845 Commits
Author SHA1 Message Date
pablorevilla-meshtastic b87e9b9917 mode changes 2026-10-26 21:55:56 -07:00
pablorevilla-meshtastic 0352ac5802 more cosmetic changes 2026-10-26 16:37:17 -07:00
pablorevilla-meshtastic daeed58042 latest updates 2026-10-26 15:17:14 -07:00
pablorevilla-meshtastic f936b32a1c add node list to map 2026-10-26 10:03:14 -07:00
pablorevilla-meshtastic 92f5b16073 more updates 2026-10-26 09:51:41 -07:00
pablorevilla-meshtastic 03ca33143b move visual changes 2026-10-26 09:45:28 -07:00
pablorevilla-meshtastic de81155e9b more cosmetic changes 2026-10-26 09:27:03 -07:00
pablorevilla-meshtastic ec67254472 quick map fixes 2026-10-26 09:21:10 -07:00
pablorevilla-meshtastic ef926798fe chat colors changes 2026-10-25 22:25:15 -07:00
pablorevilla-meshtastic 278d3b7e94 First push lots of changes 2026-10-25 22:24:48 -07:00
pablorevilla-meshtastic aabb099468 update protobufs 2026-10-24 11:15:56 -07:00
pablorevilla-meshtastic 92900362dc change readme 2026-10-23 22:27:35 -07:00
pablorevilla-meshtastic df7766e783 change reporing on Snapshot 2026-10-19 17:37:30 -07:00
pablorevilla-meshtastic fb3a0154dd some updates 2026-10-15 22:49:55 -07:00
pablorevilla-meshtastic 012150cba9 update big 2026-10-14 10:12:11 -07:00
pablorevilla-meshtastic ef37a910b9 change packet reach activity 2026-10-14 10:00:17 -07:00
pablorevilla-meshtastic f4fbf16e4f uncheck packets reach 2026-10-14 08:46:00 -07:00
pablorevilla-meshtastic f9b684ee44 fix template 2026-10-14 07:36:27 -07:00
cd78c392e9 Bound /api/coverage parameters and run the ITM model off the event loop (#172)
* Update CONTRIBUTING.md

* Update CONTRIBUTING.md

* Bound /api/coverage parameters and run the ITM model off the event loop

The coverage endpoint took radius_km, step_km and the other model inputs
straight from the query string with only a float() conversion. The ITM
loop advances by step_km until it passes radius_km, so step_km=0 (or a
negative value) never ends and radius_km=inf never ends either; a very
small step with a large radius means millions of model calls. All of this
ran synchronously inside the request handler, so one such request stalls
every other request the server is handling.

- Reject non-finite values and anything outside a sane range for each
  parameter (400 with a message saying the allowed range).
- Cap radius_km / step_km at 4000 steps.
- Run compute_perimeter / compute_coverage in a worker thread so the event
  loop keeps serving other requests while the model runs.
- Make the loops themselves refuse a non-positive step or non-finite radius,
  so a future caller cannot reintroduce the hang, and shrink the result
  cache (64 entries) since bounded inputs make large results possible.

Co-Authored-By: Claude Mythos 5.1 <noreply@anthropic.com>

---------

Co-authored-by: Pablo Revilla <pablorevilla@gmail.com>
Co-authored-by: Nathan <nathan@stonekitty.net>
Co-authored-by: Claude Mythos 5.1 <noreply@anthropic.com>
2026-10-14 07:26:18 -07:00
96b49bb893 Keep the MQTT writer running when a message is malformed (#171)
* Update CONTRIBUTING.md

* Update CONTRIBUTING.md

* Keep the MQTT writer running when a message is malformed

startdb.py stores every message it receives with mqtt_store.process_envelope,
and nothing caught an exception from it. The gateway id in a ServiceEnvelope
was converted with int(gateway_id[1:], 16) without checks, so a gateway id
of "x", "!zz" or a very long hex string raised ValueError/OverflowError,
the ingest task died and startdb.py exited. A NODEINFO whose id spelled an
existing node differently ("!00abcd" vs "!abcd") hit the UNIQUE constraint
on node.node_id at commit time with the same result. Anyone who can publish
to the broker can trigger these, and repeating them keeps the writer in a
restart loop so the site stops receiving packets.

- Parse gateway and user ids with one helper that returns None for anything
  that is not "!" + hex (or does not fit a 64-bit column) and skip the
  PacketSeen/Traceroute/Node update instead of raising.
- When a NODEINFO id is new but its node_id already exists, update that row
  instead of inserting a duplicate.
- Wrap the per-message store call in startdb.py so an unexpected error is
  logged and the loop moves on to the next message.

Co-Authored-By: Claude Mythos 5.1 <noreply@anthropic.com>

---------

Co-authored-by: Pablo Revilla <pablorevilla@gmail.com>
Co-authored-by: Nathan <nathan@stonekitty.net>
Co-authored-by: Claude Mythos 5.1 <noreply@anthropic.com>
2026-10-14 07:26:03 -07:00
5900c41cf4 Escape mesh-provided strings before inserting them into the page (#170)
* Update CONTRIBUTING.md

* Update CONTRIBUTING.md

* Escape mesh-provided strings before inserting them into the page

Node names, firmware strings, channel ids and message text all come from
the radio network, so anyone with a Meshtastic node (or publish access to
the MQTT broker) chooses their contents. Several pages dropped those
values straight into innerHTML / insertAdjacentHTML / Leaflet popups,
which lets a crafted node name run JavaScript in every visitor's browser.

Add a small shared helper (static/html-escape.js, loaded by base.html and
kiosk.html) and route every mesh-controlled value on the node list, top
nodes, firehose, node, packet and kiosk pages through it. Pages that
already had a local escapeHtml (chat, net, map, reliability) are unchanged.

Co-Authored-By: Claude Mythos 5.1 <noreply@anthropic.com>

---------

Co-authored-by: Pablo Revilla <pablorevilla@gmail.com>
Co-authored-by: Nathan <nathan@stonekitty.net>
Co-authored-by: Claude Mythos 5.1 <noreply@anthropic.com>
2026-10-14 07:25:01 -07:00
5214b233c1 Keep /api/lang and the static page route inside their directories (#173)
* Update CONTRIBUTING.md

* Update CONTRIBUTING.md

* Keep /api/lang and the static page route inside their directories

Two routes built a filename from request input without checking where it
ended up:

- /api/lang?lang=... joined the value onto the lang directory and added
  ".json". os.path.join discards the directory when the value is an
  absolute path, so ?lang=/some/where/file returned /some/where/file.json.
  Any .json file the server process can read was served.
- /{page} appended ".html" and read static/<page>. aiohttp passes an
  encoded slash (%2F) through a single path segment and unquotes it, so
  /..%2F..%2F..%2Fx read ../../../x.html relative to the static directory.

The lang route now only accepts a plain language code (en, es, pt-BR, ...)
and falls back to English otherwise, exactly as it already did for unknown
languages. The page route resolves the final path and requires it to be a
file inside meshview/static, the same check /docs/{doc} already does.

Co-Authored-By: Claude Mythos 5.1 <noreply@anthropic.com>

---------

Co-authored-by: Pablo Revilla <pablorevilla@gmail.com>
Co-authored-by: Nathan <nathan@stonekitty.net>
Co-authored-by: Claude Mythos 5.1 <noreply@anthropic.com>
2026-10-14 07:22:37 -07:00
0109d68c1b Do not let payload search match redacted direct messages (#174)
* Update CONTRIBUTING.md

* Update CONTRIBUTING.md

* Do not let payload search match redacted direct messages

/api/packets shows the text of a direct message (TEXT_MESSAGE_APP to a
specific node) as "<redacted>". The contains= filter, however, is a LIKE
over the stored packet bytes, which include the decrypted text for
messages on a known channel key. With portnum left out of the request,
contains=<guess> returned the packet when the guess appeared in a redacted
message, so the text could be recovered one substring at a time.

Direct text messages are now excluded from the substring match. Broadcast
messages and all other packet types search exactly as before.

Co-Authored-By: Claude Mythos 5.1 <noreply@anthropic.com>

---------

Co-authored-by: Pablo Revilla <pablorevilla@gmail.com>
Co-authored-by: Nathan <nathan@stonekitty.net>
Co-authored-by: Claude Mythos 5.1 <noreply@anthropic.com>
2026-10-14 07:21:05 -07:00
81612128a5 fix: limit the neighbor SNR chart to the last 7 days (#165)
* Update CONTRIBUTING.md

* Update CONTRIBUTING.md

* fix: limit the neighbor SNR chart to the last 7 days

The chart asked for the last 500 neighbor-info packets and put no
limit on how old they could be. On a busy node that is several weeks
of history, and every neighbor heard in that span gets its own line.
On one node it was 119 packets covering 21.8 days and 339 lines.

The chart now asks for the last 7 days, using the `since` parameter
that /api/packets already supports, and draws only the 15 neighbors
with the most data points in that window. A subtitle says how many
neighbors are shown and how many there were, so a missing line is not
a mystery.

Three smaller fixes in the same function:

- Neighbor names are looked up only for the lines that are drawn.
  fetchNodeFromApi() does not cache a node it cannot find, so every
  unknown neighbor was fetched again on every packet it appeared in.
- Each point is read from a Map instead of calling indexOf() on the
  timestamp list, which was quadratic in the number of points.
- Two neighbors sharing a short name are told apart. ECharts
  identifies a series by its name, so they were drawn as one line.

The "Export CSV" button for this chart wrote an empty file, because
neighborData was declared but never filled in. It is now filled in
from the neighbors on screen.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Pablo Revilla <pablorevilla@gmail.com>
Co-authored-by: Nathan <nathan@stonekitty.net>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-18 10:37:37 -07:00
pablorevilla-meshtastic bb8da4cc13 update 2026-09-10 15:39:55 -07:00
pablorevilla-meshtastic 325e685209 update 2026-09-09 20:41:24 -07:00
pablorevilla-meshtastic 0850c433f2 update 2026-09-09 20:36:02 -07:00
pablorevilla-meshtastic 28651cad7b update 2026-09-09 20:33:42 -07:00
pablorevilla-meshtastic 4df2072a72 update 2026-09-09 20:20:32 -07:00
pablorevilla-meshtastic 3c66597b65 updte 2026-09-09 20:13:15 -07:00
pablorevilla-meshtastic 64486dabc8 update 2026-09-09 20:10:19 -07:00
pablorevilla-meshtastic 9d3bd891b7 update 2026-09-09 19:58:19 -07:00
pablorevilla-meshtastic 03943c463e update 2026-09-09 19:41:42 -07:00
pablorevilla-meshtastic 849ab69566 update 2026-09-09 18:48:51 -07:00
pablorevilla-meshtastic c1d21d1ce1 update 2026-09-09 18:41:17 -07:00
pablorevilla-meshtastic 4329ccc0f3 update 2026-09-09 18:35:15 -07:00
pablorevilla-meshtastic 116a1c30b3 update 2026-09-09 18:32:23 -07:00
pablorevilla-meshtastic 295f0f086e update 2026-09-09 18:09:33 -07:00
pablorevilla-meshtastic 4988b887c7 update 2026-09-09 17:40:19 -07:00
pablorevilla-meshtastic 40ed330523 update 2026-09-09 17:26:13 -07:00
pablorevilla-meshtastic 728072dfac update 2026-09-09 17:23:37 -07:00
pablorevilla-meshtastic 4d036299f0 update 2026-09-09 16:40:22 -07:00
pablorevilla-meshtastic 0657899a6f create heard by packet trace 2026-09-09 16:33:46 -07:00
Pablo Revilla ad1f404f4a Update CONTRIBUTING.md 2026-09-09 13:41:43 -07:00
pablorevilla-meshtastic 88fe764e7b updates 2026-09-09 13:19:26 -07:00
pablorevilla-meshtastic 87344d4902 Merge branch 'develop' of github.com:pablorevilla-meshtastic/meshview into develop 2026-09-09 13:19:11 -07:00
pablorevilla-meshtastic dc7ddb5bf3 updates 2026-09-09 13:19:08 -07:00
pablorevilla-meshtastic d1e1e1a91f update 2026-09-09 12:42:37 -07:00
pablorevilla-meshtastic 81535c08b1 update 2026-09-09 12:41:27 -07:00
pablorevilla-meshtastic 41dbd12ed2 update changes 2026-09-09 12:32:55 -07:00
pablorevilla-meshtastic d78de2fd0b Latest updates summary 2026-09-09 12:30:28 -07:00
pablorevilla-meshtastic 85753d8704 Merge branch '3.0.8' 2026-09-09 12:27:04 -07:00
Manuel Villaverde e9e66b2dfb fix: make non-preset channel colors visible on the map (#164)
The fallback palette used for channels that are not Meshtastic presets was
built out of pastels, which are unreadable against the light OSM tiles. Six
of the nine entries scored under 1.6:1 contrast on the map: #fffac8 at
1.06:1 and #aaffc3 at 1.18:1 were effectively invisible, leaving only the
white marker outline showing.

The underlying issue is that one color feeds two opposite backgrounds. The
marker fill sits on light map tiles, while the filter label is text on the
dark Bootstrap panel. The old palette was calibrated only for the panel.

Replace it with 12 colors chosen by a search over HSL, constrained to clear
3:1 contrast against both backgrounds, stay at deltaE >= 30 from every
channelColorOverrides preset, and deltaE >= 20.9 from each other. Saturation
is capped at 80% to keep out neon tones that would collide with ShortTurbo.

Growing the palette from 9 to 12 entries is safe: the index is derived from
palette.length rather than a fixed number.
2026-09-09 11:21:41 -07:00
George 99a0f0a886 fix: expand Meshtastic one-byte PSK shorthand in mqtt.secondary_keys (#161)
Meshtastic stores well-known channel PSKs as a single byte index, so a
channel configured with "Ag==" was base64-decoded to one byte and handed
straight to AES. That is not just a failure to decode: algorithms.AES()
raises ValueError on a 1 byte key, and get_topic_envelopes only catches
MqttError, so the reader died on the first packet.

Expand single byte PSKs the way the firmware does in Channels::getKey --
copy the default PSK and bump its last byte by index - 1, so index 1 is
the default PSK itself. Index 0 means no encryption and is skipped.
Also validate that decoded keys are 16 or 32 bytes and log the offending
config value instead of letting a bad key reach AES.
2026-09-08 10:31:12 -07:00
George 25ada1023d fix: correct traceroute path orientation when building graph edges (#162)
* fix: correct traceroute path orientation when building graph edges

A completed traceroute is observed as a response packet, whose from/to are
reversed with respect to the path being traced: `to` is the node that started
the traceroute and `from` is the node that answered. Meshview assembled paths
as [from, *route, to], so both endpoint-adjacent edges were wrong for every
completed traceroute with at least one intermediate hop. Because the false
edges always attach to the endpoints, a busy initiator or gateway accumulated
false direct links to every remote target it ever traced.

Confirmed against TraceRouteModule::alterReceivedProtobuf, which renders a
response as printRoute(r, p.to, p.from, false), against the meshtastic python
CLI, which starts the forward path at p["to"] and the return path at p["from"],
and against real recorded traceroutes where a request's route[] is a prefix of
the matching response's route[].

Add meshview/traceroute.py and use it from /api/edges, /api/traceroute and
graph_traceroute, which had three separate copies of this logic that had all
drifted. /api/traceroute also gains initiator/target so the traceroute page
stops re-deriving the endpoints itself, which is where a fourth copy lived.

While in /api/edges, skip the NODENUM_BROADCAST placeholders that
insertUnknownHops() writes into route[] (they became a pseudo-node hub in the
graph) and guard against the (gateway, gateway) self edge that
graph_traceroute already guarded against.

* fix: do not invent links across unknown hops or unfinished returns

Review of becf4a8 found two remaining path errors.

Dropping NODENUM_BROADCAST from route[] during assembly joined the nodes
either side of it, so A -> B -> ? -> C -> D became A -> B -> C -> D and a
lone unknown hop collapsed into a false direct A -> D. Keep the placeholder
in the path and skip the edges that touch it instead. On a 2660 row sample
this removes 10 links that do not exist.

done=True only means a response was observed, not that it arrived. A gateway
usually reports one still travelling home with route_back holding just the
hops so far, so always appending the initiator claimed a final link that was
never seen. Append it only when the response reached the initiator, which the
spare snr_back entry from SNRonly=isToUs() marks. Note this is rare in
practice: 2 of 303 real responses, since the entry is added by the initiator
and gateways see packets in flight.

The deduplicated unique_forward_paths and unique_reverse_paths carry no
per-observation provenance, so the traceroute page can no longer tell which
of them reached the far endpoint. It now adds only the adjacent endpoint.

* fix: treat a response as proof the forward path reached the target

Winning path selection required return hops, so a response observed before
its first return hop contributed nothing and the page fell back to the
deduplicated reported paths, which cannot tell which of them reached the
target. A response with route=[B,C] and no route_back rendered A > B > C,
losing the target and the last link.

Select winning paths from response observations instead. A response only
exists because the request arrived, whatever its return trip went on to do.
Dropping the non-empty forward_hops guard at the same time means a zero hop
response contributes its real direct link, so a fully direct traceroute and a
completed direct return are no longer excluded from the graph.

Mark reported forward paths that some response reported, so the page can
close those on the target and they deduplicate against the winning path
instead of drawing a shorter copy underneath it.
2026-09-08 10:30:27 -07:00
George 290f8cf6f5 fix: show ROUTING ACK/NAK instead of misleading "error_reason: NONE" (#160)
error_reason sits in a protobuf oneof, so the NONE zero value is written
to the wire and printed verbatim, making successful ACKs look like
errors. Render NONE as "ACK" and anything else as "NAK: <REASON>".
Confirmed against live MQTT traffic (19 NONE, 22 NO_RESPONSE, all with
request_id set).
2026-09-08 10:29:54 -07:00
pablorevilla-meshtastic 992296b0c1 Work on new Traceroute page 2026-07-02 15:01:24 -07:00
pablorevilla-meshtastic e2adb73fea map changes and other fixes 2026-06-25 17:19:35 -07:00
pablorevilla-meshtastic 5386f39611 report change 2026-06-11 16:16:08 -07:00
pablorevilla-meshtastic 2175fcb44d remove some of the changes 2026-06-11 14:49:26 -07:00
pablorevilla-meshtastic c16e19336a more fixes 2026-06-08 12:02:20 -07:00
pablorevilla-meshtastic 7f5b50b6f3 Fix timezone or health report 2026-06-08 11:59:20 -07:00
pablorevilla-meshtastic dff2ea0249 change 2026-06-04 17:16:11 -07:00
pablorevilla-meshtastic 029d22ff9c report of cleanup status on health page 2026-06-04 17:14:43 -07:00
pablorevilla-meshtastic 02c77dcca8 change the versio n number and release date for the next release 2026-05-29 14:39:04 -07:00
pablorevilla-meshtastic d4f6a8ba9b fixed bug in top.html now it shows all channels as a option 2026-05-29 14:30:44 -07:00
SMLunchen 31ca098de5 fix: don't overwrite Node.channel from MAP_REPORT_APP if already set (#147)
NODEINFO_APP is the better / authoritative source for a nodes primary channel.
MAP_REPORT_APP packets can arrive on a different MQTT uplink channel and
are unconditionally overwriting the channel set by NODEINFO, causing
nodes to appear on the wrong channel in the map and channel filters.

now MAP_REPORT_APP only sets Node.channel when it is not (yetw) known,
making it a fallback rather than an override.
2026-05-29 14:12:42 -07:00
pablorevilla-meshtastic 794502d63f Merge branch '3.0.7' 2026-05-29 14:06:17 -07:00
pablorevilla-meshtastic ad4785baec Document version 3.0.7 2026-05-29 14:05:16 -07:00
pablorevilla-meshtastic 493fadf0d2 updated protobuf 2026-05-29 13:39:04 -07:00
pablorevilla-meshtastic db04f4dc9f made changes 2026-05-25 09:07:59 -07:00
pablorevilla-meshtastic 2ecaaae2a9 more changes 2026-05-24 11:01:45 -07:00
pablorevilla-meshtastic 7cafefb59b added hop count the the reliablility report. 2026-05-24 10:59:25 -07:00
pablorevilla-meshtastic 85cd05177e added filter for extending the range of active nodes to nodelist 2026-05-23 09:59:25 -07:00
pablorevilla-meshtastic 69150b2efc add node to nodelist 2026-05-23 09:53:21 -07:00
pablorevilla-meshtastic 4695537291 show all nodes in db 2026-05-23 09:03:32 -07:00
pablorevilla-meshtastic f1ad6333dd more updates 2026-05-20 07:05:40 -07:00
pablorevilla-meshtastic 1089cfd256 work on reliablility page 2026-05-20 06:59:37 -07:00
pablorevilla-meshtastic 2ae4483e1f Added map to relaiablity report 2026-05-19 16:49:49 -07:00
pablorevilla-meshtastic fb2c947a14 fix error with QR code not loading node's role 2026-05-19 16:21:30 -07:00
pablorevilla-meshtastic ac161e5764 Made node colors in map persistent to reboot. 2026-05-19 14:17:51 -07:00
Pablo Revilla 1f606e5fa0 Update README.md 2026-05-19 10:29:30 -07:00
pablorevilla-meshtastic c1a9bb63c7 update README.md 2026-05-19 10:27:11 -07:00
pablorevilla-meshtastic 29e5b36dbf Added scale to the maps. 2026-05-19 09:42:02 -07:00
pablorevilla-meshtastic 671af01e0b ADDED new cleanup to the keys table 2026-05-14 14:54:03 -07:00
pablorevilla-meshtastic 82323a8783 changes to calculations 2026-05-14 07:40:04 -07:00
pablorevilla-meshtastic 98549e05b9 updates to filtering 2026-05-13 12:10:57 -07:00
pablorevilla-meshtastic 1fafb344de CHANGE NAME FROM reach to reliability 2026-05-12 20:06:35 -07:00
pablorevilla-meshtastic 0368259bf7 update reach.html 2026-05-12 20:00:51 -07:00
pablorevilla-meshtastic c54c2e9f8d fix search 2026-05-12 19:45:56 -07:00
pablorevilla-meshtastic 96fa6b3063 version update 2026-05-12 19:43:09 -07:00
pablorevilla-meshtastic 15e105b3fc more changes 2026-05-12 19:39:14 -07:00
pablorevilla-meshtastic 1f83de5698 reach.html updated with new content and formatting. 2026-05-12 19:34:26 -07:00
pablorevilla-meshtastic 660c7e60bc update design and test 2026-05-12 19:26:20 -07:00
pablorevilla-meshtastic 4656a9a939 add reach.html 2026-05-12 19:21:08 -07:00
pablorevilla-meshtastic 3a5881975c new changes 2026-05-12 18:08:05 -07:00
pablorevilla-meshtastic 0fdf771980 Add reach report page 2026-05-12 17:30:36 -07:00
pablorevilla-meshtastic 0d52dfeac1 fixed pop up 2026-05-12 15:58:13 -07:00
pablorevilla-meshtastic 31744aace9 Merge branch 'master' of github.com:pablorevilla-meshtastic/meshview 2026-05-12 15:51:13 -07:00
pablorevilla-meshtastic a3ce0640ab update 2026-05-12 15:51:10 -07:00
Pablo RevillaandPaul Picazo 1ba64f8908 Merge branch 3.0.6 into master (#145)
* add world meshview tag

* small map change

* Add relay_node field to PacketSeen model and update template for display

* Add migration script to introduce relay_node column in packet_seen table

* Adapt PR 102 relay node display to packet page

* Added DB configuration and snapshot for basic detaisl

* update schemma

* fix ingestion error

* fixed the db and added more reporting

* 1

* Fix MQTT store bug.

* changes to reports

* more changes to report

* update latest list of instances

* Update protobuf

* remove file

* add channel to firehouse

* Add filter to firehose

* filter at chat.html

* remove duplicates from nodes in net.html

* add note bottom of page

* fixed issue reported on issue #143

---------

Co-authored-by: Paul Picazo <paul@picazo.com>
2026-05-08 16:20:56 -07:00
Dmitriy Q e4384f020c add russian translation (#141) 2026-04-01 10:16:24 -07:00
pablorevilla-meshtastic bdf70da803 fix location of node in node.html 2026-02-24 12:00:08 -08:00
pablorevilla-meshtastic 2cc53dc3b7 Added documentation 2026-02-13 22:50:31 -08:00
pablorevilla-meshtastic bf5f23a0ab fixed sorting error with nodelist 2026-02-13 22:35:32 -08:00
pablorevilla-meshtastic 37851cd7f8 packet.html fix 2026-02-13 20:34:16 -08:00
pablorevilla-meshtastic e0ca9900d3 fix map error 2026-02-13 20:18:04 -08:00
pablorevilla-meshtastic f108197e5f Documentation update 2026-02-13 16:28:52 -08:00
pablorevilla-meshtastic 20c2a3dc62 Update to stats page 2026-02-13 15:48:40 -08:00
pablorevilla-meshtastic 4a7fa1df08 fix error for sqlite 2026-02-13 14:20:12 -08:00
pablorevilla-meshtastic 685dbc9505 Added the ability to track gateways and present them in varous pages 2026-02-13 14:14:46 -08:00
pablorevilla-meshtastic 9aacceda28 fix location of edges now that the node is in a different spot 2026-02-12 13:29:51 -08:00
pablorevilla-meshtastic a7051e7d26 More fixes for maps overlay 2026-02-12 12:01:51 -08:00
pablorevilla-meshtastic 7926e81562 documents updte 2026-02-12 11:34:19 -08:00
pablorevilla-meshtastic 2002e093af Added visivility on maps of nodes that overlap 2026-02-12 11:33:24 -08:00
pablorevilla-meshtastic fc44f49f2d Work on updating protobufs and .gitignore 2026-02-11 17:30:53 -08:00
pablorevilla-meshtastic 89fbc6aeca changes 2026-02-11 07:00:21 -08:00
pablorevilla-meshtastic 20e3f9c104 Added Observed coverage to the node.html page 2026-02-10 15:33:59 -08:00
pablorevilla-meshtastic 17fa92d4cf modified the colors 2026-02-10 12:23:17 -08:00
pablorevilla-meshtastic a48a3a4141 Updating anb fixing errors 2026-02-10 11:07:22 -08:00
pablorevilla-meshtastic 7d5b638eac changes to coverage page 2026-02-10 10:27:07 -08:00
pablorevilla-meshtastic 5f5fe0da90 Merge branch 'pr-128' into 3.0.5 2026-02-10 10:04:40 -08:00
Amy Nagle dd98814b2c Normalize port number lists 2026-02-10 10:33:54 -05:00
pablorevilla-meshtastic 4dd999178c more details 2026-02-09 21:31:34 -08:00
pablorevilla-meshtastic 01dce2a5e0 Update to check for new requirements 2026-02-09 21:29:53 -08:00
pablorevilla-meshtastic 9622092c17 Add basic coverege support. 2026-02-09 21:17:22 -08:00
pablorevilla-meshtastic 29da1487d4 Merge branch 'pr-127' into 3.0.5 2026-02-09 07:48:33 -08:00
Mike Weaver 357fb530e2 Add database health check to include last import time
Retrieve the last import time from the database during health check.

This is useful to setup monitoring for meshview instances that are no longer receiving messages.
2026-02-08 03:07:46 -07:00
pablorevilla-meshtastic b43683a259 Added First Seen time to node.html and /api/nodes 2026-02-06 11:41:15 -08:00
pablorevilla-meshtastic 59379649e2 Add version number 2026-02-06 11:23:07 -08:00
pablorevilla-meshtastic a62bc350c0 fix: update store.py 2026-02-05 18:25:23 -08:00
pablorevilla-meshtastic 82ff4bb0df Merge PR 124: QR/import, impersonation detection, node public keys 2026-02-05 18:02:49 -08:00
pablorevilla-meshtastic c454f2ef3a started work on new traceroute template 2026-02-05 06:53:49 -08:00
pablorevilla-meshtastic b93f640233 load language dictionaries into memory to reduce call to file system 2026-01-31 10:42:47 -08:00
pablorevilla-meshtastic 018e16e9fa updates to language dictionaries 2026-01-26 10:40:20 -08:00
pablorevilla-meshtastic 41397072af Added unmaped packets detials to map.htnl 2026-01-26 09:15:01 -08:00
pablorevilla-meshtastic 43be448100 fix typo in container workflow file 2026-01-25 21:06:46 -08:00
pablorevilla-meshtastic 8c7f181002 Merge branch 'master' of github.com:pablorevilla-meshtastic/meshview 2026-01-25 20:47:03 -08:00
pablorevilla-meshtastic 5195868719 Made latest to follow master 2026-01-25 20:43:43 -08:00
Pablo Revilla a473e32c59 Add initial server and configuration settings 2026-01-25 13:39:14 -08:00
pablorevilla-meshtastic be51dc9c55 working on container 2026-01-25 13:34:26 -08:00
pablorevilla-meshtastic bea6c8cd8e Fix how we show the actual channel on the packet list. 2026-01-24 23:31:57 -08:00
pablorevilla-meshtastic 351c35ef42 Fix issues with decryption of secondary keys 2026-01-24 21:38:14 -08:00
pablorevilla-meshtastic 7f722b6f12 Updated Readme.md 2026-01-24 11:20:34 -08:00
pablorevilla-meshtastic 52f1a1e788 updated the version number and date 2026-01-24 11:14:06 -08:00
pablorevilla-meshtastic f44a78730a Added the ablility to skip packets with specific from_id and have secondary enccryption key for mqtt_reader. 2026-01-23 21:49:03 -08:00
pablorevilla-meshtastic a9a5e046ea more container test 2026-01-23 13:02:34 -08:00
pablorevilla-meshtastic 37386f9e28 change to container.yml 2026-01-23 11:58:48 -08:00
pablorevilla-meshtastic b66bfb1ee9 Fix error on container build and update README 2026-01-23 11:42:03 -08:00
pablorevilla-meshtastic caf9cd1596 Updated list of sites runing meshview 2026-01-22 07:42:24 -08:00
pablorevilla-meshtastic a4ebd2b23c work on net.html to limit packets to last 12 hours instead of 48 hours. 2026-01-21 20:11:17 -08:00
pablorevilla-meshtastic 5676ade6b7 fix api query so that weekly mesh works. 2026-01-21 17:19:19 -08:00
pablorevilla-meshtastic 319f8eac06 optimization 2026-01-20 14:48:33 -08:00
pablorevilla-meshtastic d85132133a fix bug 2026-01-20 11:27:42 -08:00
pablorevilla-meshtastic b6d8af409c fix bug on backwards compatibility 2026-01-20 10:10:39 -08:00
pablorevilla-meshtastic 896a0980d5 Update Scripts for PortgreSQL 2026-01-15 16:24:42 -08:00
pablorevilla-meshtastic 7d395e5e27 Correct documentation error 2026-01-15 14:42:18 -08:00
pablorevilla-meshtastic c3cc01d7e7 Docuement Update 2026-01-15 14:30:04 -08:00
pablorevilla-meshtastic ecbadc6087 configure "Wal" for sqlite 2026-01-15 14:10:49 -08:00
pablorevilla-meshtastic ff30623bdf Documentation updte 2026-01-15 11:55:07 -08:00
pablorevilla-meshtastic a43433ccb4 Update documentation 2026-01-15 11:51:03 -08:00
pablorevilla-meshtastic 4d9db2a52c Update instructions 2026-01-15 11:49:25 -08:00
pablorevilla-meshtastic e30b59851f Update to 2026-01-15 11:39:24 -08:00
pablorevilla-meshtastic 36dd91be63 Merge branch 'db_updates' 2026-01-15 09:04:09 -08:00
pablorevilla-meshtastic c9639d851b Fix Time function on store.py 2026-01-15 08:48:22 -08:00
Pablo Revilla 4516c84128 Modify cleanup.sh to use import_time_us for queries
Updated cleanup script to use import_time_us for deletions.
2026-01-14 22:11:52 -08:00
pablorevilla-meshtastic fa98f56318 Made a cople of changes to the time handling and database config. 2026-01-12 20:10:19 -08:00
pablorevilla-meshtastic f85e783e8c Adding code to work with multiple databases types. 2026-01-12 14:18:51 -08:00
Pablo Revilla a882bc22dd Update README with version 3.0.2 details
Added notes about database changes for version 3.0.2.
2026-01-12 10:38:55 -08:00
pablorevilla-meshtastic e12e3a2a41 Database change to remove import time columns 2026-01-09 13:30:14 -08:00
pablorevilla-meshtastic da31794d8d Bump version to 3.0.2 and update release date to 2026-1-9 2026-01-09 11:49:58 -08:00
pablorevilla-meshtastic 9912f6b181 testing commit message functionality 2026-01-08 18:39:01 -08:00
pablorevilla-meshtastic cb4cc281c6 fix speed of node list rendering 2026-01-08 17:38:56 -08:00
pablorevilla-meshtastic 571559114d Add node status indicator and improve favorites handling in nodelist 2026-01-08 17:38:12 -08:00
pablorevilla-meshtastic df26df07f1 Changes to node.html. fix some of the data 2026-01-08 14:59:45 -08:00
pablorevilla-meshtastic ffc7340bc9 Changes to nodelist.html. fix some of the data 2026-01-07 17:19:32 -08:00
pablorevilla-meshtastic 1d58aaba83 Changes to nodelist.html. fix some of the data 2026-01-07 13:35:58 -08:00
pablorevilla-meshtastic b2bb9345fe Changes to nodelist.html. fix some of the data 2026-01-07 13:29:56 -08:00
pablorevilla-meshtastic 9686622b56 Changes to node.html. fix some of the data 2026-01-07 10:01:02 -08:00
pablorevilla-meshtastic f7644a9573 Changes to node.html. fix some of the data 2026-01-07 09:48:26 -08:00
Pablo Revilla e48e9464d7 Modify packet.html to add distance 2026-01-03 21:48:19 -08:00
Pablo Revilla b72bc5d52b Modify packet.html to add distance 2026-01-03 21:44:26 -08:00
Pablo Revilla 1220f0bcbd Modify node.html to add statistics 2026-01-03 21:28:33 -08:00
Pablo Revilla 539410d5bb Modify node.html to add statistics 2026-01-03 21:26:39 -08:00
Pablo Revilla 383b576d18 Modify node.html to add statistics 2026-01-03 21:12:24 -08:00
Pablo Revilla 64a55a3ef3 Modify node.html to add statistics 2026-01-03 20:51:17 -08:00
Pablo Revilla 9408201e57 Modify node.html to add statistics 2026-01-03 19:27:00 -08:00
Pablo Revilla f75d6bf749 Modify node.html to add statistics 2026-01-03 19:00:39 -08:00
Pablo Revilla 924d223866 Modify node.html to add statistics 2026-01-03 18:13:57 -08:00
Pablo Revilla e9dcca1f19 Modify node.html to add statistics 2025-12-31 11:58:45 -08:00
Pablo Revilla 00cc2abd23 Modify node.html to add statistics 2025-12-31 11:56:18 -08:00
Pablo Revilla b76477167d Modify top.html to add paging 2025-12-31 11:13:52 -08:00
Pablo Revilla b41b249a6d Modify top.html to add paging 2025-12-31 10:38:13 -08:00
Pablo Revilla 71fcda2dd6 Modify top.html to add paging 2025-12-30 09:27:51 -08:00
Pablo Revilla c4453fbb31 Modify packet.html to sort by hop count. 2025-12-24 10:54:09 -08:00
Pablo Revilla 79fa3f66a8 Fix chart on node.html. 2025-12-24 10:06:17 -08:00
Pablo Revilla 0ce64ac975 Fix chart on node.html. 2025-12-10 09:56:30 -08:00
Pablo Revilla 350aa9e4a3 Fix chart on node.html. 2025-12-09 17:40:49 -08:00
Pablo Revilla e5bbf972c7 Fix chart on node.html. 2025-12-09 17:35:52 -08:00
Pablo Revilla 4326e12e88 Fix chart on node.html. 2025-12-09 16:58:38 -08:00
Pablo Revilla 00aa3216ff Fix chart on node.html. 2025-12-09 16:19:55 -08:00
Pablo Revilla 3d6c01f020 minor fix on node.html table of tackets shows to and from not just from. 2025-12-08 10:45:33 -08:00
Pablo Revilla d3bf0ede67 minor fix on node.html table of tackets shows to and from not just from. 2025-12-08 10:29:24 -08:00
Pablo Revilla 2b02166d82 minor fix on node.html table of tackets shows to and from not just from. 2025-12-07 20:02:33 -08:00
Pablo Revilla 2fd36b4b11 minor fix on node.html table of tackets shows to and from not just from. 2025-12-07 17:29:01 -08:00
Pablo Revilla 8aa1c59873 minor fix to langauge dictionary 2025-12-06 11:30:25 -08:00
Pablo Revilla cd036b8004 efficiency improvement node.html now it only queries the needed node info rather than all the nodes. 2025-12-06 11:26:36 -08:00
Pablo Revilla 989da239fb efficiency improvement for map.html. Now it only download the edges that need to be drawn. 2025-12-04 14:15:46 -08:00
Pablo Revilla 31626494d3 Fix README.md details 2025-12-04 10:38:58 -08:00
Pablo Revilla 960a7ef075 Fix README.md details 2025-12-04 09:41:59 -08:00
Pablo Revilla 60c4d22d2d Update multi-language support. So far Spanish and english. 2025-12-04 09:39:27 -08:00
Pablo Revilla 13a094be00 Update multi-language support. So far Spanish and english. 2025-12-04 09:38:18 -08:00
Pablo Revilla 7744cedd8c Update multi-language support. So far Spanish and english. 2025-12-04 09:35:34 -08:00
Pablo Revilla ad42c1aeaf Update multi-language support. So far Spanish and english. 2025-12-02 16:03:25 -08:00
Pablo Revilla 41f7bf42a3 Update multi-language support. So far Spanish and english. 2025-12-02 14:45:31 -08:00
Pablo Revilla 0543aeb650 Update multi-language support. So far Spanish and english. 2025-12-02 14:24:10 -08:00
Pablo Revilla 679071cc14 Update multi-language support. So far Spanish and english. 2025-12-02 13:54:39 -08:00
Pablo Revilla 198afcc7d8 Update multi-language support. So far Spanish and english. 2025-12-02 13:51:18 -08:00
Pablo Revilla 191a01a03c update version date 2025-12-01 09:48:51 -08:00
Pablo Revilla fd653f8234 Fixed Sort nodes by firmware in nodelist.html 2025-12-01 09:38:08 -08:00
Pablo Revilla 2149fed8c5 Fixed Sort nodes by firmware in nodelist.html 2025-11-30 10:38:18 -08:00
Pablo Revilla 5609d18284 worked on making map and base all API driven 2025-11-29 19:27:57 -08:00
Pablo Revilla 705b0b79fc worked on making map and base all API driven 2025-11-29 19:12:53 -08:00
Joel KrauskaandPablo Revilla 32ad8e3a9c Fix search 2 (#108)
Co-authored-by: Pablo Revilla <pablorevilla@gmail.com>
2025-11-29 19:07:58 -08:00
e77428661c Version 3.0.0 Feature Release - Target Before Thanksgiving! (#96)
* Add alembic DB schema management (#86)

* Use alembic
* add creation helper
* example migration tool

* Store UTC int time in DB (#81)

* use UTC int time

* Remove old index notes script -- no longer needed

* modify alembic to support cleaner migrations

* add /version json endpoint

* move technical docs

* remove old migrate script

* add readme in docs:

* more doc tidy

* rm

* update api docs

* ignore other database files

* health endpoint

* alembic log format

* break out api calls in to their own file to reduce footprint

* ruff and docs

* vuln

* Improves arguments in mvrun.py

* Set dbcleanup.log location configurable

* mvrun work

* fallback if missing config

* remove unused loop

* improve migrations and fix logging problem with mqtt

* Container using slim/uv

* auto build containers

* symlink

* fix symlink

* checkout and containerfile

* make /app owned by ap0p

* Traceroute Return Path logged and displayed (#97)


* traceroute returns are now logged and /packetlist now graphs the correct data for a return route
* now using alembic to update schema
* HOWTO - Alembic

---------

Co-authored-by: Joel Krauska <jkrauska@gmail.com>

* DB Backups

* backups and cleanups are different

* ruff

* Docker Docs

* setup-dev

* graphviz for dot in Container

* Summary of 3.0.0 stuff

* Alembic was blocking mqtt logs

* Add us first/last timestamps to node table too

* Worked on /api/packet. Needed to modify
- Store.py to read the new time data
- api.py to present the new time data
- firehose.html chat.html and map.html now use the new apis and the time is the browser local time

* Worked on /api/packet. Needed to modify
- Store.py to read the new time data
- api.py to present the new time data
- firehose.html chat.html and map.html now use the new apis and the time is the browser local time

* Improves container build (#94)

* Worked on /api/packet. Needed to modify
- Store.py to read the new time data
- api.py to present the new time data
- firehose.html chat.html and map.html now use the new apis and the time is the browser local time

* Worked on /api/packet. Needed to modify
- Store.py to read the new time data
- api.py to present the new time data
- firehose.html chat.html and map.html now use the new apis and the time is the browser local time

* Worked on /api/packet. Needed to modify
- Added new api endpoint /api/packets_seen
- Modified web.py and store.py to support changes to APIs.
- Started to work on new_node.html and new_packet.html for presentation of data.

* Worked on /api/packet. Needed to modify
- Added new api endpoint /api/packets_seen
- Modified web.py and store.py to support changes to APIs.
- Started to work on new_node.html and new_packet.html for presentation of data.

* Finishing up all the pages for the 3.0 release.

Now all pages are functional.

* Finishing up all the pages for the 3.0 release.

Now all pages are functional.

* fix ruff format

* more ruff

* Finishing up all the pages for the 3.0 release.

Now all pages are functional.

* Finishing up all the pages for the 3.0 release.

Now all pages are functional.

* pyproject.toml requirements

* use sys.executable

* fix 0 epoch dates in /chat

* Make the robots do our bidding

* another compatibility fix when _us is empty and we need to sort by BOTH old and new

* Finishing up all the pages for the 3.0 release.

Now all pages are functional.

* Finishing up all the pages for the 3.0 release.

Now all pages are functional.

* Remamed new_node to node. shorter and descriptive.

* Remamed new_node to node. shorter and descriptive.

* Remamed new_node to node. shorter and descriptive.

* Remamed new_node to node. shorter and descriptive.

* Remamed new_node to node. shorter and descriptive.

* Remamed new_node to node. shorter and descriptive.

* More changes... almost ready for release.

Ranamed 2 pages for easy or reading.

* Fix the net page as it was not showing the date information

* Fix the net page as it was not showing the date information

* Fix the net page as it was not showing the date information

* Fix the net page as it was not showing the date information

* ruff

---------

Co-authored-by: Óscar García Amor <ogarcia@connectical.com>
Co-authored-by: Jim Schrempp <jschrempp@users.noreply.github.com>
Co-authored-by: Pablo Revilla <pablorevilla@gmail.com>
2025-11-28 11:17:20 -08:00
Joel Krauska e68cdf8cc1 test commit
Added information about the new statistic page and API.
2025-11-03 12:43:07 -08:00
Pablo Revilla 60ae77772d worked on making map and base all API driven 2025-11-02 11:41:15 -08:00
Pablo Revilla ed33bfe540 worked on making map and base all API driven 2025-11-02 11:39:29 -08:00
Pablo Revilla 47a22911ca worked on making map and base all API driven 2025-11-01 18:30:26 -07:00
Pablo Revilla d61427db8f worked on making map and base all API driven 2025-10-31 16:55:41 -07:00
Pablo Revilla f11455eebc worked on making map and base all API driven 2025-10-31 16:55:05 -07:00
Pablo Revilla 0a548904c8 Merge remote-tracking branch 'origin/master' 2025-10-31 16:54:15 -07:00
Pablo Revilla a0e5bb0747 worked on making map and base all API driven 2025-10-31 16:52:32 -07:00
Pablo Revilla 986ef8e4e5 Merge pull request #92 from io235/master
Add Salzburg/Austria to list of running instances
2025-10-31 11:07:59 -07:00
Pablo Revilla 54f7f1b1ce worked on making map and base all API driven 2025-10-31 07:45:48 -07:00
Io 6886a97874 Add Salzburg/Austria to list of running instances 2025-10-31 10:09:13 +00:00
Pablo Revilla c4f2e3f24f Merge pull request #87 from jkrauska/traceLines
render traceroutes on top
2025-10-27 21:31:11 -07:00
Joel Krauska 8db8e90f80 use ruff format 2025-10-27 14:40:41 -07:00
Joel Krauska 3ea2809df0 render traceroutes on top 2025-10-27 14:38:35 -07:00
Pablo Revilla f7f932d821 worked on making map and base all API driven 2025-10-23 13:53:41 -07:00
Pablo Revilla ad8835a46b worked on making map and base all API driven 2025-10-22 15:57:34 -07:00
Pablo Revilla cbe4895b2c worked on making map and base all API driven 2025-10-22 15:22:47 -07:00
Pablo Revilla d9b1d5ac49 worked on making map and base all API driven 2025-10-22 14:31:07 -07:00
Pablo Revilla 13aa73e88f worked on making map and base all API driven 2025-10-22 09:20:08 -07:00
Pablo Revilla 58244bff09 worked on making map and base all API driven 2025-10-22 08:54:18 -07:00
Pablo Revilla 635353f3c8 worked on making map and base all API driven 2025-10-21 21:07:28 -07:00
Pablo Revilla d5fb589665 worked on making map and base all API driven 2025-10-18 15:52:50 -07:00
Pablo Revilla a4b51ace73 worked on making map and base all API driven 2025-10-18 15:27:13 -07:00
Pablo Revilla 75d0d9ea6a worked on making map and base all API driven 2025-10-18 15:13:08 -07:00
Pablo Revilla c909ff58a5 Merge pull request #80 from pablorevilla-meshtastic/revert-78-10-15-25-bugs2
Revert "Add configurable channel filtering with allowlist and minimum packet threshold"
2025-10-17 18:40:48 -07:00
Pablo Revilla a15b039a1f Revert "Add configurable channel filtering with allowlist and minimum packet threshold" 2025-10-17 18:40:22 -07:00
Pablo Revilla d52b7d0929 Merge pull request #78 from nullrouten0/10-15-25-bugs2
Add configurable channel filtering with allowlist and minimum packet threshold
2025-10-17 16:54:06 -07:00
Nathan d56ee8f4c5 ruff fixes 2025-10-17 15:36:36 -07:00
Pablo Revilla 52ca8a4060 Merge branch 'master' into 10-15-25-bugs2 2025-10-17 15:09:10 -07:00
Pablo Revilla e4a6de3615 worked on making map and base all API driven 2025-10-17 14:26:08 -07:00
Pablo Revilla 3cca445cad worked on making map and base all API driven 2025-10-17 12:54:44 -07:00
Pablo Revilla 8b0c7a16e7 Start adding language support 2025-10-16 13:34:35 -07:00
Nathan c5a1009877 added channel filtering min_packets, and allowlist, fixed javascript error, new sample.config.ini sections 2025-10-16 01:07:49 -07:00
Pablo Revilla 65ada1ba3e Merge pull request #77 from pablorevilla-meshtastic/revert-73-maphours-stacked
Revert "Maphours changes stacked with filtering additions"
2025-10-15 21:36:29 -07:00
Pablo Revilla 7f94bc0e39 Merge branch 'master' into revert-73-maphours-stacked 2025-10-15 21:36:06 -07:00
Pablo Revilla 5d687da598 Merge pull request #76 from pablorevilla-meshtastic/revert-75-10-15-25-bugs
Revert "fixed map to show only channels with locations"
2025-10-15 21:33:16 -07:00
Pablo Revilla a002cde2d7 Revert "fixed map to show only channels with locations" 2025-10-15 21:32:50 -07:00
Nathan 954cd4653d fixing node graph selector 2025-10-15 18:02:52 -07:00
Pablo Revilla 454c8ff6e2 Start adding language support 2025-10-15 16:27:43 -07:00
Pablo Revilla 021bc54f9d Start adding language support 2025-10-15 16:25:34 -07:00
Pablo Revilla 155ef89724 Merge remote-tracking branch 'origin/master' 2025-10-15 16:24:07 -07:00
Pablo Revilla 084647eec1 Start adding language support 2025-10-15 16:23:59 -07:00
Pablo Revilla c13a851145 Merge pull request #75 from nullrouten0/10-15-25-bugs
fixed map to show only channels with locations
2025-10-15 16:15:01 -07:00
Pablo Revilla 114cd980b9 Merge branch 'master' into 10-15-25-bugs 2025-10-15 16:14:47 -07:00
Nathan c23a650c0d fixed map to show only channels with locations 2025-10-15 16:07:52 -07:00
Pablo Revilla 318bf83403 Revert "Maphours changes stacked with filtering additions" 2025-10-15 15:57:56 -07:00
Pablo Revilla 636ab3e976 Start adding language support 2025-10-15 15:57:39 -07:00
Pablo Revilla ea10a656e7 Start adding language support 2025-10-15 15:31:04 -07:00
Pablo Revilla bcd007e5e2 Merge pull request #73 from nullrouten0/maphours-stacked
Maphours changes stacked with filtering additions
2025-10-15 15:09:24 -07:00
Nathan b35acde821 Add channel-aware activity filters and API-driven dashboards 2025-10-14 21:34:52 -07:00
Nathan b7752bc315 Map: activity time filters 2025-10-11 21:21:10 -07:00
Nathan 257bf7ffac Add channel filters to stats, chat, and firehose views 2025-10-11 16:28:34 -07:00
Pablo Revilla d561d1a8de Start adding language support 2025-10-10 21:37:45 -07:00
Pablo Revilla 60e7389d83 Start adding language support 2025-10-10 21:34:42 -07:00
Pablo Revilla 4ac3262544 Start adding language support 2025-10-10 21:34:36 -07:00
Pablo Revilla 87643e4bd2 Start adding language support 2025-10-10 21:32:36 -07:00
Pablo Revilla 29174a649c Start adding language support 2025-10-10 21:28:48 -07:00
Pablo Revilla 712aea5139 Start adding language support 2025-10-10 21:10:35 -07:00
Pablo Revilla d6fadd99d0 Start adding language support 2025-10-10 21:01:43 -07:00
Pablo Revilla ae0b0944f0 Merge pull request #68 from jkrauska/profileTop
Add database indexes for 10X improvement in page load for /top
2025-10-10 12:58:41 -07:00
Pablo Revilla d7b830e2f7 Merge pull request #69 from jkrauska/lornet.pl
fix for loranet.pl missing gateway_id
2025-10-08 18:31:05 -07:00
Joel Krauska 4a1737ebd4 fix for loranet.pl 2025-10-07 20:13:00 -07:00
Joel Krauska 60131007df fix for ruff 2025-10-07 19:49:57 -07:00
Joel Krauska 23d66c0d67 add database indexes 2025-10-07 18:22:50 -07:00
Pablo Revilla 30ba603f66 Merge pull request #67 from jkrauska/nodeListFavorites
FEATURE: Add NodeList Favorites and Remember Map Filters
2025-10-07 16:08:52 -07:00
Pablo Revilla 9811102681 Merge pull request #66 from jkrauska/apiEdges
BUG: Fix for api/edges traceback
2025-10-07 15:54:04 -07:00
Joel Krauska 7c92b06bec use ruff format 2025-10-07 14:15:29 -07:00
Joel Krauska adda666a39 Add Favorites and Remember Filters 2025-10-07 14:04:14 -07:00
Joel Krauska 3e673f30bc Fix for api/edges traceback 2025-10-07 13:59:20 -07:00
Pablo Revilla beefb4c5df Merge pull request #64 from jkrauska/ruffVersionFix
Bump ruff version - fix open call from lang work
2025-10-03 21:56:19 -07:00
Joel Krauska e1bada8378 Bump ruff version - fix open call from lang work 2025-10-03 21:34:13 -07:00
Pablo Revilla fbd6fcb123 Merge pull request #62 from jkrauska/ruffAutomation
Automate ruff in github action
2025-10-03 21:03:53 -07:00
Pablo Revilla 5d267effa5 Remove unused code 2025-10-03 20:56:47 -07:00
Joel Krauska e28d248cf9 Automate ruff in github action 2025-10-03 20:55:11 -07:00
Pablo Revilla ab101dd461 Merge pull request #61 from jkrauska/jkrauska/ruffFormat
Add Ruff formatting and pre-commit hooks
2025-10-03 20:49:44 -07:00
Joel Krauska 35212d403e Merge branch 'master' into jkrauska/ruffFormat 2025-10-03 20:43:16 -07:00
Pablo Revilla 3603014fd2 Added maps coordinates to /api/config 2025-10-03 20:41:02 -07:00
Joel Krauska e25ff22127 Add Ruff formatting and pre-commit hooks
Configure Ruff as the code formatter and linter with pre-commit hooks.
  Applied automatic formatting fixes across the entire codebase including:
  - Import sorting and organization
  - Code style consistency (spacing, line breaks, indentation)
  - String quote normalization
  - Removal of trailing whitespace and unnecessary blank lines
2025-10-03 20:38:37 -07:00
Pablo Revilla aa9922e7fa work on error where packet ids could be duplicate and crash the loop 2025-10-03 12:54:00 -07:00
Pablo Revilla a9b16d6c18 work on error where packet ids could be duplicate and crash the loop 2025-10-03 12:33:04 -07:00
Pablo Revilla b4fda0bb01 Merge remote-tracking branch 'origin/master' 2025-10-03 11:59:35 -07:00
Pablo Revilla 215817abc7 Cleanup the install process 2025-10-03 11:59:21 -07:00
Pablo Revilla f167e8780d Merge pull request #57 from jkrauska/jkrauska/startupLogging
Add structured logging and improved startup/shutdown handling
2025-10-03 08:58:31 -07:00
Joel KrauskaandClaude 2723022dd5 Add structured logging and improved startup/shutdown handling
- Add consistent logging format across all modules (timestamp, file:line, PID, level)
- Add startup logging for MQTT connection, web server startup with URL display
- Add MQTT message processing metrics (count and rate logging every 10k messages)
- Add graceful shutdown handling with signal handlers and PID file cleanup
- Add configurable HTTP access log toggle via config.ini (default: disabled)
- Replace print() statements with proper logger calls throughout
- Update .gitignore to exclude PID files (meshview-db.pid, meshview-web.pid)
- Update documentation for new logging configuration options

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-01 17:49:01 -07:00
Pablo Revilla d2d18746ef Fixed bug on edges API 2025-10-01 14:00:14 -07:00
Pablo Revilla 7146f69beb update protobuf 2025-10-01 12:07:43 -07:00
Pablo Revilla db8703919d Merge pull request #53 from jkrauska/jkrauska/mapzoom
Add url parameters to /map to support zoomed view
2025-10-01 11:43:45 -07:00
Pablo Revilla baeaf29df0 Merge pull request #51 from Cloud-121/master
Fix Client_BASE not showing in Mesh Graphs
2025-10-01 09:18:50 -07:00
Pablo Revilla 44ddfe7ed7 update protobuf 2025-10-01 08:08:50 -07:00
Pablo Revilla fc28dcc53e Merge pull request #52 from jkrauska/master
Minor README Tweaks and gitignore add
2025-10-01 08:05:34 -07:00
Pablo Revilla 81a2c0c7ca update protobuf 2025-10-01 08:01:00 -07:00
Joel Krauska c7f5467acb Add url parameters to /map to support zoomed view 2025-09-30 17:56:35 -07:00
Joel Krauska 396e5ccbf1 Minor README Tweaks and gitignore add 2025-09-30 17:17:55 -07:00
Cloud Hayes 0a522f9a19 Fix Client_BASE not showing in Mesh Graphs 2025-09-30 17:40:06 -05:00
Pablo Revilla 40c5d4e291 update protobuf 2025-09-25 13:37:55 -07:00
Pablo Revilla 550a266212 update protobuf 2025-09-24 20:28:33 -07:00
Pablo Revilla 238ac409f8 testing new integration 2025-09-24 20:16:10 -07:00
Pablo Revilla ee640b2cec Update .gitmodules 2025-09-24 20:13:28 -07:00
Pablo Revilla 561d410e6a Updates stats with pie chart and report for channel 2025-09-24 19:55:41 -07:00
Pablo Revilla a20dafe714 Updates stats with pie chart and report for channel 2025-09-24 19:54:33 -07:00
Pablo Revilla 3cd93c08a7 Updates stats with pie chart and report for channel 2025-09-24 19:39:06 -07:00
Pablo Revilla 11537fdef1 Merge remote-tracking branch 'origin/master' 2025-09-24 19:38:55 -07:00
Pablo Revilla 5068f7acb1 Updates stats with pie chart and report for channel 2025-09-24 17:23:12 -07:00
Pablo Revilla 85f04f485e Merge pull request #36 from madeofstown/master
New Install Procedure
2025-09-24 17:17:16 -07:00
Pablo Revilla a094b3edd5 Merge branch 'master' into master 2025-09-24 17:17:01 -07:00
Pablo Revilla 8d7f72ac6e Updates stats with pie chart and report for channel 2025-09-22 10:25:24 -07:00
Pablo Revilla 03e198b80c Updates stats with pie chart and report for channel 2025-09-22 10:18:06 -07:00
Pablo Revilla 86b4fa6cbf Update README.md 2025-09-19 21:48:39 -07:00
Pablo Revilla e6424e3c6d Update README.md 2025-09-19 21:48:13 -07:00
Pablo Revilla e2c1e311b8 Update README.md 2025-09-19 11:11:25 -07:00
Pablo Revilla 02f63fca70 Work on DB cleanup tool 2025-09-19 10:50:15 -07:00
Pablo Revilla f9a6f3dff2 Work on DB cleanup tool 2025-09-19 09:20:43 -07:00
Pablo Revilla 0da2ef841c Work on DB cleanup tool 2025-09-19 09:11:00 -07:00
Pablo Revilla 4ffd287c84 Work on DB cleanup tool 2025-09-19 08:50:10 -07:00
Pablo Revilla ec0dd4ef03 Work on status page 2025-09-18 10:28:55 -07:00
Pablo Revilla 608fde9e9c Work on db cleanup tool 2025-09-18 10:25:27 -07:00
Pablo Revilla 7c40c64de8 Work on db cleanup tool 2025-09-18 09:45:01 -07:00
Pablo Revilla 4f4c18fa14 Work on db cleanup tool 2025-09-18 09:37:24 -07:00
Pablo Revilla 6eb1cdbd2d Work on db cleanup tool 2025-09-18 07:40:25 -07:00
Pablo Revilla cad3051e7f Work on db cleanup tool 2025-09-18 07:38:58 -07:00
Pablo Revilla 2b9422efbc fixed spelling of variable firehouse_interval 2025-09-18 07:34:26 -07:00
Pablo Revilla ddb691d4de fixed spelling of variable firehouse_interval 2025-09-17 23:05:05 -07:00
Pablo Revilla bbab5fefd0 make the /api/config endpoint restrictive to what it provides. It will only show what is needed for the current code. 2025-09-17 23:01:29 -07:00
Pablo Revilla 6e223a066a make the /api/config endpoint restrictive to what it provides. It will only show what is needed for the current code. 2025-09-17 23:00:44 -07:00
Pablo Revilla 61b74473e3 make the /api/config endpoint restrictive to what it provides. It will only show what is needed for the current code. 2025-09-17 22:55:40 -07:00
Pablo Revilla f06fa3a4a3 Added Database cleanup feature to startdb.py 2025-09-17 22:22:35 -07:00
Pablo Revilla 9d4ebc00f6 Added Database cleanup feature to startdb.py 2025-09-17 22:15:12 -07:00
Pablo Revilla a69d1a5729 Added Database cleanup feature to startdb.py 2025-09-17 22:12:04 -07:00
Pablo Revilla d5272c1aec added index to API list 2025-09-17 07:44:48 -07:00
Pablo Revilla 4201c5476b Fixed multiple responses for active map 2025-09-15 16:05:30 -07:00
Pablo Revilla 6b4a33aeb2 Fixed multiple responses for active map 2025-09-15 13:42:52 -07:00
Pablo Revilla 77cf3df06a Fixed multiple responses for active map 2025-09-15 12:29:50 -07:00
Pablo Revilla a532fb0a16 Merge remote-tracking branch 'origin/master' 2025-09-15 09:59:52 -07:00
Pablo Revilla 48a4be887c New charts added to stats as we have access not to nodes via API 2025-09-15 09:59:19 -07:00
Pablo Revilla 8dec274045 New charts added to stats as we have access not to nodes via API 2025-09-12 17:42:19 -07:00
Pablo Revilla b09ea7192c Update sample.config.ini
added:

# Updates intervals in seconds, zero or negative number means no updates
# defaults will be 3 seconds
map_interval=3
firehose_interal=3
2025-09-12 17:40:52 -07:00
Pablo Revilla 93bad96268 New charts added to stats as we have access not to nodes via API 2025-09-12 16:15:02 -07:00
Pablo Revilla bb5dba23d0 New charts added to stats as we have access not to nodes via API 2025-09-12 12:15:10 -07:00
Pablo Revilla fd57310b0e nodelist now also works with API 2025-09-12 11:46:20 -07:00
Pablo Revilla 168763357a nodelist now also works with API 2025-09-12 11:19:55 -07:00
Pablo Revilla 285db92a53 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	meshview/templates/map.html
2025-09-12 09:54:09 -07:00
Pablo Revilla 3897ce268e Merge pull request #47 from alecperkins/feature/graph-colors
Add colors and weighting to graph, condense labels
2025-09-12 09:42:27 -07:00
Pablo Revilla aea81f77f8 nodelist now also works with API 2025-09-12 07:46:45 -07:00
Pablo Revilla 7e76424053 Merge pull request #46 from alecperkins/feature/map-fill-screen
Fill screen with map
2025-09-11 21:06:07 -07:00
Pablo Revilla 9c4171928a nodelist now also works with API 2025-09-11 07:54:00 -07:00
Pablo Revilla d69a7959b8 Added API pages and moved chat to API/JS 2025-09-10 22:31:09 -07:00
Pablo Revilla 81fe8353c4 Added API pages and moved chat to API/JS 2025-09-10 22:25:22 -07:00
Pablo Revilla 868a1658ce Added API pages and moved chat to API/JS 2025-09-10 22:04:02 -07:00
Alec Perkins a93f8d7212 feat: Add colors and weighting to graph, condense labels
The colors indicate the role, and the edges are weighted by how many traceroutes contributed to that edge. This helps to communicate the quality of the connection. The colors and node size based on role make it easier to see the composition of the graph. This also moves the look-and-feel pieces into the template only, and attempts to centralize the color definitions.
2025-09-10 18:04:12 -04:00
Alec Perkins 3eca96a01d feat: Fill screen with map
A naive approach. Ideally it would use flexbox but that would require more substantial changes.
2025-09-10 17:21:03 -04:00
Pablo Revilla 1e7fccae82 Added the traceroute and neighbours to the map 2025-09-08 09:35:18 -07:00
Pablo Revilla 5bef93b186 Merge pull request #40 from jschrempp/arrowheads
Add direction arrow heads to main map edges shown on node click
2025-09-08 09:33:46 -07:00
Pablo Revilla 8c01a7b4a0 Added the traceroute and neighbours to the map 2025-09-05 07:43:15 -07:00
Pablo Revilla 783972e4bd Added the traceroute and neighbours to the map 2025-09-04 09:05:37 -07:00
Pablo Revilla c42173cdc8 Added the traceroute and neighbours to the map 2025-09-03 09:37:17 -07:00
Jim Schrempp 52dc78b8d0 added direction arrow heads to main map edges shown on node click 2025-08-31 07:00:10 -07:00
Pablo Revilla ce8717b55a Added the traceroute and neighbours to the map 2025-08-29 09:42:56 -07:00
Pablo Revilla 6836d42fd6 Added the traceroute and neighbours to the map 2025-08-29 09:28:35 -07:00
Pablo Revilla 396d919df3 Added the traceroute and neighbours to the map 2025-08-29 09:19:56 -07:00
Pablo Revilla c374167568 Added the traceroute and neighbours to the map 2025-08-29 09:06:04 -07:00
Pablo Revilla 1ccc3bfc7d Added the traceroute and neighbours to the map 2025-08-28 16:19:47 -07:00
Pablo Revilla 0500be4541 Added the traceroute and neighbours to the map 2025-08-28 16:08:38 -07:00
Pablo Revilla a4533c33e5 Added the traceroute and neighbours to the map 2025-08-28 15:56:44 -07:00
Pablo Revilla d0799f44ec Added the traceroute and neighbours to the map 2025-08-28 15:32:52 -07:00
Pablo Revilla a022795251 Added the traceroute and neighbours to the map 2025-08-28 09:12:54 -07:00
Pablo Revilla 7b8f2e6678 Added the traceroute and neighbours to the map 2025-08-28 09:05:01 -07:00
Pablo Revilla 34cdb03791 Added the traceroute and neighbours to the map 2025-08-28 07:50:34 -07:00
Pablo Revilla 0629b7b1ef Added the traceroute and neighbours to the map 2025-08-27 16:27:24 -07:00
Pablo Revilla 749fc615a8 Added the traceroute and neighbours to the map 2025-08-27 16:12:04 -07:00
Pablo Revilla 9f93602b51 Added the traceroute and neighbours to the map 2025-08-27 14:51:08 -07:00
Pablo Revilla 2295751e18 Added the traceroute and neighbours to the map 2025-08-27 14:17:46 -07:00
Pablo Revilla eccba20a13 Added the traceroute and neighbours to the map 2025-08-27 14:13:37 -07:00
Pablo Revilla 9eae03013d Added the traceroute and neighbours to the map 2025-08-27 14:08:11 -07:00
Pablo Revilla d305ea424d Added the traceroute and neighbours to the map 2025-08-27 13:15:22 -07:00
Pablo Revilla e40b96168a Added the traceroute and neighbours to the map 2025-08-27 12:35:49 -07:00
Pablo Revilla d38c587a76 Added the traceroute and neighbours to the map 2025-08-27 12:28:19 -07:00
Pablo Revilla ec02d72f89 Added the traceroute and neighbours to the map 2025-08-27 12:25:13 -07:00
Pablo Revilla 93b7276b9e Added the traceroute and neighbours to the map 2025-08-27 11:25:26 -07:00
Pablo Revilla f72e5178b2 Added the traceroute and neighbours to the map 2025-08-27 09:54:55 -07:00
Pablo Revilla 21760552e4 Added the traceroute and neighbours to the map 2025-08-27 07:30:28 -07:00
Pablo Revilla fdfbdd50ba Fixed bug with nodegraph.html it was not able to handle some characters on the name_long 2025-08-26 13:23:55 -07:00
Pablo Revilla 34fd41c10f Adding live-map and static pages for the apis 2025-08-25 20:32:24 -07:00
Pablo Revilla 7e80e83850 Adding live-map and static pages for the apis 2025-08-25 20:21:20 -07:00
Pablo Revilla b8647ee993 Adding live-map and static pages for the apis 2025-08-25 20:13:52 -07:00
Pablo Revilla de50e2bc7b Adding live-map and static pages for the apis 2025-08-25 20:01:33 -07:00
Pablo Revilla ad93483cd0 Adding live-map and static pages for the apis 2025-08-25 17:08:49 -07:00
Pablo Revilla 75eb392182 Adding live-map and static pages for the apis 2025-08-25 16:57:55 -07:00
Pablo Revilla 94a03d7cbb Adding live-map and static pages for the apis 2025-08-25 16:29:45 -07:00
Pablo Revilla e7963683f1 Adding live-map and static pages for the apis 2025-08-25 14:57:10 -07:00
Pablo Revilla 941de1c2fb Adding live-map and static pages for the apis 2025-08-25 14:27:19 -07:00
Pablo Revilla 0a2f7e50c9 Adding live-map and static pages for the apis 2025-08-25 14:07:47 -07:00
Pablo Revilla 0e548d4c03 Adding live-map and static pages for the apis 2025-08-25 14:04:59 -07:00
Pablo Revilla dee948e26c Adding live-map and static pages for the apis 2025-08-25 14:03:47 -07:00
Pablo Revilla 4c815ec486 Changing the way we load protobuf definitions since meshtastic added a submodule that is not loading properly 2025-08-21 10:49:30 -07:00
Pablo Revilla 2cf2c32e31 Changing the way we load protobuf definitions since meshtastic added a submodule that is not loading properly 2025-08-21 10:30:04 -07:00
Pablo Revilla 2a55309bde Changing the way we load protobuf definitions since meshtastic added a submodule that is not loading properly 2025-08-20 08:31:52 -07:00
madeofstown 7e3076c0e2 Update README.md
symlink target is relative to link location
2025-08-19 19:24:58 -07:00
madeofstown e3f5c0f006 Delete meshtastic/protobuf 2025-08-19 19:14:48 -07:00
madeofstown 572e79c9ac Update .gitmodules 2025-08-19 19:10:46 -07:00
madeofstown fb70f644e5 Update README.md
Change install procedure to mitigate broken submodule
2025-08-19 19:08:38 -07:00
madeofstown 954d6300de Update .gitignore 2025-08-19 17:35:26 -07:00
madeofstown 9ceca0eea9 Update .gitmodules 2025-08-19 17:31:36 -07:00
madeofstown 24f768f725 Merge pull request #5 from madeofstown/testing
re-add meshtastic/python submodule
2025-08-19 17:14:35 -07:00
madeofstown 89f3eade15 re-add meshtastic/python submodule 2025-08-19 17:12:40 -07:00
Pablo Revilla f147360bfc Delete .gitmodules 2025-08-19 16:20:09 -07:00
Pablo Revilla a3186e6cca Update protobuf 2025-08-19 15:20:27 -07:00
Pablo Revilla 4e06b5b7cc Update .gitmodules 2025-08-19 15:19:15 -07:00
Pablo Revilla 40235c9c11 Updating the protobuf 2025-08-19 14:54:27 -07:00
Pablo Revilla d025255748 Update .gitmodules 2025-08-19 14:52:26 -07:00
Pablo Revilla 333d538955 Update .gitmodules 2025-08-19 13:02:45 -07:00
Pablo Revilla ed0c15a92e Delete .idea directory 2025-08-19 12:52:19 -07:00
Pablo Revilla 8b7de8d30b Update .gitmodules 2025-08-19 12:49:19 -07:00
Pablo Revilla ee2a449c55 Update .gitmodules 2025-08-19 12:41:00 -07:00
Pablo Revilla 7bde05e6da Update .gitmodules 2025-08-19 12:22:36 -07:00
Pablo Revilla 9648b9a849 Update .gitmodules 2025-08-19 12:14:44 -07:00
Pablo Revilla 7d3b94f23c Update .gitmodules 2025-08-19 12:00:34 -07:00
Pablo Revilla 563e239ee9 test 2025-08-19 11:56:46 -07:00
Pablo Revilla 46142dcb7b Update .gitmodules 2025-08-19 11:41:12 -07:00
Pablo Revilla 501adc4519 Update .gitmodules 2025-08-19 11:22:25 -07:00
Pablo Revilla 3135ad00f1 Update .gitmodules 2025-08-19 11:14:13 -07:00
Pablo Revilla 6dd40bea29 Update .gitmodules 2025-08-19 11:06:31 -07:00
Pablo Revilla 722c404715 Update .gitmodules 2025-08-19 11:05:27 -07:00
Pablo Revilla 734162fb48 Update .gitmodules 2025-08-19 10:53:50 -07:00
Pablo Revilla 64c9d23de6 Update .gitmodules 2025-08-19 10:53:03 -07:00
Pablo Revilla da92fd8155 Update .gitmodules 2025-08-19 10:46:42 -07:00
Pablo Revilla a88db0cd92 Update .gitmodules 2025-08-19 10:41:24 -07:00
Pablo Revilla 1522bf1138 Update .gitmodules 2025-08-19 10:40:10 -07:00
Pablo Revilla 0ffdc60c62 Update .gitmodules 2025-08-19 10:29:28 -07:00
Pablo Revilla efd3742f99 New updates to documentation 2025-08-19 10:13:51 -07:00
Pablo Revilla 078ace50aa New updates to documentation 2025-08-19 09:07:32 -07:00
Pablo Revilla b53bcd2d7b New updates to documentation 2025-08-18 14:27:00 -07:00
Pablo Revilla fedbd10bf8 Merge pull request #34 from jschrempp/patch-1
Update README.md
2025-08-15 08:33:24 -07:00
Pablo Revilla 9d3b2af087 Merge pull request #33 from SConaway/error-page
Use error template for more issues
2025-08-15 08:32:34 -07:00
Jim Schrempp c6f91b4d4e Update README.md
added note on the bind = setting for OSX
2025-08-14 21:23:24 -07:00
Steven Conaway e00c0a426a Show tracebacks on errors 2025-08-14 18:48:30 -07:00
Steven Conaway 82783b301f Use error template for issues with node info page 2025-08-14 11:27:25 -07:00
Pablo Revilla 59f7bc73e1 New updates to documentation 2025-08-12 15:26:12 -07:00
Pablo Revilla ead29f1dbb New updates to documentation 2025-08-12 15:25:32 -07:00
Pablo Revilla 2cc913d133 Add the Replying to link to the chat page 2025-08-12 15:20:14 -07:00
Pablo Revilla ef105a0928 Add the Replying to link to the chat page 2025-08-12 14:59:17 -07:00
Pablo Revilla f2afd3d0ee Add the Replying to link to the chat page 2025-08-12 12:55:26 -07:00
Pablo Revilla b163b773c8 Add the Replying to link to the chat page 2025-08-12 12:43:43 -07:00
Pablo Revilla b9e0cd10bc Statistic page redo 2025-08-12 12:37:09 -07:00
Pablo Revilla 77f8746b4a Statistic page redo 2025-08-12 12:30:59 -07:00
Pablo Revilla b212c57ad7 Statistic page redo 2025-08-11 17:04:24 -07:00
Pablo Revilla 8d0a13729c add API code for /api/packets 2025-08-11 16:07:56 -07:00
Pablo Revilla 573b1b1571 add API code for /api/packets 2025-08-11 15:57:45 -07:00
Pablo Revilla 32dd6b5c96 add API code for /api/packets 2025-08-11 15:50:47 -07:00
Pablo Revilla a8313cd921 add API code for /api/packets 2025-08-11 14:26:40 -07:00
Pablo Revilla edb0f7a23d add API code for /api/packets 2025-08-11 14:00:52 -07:00
Pablo Revilla d8ceb19163 add API code for /api/packets 2025-08-11 13:57:30 -07:00
Pablo Revilla 635cb7bb41 add API code for /api/packets 2025-08-11 09:20:16 -07:00
Pablo Revilla 69c819ee22 add API code for /api/packets 2025-08-11 09:20:06 -07:00
Pablo Revilla d405524ff5 add API code for /api/packets 2025-08-07 16:06:24 -07:00
Pablo Revilla 9065616347 add API code for /api/packets 2025-08-07 16:01:13 -07:00
Pablo Revilla c77cbf70e8 add API code for /api/packets 2025-08-06 17:27:04 -07:00
Pablo Revilla 706c71ef39 add API code for /api/packets 2025-08-06 17:18:48 -07:00
Pablo Revilla a9514a0238 add API code for /api/packets 2025-08-06 16:47:17 -07:00
Pablo Revilla 5671983ebd add API code for /api/packets 2025-08-06 16:46:08 -07:00
Pablo Revilla fc8e63bdf7 add API code for /api/packets 2025-08-06 16:16:28 -07:00
Pablo Revilla b2c307a392 add API code for /api/packets 2025-08-06 15:26:09 -07:00
Pablo Revilla cb7df2c35a add API code for /api/packets 2025-08-06 15:18:49 -07:00
Pablo Revilla 781ae14fd7 add API code for /api/packets 2025-08-06 15:11:30 -07:00
Pablo Revilla 78f22603dd add API code for /api/packets 2025-08-06 13:30:41 -07:00
Pablo Revilla 1c49529846 add API code for /api/packets 2025-07-23 08:53:23 -07:00
Pablo Revilla 4b5c2891ba add API code for /api/packets 2025-07-23 08:53:06 -07:00
Pablo Revilla 75a2189862 add API code for /api/packets 2025-07-23 08:49:18 -07:00
Pablo Revilla f3dfdf6f04 add API code 2025-07-22 15:12:03 -07:00
Pablo Revilla d8ab614f79 add API code 2025-07-22 15:10:56 -07:00
Pablo Revilla 4a700700d2 added another running instance. 2025-07-22 14:58:14 -07:00
Pablo Revilla 8c99b63399 added another running instance. 2025-07-22 14:49:43 -07:00
Pablo Revilla b47240fa06 added another running instance. 2025-07-21 13:12:52 -07:00
Pablo Revilla 2ff89a2041 added another running instance. 2025-07-02 16:55:01 -07:00
Pablo Revilla 9d918a28f9 added another running instance. 2025-07-02 16:50:02 -07:00
Pablo Revilla 6361961a20 changed the label for a node that does not report firmware from None to N/A 2025-06-30 14:00:59 -07:00
Pablo Revilla 2192fa02a4 clean up the map.html template 2025-06-27 10:17:29 -07:00
Pablo Revilla a4aa61dca1 update version and fix bug introuced a few days back 2025-06-26 18:54:20 -07:00
Pablo Revilla baf66487de update version 2025-06-26 18:45:30 -07:00
Pablo Revilla 621d347849 update version 2025-06-26 18:33:35 -07:00
Pablo Revilla a58aa5b211 update version 2025-06-24 20:00:30 -07:00
Pablo Revilla 6b4b1b52ce update version 2025-06-24 16:26:27 -07:00
Pablo Revilla 1729b6556f update version 2025-06-24 15:09:04 -07:00
Pablo Revilla f462889b62 update version 2025-06-24 13:46:23 -07:00
Pablo Revilla 7d8a757788 update version 2025-06-24 13:08:19 -07:00
Pablo Revilla 66a9dc510d Merge remote-tracking branch 'origin/master' 2025-06-24 12:31:40 -07:00
Pablo Revilla 33a0992c97 update version 2025-06-24 12:31:22 -07:00
Pablo Revilla 6370f694d6 Merge pull request #29 from skullydazed/pad_node_ids
Pad Node IDs so they can be copied and pasted successfully
2025-06-23 09:53:52 -07:00
Zach White 1888a70e35 pad nodeids 2025-06-14 20:23:46 -07:00
Pablo Revilla b1106d8558 update version 2025-06-12 15:12:56 -07:00
Pablo Revilla 762a771876 Worked on README.md to add cleanup instructions 2025-06-12 11:31:53 -07:00
Pablo Revilla a72dde6a58 Worked on README.md to add cleanup instructions 2025-06-09 13:03:50 -07:00
Pablo Revilla 000f5def04 Worked on README.md to add cleanup instructions 2025-06-09 09:55:41 -07:00
Pablo Revilla 08ccbc9a6c Worked on README.md to add cleanup instructions 2025-06-06 15:58:57 -07:00
Pablo Revilla 76a07535d4 Worked on README.md to add cleanup instructions 2025-06-06 15:53:29 -07:00
Pablo Revilla 2fe52b8744 Worked on README.md to add cleanup instructions 2025-06-06 15:51:27 -07:00
Pablo Revilla 064db62ce4 Worked on README.md to add cleanup instructions 2025-06-06 15:50:44 -07:00
Pablo Revilla 8ff88e390f Worked on README.md to add cleanup instructions 2025-06-06 15:49:25 -07:00
Pablo Revilla cb1e4e066d Worked on README.md to add cleanup instructions 2025-06-06 15:46:55 -07:00
Pablo Revilla 8e30de71f2 Worked on README.md to add cleanup instructions 2025-06-06 15:45:40 -07:00
Pablo Revilla 98b21af26e Worked on README.md to add cleanup instructions 2025-06-06 15:44:07 -07:00
Pablo Revilla 6e7167bc89 Merge pull request #27 from kabili207/master
Thank you. I will merge it.
2025-06-06 11:10:48 -07:00
Pablo Revilla 55c13588bf Fixed fuzzy node logic and error 2025-06-06 10:55:11 -07:00
Pablo Revilla 894e96e5dd Fixed fuzzy node logic and error 2025-06-06 10:52:32 -07:00
Pablo Revilla 4af559646d Fixed fuzzy node logic and error 2025-06-06 08:07:58 -07:00
Pablo Revilla e1e1a1a1cb Fixed fuzzy node logic and error 2025-06-06 08:07:01 -07:00
Pablo Revilla 3a9f2eb5ab Changed zoom factor on maps 2025-06-05 22:33:57 -07:00
Pablo Revilla b49a8d61e8 Changed zoom factor on maps 2025-06-05 16:05:58 -07:00
Pablo Revilla 5fde038ddc added version to the footer. 2025-06-05 15:46:29 -07:00
Pablo Revilla 6766f49d6f get some new screenshots 2025-06-05 15:44:07 -07:00
Amy Nagle 6b946d1b9c Process all data in MapReport packet 2025-06-04 14:22:44 -04:00
Pablo Revilla ab8f56a7ef get some new screenshots 2025-06-03 13:44:06 -07:00
Pablo Revilla 52e1da3d99 get some new screenshots 2025-06-03 13:42:08 -07:00
Pablo Revilla 11d8385d13 get some new screenshots 2025-06-03 10:37:26 -07:00
Pablo Revilla df6d02ff59 get some new screenshots 2025-06-03 10:32:52 -07:00
Pablo Revilla 49743f72ae get some new screenshots 2025-06-03 10:32:01 -07:00
Pablo Revilla ec83bc1822 fixed base.html so that if a value in the quick links is not set it will not report an error. 2025-06-03 08:28:27 -07:00
Pablo Revilla 44657a8947 Merge remote-tracking branch 'origin/master' 2025-06-03 08:26:37 -07:00
Pablo Revilla 07aafb87e1 fixed base.html so that if a value in the quick links is not set it will not report an error. 2025-06-03 08:26:30 -07:00
Pablo Revilla ef9fb202a3 Update README.md 2025-06-03 08:25:03 -07:00
Pablo Revilla 35d68cd004 fixed base.html so that if a value in the quick links is not set it will not report an error. 2025-06-03 08:23:10 -07:00
Pablo Revilla 39724a99b4 fixed base.html so that if a value in the quick links is not set it will not report an error. 2025-06-03 08:16:39 -07:00
Pablo Revilla 5ba9b17f09 add timeout to 60 seconds 2025-06-02 17:16:36 -07:00
Pablo Revilla ab1b9c53e2 add timeout to 60 seconds 2025-06-02 15:25:49 -07:00
Pablo Revilla b2f1944105 Cleaned up some print statements 2025-06-02 13:37:05 -07:00
Pablo Revilla fbd84f1fec Cleaned up some print statements 2025-06-02 13:35:32 -07:00
Pablo Revilla 5b0d07e2d1 Added Chicago to the list of sites. 2025-06-01 23:05:12 -07:00
Pablo Revilla 4d9d893868 Changed so that the Top page starts with long fast selected 2025-06-01 22:54:42 -07:00
Pablo Revilla 9bca3566f6 Changed so that the Top page starts with long fast selected 2025-06-01 22:31:21 -07:00
Pablo Revilla 586ecc5d69 Remove pagination from the node's page 2025-06-01 22:26:20 -07:00
Pablo Revilla 6b70c119c2 Removed extra button in the firehose.html file 2025-06-01 22:19:27 -07:00
Pablo Revilla 82ef3cde88 Merge remote-tracking branch 'origin/master' 2025-06-01 22:15:31 -07:00
Pablo Revilla cfa4d4003f Removed extra button in the firehose.html file 2025-06-01 22:15:11 -07:00
Pablo Revilla 38b0d6f630 Merge pull request #26 from gsilvr/meshview-docker
Added a working dockerfile and readme
2025-06-01 21:56:10 -07:00
Pablo Revilla e45be00784 Added pagination to the nodes list 2025-06-01 21:31:57 -07:00
George f037eb27f9 Added a working dockerfile and readme 2025-06-01 12:38:49 -07:00
Pablo Revilla 124c5f2840 Added pagination to the nodes list 2025-05-27 09:28:09 -07:00
Pablo Revilla 5f8c78cf98 Fix UI bug with chat.html 2025-05-23 10:31:42 -07:00
Pablo Revilla dadcad3af3 Added seach to all the pages by adding it to base.html 2025-05-23 10:23:54 -07:00
Pablo Revilla eefa896780 Added seach to all the pages by adding it to base.html 2025-05-23 09:09:48 -07:00
Pablo Revilla dc0b14006f Modified the power and battery graph to show both axis 2025-05-23 07:26:08 -07:00
Pablo Revilla 49922ac617 Modified the README.md 2025-05-22 18:28:06 -07:00
Pablo Revilla 2d7dbdff49 Readded node_graphs 2025-05-22 18:24:08 -07:00
Pablo Revilla b1f1e7c6da Added self updating firehose.html and chat.html 2025-05-22 15:56:33 -07:00
Pablo Revilla ada5c1e0a3 Merge remote-tracking branch 'origin/master' 2025-05-22 15:51:05 -07:00
Pablo Revilla 0c443dde25 Added self updating firehose.html and chat.html 2025-05-22 15:50:47 -07:00
Pablo Revilla a203d5ee30 Update README.md 2025-05-22 14:20:49 -07:00
Pablo Revilla 1ddc3445c3 Update README.md 2025-05-22 14:14:41 -07:00
Pablo Revilla 960a18586d Added self updating firehose.html and chat.html 2025-05-22 10:29:10 -07:00
Pablo Revilla f08f6f9b93 Added self updating firehose.html and chat.html 2025-05-22 10:19:50 -07:00
Pablo Revilla 56fef8312b Cleaned up the import section as we removed 4 packages 2025-05-21 12:17:19 -07:00
Pablo Revilla 85427fd2a8 Modified all graphs to eliminate the errors and use eCharts 2025-05-21 12:13:51 -07:00
Pablo Revilla 32437584a9 Modified all graphs to eliminate the errors and use eCharts 2025-05-21 11:56:17 -07:00
Pablo Revilla 33bdb9d668 Modified all graphs to eliminate the errors and use eCharts 2025-05-21 11:29:41 -07:00
Pablo Revilla dfb4b72056 Modified all graphs to eliminate the errors and use eCharts 2025-05-21 11:18:36 -07:00
Pablo Revilla 2b3be8bf93 Modified the Neighbours graphs to eliminate the errors. 2025-05-21 09:37:23 -07:00
Pablo Revilla a6c9970054 Modified the Neighbours graphs to eliminate the errors. 2025-05-21 09:14:17 -07:00
Pablo Revilla f9319472b1 Added site in Spain 2025-05-20 22:09:55 -07:00
Pablo Revilla 404996716a Added site in Spain 2025-05-20 10:58:58 -07:00
Pablo Revilla 5631f84b1a Updates to README.md 2025-05-12 11:07:40 -07:00
Pablo Revilla ae15f0f291 Updates to README.md 2025-05-12 11:02:49 -07:00
Pablo Revilla 6f13be8a58 Added the ability to show receiving node location on map even if the main node is does not have location 2025-05-08 11:09:22 -07:00
Pablo Revilla 295f7083d7 Added the ability to show receiving node location on map even if the main node is does not have location 2025-05-08 10:49:18 -07:00
Pablo Revilla 67f769ec8e Merge all Graphs into one section 2025-05-08 10:20:16 -07:00
Pablo Revilla 6a66e3e579 Merge all Graphs into one section 2025-05-08 10:19:05 -07:00
Pablo Revilla 20f3ec4fab Merge all Graphs into one section 2025-05-07 22:04:43 -07:00
Pablo Revilla 8ce672c5ab Merge all Graphs into one section 2025-05-07 21:43:01 -07:00
Pablo Revilla c0d69f13de Update README.md 2025-05-07 09:12:41 -07:00
Pablo Revilla a3e867fc10 Merge pull request #20 from PSandro/master
config: fix server->bind when more than 1 char
2025-05-07 08:58:51 -07:00
Pablo Revilla 91bb0e006f Merge pull request #21 from PSandro/config-add-net-tag
add net_tag to sample.config.ini
2025-05-07 08:56:24 -07:00
Sandro Pischinger 35f8b4d234 add net_tag to sample.config.ini
Not having set net_tag in the config file causes a KeyError when opening
Weekly Net as the net_tag configuration is expected. Thus setting a default value.

Signed-off-by: Sandro Pischinger <mail@sandropischinger.de>
2025-05-04 18:09:01 +02:00
Sandro Pischinger 67f7d13ef6 config: fix server->bind when more than 1 char
Currently the bind option in the configuration file defaults to '*' and
is read during startup in web.py. The value of the host variable  is
of type string, but the current code tries to iterate through it,
suppusedly to support multiple hosts.
This would work if the value was of type array, holding multiple strings
of hostnames (similar to [mqtt]->topics, which is currently not
possible.

When setting 'bind=localhost', the code iterates through 'localhost'
and tries to start a TCPSite with a host of 'l', then 'o', then 'c' and
so on but failes at the first 'l' already since it cannot be resolved.

This commit changes the behaviour of 'bind' to only expect one value,
namely a string of the host where to bind to.

This change does not require any config changes in current productions
setups: The default bind value of '*' is still handled correctly and any
other bind values with more than one character currently fail anyways.

Signed-off-by: Sandro Pischinger <mail@sandropischinger.de>
2025-05-04 17:27:10 +02:00
Pablo Revilla d374de7bf3 Merge remote-tracking branch 'origin/master' 2025-05-02 11:24:50 -07:00
Pablo Revilla deb5b25da1 added version visivility. 2025-05-02 11:24:40 -07:00
Pablo Revilla 090d11fe28 added version visivility. 2025-05-02 11:23:13 -07:00
Pablo Revilla c5d2f42013 added version visivility. 2025-05-02 11:21:21 -07:00
Pablo Revilla c171ec52ec added version visivility. 2025-05-02 11:18:42 -07:00
Pablo Revilla 16332f928a Merge pull request #19 from tb0hdan/master
Add Canadaverse to the list of running instances
2025-05-01 20:27:53 -07:00
Pablo Revilla 36ddc97ca6 Made the number of node to show on map to be configurable 2025-05-01 20:17:00 -07:00
Pablo Revilla afd86cb214 Made the number of node to show on map to be configurable 2025-05-01 20:13:45 -07:00
Bohdan Turkynewych df5aa89946 Add Canadaverse to the list of running instances 2025-04-29 21:53:11 -04:00
Pablo Revilla 8fc04a5f18 Added popup link to the maps 2025-04-28 22:19:21 -07:00
Pablo Revilla 7d04035c60 Added popup link to the maps 2025-04-28 22:17:37 -07:00
Pablo Revilla 60ea735e11 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	startdb.py
2025-04-28 22:11:26 -07:00
Pablo Revilla f9e6765a68 Added popup link to the maps 2025-04-28 22:10:55 -07:00
Pablo Revilla 2851ee00bf Update startdb.py 2025-04-28 22:06:42 -07:00
Pablo Revilla f9c874bcc1 Revert "Added popup link to the maps"
This reverts commit 48d5dcbf7d.
2025-04-28 21:58:06 -07:00
Pablo Revilla b42630e6d0 Added popup link to the maps 2025-04-28 21:38:55 -07:00
Pablo Revilla 48d5dcbf7d Added popup link to the maps 2025-04-28 21:38:31 -07:00
Pablo Revilla 85c1e24b18 Added popup link to the maps 2025-04-28 21:37:11 -07:00
Pablo Revilla 94d23ed5a9 Added popup link to the maps 2025-04-28 21:36:20 -07:00
Pablo Revilla 36c754c49b Added popup link to the maps 2025-04-28 21:16:25 -07:00
Pablo Revilla 3663f8264e Trying to fix a bug that is reported by web.py when a packet id is requested and it does not exist. 2025-04-24 09:28:40 -07:00
Pablo Revilla 187284f5de Trying to fix a bug that is reported by web.py when a packet id is requested and it does not exist. 2025-04-24 09:17:47 -07:00
Pablo Revilla 422750599d Fix bug with time in map.html and web.py 2025-04-21 13:42:20 -07:00
Pablo Revilla c3c59bda53 Fix bug with time in map.html and web.py 2025-04-21 13:41:50 -07:00
Pablo Revilla 9f40458597 Merge pull request #18 from prokrypt/patch-6
Update store.py: localtime again
2025-04-17 15:55:33 -07:00
Pablo Revilla 2b1380eed0 Added channel selection on Top users statistics 2025-04-17 14:47:43 -07:00
Pablo Revilla 94dba95489 Added channel selection on Top users statistics 2025-04-17 14:31:25 -07:00
prokrypt 3d7aeb5d4e Update store.py: localtime again
moar localtime, moaaaaar
2025-04-14 16:00:45 -07:00
Pablo Revilla d1fb800534 Fixed the colors of the dots on the map. 2025-04-12 08:56:51 -07:00
Pablo Revilla 27f231deb2 Fixed the colors of the dots on the map. 2025-04-11 21:52:55 -07:00
Pablo Revilla 914910fe76 Adding new Top Users visualization 2025-04-11 09:18:56 -07:00
Pablo Revilla a8b5f75942 Adding new Top Users visualization 2025-04-10 14:40:40 -07:00
Pablo Revilla 60a5d98555 Adding new Top Users visualization 2025-04-10 14:32:32 -07:00
Pablo Revilla 6b5bd26b54 Now the tag for the weekly mesh can be configurable 2025-04-07 09:38:41 -07:00
Pablo Revilla b6af98925d Now the tag for the weekly mesh can be configurable 2025-04-07 09:36:53 -07:00
Pablo Revilla 1cbdb4fda6 Now the tag for the weekly mesh can be configurable 2025-04-07 09:08:28 -07:00
Pablo Revilla 0d536e2308 Now the tag for the weekly mesh can be configurable 2025-04-06 13:23:39 -07:00
Pablo Revilla e65b1eaeb6 Now the tag for the weekly mesh can be configurable 2025-04-06 13:22:28 -07:00
Pablo Revilla 1bc7957c65 Now the tag for the weekly mesh can be configurable 2025-04-06 13:15:27 -07:00
Pablo Revilla ad767ee457 Now the tag for the weekly mesh can be configurable 2025-04-06 11:56:02 -07:00
Pablo Revilla 2b39074e01 Updated Documentation 2025-04-06 10:52:55 -07:00
Pablo Revilla 5a39c166a7 Updated Documentation 2025-04-06 10:49:30 -07:00
Pablo Revilla c49b600b11 Updated Documentation 2025-04-06 10:41:55 -07:00
Pablo Revilla 887084de0f Changes:
new config file changes
2025-04-01 22:22:53 -07:00
Pablo Revilla 77dd2d16ed Changes:
new node graph
2025-04-01 22:10:39 -07:00
Pablo Revilla e0080ce811 Changes:
new node graph
2025-04-01 22:06:29 -07:00
Pablo Revilla ada666da44 Merge remote-tracking branch 'origin/master' 2025-03-30 17:48:41 -07:00
Pablo Revilla c916b91e18 Changes:
add a way to print out records
2025-03-30 17:48:25 -07:00
Pablo Revilla d7526daf46 Merge pull request #16 from prokrypt/patch-5
node_traffic.html: add WAYPOINT_APP
2025-03-30 17:45:44 -07:00
prokrypt d53eebbbeb node_traffic.html: add waypoint
because waypoints are fun and we need more.
2025-03-28 18:04:14 -07:00
Pablo Revilla 0ca730b67b Changes:
Modified the map to accept all kinds of channels
2025-03-28 14:34:34 -07:00
Pablo Revilla 91ff7edbf9 Changes:
- Added the link to another sample instance
2025-03-28 14:05:48 -07:00
Pablo Revilla f5566ed435 Changes:
- Added the link to another sample instance
2025-03-28 09:08:21 -07:00
Pablo Revilla 3a29fe87cb Changes:
- Added the link to another sample instance
2025-03-28 09:07:19 -07:00
Pablo Revilla ab1afec042 Changes:
- Added the link to another sample instance
2025-03-28 09:05:32 -07:00
Pablo Revilla 421cb802e4 Changes:
- Added the link to another sample instance
2025-03-28 09:04:09 -07:00
Pablo Revilla 4197d15bea Merge pull request #15 from prokrypt/patch-4
store.py: get_node_traffic should not count incoming traffic
2025-03-26 16:13:25 -07:00
prokrypt 12c29c3e49 store.py: get_node_traffic should not count incoming traffic
to match behavior of get_top_traffic_nodes
2025-03-26 14:30:20 -07:00
Pablo Revilla fd99067ea5 Merge pull request #14 from prokrypt/patch-3
store.py: fix timezone derp
2025-03-24 09:07:38 -07:00
prokrypt a37bbf136f store.py: missing some hours here too 2025-03-23 20:44:27 -07:00
prokrypt 6c21c1a05f store.py: fix timezone derp
... and gain 7 hours! yay
2025-03-23 20:37:35 -07:00
Pablo Revilla 682fdd8dd2 Changes:
- Added the ability to change the message on the weekly net
2025-03-20 13:27:32 -07:00
Pablo Revilla 45f650c0d8 try fixing any channel change 2025-03-18 07:44:54 -07:00
Pablo Revilla 124ea2bf30 Added numbers to the hop count 2025-03-17 21:51:55 -07:00
Pablo Revilla 52a6450076 Merge remote-tracking branch 'origin/master' 2025-03-17 21:45:02 -07:00
Pablo Revilla 1b0023485c Added numbers to the hop count 2025-03-17 21:44:46 -07:00
Pablo Revilla 69f1937b44 Merge pull request #13
mqtt_store.py: update channel on existing nodeinfo
2025-03-17 15:26:10 -07:00
Pablo Revilla 77db8e13f6 Added numbers to the hop count 2025-03-17 14:33:32 -07:00
Pablo Revilla a15dcf624f Added numbers to the hop count 2025-03-17 13:29:10 -07:00
Pablo Revilla 0b8597c704 Fixed Date format to mm/dd/YYYY.
Added /api that dumps a json with all the nodes.
2025-03-17 13:25:36 -07:00
Pablo Revilla 18b4ed1e2a Merge pull request #12 from prokrypt/patch-1
fix error when viewing packetlist for node with no nodeinfo
2025-03-17 11:02:41 -07:00
prokrypt 196ca07dac mqtt_store.py: update channel on seen nodeinfo 2025-03-16 13:20:33 -07:00
prokrypt c14fe63044 fix error when viewing packetlist for node with no nodeinfo 2025-03-15 15:29:37 -07:00
Pablo Revilla 4ef3c27937 Fixed Date format to mm/dd/YYYY.
Added /api that dumps a json with all the nodes.
2025-03-14 10:27:45 -07:00
Pablo Revilla da8490f3b4 Create sample.config.ini 2025-03-14 09:57:51 -07:00
Pablo Revilla 63724becf2 Merge pull request #11 from madeofstown/dev
mvrun.py
2025-03-14 09:47:57 -07:00
Pablo Revilla 45c4a1b14c Update README.md 2025-03-10 14:05:36 -07:00
Pablo Revilla 8ffbc90c51 Update README.md 2025-03-10 14:04:09 -07:00
Pablo Revilla 937845e5a5 Update README.md 2025-03-10 14:00:30 -07:00
Pablo Revilla 28fa11030d update screenshot 2025-03-10 13:58:33 -07:00
Pablo Revilla e6c41f72b5 Added coordinates customization to the config.ini file and map.
Added search capabilities to the mesh graphs.
2025-03-10 13:54:15 -07:00
madeofstown 68bd8e12e7 Merge branch 'pablorevilla-meshtastic:master' into dev 2025-03-10 06:40:25 -07:00
madeofstown 2ccdb53974 Update README.md
fix note
2025-03-09 21:21:52 -07:00
madeofstown e262c6dff8 mvrun.py changes 2025-03-09 21:20:55 -07:00
Pablo Revilla ccd91185ef Merge pull request #10 from madeofstown/dev
Website configuration in `config.ini`
2025-03-09 12:14:30 -07:00
madeofstown 83033a3a64 Website configuration in config.ini 2025-03-08 19:24:17 -08:00
Pablo Revilla 95abb79af4 config.py is in the wrong location 2025-03-08 15:42:32 -08:00
Pablo Revilla b525e57e91 changed font size on chat 2025-03-08 15:34:30 -08:00
Pablo Revilla d696f41d5f changed font size on chat 2025-03-08 10:45:23 -08:00
Pablo Revilla 4679d6ba55 changed font size on chat 2025-03-08 10:40:13 -08:00
Pablo Revilla 80b309e850 Merge pull request #9 from madeofstown/pablo-merge
Restoring what was lost
2025-03-08 09:58:51 -08:00
madeofstown e1cb984358 update README.md 2025-03-07 22:24:41 -08:00
madeofstown 408cc5c52b update sample.config.ini 2025-03-07 22:12:33 -08:00
madeofstown 93c1185447 i think its working now 2025-03-07 22:06:16 -08:00
madeofstown 10c1bea76f First Attempt
Try merge. Will need testing and tweaking.
2025-03-07 19:40:46 -08:00
madeofstown 031d75eb33 Merge branch 'pablo-merge' into site_config 2025-03-07 19:39:39 -08:00
Pablo Revilla a59787a010 Added more analytics by reporting on the number and kinds of packets each node sends in a 24 hour period. 2025-03-06 15:59:09 -08:00
Pablo Revilla ab5b8a7012 Added more analytics by reporting on the number and kinds of packets each node sends in a 24 hour period. 2025-03-06 15:50:33 -08:00
Pablo Revilla d910fadf24 Merge remote-tracking branch 'origin/master' 2025-03-05 16:53:14 -08:00
Pablo Revilla 9006444cf8 Major changes to the project
- Now the database process and the web process are separate.
- Added Map
- Added new graphing tools
2025-03-05 16:53:05 -08:00
Pablo Revilla 45ce4c17e5 Update README.md 2025-03-05 16:45:26 -08:00
Pablo Revilla 19aba18fcd Update README.md 2025-03-05 16:44:26 -08:00
Pablo Revilla 707426dfd6 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	meshview/store.py
#	meshview/templates/node.html
#	meshview/web.py
2025-03-05 16:12:59 -08:00
Pablo Revilla 5f97274e80 Major changes to the project
- Now the database process and the web process are separate.
- Added Map
- Added new graphing tools
2025-03-05 16:11:40 -08:00
madeofstown ae0748d874 Merge pull request #3 from pablorevilla-meshtastic/master
Merge pull request #8 from madeofstown/net-graph
2025-03-02 17:49:03 -08:00
madeofstown c8bc651970 upload local 2025-03-02 17:12:42 -08:00
Pablo Revilla 445ffbc1fb Merge pull request #8 from madeofstown/net-graph
Fix the Network Graph button
2025-02-26 20:40:43 -08:00
madeofstown e879030d70 Update README.md
technically flags are boolean arguments
2025-02-23 14:41:27 -08:00
madeofstown 272476c700 Update README.md
A few more changes - including a screenshot!
2025-02-23 14:37:56 -08:00
madeofstown d381f9c009 Add files via upload 2025-02-23 14:30:47 -08:00
madeofstown 518f7f0c2f Delete screenshots/image.png 2025-02-23 14:30:12 -08:00
madeofstown a66b3aa4f8 Add files via upload 2025-02-23 14:28:44 -08:00
madeofstown 334ffb03fe Delete screenshots/image.png 2025-02-23 14:28:21 -08:00
madeofstown 5ebfb4bf67 Add files via upload 2025-02-23 14:26:46 -08:00
madeofstown e6680ff486 Rename image.png to nodeinfo.png 2025-02-23 14:25:09 -08:00
madeofstown 65ae1bb204 Add files via upload 2025-02-23 14:24:27 -08:00
madeofstown 44c30433c7 Delete config.ini 2025-02-23 14:18:16 -08:00
madeofstown bcc9c03459 a few more changes with the readme 2025-02-23 14:14:57 -08:00
madeofstown f17a3d2786 ok, it's a little more than just a fix 2025-02-23 13:33:43 -08:00
Pablo Revilla 532fd7a56d Merge remote-tracking branch 'origin/master'
# Conflicts:
#	config.ini
#	meshview/templates/map.html
2025-02-21 11:58:01 -08:00
Pablo Revilla 1bd41ae82a Adding screenshots 2025-02-21 11:57:01 -08:00
Pablo Revilla bcb04bcec5 Create map.html 2025-02-21 11:56:07 -08:00
Pablo Revilla 03183384c6 Adding screenshots 2025-02-21 11:24:15 -08:00
Pablo Revilla 1a7a8b31a7 Merge pull request #7 from madeofstown/master
Fix for the mqtt bugs
2025-02-21 11:00:50 -08:00
madeofstown 4799a97f59 user is string not list 2025-02-20 19:24:04 -08:00
madeofstown 2bfb53ba45 Merge branch 'pablorevilla-meshtastic:master' into master 2025-02-20 19:19:58 -08:00
madeofstown 342a92c40e fix? 2025-02-20 19:16:59 -08:00
Pablo Revilla 4585f50b08 Adding screenshots 2025-02-20 10:19:05 -08:00
Pablo Revilla b616623898 Adding screenshots 2025-02-20 10:17:38 -08:00
Pablo Revilla 6ea5cf7eba Added Map capabilities 2025-02-20 09:02:51 -08:00
Pablo Revilla 1432cefb4b Removed comments 2025-02-20 08:52:34 -08:00
Pablo Revilla 0c0c41e157 Removed comments 2025-02-20 08:52:08 -08:00
Pablo Revilla 4fd167a226 Merge pull request #6 from madeofstown/patch-3
Fix Code Snippet
2025-02-19 10:39:16 -08:00
madeofstown 2cdd2a7048 Update README.md
Fix embedded code snippet in README
2025-02-19 06:09:45 -08:00
Pablo Revilla 20bc89a21f Update README.md 2025-02-18 17:11:46 -08:00
Pablo Revilla 551b9f52eb Merge pull request #5 from madeofstown/master
Fix overlapping legends
2025-02-18 13:49:25 -08:00
Pablo Revilla 615dd44b85 Merge pull request #4 from madeofstown/configini
Add config file
2025-02-18 09:57:38 -08:00
Pablo Revilla cacf072a51 Merge pull request #3 from madeofstown/patch-2
Update and rename README to README.md
2025-02-18 08:48:34 -08:00
madeofstown a67383ee68 oops, add it back 2025-02-17 15:35:16 -08:00
madeofstown ab1f1a71ea Fix Legend Overlap 2025-02-17 15:29:28 -08:00
madeofstown f20ca4a88e Merge pull request #2 from madeofstown/configini
Merge configini branch into master
2025-02-17 14:47:20 -08:00
madeofstown 6406efffe8 Update README.md
Make python and graphviz requirements more clear
2025-02-17 14:28:06 -08:00
madeofstown c8567fec6e Update README.md
More changes to reflect the addition of `config.ini`
2025-02-17 14:24:51 -08:00
madeofstown c9d65a078a changes after testing 2025-02-17 13:49:34 -08:00
madeofstown 076abb5811 First changes - pre test 2025-02-17 13:04:42 -08:00
madeofstown 0de71c9f13 Update README.md
first mention of config.ini
2025-02-16 17:37:34 -08:00
madeofstown 4c07dcd2e5 Merge pull request #1 from madeofstown/patch-2
Update and rename README to README.md
2025-02-16 17:17:16 -08:00
madeofstown a808b47295 Merge branch 'pablorevilla-meshtastic:master' into master 2025-02-16 17:09:07 -08:00
madeofstown 44f31c5eb7 Update README.md
fixed a spelling error
2025-02-16 13:28:11 -08:00
madeofstown e04c3aaa08 Update and rename README to README.md
Also add new info for correctly cloning to include submodules
2025-02-16 13:21:06 -08:00
Pablo Revilla 55031ad711 Made the conversation section a bit more modern looking 2025-02-13 22:57:48 -08:00
Pablo Revilla 85c708a5a6 Added Weekly Mesh reporting 2025-02-13 11:18:11 -08:00
Pablo Revilla 0556706a30 Added new searching capabilities to our node reports 2025-02-12 08:50:19 -08:00
Pablo Revilla 81703c9e49 Merge remote-tracking branch 'origin/master' 2025-02-11 23:01:36 -08:00
Pablo Revilla 9fbe3400ef Added new searching capabilities to our node reports 2025-02-11 23:01:15 -08:00
Pablo Revilla 9446c3532c Update README 2025-02-11 17:49:00 -08:00
Pablo Revilla 66a3780ff9 Update README 2025-02-11 17:46:50 -08:00
Pablo Revilla 0151bd9513 Update README 2025-02-11 17:43:05 -08:00
Pablo Revilla 94d803df66 added screenshot 2025-02-11 17:41:57 -08:00
Pablo Revilla e17c288041 added screenshot 2025-02-11 17:40:38 -08:00
Pablo Revilla 052adb7791 added screenshot 2025-02-11 17:38:54 -08:00
Pablo Revilla bdcf086939 Multiple changes to the code. Important to mentioned:
- Added ways to show the node data on the page with links to the nodes themselves.
- more work on the graphs.
2025-02-11 17:37:12 -08:00
Pablo Revilla e1228fbb64 Multiple changes to the code. Important to mentioned:
- Added ways to show the node data on the page with links to the nodes themselves.
- more work on the graphs.
2025-02-11 17:35:21 -08:00
Pablo Revilla 33767dc595 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	README
2025-02-11 17:32:21 -08:00
Pablo Revilla 6b76908698 Multiple changes to the code. Important to mentioned:
- Added ways to show the node data on the page with links to the nodes themselves.
- more work on the graphs.
2025-02-11 17:31:45 -08:00
Pablo Revilla 365200dcb8 Update README 2025-02-11 12:53:37 -08:00
Pablo Revilla 0831301997 Multiple changes to the code. Important to mentioned:
- We added another column to the nodes table to report on firmware version

- Also changed the date and time format to be more readable.

- Added a node list report

- Modified the Mesh Graphs
2025-02-07 21:18:02 -08:00
Pablo Revilla 604fc5c284 Multile changes to the code. Important to mentioned that we added another column to the nodes table to report on last_update
This can give us when the node was last seen on the mesh and provide some understanding if it is active.
2025-01-31 14:19:28 -08:00
Pablo Revilla 45c26aa713 Basic documentation of the notify feature. This is still reporting the "Missing return Statement on request handler" 2025-01-26 18:31:16 -08:00
Pablo Revilla 6f0f65f2b1 Added the code and HTML syntax to saparate LF from MS on the graphs. 2025-01-26 18:30:12 -08:00
madeofstown 77d1f84456 Merge branch 'pablorevilla-meshtastic:master' into master 2025-01-26 17:45:44 -08:00
Pablo Revilla cedc809928 Added links for LF and MS network Graphs. 2025-01-25 19:14:41 -08:00
Pablo Revilla f1c7f98353 Update to the data models to show new fields on DB 2025-01-25 18:28:42 -08:00
Pablo Revilla 94bd8ba423 Update to the data models to show new fields on DB 2025-01-25 18:27:49 -08:00
Pablo Revilla 40310d782a Update to the data models to show new fields on DB 2025-01-25 18:27:11 -08:00
Pablo Revilla 37ed0369e4 Update to the data models to show new fields on DB 2025-01-25 18:21:26 -08:00
madeofstown 8b05e500b8 Use config.ini for settings (try 2) 2025-01-25 15:41:26 -08:00
Pablo Revilla f72d7f70f1 Merge pull request #2 from madeofstown/master
Major Additions
2025-01-25 14:31:06 -08:00
Pablo Revilla 1cbe5effd2 Update store.py
Added Comments
2025-01-23 09:54:56 -08:00
Pablo Revilla 28092a510f Update web.py
Does it need a web.response>
2025-01-21 21:51:19 -08:00
madeofstown 0c46891f13 Graphs and Dark Mode 2025-01-20 20:23:27 -08:00
madeofstown 4c8a8245ca oops 2025-01-20 14:22:45 -08:00
madeofstown 796f572cef more meshtastic-python as submodule changes 2025-01-20 14:19:49 -08:00
madeofstown 57643b1a12 tryfix symlink origin 2025-01-20 13:54:22 -08:00
madeofstown f898b4632f meshtastic/protobuf 2025-01-20 13:51:16 -08:00
madeofstown f189147ab5 meshtastic python as submodule 2025-01-20 13:41:48 -08:00
madeofstown fb66b74fe7 add symlink to submodule folder 2025-01-20 13:05:43 -08:00
madeofstown 5204851a6a Delete old pb2 files 2025-01-20 13:04:28 -08:00
madeofstown e28dd0ce83 meshtastic-python as submodule 2025-01-20 12:41:47 -08:00
Pablo Revilla ff4f3a3734 Added quick link for statistics on base.html 2025-01-17 13:40:32 -08:00
Pablo Revilla fcfd7d6683 Fixed Typo 2025-01-17 13:37:31 -08:00
Pablo Revilla 5e7d94973e Providing /stats to give us basic reporting on number of nodes and packets seen by the tool 2025-01-17 12:52:11 -08:00
Pablo Revilla 58e700db2b Providing /stats to give us basic reporting on number of nodes and packets seen by the tool 2025-01-17 12:47:55 -08:00
Pablo Revilla 4bcc7b08d0 Providing /stats to give us basic reporting on number of nodes and packets seen by the tool 2025-01-17 12:46:26 -08:00
Pablo Revilla 63552b3d53 Update base.html
Added link to Meshview forks on Github
2025-01-14 14:22:47 -08:00
Pablo Revilla ef725185b1 Update web.py 2025-01-13 15:50:27 -08:00
Pablo Revilla 35da39e079 UTC change made uplinked packets not work. reverted the changes. 2025-01-13 14:33:58 -08:00
Pablo Revilla 43418c1249 Changed the import time from UTC to the server's time 2025-01-13 13:03:15 -08:00
Pablo Revilla 4fa4e17f45 changes to README 2025-01-13 12:56:55 -08:00
Pablo Revilla 854f1c5555 changes to README 2025-01-11 14:39:54 -08:00
Pablo Revilla f809bfc54f Modified read me to add the graphviz requirement 2025-01-11 14:38:59 -08:00
Pablo Revilla 1eff0e6d5c Modified read me to add the graphviz requirement 2025-01-11 11:01:47 -08:00
Pablo Revilla aa90d23740 Changed html from <center> to a div with center 2025-01-11 10:59:19 -08:00
Pablo Revilla 8ec4ad2108 Changed html from <center> to a div with center 2025-01-09 17:42:13 -08:00
Pablo Revilla e3768b81a9 Cleaned up Index page 2025-01-09 15:50:37 -08:00
Pablo Revilla 5882f79211 Added main menu and spacing 2025-01-09 15:45:50 -08:00
Pablo Revilla a17db8ce93 Added main menu and spacing 2025-01-09 15:36:16 -08:00
pablorevilla-meshtastic eebfdb84c3 Update README 2025-01-09 15:17:35 -08:00
Jason Michalski c0641147cb Change the default topic.
There is no traffic on msh/US/bayarea/# now that we moved to a private
server.
2024-08-26 20:47:25 -07:00
Jason Michalski 9a2c76a0a3 Set an identifier when connecting to MQTT. 2024-08-26 20:46:14 -07:00
Jason Michalski d4a174ebbf Fix packet details for missing nodes. 2024-08-25 20:06:11 -07:00
Jason Michalski 0838f385ff Do not set pool settings for sqlite. 2024-08-25 19:45:16 -07:00
Jason Michalski 15a6efd813 Update protos. 2024-08-21 20:51:25 -07:00
Jason Michalski 4127ef4951 Disable fitBounds animation. 2024-08-17 19:25:40 -07:00
Jason Michalski 20194265a4 Add popups on the packet details map. 2024-08-17 19:08:39 -07:00
Jason Michalski 33879f3eda Add more graphs. 2024-07-29 21:43:15 -07:00
Jason Michalski ddfd2550ac Make the mobile layout less bad. 2024-07-29 18:59:42 -07:00
Jason Michalski 0d58967da2 Use my new found fitBounds powers on the node map. 2024-07-27 21:53:05 -07:00
Jason Michalski 5a23fb25bd Add a map to the packet details. 2024-07-27 21:50:24 -07:00
Jason Michalski e3969e12d6 Add net view. 2024-07-27 20:33:36 -07:00
Jason Michalski d01d442eb7 Show milliseconds in timestamp because Fnnc wants it. 2024-07-16 15:04:42 -07:00
Jason Michalski 4def7c47e9 Allow using freedom MQTT servers. 2024-07-15 20:12:12 -07:00
Jason Michalski b7667485b3 404 on missing packets. 2024-07-15 14:37:51 -07:00
Jason Michalski 7fd735353d The position packet may not have a location. 2024-07-14 21:21:36 -07:00
Jason Michalski f5966acb7f Link nodes in the traceroute graphs. 2024-07-14 19:59:57 -07:00
Jason Michalski 83547197df Use a smaller image static SNR graph. 2024-07-14 19:59:30 -07:00
Jason Michalski df33c43d1c Stop trusting the client's clock. 2024-07-14 19:58:59 -07:00
Jason Michalski 06c16806f2 Add a single old location point to the trace if we have one. 2024-07-14 19:57:49 -07:00
Jason Michalski 64a2862e17 Add minutes support to the network graph. 2024-07-03 15:52:31 -07:00
Jason Michalski 4437aff938 Use plotly for detailed neighbors graphs. 2024-06-30 22:05:38 -07:00
Jason Michalski c469cee12b Only show the past 24h of locations. 2024-06-29 18:08:37 -07:00
Jason Michalski e937f63322 Fix crash on missing traceroute request packet. 2024-06-29 17:14:18 -07:00
Jason Michalski c251a4dc78 Add role to traceroute graphs. 2024-06-29 15:58:42 -07:00
Jason Michalski 3f6397f31b Fix crash when payload can not be decoded. 2024-06-29 15:58:24 -07:00
Jason Michalski b279ddd88e Increase database conection pool size. 2024-06-29 15:57:56 -07:00
Jason Michalski d1c7984aea Update protos 2024-06-29 15:55:45 -07:00
Jason Michalski a6d8212143 Add sserver generated neighbor info. 2024-06-18 00:34:40 -07:00
Jason Michalski 672563c9cd concentrate was to working so do it myself. 2024-06-16 20:13:56 -07:00
Jason Michalski 3f15c29683 Add graph link to traceroute results as well. 2024-06-16 16:43:37 -07:00
Jason Michalski a4c18d8525 Add node zooming and time filters. 2024-06-16 16:41:37 -07:00
Jason Michalski 13eda803c9 Include the dest of TRs in the network. 2024-06-15 20:50:25 -07:00
Jason Michalski aa7c108513 Link to the network graph and make TR win. 2024-06-15 19:56:43 -07:00
Jason Michalski f372001703 Color ROUTER nodes in the network graph. 2024-06-15 19:46:52 -07:00
Jason Michalski 96db2e0970 Add node role to the info box. 2024-06-15 19:31:46 -07:00
Jason Michalski b24b829fb1 Add edge color and change some dot settings. 2024-06-15 19:06:50 -07:00
Jason Michalski ad004c399c Add a network graph based on the list day of traceroute traffic. 2024-06-15 11:40:01 -07:00
Jason Michalski eeffc52932 Add link to the packet from the chat list. 2024-06-15 10:14:26 -07:00
Jason Michalski aab74af21a Load packet details on the package index. 2024-06-12 20:20:56 -07:00
Jason Michalski 51c478d8fc Add traceroute times. 2024-06-11 22:34:17 -07:00
276 changed files with 26048 additions and 14338 deletions

No files matched your search

View File
Whitespace-only changes.
+10
View File
@@ -0,0 +1,10 @@
# This keeps Docker from including hostOS virtual environment folders
env/
.venv/
# Database files and backups
*.db
*.db-shm
*.db-wal
backups/
*.db.gz
+54
View File
@@ -0,0 +1,54 @@
name: Build container
on:
push:
workflow_dispatch:
jobs:
docker:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Docker meta
id: meta
uses: docker/metadata-action@v5
with:
# list of Docker images to use as base name for tags
images: |
ghcr.io/${{ github.repository }}
# generate Docker tags based on the following events/attributes
tags: |
type=ref,event=branch
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}
# publish :latest from the default branch
type=raw,value=latest,enable={{is_default_branch}}
- name: Login to GitHub Container Registry
if: github.event_name != 'pull_request'
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build and push
uses: docker/build-push-action@v6
with:
context: .
file: ./Containerfile
push: ${{ github.event_name != 'pull_request' }}
labels: ${{ steps.meta.outputs.labels }}
tags: ${{ steps.meta.outputs.tags }}
platforms: linux/amd64,linux/arm64
# optional cache (speeds up rebuilds)
cache-from: type=gha
cache-to: type=gha,mode=max
+39
View File
@@ -0,0 +1,39 @@
name: Ruff
on:
pull_request:
paths:
- "**/*.py"
- "pyproject.toml"
- "ruff.toml"
- ".pre-commit-config.yaml"
jobs:
ruff:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.13"
- name: Cache Ruff
uses: actions/cache@v4
with:
path: ~/.cache/ruff
key: ruff-${{ runner.os }}-${{ hashFiles('**/pyproject.toml', '**/ruff.toml') }}
- name: Install Ruff
run: pip install "ruff==0.13.3"
# Lint (with GitHub annotation format for inline PR messages)
- name: Ruff check
run: ruff check --output-format=github .
# Fail PR if formatting is needed
- name: Ruff format (check-only)
run: ruff format --check .
# TODO: Investigate only applying to changed files and possibly apply fixes
+45
View File
@@ -1,3 +1,48 @@
env/*
__pycache__/*
meshview/__pycache__/*
alembic/__pycache__/*
# Database files
packets.db
packets*.db
*.db
*.db-shm
*.db-wal
# Database backups
backups/
*.db.gz
# Process files
meshview-db.pid
meshview-web.pid
# Config and logs
/table_details.py
config.ini
*.log
*.status.json
# Screenshots
screenshots/*
# Python
python/nanopb
__pycache__/
*.pyc
*.pyo
*.pyd
.Python
# IDE
.vscode/
.idea/
*.swp
*.swo
*~
# OS
.DS_Store
Thumbs.db
packets.db-journal
+1
View File
@@ -0,0 +1 @@
+8
View File
@@ -0,0 +1,8 @@
repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.13.3 # pin the latest you’re comfortable with
hooks:
- id: ruff
args: [--fix, --exit-non-zero-on-fix] # fail if it had to change files
- id: ruff-format
+204
View File
@@ -0,0 +1,204 @@
# AI Agent Guidelines for Meshview
This document provides context and guidelines for AI coding assistants working on the Meshview project.
## Project Overview
Meshview is a real-time monitoring and diagnostic tool for Meshtastic mesh networks. It provides web-based visualization and analysis of network activity, including:
- Real-time packet monitoring from MQTT streams
- Interactive map visualization of node locations
- Network topology graphs showing connectivity
- Message traffic analysis and conversation tracking
- Node statistics and telemetry data
- Packet inspection and traceroute analysis
## Architecture
### Core Components
1. **MQTT Reader** (`meshview/mqtt_reader.py`) - Subscribes to MQTT topics and receives mesh packets
2. **Database Manager** (`meshview/database.py`, `startdb.py`) - Handles database initialization and migrations
3. **MQTT Store** (`meshview/mqtt_store.py`) - Processes and stores packets in the database
4. **Web Server** (`meshview/web.py`, `main.py`) - Serves the web interface and API endpoints
5. **API Layer** (`meshview/web_api/api.py`) - REST API endpoints for data access
6. **Models** (`meshview/models.py`) - SQLAlchemy database models
7. **Decode Payload** (`meshview/decode_payload.py`) - Protobuf message decoding
### Technology Stack
- **Python 3.13+** - Main language
- **aiohttp** - Async web framework
- **aiomqtt** - Async MQTT client
- **SQLAlchemy (async)** - ORM with async support
- **Alembic** - Database migrations
- **Jinja2** - Template engine
- **Protobuf** - Message serialization (Meshtastic protocol)
- **SQLite/PostgreSQL** - Database backends (SQLite default, PostgreSQL via asyncpg)
### Key Patterns
- **Async/Await** - All I/O operations are asynchronous
- **Database Migrations** - Use Alembic for schema changes (see `docs/Database-Changes-With-Alembic.md`)
- **Configuration** - INI file-based config (`config.ini`, see `sample.config.ini`)
- **Modular API** - API routes separated into `meshview/web_api/` module
## Project Structure
```
meshview/
├── alembic/ # Database migration scripts
├── docs/ # Technical documentation
├── meshview/ # Main application package
│ ├── static/ # Static web assets (HTML, JS, CSS)
│ ├── templates/ # Jinja2 HTML templates
│ ├── web_api/ # API route handlers
│ └── *.py # Core modules
├── main.py # Web server entry point
├── startdb.py # Database manager entry point
├── mvrun.py # Combined runner (starts both services)
├── config.ini # Runtime configuration
└── requirements.txt # Python dependencies
```
## Development Workflow
### Setup
1. Use Python 3.13+ virtual environment
### Running
- **Database**: `./env/bin/python startdb.py`
- **Web Server**: `./env/bin/python main.py`
- **Both**: `./env/bin/python mvrun.py`
## Code Style
- **Line length**: 100 characters (see `pyproject.toml`)
- **Linting**: Ruff (configured in `pyproject.toml`)
- **Formatting**: Ruff formatter
- **Type hints**: Preferred but not strictly required
- **Async**: Use `async def` and `await` for I/O operations
## Important Files
### Configuration
- `config.ini` - Runtime configuration (server, MQTT, database, cleanup)
- `sample.config.ini` - Template configuration file
- `alembic.ini` - Alembic migration configuration
### Database
- `meshview/models.py` - SQLAlchemy models (Packet, Node, Traceroute, etc.)
- `meshview/database.py` - Database initialization and session management
- `alembic/versions/` - Migration scripts
### Core Logic
- `meshview/mqtt_reader.py` - MQTT subscription and message reception
- `meshview/mqtt_store.py` - Packet processing and storage
- `meshview/decode_payload.py` - Protobuf decoding
- `meshview/web.py` - Web server routes and handlers
- `meshview/web_api/api.py` - REST API endpoints
### Templates
- `meshview/templates/` - Jinja2 HTML templates
- `meshview/static/` - Static files (HTML pages, JS, CSS)
## Common Tasks
### Adding a New API Endpoint
1. Add route handler in `meshview/web_api/api.py`
2. Register route in `meshview/web.py` (if needed)
3. Update `docs/API_Documentation.md` if public API
### Database Schema Changes
1. Modify models in `meshview/models.py`
2. Create migration: `alembic revision --autogenerate -m "description"`
3. Review generated migration in `alembic/versions/`
4. Test migration: `alembic upgrade head`
5. **Never** modify existing migration files after they've been applied
### Adding a New Web Page
1. Create template in `meshview/templates/`
2. Add route in `meshview/web.py`
3. Add navigation link if needed (check existing templates for pattern)
4. Add static assets if needed in `meshview/static/`
### Processing New Packet Types
1. Check `meshview/decode_payload.py` for existing decoders
2. Add decoder function if new type
3. Update `meshview/mqtt_store.py` to handle new packet type
4. Update database models if new data needs storage
## Key Concepts
### Meshtastic Protocol
- Uses Protobuf for message serialization
- Packets contain various message types (text, position, telemetry, etc.)
- MQTT topics follow pattern: `msh/{region}/{subregion}/#`
### Database Schema
- **packet** - Raw packet data
- **node** - Mesh node information
- **traceroute** - Network path information
- **packet_seen** - Packet observation records
### Real-time Updates
- Web pages use Server-Sent Events (SSE) for live updates
- Map and firehose pages auto-refresh based on config intervals
- API endpoints return JSON for programmatic access
## Best Practices
1. **Always use async/await** for database and network operations
2. **Use Alembic** for all database schema changes
3. **Follow existing patterns** - check similar code before adding new features
4. **Update documentation** - keep `docs/` and README current
5. **Test migrations** - verify migrations work both up and down
6. **Handle errors gracefully** - log errors, don't crash on bad packets
7. **Respect configuration** - use `config.ini` values, don't hardcode
## Common Pitfalls
- **Don't modify applied migrations** - create new ones instead
- **Don't block the event loop** - use async I/O, not sync
- **Don't forget timezone handling** - timestamps are stored in UTC
- **Don't hardcode paths** - use configuration values
- **Don't ignore MQTT reconnection** - handle connection failures gracefully
## Resources
- **Main README**: `README.md` - Installation and basic usage
- **Docker Guide**: `README-Docker.md` - Container deployment
- **API Docs**: `docs/API_Documentation.md` - API endpoint reference
- **Migration Guide**: `docs/Database-Changes-With-Alembic.md` - Database workflow
- **Contributing**: `CONTRIBUTING.md` - Contribution guidelines
## Version Information
- **Current Version**: 3.0.0 (November 2025)
- **Python Requirement**: 3.13+
- **Key Features**: Alembic migrations, automated backups, Docker support, traceroute return paths
## Rules for robots
- Always run ruff check and ruff format after making changes (only on python changes)
---
When working on this project, prioritize:
1. Maintaining async patterns
2. Following existing code structure
3. Using proper database migrations
4. Keeping documentation updated
5. Testing changes thoroughly
+130
View File
@@ -0,0 +1,130 @@
# Contributing to Meshview
First off, thanks for taking the time to contribute! ❤️
All types of contributions are encouraged and valued. See the [Table of Contents](#table-of-contents) for ways to help and details about how this project handles contributions. Please read the relevant section before getting started — it will make things smoother for both you and the maintainers.
The Meshview community looks forward to your contributions. 🎉
> And if you like the project but don’t have time to contribute code, that’s fine! You can still support Meshview by:
> - ⭐ Starring the repo on GitHub
> - Talking about Meshview on social media
> - Referencing Meshview in your own project’s README
> - Mentioning Meshview at local meetups or to colleagues/friends
---
## Table of Contents
- [Code of Conduct](#code-of-conduct)
- [I Have a Question](#i-have-a-question)
- [I Want to Contribute](#i-want-to-contribute)
- [Reporting Bugs](#reporting-bugs)
- [Suggesting Enhancements](#suggesting-enhancements)
- [Your First Code Contribution](#your-first-code-contribution)
- [Improving the Documentation](#improving-the-documentation)
- [Styleguides](#styleguides)
- [Commit Messages](#commit-messages)
- [Join the Project Team](#join-the-project-team)
---
## Code of Conduct
Meshview is an open and welcoming community. We want everyone to feel safe, respected, and valued.
### Our Standards
- Be respectful and considerate in all interactions.
- Welcome new contributors and help them learn.
- Provide constructive feedback, not personal attacks.
- Focus on collaboration and what benefits the community.
Unacceptable behavior includes harassment, insults, hate speech, personal attacks, or publishing others’ private information without permission.
---
## I Have a Question
> Before asking, please read the [documentation](docs/README.md) if available.
1. Search the [issues list](../../issues) to see if your question has already been asked.
2. If not, open a [new issue](../../issues/new) with the **question** label.
3. Provide as much context as possible (OS, Python version, database type, etc.).
---
## I Want to Contribute!
### Legal Notice
By contributing to Meshview, you agree that:
- You authored the content yourself.
- You have the necessary rights to the content.
- Your contribution can be provided under the project’s license.
---
### Reporting Bugs
Before submitting a bug report:
- Make sure you’re using the latest Meshview version.
- Verify the issue is not due to a misconfigured environment (SQLite/MySQL, Python version, etc.).
- Search existing [bug reports](../../issues?q=label%3Abug).
- Collect relevant information:
- Steps to reproduce
- Error messages / stack traces
- OS, Python version, and database backend
- Any logs (`meshview-db.service`, `mqtt_reader.py`, etc.)
How to report:
- Open a [new issue](../../issues/new).
- Use a **clear and descriptive title**.
- Include reproduction steps and expected vs. actual behavior.
---
### Suggesting Enhancements
Enhancements are tracked as [issues](../../issues). Before suggesting:
- Make sure the feature doesn’t already exist.
- Search for prior suggestions.
- Check that it fits Meshview’s scope (mesh packet analysis, visualization, telemetry, etc.).
When submitting:
- Use a **clear and descriptive title**.
- Describe the current behavior and what you’d like to see instead.
- Include examples, screenshots, or mockups if relevant.
- Explain why it would be useful to most Meshview users.
---
### Your First Code Contribution
We love first-time contributors! 🚀
If you’d like to start coding:
1. Fork the repository and clone it locally.
2. Set up the development environment:
3. Run the app locally
4. Create a new branch from `develop`, make your changes, commit, and push.
5. Open a pull request against the `develop` branch.
---
### Improving the Documentation
Docs are just as important as code. You can help by:
- Fixing typos or broken links.
- Clarifying confusing instructions.
- Adding examples (e.g., setting up Nginx as a reverse proxy, SQLite vs. MySQL setup).
- Writing or updating tutorials.
---
## Join the Project Team
Meshview is a community-driven project. If you consistently contribute (code, documentation, or community help), we’d love to invite you as a maintainer.
Start by contributing regularly, engaging in issues/PRs, and helping others.
---
✨ That’s it! Thanks again for being part of Meshview. Every contribution matters.
+79
View File
@@ -0,0 +1,79 @@
# Build Image
# Uses python:3.13-slim because no native dependencies are needed for meshview itself
# (everything is available as a wheel)
FROM docker.io/python:3.13-slim AS meshview-build
RUN apt-get update && \
apt-get install -y --no-install-recommends curl patch && \
rm -rf /var/lib/apt/lists/*
# Add a non-root user/group
ARG APP_USER=app
RUN useradd -m -u 10001 -s /bin/bash ${APP_USER}
# Install uv and put it on PATH system-wide
RUN curl -LsSf https://astral.sh/uv/install.sh | sh \
&& install -m 0755 /root/.local/bin/uv /usr/local/bin/uv
WORKDIR /app
RUN chown -R ${APP_USER}:${APP_USER} /app
# Copy deps first for caching
COPY --chown=${APP_USER}:${APP_USER} pyproject.toml uv.lock* requirements*.txt ./
# Optional: wheels-only to avoid slow source builds
ENV UV_NO_BUILD=1
RUN uv venv /opt/venv
# RUN uv sync --frozen
ENV VIRTUAL_ENV=/opt/venv
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
RUN uv pip install --no-cache-dir --upgrade pip \
&& if [ -f requirements.txt ]; then uv pip install --only-binary=:all: -r requirements.txt; fi
# Copy app code
COPY --chown=${APP_USER}:${APP_USER} . .
# Patch config
COPY --chown=${APP_USER}:${APP_USER} container/config.ini /app/sample.config.ini
# Clean
RUN rm -rf /app/.git* && \
rm -rf /app/.pre-commit-config.yaml && \
rm -rf /app/*.md && \
rm -rf /app/COPYING && \
rm -rf /app/Containerfile && \
rm -rf /app/Dockerfile && \
rm -rf /app/container && \
rm -rf /app/docker && \
rm -rf /app/docs && \
rm -rf /app/pyproject.toml && \
rm -rf /app/requirements.txt && \
rm -rf /app/screenshots
# Prepare /app and /opt to copy
RUN mkdir -p /meshview && \
mv /app /opt /meshview
# Use a clean container for install
FROM docker.io/python:3.13-slim
ARG APP_USER=app
COPY --from=meshview-build /meshview /
RUN apt-get update && \
apt-get install -y --no-install-recommends graphviz && \
rm -rf /var/lib/apt/lists/* && \
useradd -m -u 10001 -s /bin/bash ${APP_USER} && \
mkdir -p /etc/meshview /var/lib/meshview /var/log/meshview && \
mv /app/sample.config.ini /etc/meshview/config.ini && \
chown -R ${APP_USER}:${APP_USER} /var/lib/meshview /var/log/meshview
# Drop privileges
USER ${APP_USER}
WORKDIR /app
ENTRYPOINT [ "/opt/venv/bin/python", "mvrun.py"]
CMD ["--pid_dir", "/tmp", "--py_exec", "/opt/venv/bin/python", "--config", "/etc/meshview/config.ini" ]
EXPOSE 8081
VOLUME [ "/etc/meshview", "/var/lib/meshview", "/var/log/meshview" ]
Symlink
+1
View File
@@ -0,0 +1 @@
Containerfile
-19
View File
@@ -1,19 +0,0 @@
Meshview
========
This project watches a MQTT topic for meshtastic messages, imports them to a
database and has a web UI to view them.
Example
-------
An example instance, https://meshview.armooo.net, is running with with data
from the MQTT topic msh/US/bayarea/#.
Running
-------
$ python3 -m venv env
$ ./env/bin/pip install -r requirements.txt
$ ./env/bin/python main.py
Now you can hit http://localhost:8080/
+247
View File
@@ -0,0 +1,247 @@
# Running MeshView with Docker
MeshView container images are built automatically and published to GitHub Container Registry.
## Quick Start
Pull and run the latest image:
```bash
docker pull ghcr.io/pablorevilla-meshtastic/meshview:latest
docker run -d \
--name meshview \
-p 8081:8081 \
-v ./config:/etc/meshview \
-v ./data:/var/lib/meshview \
-v ./logs:/var/log/meshview \
ghcr.io/pablorevilla-meshtastic/meshview:latest
```
Access the web interface at: http://localhost:8081
## Volume Mounts
The container uses three volumes for persistent data:
| Volume | Purpose | Required |
|--------|---------|----------|
| `/etc/meshview` | Configuration files | Yes |
| `/var/lib/meshview` | Database storage | Recommended |
| `/var/log/meshview` | Log files | Optional |
### Configuration Volume
Mount a directory containing your `config.ini` file:
```bash
-v /path/to/your/config:/etc/meshview
```
If no config is provided, the container will use the default `sample.config.ini`.
### Database Volume
Mount a directory to persist the SQLite database:
```bash
-v /path/to/your/data:/var/lib/meshview
```
**Important:** Without this mount, your database will be lost when the container stops.
### Logs Volume
Mount a directory to access logs from the host:
```bash
-v /path/to/your/logs:/var/log/meshview
```
## Complete Example
Create a directory structure and run:
```bash
# Create directories
mkdir -p meshview/{config,data,logs,backups}
# Copy sample config (first time only)
docker run --rm ghcr.io/pablorevilla-meshtastic/meshview:latest \
cat /etc/meshview/config.ini > meshview/config/config.ini
# Edit config.ini with your MQTT settings
nano meshview/config/config.ini
# Run the container
docker run -d \
--name meshview \
--restart unless-stopped \
-p 8081:8081 \
-v $(pwd)/meshview/config:/etc/meshview \
-v $(pwd)/meshview/data:/var/lib/meshview \
-v $(pwd)/meshview/logs:/var/log/meshview \
ghcr.io/pablorevilla-meshtastic/meshview:latest
```
## Docker Compose
Create a `docker-compose.yml`:
```yaml
version: '3.8'
services:
meshview:
image: ghcr.io/pablorevilla-meshtastic/meshview:latest
container_name: meshview
restart: unless-stopped
ports:
- "8081:8081"
volumes:
- ./config:/etc/meshview
- ./data:/var/lib/meshview
- ./logs:/var/log/meshview
- ./backups:/var/lib/meshview/backups # For database backups
environment:
- TZ=America/Los_Angeles # Set your timezone
```
Run with:
```bash
docker-compose up -d
```
## Configuration
### Minimum Configuration
Edit your `config.ini` to configure MQTT connection:
```ini
[mqtt]
server = mqtt.meshtastic.org
topics = ["msh/US/#"]
port = 1883
username =
password =
[database]
# SQLAlchemy async connection string.
# Examples:
# sqlite+aiosqlite:///var/lib/meshview/packets.db
# postgresql+asyncpg://user:pass@host:5432/meshview
connection_string = sqlite+aiosqlite:////var/lib/meshview/packets.db
```
### Database Backups
To enable automatic daily backups inside the container:
```ini
[cleanup]
backup_enabled = True
backup_dir = /var/lib/meshview/backups
backup_hour = 2
backup_minute = 00
```
Then mount the backups directory:
```bash
-v $(pwd)/meshview/backups:/var/lib/meshview/backups
```
## Available Tags
| Tag | Description |
|-----|-------------|
| `latest` | Latest build from the main branch |
| `dev-v3` | Development branch |
| `v1.2.3` | Specific version tags |
## Updating
Pull the latest image and restart:
```bash
docker pull ghcr.io/pablorevilla-meshtastic/meshview:latest
docker restart meshview
```
Or with docker-compose:
```bash
docker-compose pull
docker-compose up -d
```
## Logs
View container logs:
```bash
docker logs meshview
# Follow logs
docker logs -f meshview
# Last 100 lines
docker logs --tail 100 meshview
```
## Troubleshooting
### Container won't start
Check logs:
```bash
docker logs meshview
```
### Database permission issues
Ensure the data directory is writable:
```bash
chmod -R 755 meshview/data
```
### Can't connect to MQTT
1. Check your MQTT configuration in `config.ini`
2. Verify network connectivity from the container:
```bash
docker exec meshview ping mqtt.meshtastic.org
```
### Port already in use
Change the host port (left side):
```bash
-p 8082:8081
```
Then access at: http://localhost:8082
## Building Your Own Image
If you want to build from source:
```bash
git clone https://github.com/pablorevilla-meshtastic/meshview.git
cd meshview
docker build -f Containerfile -t meshview:local .
```
## Security Notes
- The container runs as a non-root user (`app`, UID 10001)
- No privileged access required
- Only port 8081 is exposed
- All data stored in mounted volumes
## Support
- GitHub Issues: https://github.com/pablorevilla-meshtastic/meshview/issues
- Documentation: https://github.com/pablorevilla-meshtastic/meshview
+706
View File
@@ -0,0 +1,706 @@
# Meshview
![Start Page](screenshots/animated.gif)
The project serves as a real-time monitoring and diagnostic tool for the Meshtastic mesh network. It provides detailed insights into network activity, including message traffic, node positions, and telemetry data.
### Version 3.0.9 — October 2026
- Protobufs: refreshed Meshtastic schemas and Python type stubs to upstream commit `569a2b3ae7b6bda1a7ab177463a55d8ede3bef53`; updated the refresh script to handle custom metadata options.
- Live map: added animated packet traces from senders to reporting gateways and configurable channel colors through the optional `[map_channel_colors]` section in `config.ini`.
- Daily snapshots: new snapshots report activity for the previous complete UTC day, including newly imported packets, unique packet senders observed that day, and gateways that reported packets that day. Existing historical snapshots keep their original counts.
- Node tracking: record nodes from packet activity before their node information arrives, and preserve known positions when map reports have missing or invalid coordinates.
- Neighbor SNR chart: show the last seven days and the 15 neighbors with the most data points, distinguish neighbors with identical short names, and fix CSV export.
- MQTT reliability: skip malformed messages and invalid node IDs without stopping packet ingestion.
- Security and privacy: escape mesh-provided text in web pages, restrict language and static file requests to their intended directories, and prevent payload searches from matching redacted direct messages.
- Coverage API: validate and bound request parameters, and run coverage calculations off the event loop to keep the web server responsive.
- Contributors: thanks to [nullrouten0](https://github.com/nullrouten0) and Nathan for the neighbor SNR chart, MQTT reliability, security, privacy, and coverage API fixes; Manuel Villaverde for improving map channel color visibility; and [Pablo Revilla](https://github.com/pablorevilla-meshtastic) for the live map, node tracking, and daily snapshot updates.
### Version 3.0.8 — September 2026
- Map updates: added OpenTopoMap as a selectable base map, improved map controls, and fixed several map/node display edge cases.
- Traceroute: added a dedicated traceroute page, corrected route path orientation in graph edges, and improved traceroute API/documentation support.
- Routing display: show ROUTING ACK/NAK packets clearly instead of reporting misleading `error_reason: NONE` values.
- MQTT/decryption: expanded Meshtastic one-byte PSK shorthand support in `mqtt.secondary_keys`.
- Health/maintenance: added cleanup status reporting to the health page and fixed timezone handling in health reporting.
- UI/API fixes: improved Firehose, Node, and Top channel handling, including showing all channels where expected.
- Contributors: thanks to [giannoug](https://github.com/giannoug) for fixes to ROUTING ACK/NAK display, `mqtt.secondary_keys` PSK shorthand handling, and traceroute path orientation, plus jschrempp and the Meshview community for testing and feedback included in this release.
### Version 3.0.7 — May 2026
- Reliability report: added a dedicated reliability page for checking how well a selected node is heard across the mesh, including heard/missed status, packet counts, hop counts, gateway tables, and a map view.
- Node list/map UX: added node list filtering for wider active-node ranges, included all database nodes where appropriate, and made map node colors persistent across reboots.
- QR/API fixes: corrected QR code generation when a node role is missing or unavailable.
- Database cleanup: removed stored node public key data and added the Alembic migration to drop `node.public_key`.
- Protobufs: refreshed Meshtastic protobuf Python modules to upstream commit
- Tooling: improved the protobuf updater so it supports raw commit SHAs, the newer upstream `meshtastic/*.proto` layout, generated `.pyi` stubs, and the vendored `nanopb`/`serial_hal` outputs.
### Version 3.0.6 — March 2026
- Daily snapshots: added the `daily_snapshot` table, scheduled snapshot capture, and `/api/snapshots/daily` for historical node, packet, and gateway counts.
Each new snapshot stores packets imported during the previous complete UTC day,
labeled with that day's date. Node and gateway counts are database totals at capture
time. Existing historical snapshots retain their previously stored packet totals.
- Stats/UI: expanded stats views with snapshot data and added channel filters to Chat and Firehose.
- Map/node fixes: corrected node location handling, map popup behavior, packet page display, and node list sorting.
- Ingestion/API reliability: improved duplicate `PacketSeen` handling, guarded invalid node info packets, and made traceroute/edge APIs more tolerant of decode failures.
- Language support: added Russian translations.
### Version 3.0.5 — February 2026
- **IMPORTANT:** the predicted coverage feature requires the extra `pyitm` dependency. If it is not installed, the coverage API will return 503.
- Ubuntu install (inside the venv): `./env/bin/pip install pyitm`
- Coverage: predicted coverage overlay (Longley‑Rice area mode) with perimeter rendering and documentation.
- UI: added QR code display for quick node/app access.
- Gateways: persistent gateway tracking (`is_mqtt_gateway`) and UI indicators in nodes, map popups, and stats.
- Map UX: deterministic jitter for overlapping nodes; edges follow jittered positions.
- Tooling: Meshtastic protobuf updater script with `--check` and `UPSTREAM_REV.txt` tracking.
### Version 3.0.4 — Late January 2026
- Database: multi‑DB support, PostgreSQL scripts, WAL config for SQLite, cleanup query timing fixes, removal of import time columns, and various time‑handling fixes.
- UI/UX: extensive updates to node.html, nodelist.html, top.html, and packet.html (paging, stats, distance, status/favorites), plus net view changes to 12‑hour window.
- API/logic: weekly mesh query fix, node list performance improvement, backwards‑compatibility and other bug fixes.
- MQTT reader: configurable skip‑node list and secondary decryption keys.
- Docs/ops: multiple documentation updates, updated site list, container workflow fixes/tests, README updates.
### Version 3.0.2 — January 2026
- Changes to the Database to will make it so that there is a need for space when updating to the latest. SQlite requires to rebuild the database when droping a column. ( we are droping some of the old columns) so make sure you have 1.2x the size of the db of space in your environment. Depending on how big your db is it would take a long time.
### Version 3.0.1 — December 2025
#### 🌐 Multi-Language Support (i18n)
- New `/api/lang` endpoint for serving translations
- Section-based translation loading (e.g., `?section=firehose`)
- Default language controlled via config file language section
- JSON-based translation files for easy expansion
- Core pages updated to support `data-translate-lang` attributes
### 🛠 Improvements
- Updated UI elements across multiple templates for localization readiness
- General cleanup to support future language additions
### Version 3.0.0 update - November 2025
**Major Infrastructure Improvements:**
* **Database Migrations**: Alembic integration for safe schema upgrades and database versioning
* **Automated Backups**: Independent database backup system with gzip compression (separate from cleanup)
* **Development Tools**: Quick setup script (`setup-dev.sh`) with pre-commit hooks for code quality
* **Docker Support**: Pre-built containers now available on GitHub Container Registry with automatic builds - ogarcia
**New Features:**
* **Traceroute Return Path**: Log and display return path data for traceroute packets - jschrempp
* **Microsecond Timestamps**: Added `import_time_us` columns for higher precision time tracking
**Technical Improvements:**
* Migration from manual SQL to Alembic-managed schema
* Container images use `uv` for faster dependency installation
* Python 3.13 support with slim Debian-based images
* Documentation collection in `docs/` directory
* API routes moved to separate modules for better organization
* /version and /health endpoints added for monitoring
See [README-Docker.md](README-Docker.md) for container deployment and [docs/](docs/) for technical documentation.
### Version 2.0.7 update - September 2025
* New database maintenance capability to automatically keep a specific number of days of data.
* Added configuration for update intervals for both the Live Map and the Firehose pages.
### Version 2.0.6 update - August 2025
* New Live Map (Shows packet feed live)
* New API /api/config (See API documentation)
* New API /api/edges (See API documentation)
* Adds edges to the map (click to see traceroute and neighbours)
### Version 2.0.4 update - August 2025
* New statistic page with more data.
* New API /api/stats (See API documentation).
* Inprovement on "See Everything" and "Conversation" pages.
* Tracking of replies with links to original message.
### Version 2.0.3 update - June 2025
* Moved more graphs to eCharts.
* Addedd smooth updating for "Conversations" and "See everything" sections.
* Now you can turn on and off "Quick Links".
* Network graphs are now dynamically generated depending on your mesh and the presets in use.
* Download node's packet information for the last 3 days to .csv file.
* Display distance traveled by packet.
### Key Features
* **Live Data Visualization**: Users can view real-time data from the mesh network, including text messages, GPS positions, and node information.
* **Interactive Map**: The site offers an interactive map displaying the locations of active nodes, helping users identify network coverage areas.
* **Mesh Graphs**: Visual representations of the network's structure and connectivity are available, illustrating how nodes are interconnected.
* **Packet Analysis**: Detailed information on individual data packets transmitted within the network can be accessed, including payload content and transmission paths.
* **Node Statistics**: Users can explore statistics related to network traffic, such as top contributors and message volumes.
Samples of currently running instances:
| Area | URL | Version | Nodes | Last Updated |
| --- | --- | --- | ---: | --- |
| Polski Mesh | https://meshview.format.ovh | 3.0.6 (65386be) | 4,827 | 4/1/2026, 12:12:25 PM |
| Poland | https://meshview.szastan.pl | 3.0.5 (unknown) | 4,194 | 4/1/2026, 12:12:39 PM |
| Spain | https://meshview.meshtastic.es | 3.0.5 (unknown) | 2,466 | 4/1/2026, 12:11:17 PM |
| San Francisco Bay Area | https://meshview.bayme.sh | 3.0.5 (bdf70da) | 1,983 | 4/1/2026, 12:11:08 PM |
| Southern California | https://meshview.socalmesh.org | 3.0.5 (unknown) | 1,205 | 4/1/2026, 12:11:50 PM |
| Oregon (USA) | https://meshview.meshoregon.com | 3.0.5 (bdf70da) | 1,167 | 4/1/2026, 12:11:41 PM |
| Australia/ New Zeland | https://my.meshview.world/anz | plus 1.0.0 | 1,165 | 4/1/2026, 12:11:59 PM |
| Hessen - Germany | https://meshview.lsinfra.de | 3.0.5 (unknown) | 1,082 | 4/1/2026, 12:11:30 PM |
| New York City | https://meshview.nyme.sh | 3.0.5 (bdf70da) | 984 | 4/1/2026, 12:11:26 PM |
| Salt Lake City (USA) | https://meshview.freq51.net | — | 801 | 4/1/2026, 12:11:36 PM |
| Salzburg / Austria | https://meshview-salzburg.jmt.gr | — | 748 | 4/1/2026, 12:11:21 PM |
| North Georgia / East Tennessee - USA | https://view.mtnme.sh | 3.0.3 (ff30623) | 730 | 4/1/2026, 12:11:33 PM |
| Canada | https://mv.canadaverse.org | 3.0.1 (unknown) | 674 | 4/1/2026, 12:12:06 PM |
| Pioneer Valley, Massachusetts (USA) | https://meshview.pvmesh.org | 3.0.4 (018e16e) | 560 | 4/1/2026, 12:11:44 PM |
| Western Pennsylvania (USA) | https://map.wpamesh.net | 3.0.5 (unknown) | 447 | 4/1/2026, 12:11:38 PM |
| Great Britan | https://my.meshview.world/gb | plus 1.0.0 | 421 | 4/1/2026, 12:12:03 PM |
| Chicago (USA) | https://meshview.chicagolandmesh.org | 3.0.5 (unknown) | 420 | 4/1/2026, 12:12:41 PM |
| Georgia (USA) | https://meshview.gamesh.net | 3.0.1 (unknown) | 384 | 4/1/2026, 12:11:45 PM |
| Brazil | https://my.meshview.world/brazil | plus 1.0.0 | 364 | 4/1/2026, 12:12:01 PM |
| Mexico | https://my.meshview.world/mexico | plus 1.0.0 | 268 | 4/1/2026, 12:11:59 PM |
| Northeast Ohio | https://meshview.neomesh.org | 3.0.5 (unknown) | 264 | 4/1/2026, 12:11:52 PM |
| South Africa | https://my.meshview.world/za | plus 1.0.0 | 263 | 4/1/2026, 12:12:07 PM |
| Argentina | https://my.meshview.world/argentina | plus 1.0.0 | 258 | 4/1/2026, 12:12:00 PM |
| Northwest Indiana (USA) | https://meshview.nwimesh.net | 3.0.5 (2cc53dc) | 219 | 4/1/2026, 12:12:08 PM |
| Louisiana (USA) | https://meshview.louisianamesh.org | — | 78 | 4/1/2026, 12:11:51 PM |
| Chile | https://my.meshview.world/chile | plus 1.0.0 | 58 | 4/1/2026, 12:12:06 PM |
| Colombia | https://meshview.meshcolombia.co | 3.0.5 (2cc53dc) | 55 | 4/1/2026, 12:11:46 PM |
| Croatia | https://map.cromesh.eu | — | 0 | 4/1/2026, 12:11:45 PM |
| Saint Louis (USA) | https://meshview.meshstl.org | 3.0.5 (2cc53dc) | 0 | 4/1/2026, 12:11:51 PM |
| Southwest Louisiana (USA) | https://www.swlamesh.com | — | 0 | 4/1/2026, 12:11:46 PM |
---
### Updating from 2.x to 3.x
We are adding the use of Alembic. If using GitHub
Update your codebase by running the pull command
```bash
cd meshview
git pull origin master
```
Install Alembic in your environment
```bash
./env/bin/pip install alembic
```
Start your scripts or services. This process will update your database with the latest schema.
## Installing
### Using Docker (Recommended)
The easiest way to run MeshView is using Docker. Pre-built images are available from GitHub Container Registry.
See **[README-Docker.md](README-Docker.md)** for complete Docker installation and usage instructions.
### Manual Installation
Requires **`python3.13`** or above.
Clone the repo from GitHub:
```bash
git clone https://github.com/pablorevilla-meshtastic/meshview.git
cd meshview
```
#### Quick Setup (Recommended)
Run the development setup script:
```bash
./setup-dev.sh
```
This will:
- Create Python virtual environment
- Install all requirements
- Install development tools (pre-commit, pytest)
- Set up pre-commit hooks for code formatting
- Create config.ini from sample
#### Manual Setup
Create a Python virtual environment:
```bash
python3 -m venv env
```
Install the environment requirements:
```bash
./env/bin/pip install -r requirements.txt
```
Install `graphviz` on MacOS or Debian/Ubuntu Linux:
```bash
sudo apt-get install graphviz
```
Copy `sample.config.ini` to `config.ini`:
```bash
cp sample.config.ini config.ini
```
Edit `config.ini` to match your MQTT and web server settings:
```bash
nano config.ini
```
> **NOTE**
> On MacOS set the bind configuration line to
> ```
> bind = 127.0.0.1
> ```
Example:
```ini
# -------------------------
# Server Configuration
# -------------------------
[server]
# The address to bind the server to. Use * to listen on all interfaces.
bind = *
# Port to run the web server on.
port = 8081
# Path to TLS certificate (leave blank to disable HTTPS).
tls_cert =
# Path for the ACME challenge if using Let's Encrypt.
acme_challenge =
# -------------------------
# Site Appearance & Behavior
# -------------------------
[site]
# The domain name of your site.
domain =
# Select language (this represents the name of the json file in the /lang directory)
language = es
# Site title to show in the browser title bar and headers.
title = Bay Area Mesh
# A brief message shown on the homepage.
message = Real time data from around the bay area and beyond.
# Enable or disable site features (as strings: "True" or "False").
nodes = True
conversations = True
everything = True
graphs = True
stats = True
net = True
map = True
top = True
# Show the API documentation link in the navigation bar (default: True).
api = True
# Map boundaries (used for the map view).
# Defaults will show the San Francisco Bay Area
map_top_left_lat = 39
map_top_left_lon = -123
map_bottom_right_lat = 36
map_bottom_right_lon = -121
# Updates intervals in seconds, zero or negative number means no updates
# defaults will be 3 seconds
map_interval=3
firehose_interval=3
# Weekly net details
weekly_net_message = Weekly Mesh check-in. We will keep it open on every Wednesday from 5:00pm for checkins. The message format should be (LONG NAME) - (CITY YOU ARE IN) #BayMeshNet.
net_tag = #BayMeshNet
# -------------------------
# MQTT Broker Configuration
# -------------------------
[mqtt]
# MQTT server hostname or IP.
server = mqtt.bayme.sh
# Topics to subscribe to (as JSON-like list, but still a string).
topics = ["msh/US/bayarea/#", "msh/US/CA/mrymesh/#", "msh/US/CA/sacvalley"]
# Port used by MQTT (typically 1883 for unencrypted).
port = 1883
# MQTT username and password.
username = meshdev
password = large4cats
# -------------------------
# Database Configuration
# -------------------------
[database]
# SQLAlchemy async connection string.
# Examples:
# sqlite+aiosqlite:///packets.db
# postgresql+asyncpg://user:pass@host:5432/meshview
connection_string = sqlite+aiosqlite:///packets.db
# -------------------------
# Database Cleanup Configuration
# -------------------------
[cleanup]
# Enable or disable daily cleanup
enabled = False
# Number of days to keep records in the database
days_to_keep = 14
# Time to run daily cleanup (24-hour format)
hour = 2
minute = 00
# Run VACUUM after cleanup
vacuum = False
# -------------------------
# Logging Configuration
# -------------------------
[logging]
# Enable or disable HTTP access logs from the web server
# When disabled, request logs like "GET /api/chat" will not appear
# Application logs (errors, startup messages, etc.) are unaffected
# Set to True to enable, False to disable (default: False)
access_log = False
# Database cleanup logfile location
db_cleanup_logfile = dbcleanup.log
```
---
## NOTE (PostgreSQL setup)**
If you want to use PostgreSQL instead of SQLite:
Install PostgreSQL for your OS.
Create a user and database:
```
`CREATE USER meshview WITH PASSWORD 'change_me';`
`CREATE DATABASE meshview OWNER meshview;`
```
Update `config.ini` example:
```
`connection_string = postgresql+asyncpg://meshview:change_me@localhost:5432/meshview`
```
## Running Meshview
Start the database manager:
```bash
./env/bin/python startdb.py
```
Start the web server:
```bash
./env/bin/python main.py
```
> **NOTE**
> You can specify a custom config file with the `--config` flag:
>
> ```bash
> ./env/bin/python startdb.py --config /path/to/config.ini
> ./env/bin/python main.py --config /path/to/config.ini
> ```
Open in your browser: http://localhost:8081/
---
## Running Meshview with `mvrun.py`
- `mvrun.py` starts both `startdb.py` and `main.py` in separate threads and merges the output.
- It accepts several command-line arguments for flexible deployment.
```bash
./env/bin/python mvrun.py
```
**Command-line options:**
- `--config CONFIG` - Path to the configuration file (default: `config.ini`)
- `--pid_dir PID_DIR` - Directory for PID files (default: `.`)
- `--py_exec PY_EXEC` - Path to the Python executable (default: `./env/bin/python`)
**Examples:**
```bash
# Use a specific config file
./env/bin/python mvrun.py --config /etc/meshview/config.ini
# Store PID files in a specific directory
./env/bin/python mvrun.py --pid_dir /var/run/meshview
# Use a different Python executable
./env/bin/python mvrun.py --py_exec /usr/bin/python3
```
---
## Setting Up Systemd Services (Ubuntu)
To run Meshview automatically on boot, create systemd services for `startdb.py` and `main.py`.
> **NOTE**
> You need to change the "User" and "/path/to/meshview" for your instance of the code on each service.
### 1. Service for `startdb.py`
Create:
```bash
sudo nano /etc/systemd/system/meshview-db.service
```
Paste:
```ini
[Unit]
Description=Meshview Database Initializer
After=network.target
[Service]
Type=simple
WorkingDirectory=/path/to/meshview
ExecStart=/path/to/meshview/env/bin/python /path/to/meshview/startdb.py --config /path/to/meshview/config.ini
Restart=always
RestartSec=5
User=yourusername
[Install]
WantedBy=multi-user.target
```
### 2. Service for `main.py`
Create:
```bash
sudo nano /etc/systemd/system/meshview-web.service
```
Paste:
```ini
[Unit]
Description=Meshview Web Server
After=network.target meshview-db.service
[Service]
Type=simple
WorkingDirectory=/path/to/meshview
ExecStart=/path/to/meshview/env/bin/python /path/to/meshview/main.py --config /path/to/meshview/config.ini
Restart=always
RestartSec=5
User=yourusername
[Install]
WantedBy=multi-user.target
```
### 3. Enable and start the services
```bash
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl enable meshview-db
sudo systemctl enable meshview-web
sudo systemctl start meshview-db
sudo systemctl start meshview-web
```
### 4. Check status
```bash
systemctl status meshview-db
systemctl status meshview-web
```
**TIP**
After editing `.service` files, always run:
```bash
sudo systemctl daemon-reload
```
## 5. Database Maintenance
### Database maintnance can now be done via the script itself here is the section from the configuration file.
- Simple to setup
- It will not drop any packets
```
# -------------------------
# Database Cleanup Configuration
# -------------------------
[cleanup]
# Enable or disable daily cleanup
enabled = False
# Number of days to keep records in the database
days_to_keep = 14
# Time to run daily cleanup (24-hour format)
hour = 2
minute = 00
# Run VACUUM after cleanup
vacuum = False
# -------------------------
# Logging Configuration
# -------------------------
[logging]
# Enable or disable HTTP access logs from the web server
access_log = False
# Database cleanup logfile location
db_cleanup_logfile = dbcleanup.log
```
Once changes are done you need to restart the script for changes to load.
### Alternatively we can do it via your OS (This example is Ubuntu like OS)
- Create and save bash script below. (Modify /path/to/file/ to the correct path)
- Name it cleanup.sh
- Make it executable.
```bash
#!/bin/bash
DB_FILE="/path/to/file/packets.db"
# Stop DB service
sudo systemctl stop meshview-db.service
sudo systemctl stop meshview-web.service
sleep 5
echo "Run cleanup..."
# Run cleanup queries
sqlite3 "$DB_FILE" <<EOF
DELETE FROM packet
WHERE import_time_us IS NOT NULL
AND import_time_us < (strftime('%s','now','-14 days') * 1000000);
SELECT 'packet deleted: ' || changes();
DELETE FROM packet_seen
WHERE import_time_us IS NOT NULL
AND import_time_us < (strftime('%s','now','-14 days') * 1000000);
SELECT 'packet_seen deleted: ' || changes();
DELETE FROM traceroute
WHERE import_time_us IS NOT NULL
AND import_time_us < (strftime('%s','now','-14 days') * 1000000);
SELECT 'traceroute deleted: ' || changes();
DELETE FROM node
WHERE last_seen_us IS NULL
OR last_seen_us < (strftime('%s','now','-14 days') * 1000000);
SELECT 'node deleted: ' || changes();
VACUUM;
EOF
# Start DB service
sudo systemctl start meshview-db.service
sudo systemctl start meshview-web.service
echo "Database cleanup completed on $(date)"
```
- If you are using PostgreSQL, use this version instead (adjust credentials/DB name):
```bash
#!/bin/bash
set -euo pipefail
DB="postgresql://meshview@localhost:5432/meshview"
RETENTION_DAYS=14
BATCH_SIZE=100
PSQL="/usr/bin/psql"
echo "[$(date)] Starting batched cleanup..."
while true; do
DELETED=$(
$PSQL "$DB" -At -v ON_ERROR_STOP=1 <<EOF
WITH cutoff AS (
SELECT (EXTRACT(EPOCH FROM (NOW() - INTERVAL '${RETENTION_DAYS} days')) * 1000000)::bigint AS ts
),
old_packets AS (
SELECT id
FROM packet, cutoff
WHERE import_time_us IS NOT NULL
AND import_time_us < cutoff.ts
ORDER BY id
LIMIT ${BATCH_SIZE}
),
ps_del AS (
DELETE FROM packet_seen
WHERE packet_id IN (SELECT id FROM old_packets)
RETURNING 1
),
tr_del AS (
DELETE FROM traceroute
WHERE packet_id IN (SELECT id FROM old_packets)
RETURNING 1
),
p_del AS (
DELETE FROM packet
WHERE id IN (SELECT id FROM old_packets)
RETURNING 1
)
SELECT COUNT(*) FROM p_del;
EOF
)
if [[ "$DELETED" -eq 0 ]]; then
break
fi
sleep 0.1
done
echo "[$(date)] Packet cleanup complete"
echo "[$(date)] Cleaning old nodes..."
$PSQL "$DB" -v ON_ERROR_STOP=1 <<EOF
DELETE FROM node
WHERE last_seen_us IS NOT NULL
AND last_seen_us < (
EXTRACT(EPOCH FROM (NOW() - INTERVAL '${RETENTION_DAYS} days')) * 1000000
);
EOF
echo "[$(date)] Node cleanup complete"
$PSQL "$DB" -c "VACUUM (ANALYZE) packet_seen;"
$PSQL "$DB" -c "VACUUM (ANALYZE) traceroute;"
$PSQL "$DB" -c "VACUUM (ANALYZE) packet;"
$PSQL "$DB" -c "VACUUM (ANALYZE) node;"
echo "[$(date)] Cleanup finished"
```
- Schedule running the script on a regular basis.
- In this example it runs every night at 2:00am.
Open scheduler:
```bash
sudo crontab -e
```
Add schedule to the bottom of the file (modify /path/to/file/ to the correct path):
```bash
0 2 * * * /path/to/file/cleanup.sh >> /path/to/file/cleanup.log 2>&1
```
Check the log file to see it the script run at the specific time.
---
## Technical Documentation
For more detailed technical documentation including database migrations, architecture details, and advanced topics, see the [docs/](docs/) directory.
+120
View File
@@ -0,0 +1,120 @@
# A generic, single database configuration.
[alembic]
# path to migration scripts
# Use forward slashes (/) also on windows to provide an os agnostic path
script_location = alembic
# template used to generate migration file names; The default value is %%(rev)s_%%(slug)s
# Uncomment the line below if you want the files to be prepended with date and time
# see https://alembic.sqlalchemy.org/en/latest/tutorial.html#editing-the-ini-file
# for all available tokens
# file_template = %%(year)d_%%(month).2d_%%(day).2d_%%(hour).2d%%(minute).2d-%%(rev)s_%%(slug)s
# sys.path path, will be prepended to sys.path if present.
# defaults to the current working directory.
prepend_sys_path = .
# timezone to use when rendering the date within the migration file
# as well as the filename.
# If specified, requires the python>=3.9 or backports.zoneinfo library and tzdata library.
# Any required deps can installed by adding `alembic[tz]` to the pip requirements
# string value is passed to ZoneInfo()
# leave blank for localtime
# timezone =
# max length of characters to apply to the "slug" field
# truncate_slug_length = 40
# set to 'true' to run the environment during
# the 'revision' command, regardless of autogenerate
# revision_environment = false
# set to 'true' to allow .pyc and .pyo files without
# a source .py file to be detected as revisions in the
# versions/ directory
# sourceless = false
# version location specification; This defaults
# to alembic/versions. When using multiple version
# directories, initial revisions must be specified with --version-path.
# The path separator used here should be the separator specified by "version_path_separator" below.
# version_locations = %(here)s/bar:%(here)s/bat:alembic/versions
# version path separator; As mentioned above, this is the character used to split
# version_locations. The default within new alembic.ini files is "os", which uses os.pathsep.
# If this key is omitted entirely, it falls back to the legacy behavior of splitting on spaces and/or commas.
# Valid values for version_path_separator are:
#
# version_path_separator = :
# version_path_separator = ;
# version_path_separator = space
# version_path_separator = newline
#
# Use os.pathsep. Default configuration used for new projects.
version_path_separator = os
# set to 'true' to search source files recursively
# in each "version_locations" directory
# new in Alembic version 1.10
# recursive_version_locations = false
# the output encoding used when revision files
# are written from script.py.mako
# output_encoding = utf-8
# sqlalchemy.url will be set programmatically from meshview config
# sqlalchemy.url = driver://user:pass@localhost/dbname
[post_write_hooks]
# post_write_hooks defines scripts or Python functions that are run
# on newly generated revision scripts. See the documentation for further
# detail and examples
# format using "black" - use the console_scripts runner, against the "black" entrypoint
# hooks = black
# black.type = console_scripts
# black.entrypoint = black
# black.options = -l 79 REVISION_SCRIPT_FILENAME
# lint with attempts to fix using "ruff" - use the exec runner, execute a binary
# hooks = ruff
# ruff.type = exec
# ruff.executable = %(here)s/.venv/bin/ruff
# ruff.options = --fix REVISION_SCRIPT_FILENAME
# Logging configuration
[loggers]
keys = root,sqlalchemy,alembic
[handlers]
keys = console
[formatters]
keys = generic
[logger_root]
level = INFO
handlers = console
qualname =
[logger_sqlalchemy]
level = WARNING
handlers =
qualname = sqlalchemy.engine
[logger_alembic]
level = INFO
handlers =
qualname = alembic
[handler_console]
class = StreamHandler
args = (sys.stderr,)
level = NOTSET
formatter = generic
[formatter_generic]
format = %(asctime)s %(filename)s:%(lineno)d [pid:%(process)d] %(levelname)s - %(message)s
datefmt = %Y-%m-%d %H:%M:%S
+1
View File
@@ -0,0 +1 @@
Generic single-database configuration.
+102
View File
@@ -0,0 +1,102 @@
import asyncio
from logging.config import fileConfig
from sqlalchemy import pool
from sqlalchemy.engine import Connection
from sqlalchemy.ext.asyncio import async_engine_from_config
from alembic import context
# Import models metadata for autogenerate support
from meshview.models import Base
# this is the Alembic Config object, which provides
# access to the values within the .ini file in use.
config = context.config
# Interpret the config file for Python logging.
# This line sets up loggers basically.
# Use disable_existing_loggers=False to preserve app logging configuration
if config.config_file_name is not None:
fileConfig(config.config_file_name, disable_existing_loggers=False)
# Add your model's MetaData object here for 'autogenerate' support
target_metadata = Base.metadata
def run_migrations_offline() -> None:
"""Run migrations in 'offline' mode.
This configures the context with just a URL
and not an Engine, though an Engine is acceptable
here as well. By skipping the Engine creation
we don't even need a DBAPI to be available.
Calls to context.execute() here emit the given string to the
script output.
"""
url = config.get_main_option("sqlalchemy.url")
context.configure(
url=url,
target_metadata=target_metadata,
literal_binds=True,
dialect_opts={"paramstyle": "named"},
)
with context.begin_transaction():
context.run_migrations()
def do_run_migrations(connection: Connection) -> None:
"""Run migrations with the given connection."""
context.configure(connection=connection, target_metadata=target_metadata)
with context.begin_transaction():
context.run_migrations()
async def run_async_migrations() -> None:
"""Run migrations in async mode."""
# Get configuration section
configuration = config.get_section(config.config_ini_section, {})
# If sqlalchemy.url is not set in alembic.ini, try to get it from meshview config
if "sqlalchemy.url" not in configuration:
try:
from meshview.config import CONFIG
configuration["sqlalchemy.url"] = CONFIG["database"]["connection_string"]
except Exception:
# Fallback to a default for initial migration creation
configuration["sqlalchemy.url"] = "sqlite+aiosqlite:///packets.db"
connectable = async_engine_from_config(
configuration,
prefix="sqlalchemy.",
poolclass=pool.NullPool,
)
async with connectable.connect() as connection:
await connection.run_sync(do_run_migrations)
await connectable.dispose()
def run_migrations_online() -> None:
"""Run migrations in 'online' mode with async support."""
try:
# Event loop is already running, schedule and run the coroutine
import concurrent.futures
with concurrent.futures.ThreadPoolExecutor() as pool:
pool.submit(lambda: asyncio.run(run_async_migrations())).result()
except RuntimeError:
# No event loop running, create one
asyncio.run(run_async_migrations())
if context.is_offline_mode():
run_migrations_offline()
else:
run_migrations_online()
+26
View File
@@ -0,0 +1,26 @@
"""${message}
Revision ID: ${up_revision}
Revises: ${down_revision | comma,n}
Create Date: ${create_date}
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
${imports if imports else ""}
# revision identifiers, used by Alembic.
revision: str = ${repr(up_revision)}
down_revision: Union[str, None] = ${repr(down_revision)}
branch_labels: Union[str, Sequence[str], None] = ${repr(branch_labels)}
depends_on: Union[str, Sequence[str], None] = ${repr(depends_on)}
def upgrade() -> None:
${upgrades if upgrades else "pass"}
def downgrade() -> None:
${downgrades if downgrades else "pass"}
@@ -0,0 +1,45 @@
"""Add example table
Revision ID: 1717fa5c6545
Revises: c88468b7ab0b
Create Date: 2025-10-26 20:59:04.347066
"""
from collections.abc import Sequence
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision: str = '1717fa5c6545'
down_revision: str | None = 'add_time_us_cols'
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None
def upgrade() -> None:
"""Create example table with sample columns."""
op.create_table(
'example',
sa.Column('id', sa.Integer(), nullable=False, primary_key=True, autoincrement=True),
sa.Column('name', sa.String(length=100), nullable=False),
sa.Column('description', sa.Text(), nullable=True),
sa.Column('value', sa.Float(), nullable=True),
sa.Column('is_active', sa.Boolean(), nullable=False, server_default='1'),
sa.Column(
'created_at', sa.DateTime(), nullable=False, server_default=sa.text('CURRENT_TIMESTAMP')
),
sa.Column('updated_at', sa.DateTime(), nullable=True),
sa.PrimaryKeyConstraint('id'),
)
# Create an index on the name column for faster lookups
op.create_index('idx_example_name', 'example', ['name'])
def downgrade() -> None:
"""Remove example table."""
op.drop_index('idx_example_name', table_name='example')
op.drop_table('example')
@@ -0,0 +1,27 @@
"""Add is_mqtt_gateway to node
Revision ID: 23dad03d2e42
Revises: a0c9c13e118f
Create Date: 2026-02-13 00:00:00.000000
"""
from collections.abc import Sequence
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision: str = "23dad03d2e42"
down_revision: str | None = "a0c9c13e118f"
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None
def upgrade() -> None:
op.add_column("node", sa.Column("is_mqtt_gateway", sa.Boolean(), nullable=True))
def downgrade() -> None:
op.drop_column("node", "is_mqtt_gateway")
@@ -0,0 +1,35 @@
"""Add first_seen_us and last_seen_us to node table
Revision ID: 2b5a61bb2b75
Revises: ac311b3782a1
Create Date: 2025-11-05 15:19:13.446724
"""
from collections.abc import Sequence
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision: str = '2b5a61bb2b75'
down_revision: str | None = 'ac311b3782a1'
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None
def upgrade() -> None:
# Add microsecond epoch timestamp columns for first and last seen times
op.add_column('node', sa.Column('first_seen_us', sa.BigInteger(), nullable=True))
op.add_column('node', sa.Column('last_seen_us', sa.BigInteger(), nullable=True))
op.create_index('idx_node_first_seen_us', 'node', ['first_seen_us'], unique=False)
op.create_index('idx_node_last_seen_us', 'node', ['last_seen_us'], unique=False)
def downgrade() -> None:
# Remove the microsecond epoch timestamp columns and their indexes
op.drop_index('idx_node_last_seen_us', table_name='node')
op.drop_index('idx_node_first_seen_us', table_name='node')
op.drop_column('node', 'last_seen_us')
op.drop_column('node', 'first_seen_us')
@@ -0,0 +1,35 @@
"""Add daily_snapshot table
Revision ID: 4f1d2a9c8b71
Revises: 23dad03d2e42
Create Date: 2026-03-05 00:00:00.000000
"""
from collections.abc import Sequence
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision: str = "4f1d2a9c8b71"
down_revision: str | None = "23dad03d2e42"
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None
def upgrade() -> None:
op.create_table(
"daily_snapshot",
sa.Column("snapshot_date", sa.Date(), nullable=False),
sa.Column("node_count", sa.BigInteger(), nullable=False),
sa.Column("packet_count", sa.BigInteger(), nullable=False),
sa.Column("gateway_count", sa.BigInteger(), nullable=False),
sa.Column("captured_at_us", sa.BigInteger(), nullable=False),
sa.PrimaryKeyConstraint("snapshot_date"),
)
def downgrade() -> None:
op.drop_table("daily_snapshot")
@@ -0,0 +1,65 @@
"""Drop import_time columns.
Revision ID: 9f3b1a8d2c4f
Revises: 2b5a61bb2b75
Create Date: 2026-01-09 09:55:00.000000
"""
from collections.abc import Sequence
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision: str = "9f3b1a8d2c4f"
down_revision: str | None = "2b5a61bb2b75"
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None
def upgrade() -> None:
conn = op.get_bind()
inspector = sa.inspect(conn)
packet_indexes = {idx["name"] for idx in inspector.get_indexes("packet")}
packet_columns = {col["name"] for col in inspector.get_columns("packet")}
with op.batch_alter_table("packet", schema=None) as batch_op:
if "idx_packet_import_time" in packet_indexes:
batch_op.drop_index("idx_packet_import_time")
if "idx_packet_from_node_time" in packet_indexes:
batch_op.drop_index("idx_packet_from_node_time")
if "import_time" in packet_columns:
batch_op.drop_column("import_time")
packet_seen_columns = {col["name"] for col in inspector.get_columns("packet_seen")}
with op.batch_alter_table("packet_seen", schema=None) as batch_op:
if "import_time" in packet_seen_columns:
batch_op.drop_column("import_time")
traceroute_indexes = {idx["name"] for idx in inspector.get_indexes("traceroute")}
traceroute_columns = {col["name"] for col in inspector.get_columns("traceroute")}
with op.batch_alter_table("traceroute", schema=None) as batch_op:
if "idx_traceroute_import_time" in traceroute_indexes:
batch_op.drop_index("idx_traceroute_import_time")
if "import_time" in traceroute_columns:
batch_op.drop_column("import_time")
def downgrade() -> None:
with op.batch_alter_table("traceroute", schema=None) as batch_op:
batch_op.add_column(sa.Column("import_time", sa.DateTime(), nullable=True))
batch_op.create_index("idx_traceroute_import_time", ["import_time"], unique=False)
with op.batch_alter_table("packet_seen", schema=None) as batch_op:
batch_op.add_column(sa.Column("import_time", sa.DateTime(), nullable=True))
with op.batch_alter_table("packet", schema=None) as batch_op:
batch_op.add_column(sa.Column("import_time", sa.DateTime(), nullable=True))
batch_op.create_index("idx_packet_import_time", [sa.text("import_time DESC")], unique=False)
batch_op.create_index(
"idx_packet_from_node_time",
["from_node_id", sa.text("import_time DESC")],
unique=False,
)
@@ -0,0 +1,43 @@
"""Add node_public_key table
Revision ID: a0c9c13e118f
Revises: d4d7b0c2e1a4
Create Date: 2026-02-06 00:00:00.000000
"""
from collections.abc import Sequence
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision: str = "a0c9c13e118f"
down_revision: str | None = "d4d7b0c2e1a4"
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None
def upgrade() -> None:
op.create_table(
"node_public_key",
sa.Column("id", sa.Integer(), primary_key=True, autoincrement=True),
sa.Column("node_id", sa.BigInteger(), nullable=False),
sa.Column("public_key", sa.String(), nullable=False),
sa.Column("first_seen_us", sa.BigInteger(), nullable=True),
sa.Column("last_seen_us", sa.BigInteger(), nullable=True),
)
op.create_index("idx_node_public_key_node_id", "node_public_key", ["node_id"], unique=False)
op.create_index(
"idx_node_public_key_public_key",
"node_public_key",
["public_key"],
unique=False,
)
def downgrade() -> None:
op.drop_index("idx_node_public_key_public_key", table_name="node_public_key")
op.drop_index("idx_node_public_key_node_id", table_name="node_public_key")
op.drop_table("node_public_key")
@@ -0,0 +1,31 @@
"""add route_return to traceroute
Revision ID: ac311b3782a1
Revises: 1717fa5c6545
Create Date: 2025-11-04 20:28:33.174137
"""
from collections.abc import Sequence
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision: str = 'ac311b3782a1'
down_revision: str | None = '1717fa5c6545'
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None
def upgrade() -> None:
# Add route_return column to traceroute table
with op.batch_alter_table('traceroute', schema=None) as batch_op:
batch_op.add_column(sa.Column('route_return', sa.LargeBinary(), nullable=True))
def downgrade() -> None:
# Remove route_return column from traceroute table
with op.batch_alter_table('traceroute', schema=None) as batch_op:
batch_op.drop_column('route_return')
@@ -0,0 +1,74 @@
"""add import_time_us columns
Revision ID: add_time_us_cols
Revises: c88468b7ab0b
Create Date: 2025-11-03 14:10:00.000000
"""
from collections.abc import Sequence
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision: str = 'add_time_us_cols'
down_revision: str | None = 'c88468b7ab0b'
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None
def upgrade() -> None:
# Check if columns already exist, add them if they don't
conn = op.get_bind()
inspector = sa.inspect(conn)
# Add import_time_us to packet table
packet_columns = [col['name'] for col in inspector.get_columns('packet')]
if 'import_time_us' not in packet_columns:
with op.batch_alter_table('packet', schema=None) as batch_op:
batch_op.add_column(sa.Column('import_time_us', sa.BigInteger(), nullable=True))
op.create_index(
'idx_packet_import_time_us', 'packet', [sa.text('import_time_us DESC')], unique=False
)
op.create_index(
'idx_packet_from_node_time_us',
'packet',
['from_node_id', sa.text('import_time_us DESC')],
unique=False,
)
# Add import_time_us to packet_seen table
packet_seen_columns = [col['name'] for col in inspector.get_columns('packet_seen')]
if 'import_time_us' not in packet_seen_columns:
with op.batch_alter_table('packet_seen', schema=None) as batch_op:
batch_op.add_column(sa.Column('import_time_us', sa.BigInteger(), nullable=True))
op.create_index(
'idx_packet_seen_import_time_us', 'packet_seen', ['import_time_us'], unique=False
)
# Add import_time_us to traceroute table
traceroute_columns = [col['name'] for col in inspector.get_columns('traceroute')]
if 'import_time_us' not in traceroute_columns:
with op.batch_alter_table('traceroute', schema=None) as batch_op:
batch_op.add_column(sa.Column('import_time_us', sa.BigInteger(), nullable=True))
op.create_index(
'idx_traceroute_import_time_us', 'traceroute', ['import_time_us'], unique=False
)
def downgrade() -> None:
# Drop indexes and columns
op.drop_index('idx_traceroute_import_time_us', table_name='traceroute')
with op.batch_alter_table('traceroute', schema=None) as batch_op:
batch_op.drop_column('import_time_us')
op.drop_index('idx_packet_seen_import_time_us', table_name='packet_seen')
with op.batch_alter_table('packet_seen', schema=None) as batch_op:
batch_op.drop_column('import_time_us')
op.drop_index('idx_packet_from_node_time_us', table_name='packet')
op.drop_index('idx_packet_import_time_us', table_name='packet')
with op.batch_alter_table('packet', schema=None) as batch_op:
batch_op.drop_column('import_time_us')
@@ -0,0 +1,94 @@
"""Add last_update_us to node and migrate data.
Revision ID: b7c3c2e3a1f0
Revises: 9f3b1a8d2c4f
Create Date: 2026-01-12 10:12:00.000000
"""
from collections.abc import Sequence
from datetime import UTC, datetime
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision: str = "b7c3c2e3a1f0"
down_revision: str | None = "9f3b1a8d2c4f"
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None
def _parse_datetime(value):
if value is None:
return None
if isinstance(value, datetime):
dt = value
elif isinstance(value, str):
text = value.replace("Z", "+00:00")
try:
dt = datetime.fromisoformat(text)
except ValueError:
return None
else:
return None
if dt.tzinfo is None:
return dt.replace(tzinfo=UTC)
return dt.astimezone(UTC)
def upgrade() -> None:
conn = op.get_bind()
op.add_column("node", sa.Column("last_update_us", sa.BigInteger(), nullable=True))
op.create_index("idx_node_last_update_us", "node", ["last_update_us"], unique=False)
node = sa.table(
"node",
sa.column("id", sa.String()),
sa.column("last_update", sa.DateTime()),
sa.column("last_update_us", sa.BigInteger()),
)
rows = conn.execute(sa.select(node.c.id, node.c.last_update)).all()
for node_id, last_update in rows:
dt = _parse_datetime(last_update)
if dt is None:
continue
last_update_us = int(dt.timestamp() * 1_000_000)
conn.execute(
sa.update(node).where(node.c.id == node_id).values(last_update_us=last_update_us)
)
if conn.dialect.name == "sqlite":
with op.batch_alter_table("node", schema=None) as batch_op:
batch_op.drop_column("last_update")
else:
op.drop_column("node", "last_update")
def downgrade() -> None:
conn = op.get_bind()
op.add_column("node", sa.Column("last_update", sa.DateTime(), nullable=True))
node = sa.table(
"node",
sa.column("id", sa.String()),
sa.column("last_update", sa.DateTime()),
sa.column("last_update_us", sa.BigInteger()),
)
rows = conn.execute(sa.select(node.c.id, node.c.last_update_us)).all()
for node_id, last_update_us in rows:
if last_update_us is None:
continue
dt = datetime.fromtimestamp(last_update_us / 1_000_000, tz=UTC).replace(tzinfo=None)
conn.execute(sa.update(node).where(node.c.id == node_id).values(last_update=dt))
if conn.dialect.name == "sqlite":
with op.batch_alter_table("node", schema=None) as batch_op:
batch_op.drop_index("idx_node_last_update_us")
batch_op.drop_column("last_update_us")
else:
op.drop_index("idx_node_last_update_us", table_name="node")
op.drop_column("node", "last_update_us")
@@ -0,0 +1,22 @@
"""Compatibility placeholder for removed revision c6b1d8f2a9e3.
Revision ID: c6b1d8f2a9e3
Revises: 4f1d2a9c8b71
Create Date: 2026-03-05 00:00:00.000000
"""
from collections.abc import Sequence
# revision identifiers, used by Alembic.
revision: str = "c6b1d8f2a9e3"
down_revision: str | None = "4f1d2a9c8b71"
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None
def upgrade() -> None:
pass
def downgrade() -> None:
pass
@@ -0,0 +1,160 @@
"""Initial migration
Revision ID: c88468b7ab0b
Revises:
Create Date: 2025-10-26 20:56:50.285200
"""
from collections.abc import Sequence
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision: str = 'c88468b7ab0b'
down_revision: str | None = None
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None
def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
# Get connection and inspector to check what exists
conn = op.get_bind()
inspector = sa.inspect(conn)
existing_tables = inspector.get_table_names()
# Create node table if it doesn't exist
if 'node' not in existing_tables:
op.create_table(
'node',
sa.Column('id', sa.String(), nullable=False),
sa.Column('node_id', sa.BigInteger(), nullable=True),
sa.Column('long_name', sa.String(), nullable=True),
sa.Column('short_name', sa.String(), nullable=True),
sa.Column('hw_model', sa.String(), nullable=True),
sa.Column('firmware', sa.String(), nullable=True),
sa.Column('role', sa.String(), nullable=True),
sa.Column('last_lat', sa.BigInteger(), nullable=True),
sa.Column('last_long', sa.BigInteger(), nullable=True),
sa.Column('channel', sa.String(), nullable=True),
sa.Column('last_update', sa.DateTime(), nullable=True),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('node_id'),
)
op.create_index('idx_node_node_id', 'node', ['node_id'], unique=False)
# Create packet table if it doesn't exist
if 'packet' not in existing_tables:
op.create_table(
'packet',
sa.Column('id', sa.BigInteger(), nullable=False),
sa.Column('portnum', sa.Integer(), nullable=True),
sa.Column('from_node_id', sa.BigInteger(), nullable=True),
sa.Column('to_node_id', sa.BigInteger(), nullable=True),
sa.Column('payload', sa.LargeBinary(), nullable=True),
sa.Column('import_time', sa.DateTime(), nullable=True),
sa.Column('import_time_us', sa.BigInteger(), nullable=True),
sa.Column('channel', sa.String(), nullable=True),
sa.PrimaryKeyConstraint('id'),
)
op.create_index('idx_packet_from_node_id', 'packet', ['from_node_id'], unique=False)
op.create_index('idx_packet_to_node_id', 'packet', ['to_node_id'], unique=False)
op.create_index(
'idx_packet_import_time', 'packet', [sa.text('import_time DESC')], unique=False
)
op.create_index(
'idx_packet_import_time_us', 'packet', [sa.text('import_time_us DESC')], unique=False
)
op.create_index(
'idx_packet_from_node_time',
'packet',
['from_node_id', sa.text('import_time DESC')],
unique=False,
)
op.create_index(
'idx_packet_from_node_time_us',
'packet',
['from_node_id', sa.text('import_time_us DESC')],
unique=False,
)
# Create packet_seen table if it doesn't exist
if 'packet_seen' not in existing_tables:
op.create_table(
'packet_seen',
sa.Column('packet_id', sa.BigInteger(), nullable=False),
sa.Column('node_id', sa.BigInteger(), nullable=False),
sa.Column('rx_time', sa.BigInteger(), nullable=False),
sa.Column('hop_limit', sa.Integer(), nullable=True),
sa.Column('hop_start', sa.Integer(), nullable=True),
sa.Column('channel', sa.String(), nullable=True),
sa.Column('rx_snr', sa.Float(), nullable=True),
sa.Column('rx_rssi', sa.Integer(), nullable=True),
sa.Column('topic', sa.String(), nullable=True),
sa.Column('import_time', sa.DateTime(), nullable=True),
sa.Column('import_time_us', sa.BigInteger(), nullable=True),
sa.ForeignKeyConstraint(
['packet_id'],
['packet.id'],
),
sa.PrimaryKeyConstraint('packet_id', 'node_id', 'rx_time'),
)
op.create_index('idx_packet_seen_node_id', 'packet_seen', ['node_id'], unique=False)
op.create_index('idx_packet_seen_packet_id', 'packet_seen', ['packet_id'], unique=False)
op.create_index(
'idx_packet_seen_import_time_us', 'packet_seen', ['import_time_us'], unique=False
)
# Create traceroute table if it doesn't exist
if 'traceroute' not in existing_tables:
op.create_table(
'traceroute',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('packet_id', sa.BigInteger(), nullable=True),
sa.Column('gateway_node_id', sa.BigInteger(), nullable=True),
sa.Column('done', sa.Boolean(), nullable=True),
sa.Column('route', sa.LargeBinary(), nullable=True),
sa.Column('import_time', sa.DateTime(), nullable=True),
sa.Column('import_time_us', sa.BigInteger(), nullable=True),
sa.ForeignKeyConstraint(
['packet_id'],
['packet.id'],
),
sa.PrimaryKeyConstraint('id'),
)
op.create_index('idx_traceroute_import_time', 'traceroute', ['import_time'], unique=False)
op.create_index(
'idx_traceroute_import_time_us', 'traceroute', ['import_time_us'], unique=False
)
# ### end Alembic commands ###
def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
# Drop traceroute table and indexes
op.drop_index('idx_traceroute_import_time_us', table_name='traceroute')
op.drop_index('idx_traceroute_import_time', table_name='traceroute')
op.drop_table('traceroute')
# Drop packet_seen table and indexes
op.drop_index('idx_packet_seen_import_time_us', table_name='packet_seen')
op.drop_index('idx_packet_seen_packet_id', table_name='packet_seen')
op.drop_index('idx_packet_seen_node_id', table_name='packet_seen')
op.drop_table('packet_seen')
# Drop packet table and indexes
op.drop_index('idx_packet_from_node_time_us', table_name='packet')
op.drop_index('idx_packet_from_node_time', table_name='packet')
op.drop_index('idx_packet_import_time_us', table_name='packet')
op.drop_index('idx_packet_import_time', table_name='packet')
op.drop_index('idx_packet_to_node_id', table_name='packet')
op.drop_index('idx_packet_from_node_id', table_name='packet')
op.drop_table('packet')
# Drop node table and indexes
op.drop_index('idx_node_node_id', table_name='node')
op.drop_table('node')
# ### end Alembic commands ###
@@ -0,0 +1,34 @@
"""Drop last_update_us from node.
Revision ID: d4d7b0c2e1a4
Revises: b7c3c2e3a1f0
Create Date: 2026-01-12 10:20:00.000000
"""
from collections.abc import Sequence
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision: str = "d4d7b0c2e1a4"
down_revision: str | None = "b7c3c2e3a1f0"
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None
def upgrade() -> None:
conn = op.get_bind()
if conn.dialect.name == "sqlite":
with op.batch_alter_table("node", schema=None) as batch_op:
batch_op.drop_index("idx_node_last_update_us")
batch_op.drop_column("last_update_us")
else:
op.drop_index("idx_node_last_update_us", table_name="node")
op.drop_column("node", "last_update_us")
def downgrade() -> None:
op.add_column("node", sa.Column("last_update_us", sa.BigInteger(), nullable=True))
op.create_index("idx_node_last_update_us", "node", ["last_update_us"], unique=False)
@@ -0,0 +1,43 @@
"""Drop node_public_key table
Revision ID: e8f2c4b6d9a1
Revises: c6b1d8f2a9e3
Create Date: 2026-05-25 00:00:00.000000
"""
from collections.abc import Sequence
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision: str = "e8f2c4b6d9a1"
down_revision: str | None = "c6b1d8f2a9e3"
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None
def upgrade() -> None:
op.drop_index("idx_node_public_key_public_key", table_name="node_public_key")
op.drop_index("idx_node_public_key_node_id", table_name="node_public_key")
op.drop_table("node_public_key")
def downgrade() -> None:
op.create_table(
"node_public_key",
sa.Column("id", sa.Integer(), primary_key=True, autoincrement=True),
sa.Column("node_id", sa.BigInteger(), nullable=False),
sa.Column("public_key", sa.String(), nullable=False),
sa.Column("first_seen_us", sa.BigInteger(), nullable=True),
sa.Column("last_seen_us", sa.BigInteger(), nullable=True),
)
op.create_index("idx_node_public_key_node_id", "node_public_key", ["node_id"], unique=False)
op.create_index(
"idx_node_public_key_public_key",
"node_public_key",
["public_key"],
unique=False,
)
+57
View File
@@ -0,0 +1,57 @@
#!/bin/sh
#
# build-container.sh
#
# Script to build MeshView container images
set -e
# Default values
IMAGE_NAME="meshview"
TAG="latest"
CONTAINERFILE="Containerfile"
# Parse arguments
while [ $# -gt 0 ]; do
case "$1" in
--tag|-t)
TAG="$2"
shift 2
;;
--name|-n)
IMAGE_NAME="$2"
shift 2
;;
--file|-f)
CONTAINERFILE="$2"
shift 2
;;
--help|-h)
echo "Usage: $0 [OPTIONS]"
echo ""
echo "Options:"
echo " -t, --tag TAG Tag for the image (default: latest)"
echo " -n, --name NAME Image name (default: meshview)"
echo " -f, --file FILE Containerfile path (default: Containerfile)"
echo " -h, --help Show this help"
exit 0
;;
*)
echo "Unknown option: $1"
echo "Use --help for usage information"
exit 1
;;
esac
done
echo "Building MeshView container image..."
echo " Image: ${IMAGE_NAME}:${TAG}"
echo " Containerfile: ${CONTAINERFILE}"
echo ""
# Build the container
docker build -f "${CONTAINERFILE}" -t "${IMAGE_NAME}:${TAG}" .
echo ""
echo "Build complete!"
echo "Run with: docker run --rm -p 8081:8081 ${IMAGE_NAME}:${TAG}"
+90
View File
@@ -0,0 +1,90 @@
# -------------------------
# Server Configuration
# -------------------------
[server]
# The address to bind the server to. Use * to listen on all interfaces.
bind = 0.0.0.0
# Port to run the web server on.
port = 8081
# Path to TLS certificate (leave blank to disable HTTPS).
tls_cert =
# Path for the ACME challenge if using Let's Encrypt.
acme_challenge =
# -------------------------
# Site Appearance & Behavior
# -------------------------
[site]
domain =
language = en
title = Bay Area Mesh
message = Real time data from around the bay area and beyond.
starting = /chat
nodes = True
conversations = True
everything = True
graphs = True
stats = True
net = True
map = True
top = True
map_top_left_lat = 39
map_top_left_lon = -123
map_bottom_right_lat = 36
map_bottom_right_lon = -121
map_interval = 3
firehose_interal = 3
weekly_net_message = Weekly Mesh check-in. We will keep it open on every Wednesday from 5:00pm for checkins. The message format should be (LONG NAME) - (CITY YOU ARE IN) #BayMeshNet.
net_tag = #BayMeshNet
# -------------------------
# MQTT Broker Configuration
# -------------------------
[mqtt]
server = mqtt.meshtastic.org
topics = ["msh/US/bayarea/#", "msh/US/CA/mrymesh/#", "msh/US/CA/sacvalley"]
port = 1883
username = meshdev
password = large4cats
skip_node_ids =
secondary_keys =
# -------------------------
# Database Configuration
# -------------------------
[database]
connection_string = sqlite+aiosqlite:////var/lib/meshview/packets.db
# -------------------------
# Database Cleanup Configuration
# -------------------------
[cleanup]
enabled = False
days_to_keep = 14
hour = 2
minute = 00
vacuum = False
backup_enabled = False
backup_dir = ./backups
backup_hour = 2
backup_minute = 00
# -------------------------
# Logging Configuration
# -------------------------
[logging]
access_log = False
db_cleanup_logfile = /var/log/meshview/dbcleanup.log
+37
View File
@@ -0,0 +1,37 @@
diff --git a/sample.config.ini b/sample.config.ini
index 0e64980..494685c 100644
--- a/sample.config.ini
+++ b/sample.config.ini
@@ -3,7 +3,7 @@
# -------------------------
[server]
# The address to bind the server to. Use * to listen on all interfaces.
-bind = *
+bind = 0.0.0.0
# Port to run the web server on.
port = 8081
@@ -64,7 +64,7 @@ net_tag = #BayMeshNet
# -------------------------
[mqtt]
# MQTT server hostname or IP.
-server = mqtt.bayme.sh
+server = mqtt.meshtastic.org
# Topics to subscribe to (as JSON-like list, but still a string).
topics = ["msh/US/bayarea/#", "msh/US/CA/mrymesh/#", "msh/US/CA/sacvalley"]
@@ -82,7 +82,7 @@ password = large4cats
# -------------------------
[database]
# SQLAlchemy connection string. This one uses SQLite with asyncio support.
-connection_string = sqlite+aiosqlite:///packets.db
+connection_string = sqlite+aiosqlite:////var/lib/meshview/packets.db
# -------------------------
@@ -110,4 +110,4 @@ vacuum = False
# Set to True to enable, False to disable (default: False)
access_log = False
# Database cleanup logfile
-db_cleanup_logfile = dbcleanup.log
+db_cleanup_logfile = /var/log/meshview/dbcleanup.log
+52
View File
@@ -0,0 +1,52 @@
#!/usr/bin/env python3
"""
Script to create a blank migration for manual editing.
Usage:
./env/bin/python create_example_migration.py
This creates an empty migration file that you can manually edit to add
custom migration logic (data migrations, complex schema changes, etc.)
Unlike create_migration.py which auto-generates from model changes,
this creates a blank template for you to fill in.
"""
import os
import sys
# Add current directory to path
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from alembic.config import Config
from alembic import command
# Create Alembic config
alembic_cfg = Config("alembic.ini")
# Set database URL from meshview config
try:
from meshview.config import CONFIG
database_url = CONFIG["database"]["connection_string"]
alembic_cfg.set_main_option("sqlalchemy.url", database_url)
print(f"Using database URL from config: {database_url}")
except Exception as e:
print(f"Warning: Could not load meshview config: {e}")
print("Using default database URL")
alembic_cfg.set_main_option("sqlalchemy.url", "sqlite+aiosqlite:///packets.db")
# Generate blank migration
try:
print("Creating blank migration for manual editing...")
command.revision(alembic_cfg, autogenerate=False, message="Manual migration")
print("✓ Successfully created blank migration!")
print("\nNow edit the generated file in alembic/versions/")
print("Add your custom upgrade() and downgrade() logic")
except Exception as e:
print(f"✗ Error creating migration: {e}")
import traceback
traceback.print_exc()
sys.exit(1)
+58
View File
@@ -0,0 +1,58 @@
#!/usr/bin/env python3
"""
Helper script to create Alembic migrations from SQLAlchemy model changes.
Usage:
./env/bin/python create_migration.py
This will:
1. Load your current models from meshview/models.py
2. Compare them to the current database schema
3. Auto-generate a migration with the detected changes
4. Save the migration to alembic/versions/
After running this, review the generated migration file before committing!
"""
import os
import sys
# Add current directory to path
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from alembic.config import Config
from alembic import command
# Create Alembic config
alembic_cfg = Config("alembic.ini")
# Set database URL from meshview config
try:
from meshview.config import CONFIG
database_url = CONFIG["database"]["connection_string"]
alembic_cfg.set_main_option("sqlalchemy.url", database_url)
print(f"Using database URL from config: {database_url}")
except Exception as e:
print(f"Warning: Could not load meshview config: {e}")
print("Using default database URL")
alembic_cfg.set_main_option("sqlalchemy.url", "sqlite+aiosqlite:///packets.db")
# Generate migration
try:
print("\nComparing models to current database schema...")
print("Generating migration...\n")
command.revision(alembic_cfg, autogenerate=True, message="Auto-generated migration")
print("\n✓ Successfully created migration!")
print("\nNext steps:")
print("1. Review the generated file in alembic/versions/")
print("2. Edit the migration message/logic if needed")
print("3. Test the migration: ./env/bin/alembic upgrade head")
print("4. Commit the migration file to version control")
except Exception as e:
print(f"\n✗ Error creating migration: {e}")
import traceback
traceback.print_exc()
sys.exit(1)
+361
View File
@@ -0,0 +1,361 @@
# Alembic Database Migration Setup
This document describes the automatic database migration system implemented for MeshView using Alembic.
## Overview
The system provides automatic database schema migrations with coordination between the writer app (startdb.py) and reader app (web.py):
- **Writer App**: Automatically runs pending migrations on startup
- **Reader App**: Waits for migrations to complete before starting
## Architecture
### Key Components
1. **`meshview/migrations.py`** - Migration management utilities
- `run_migrations()` - Runs pending migrations (writer app)
- `wait_for_migrations()` - Waits for schema to be current (reader app)
- `is_database_up_to_date()` - Checks schema version
- Migration status tracking table
2. **`alembic/`** - Alembic migration directory
- `env.py` - Configured for async SQLAlchemy support
- `versions/` - Migration scripts directory
- `alembic.ini` - Alembic configuration
3. **Modified Apps**:
- `startdb.py` - Writer app that runs migrations before MQTT ingestion
- `meshview/web.py` - Reader app that waits for schema updates
## How It Works - Automatic In-Place Updates
### ✨ Fully Automatic Operation
**No manual migration commands needed!** The database schema updates automatically when you:
1. Deploy new code with migration files
2. Restart the applications
### Writer App (startdb.py) Startup Sequence
1. Initialize database connection
2. Create migration status tracking table
3. Set "migration in progress" flag
4. **🔄 Automatically run any pending Alembic migrations** (synchronously)
- Detects current schema version
- Compares to latest available migration
- Runs all pending migrations in sequence
- Updates database schema in place
5. Clear "migration in progress" flag
6. Start MQTT ingestion and other tasks
### Reader App (web.py) Startup Sequence
1. Initialize database connection
2. **Check database schema version**
3. If not up to date:
- Wait up to 60 seconds (30 retries × 2 seconds)
- Check every 2 seconds for schema updates
- Automatically proceeds once writer completes migrations
4. Once schema is current, start web server
### 🎯 Key Point: Zero Manual Steps
When you deploy new code with migrations:
```bash
# Just start the apps - migrations happen automatically!
./env/bin/python startdb.py # Migrations run here automatically
./env/bin/python main.py # Waits for migrations, then starts
```
**The database updates itself!** No need to run `alembic upgrade` manually.
### Coordination
The apps coordinate using:
- **Alembic version table** (`alembic_version`) - Tracks current schema version
- **Migration status table** (`migration_status`) - Optional flag for "in progress" state
## Creating New Migrations
### Using the helper script:
```bash
./env/bin/python create_migration.py
```
### Manual creation:
```bash
./env/bin/alembic revision --autogenerate -m "Description of changes"
```
This will:
1. Compare current database schema with SQLAlchemy models
2. Generate a migration script in `alembic/versions/`
3. Automatically detect most schema changes
### Manual migration (advanced):
```bash
./env/bin/alembic revision -m "Manual migration"
```
Then edit the generated file to add custom migration logic.
## Running Migrations
### Automatic (Recommended)
Migrations run automatically when the writer app starts:
```bash
./env/bin/python startdb.py
```
### Manual
To run migrations manually:
```bash
./env/bin/alembic upgrade head
```
To downgrade:
```bash
./env/bin/alembic downgrade -1 # Go back one version
./env/bin/alembic downgrade base # Go back to beginning
```
## Checking Migration Status
Check current database version:
```bash
./env/bin/alembic current
```
View migration history:
```bash
./env/bin/alembic history
```
## Benefits
1. **Zero Manual Intervention**: Migrations run automatically on startup
2. **Safe Coordination**: Reader won't connect to incompatible schema
3. **Version Control**: All schema changes tracked in git
4. **Rollback Capability**: Can downgrade if needed
5. **Auto-generation**: Most migrations created automatically from model changes
## Migration Workflow
### Development Process
1. **Modify SQLAlchemy models** in `meshview/models.py`
2. **Create migration**:
```bash
./env/bin/python create_migration.py
```
3. **Review generated migration** in `alembic/versions/`
4. **Test migration**:
- Stop all apps
- Start writer app (migrations run automatically)
- Start reader app (waits for schema to be current)
5. **Commit migration** to version control
### Production Deployment
1. **Deploy new code** with migration scripts
2. **Start writer app** - Migrations run automatically
3. **Start reader app** - Waits for migrations, then starts
4. **Monitor logs** for migration success
## Troubleshooting
### Migration fails
Check logs in writer app for error details. To manually fix:
```bash
./env/bin/alembic current # Check current version
./env/bin/alembic history # View available versions
./env/bin/alembic upgrade head # Try manual upgrade
```
### Reader app won't start (timeout)
Check if writer app is running and has completed migrations:
```bash
./env/bin/alembic current
```
### Reset to clean state
⚠️ **Warning: This will lose all data**
```bash
rm packets.db # Or your database file
./env/bin/alembic upgrade head # Create fresh schema
```
## File Structure
```
meshview/
├── alembic.ini # Alembic configuration
├── alembic/
│ ├── env.py # Async-enabled migration runner
│ ├── script.py.mako # Migration template
│ └── versions/ # Migration scripts
│ └── c88468b7ab0b_initial_migration.py
├── meshview/
│ ├── models.py # SQLAlchemy models (source of truth)
│ ├── migrations.py # Migration utilities
│ ├── mqtt_database.py # Writer database connection
│ └── database.py # Reader database connection
├── startdb.py # Writer app (runs migrations)
├── main.py # Entry point for reader app
└── create_migration.py # Helper script for creating migrations
```
## Configuration
Database URL is read from `config.ini`:
```ini
[database]
connection_string = sqlite+aiosqlite:///packets.db
```
Alembic automatically uses this configuration through `meshview/migrations.py`.
## Important Notes
1. **Always test migrations** in development before deploying to production
2. **Backup database** before running migrations in production
3. **Check for data loss** - Some migrations may require data migration logic
4. **Coordinate deployments** - Start writer before readers in multi-instance setups
5. **Monitor logs** during first startup after deployment
## Example Migrations
### Example 1: Generated Initial Migration
Here's what an auto-generated migration looks like (from comparing models to database):
```python
"""Initial migration
Revision ID: c88468b7ab0b
Revises:
Create Date: 2025-01-26 20:56:50.123456
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers
revision = 'c88468b7ab0b'
down_revision = None
branch_labels = None
depends_on = None
def upgrade() -> None:
# Upgrade operations
op.create_table('node',
sa.Column('id', sa.String(), nullable=False),
sa.Column('node_id', sa.BigInteger(), nullable=True),
# ... more columns
sa.PrimaryKeyConstraint('id')
)
def downgrade() -> None:
# Downgrade operations
op.drop_table('node')
```
### Example 2: Manual Migration Adding a New Table
We've included an example migration (`1717fa5c6545_add_example_table.py`) that demonstrates how to manually create a new table:
```python
"""Add example table
Revision ID: 1717fa5c6545
Revises: c88468b7ab0b
Create Date: 2025-10-26 20:59:04.347066
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
def upgrade() -> None:
"""Create example table with sample columns."""
op.create_table(
'example',
sa.Column('id', sa.Integer(), nullable=False, primary_key=True, autoincrement=True),
sa.Column('name', sa.String(length=100), nullable=False),
sa.Column('description', sa.Text(), nullable=True),
sa.Column('value', sa.Float(), nullable=True),
sa.Column('is_active', sa.Boolean(), nullable=False, server_default='1'),
sa.Column('created_at', sa.DateTime(), nullable=False,
server_default=sa.text('CURRENT_TIMESTAMP')),
sa.Column('updated_at', sa.DateTime(), nullable=True),
sa.PrimaryKeyConstraint('id')
)
# Create an index on the name column for faster lookups
op.create_index('idx_example_name', 'example', ['name'])
def downgrade() -> None:
"""Remove example table."""
op.drop_index('idx_example_name', table_name='example')
op.drop_table('example')
```
**Key features demonstrated:**
- Various column types (Integer, String, Text, Float, Boolean, DateTime)
- Primary key with autoincrement
- Nullable and non-nullable columns
- Server defaults (for timestamps and booleans)
- Creating indexes
- Proper downgrade that reverses all changes
**To test this migration:**
```bash
# Apply the migration
./env/bin/alembic upgrade head
# Check it was applied
./env/bin/alembic current
# Verify table was created
sqlite3 packetsPL.db "SELECT sql FROM sqlite_master WHERE type='table' AND name='example';"
# Roll back the migration
./env/bin/alembic downgrade -1
# Verify table was removed
sqlite3 packetsPL.db "SELECT name FROM sqlite_master WHERE type='table' AND name='example';"
```
**To remove this example migration** (after testing):
```bash
# First make sure you're not on this revision
./env/bin/alembic downgrade c88468b7ab0b
# Then delete the migration file
rm alembic/versions/1717fa5c6545_add_example_table.py
```
## References
- [Alembic Documentation](https://alembic.sqlalchemy.org/)
- [SQLAlchemy Documentation](https://docs.sqlalchemy.org/)
- [Async SQLAlchemy](https://docs.sqlalchemy.org/en/20/orm/extensions/asyncio.html)
+745
View File
@@ -0,0 +1,745 @@
# API Documentation
Base URL: `http(s)://<host>`
This reference covers all 16 GET routes registered in `meshview/web_api/api.py`,
including `/health` and `/version`. The browser version is served at `/api.html`.
Responses below are illustrative examples; actual values depend on stored data.
Regenerate the browser reference after editing this file with
`node scripts/build-api-docs.mjs`.
## Conventions
- Successful API responses are JSON. Explicit validation errors usually return JSON
with an `error` field. Some unhandled errors return HTTP 500 with a plain-text
body; check HTTP status and Content-Type before parsing an error response.
- All routes are read-only. The application does not require an API token; a reverse
proxy may impose authentication. There are no application-level write endpoints.
- `*_us` timestamps and `since` use microseconds since the Unix epoch. Snapshot dates
and statistics buckets use UTC. Node latitude/longitude integers must be divided
by 10,000,000 to obtain degrees; coverage coordinates are already degrees.
- Packet `id` and `storage_id` are database row IDs. Use these for the `packet_id`
query/path parameters on packet, observation, count, and traceroute endpoints.
A response field named `packet_id` on a packet object is instead its over-the-air
Meshtastic ID. `reply_id`, when present, is also an over-the-air ID. These ID types
are not interchangeable. Node IDs are numeric Meshtastic node numbers; the node
object's `id` is a separate string identifier.
- Use decimal node IDs throughout. The packet sender/recipient filters and the QR
and coverage paths also accept Python-style `0x` hexadecimal numbers. This is
not supported consistently by the other routes.
- Public broadcast text is readable. Direct text messages on port 1 are returned as
`<redacted>`. Request chat with `/api/packets?portnum=1`; there is no `/api/chat`
route. Do not treat a decoded `payload` string as trusted HTML.
## Quick examples
```sh
curl 'http://localhost:8081/api/nodes?days_active=3'
curl 'http://localhost:8081/api/packets?portnum=1&limit=100'
curl 'http://localhost:8081/api/stats/count'
curl 'http://localhost:8081/api/coverage/1234?mode=perimeter&radius_km=20'
```
## 1. Nodes API
### GET `/api/nodes`
Returns a list of nodes, with optional filtering.
Query Parameters
- `node_id` (optional, int): Exact node ID.
- `role` (optional, string): Node role.
- `channel` (optional, string): Channel name.
- `hw_model` (optional, string): Hardware model.
- `days_active` (optional, int): Nodes seen within the last N days. Omit for all
nodes with a non-null last-seen timestamp; invalid integers are ignored.
Nodes are sorted by `short_name` ascending. `role` is normalized to uppercase;
channel and hardware filters are exact matches. No pagination is implemented.
Errors: HTTP 500 with `{"error":"Failed to fetch nodes"}` for handler failures;
the storage helper may return an empty list for database failures.
Response Example
```json
{
"nodes": [
{
"id": "!000004d2",
"node_id": 1234,
"long_name": "Alice",
"short_name": "A",
"hw_model": "T-Beam",
"firmware": "1.2.3",
"role": "client",
"last_lat": 377749000,
"last_long": -1224194000,
"channel": "main",
"is_mqtt_gateway": true,
"first_seen_us": 1736283723456789,
"last_seen_us": 1736370123456789
}
]
}
```
---
## 2. Packets API
### GET `/api/packets`
Returns packets with optional filters.
Query Parameters
- `packet_id` (optional, decimal int): Return one packet by database row ID (overrides other filters).
- `limit` (optional, int): Max packets to return, clamped 1-1000. Default: `50`.
- `since` (optional, int): Only packets imported after this microsecond timestamp.
- `portnum` (optional, int): Filter by port number.
- `contains` (optional, string): Payload substring filter.
- `from_node_id` (optional, int): Filter by sender node ID.
- `to_node_id` (optional, int): Filter by recipient node ID.
- `node_id` (optional, int): Legacy filter matching either from or to node ID.
Response Example
```json
{
"packets": [
{
"id": 123,
"storage_id": 123,
"packet_id": 3314808102,
"import_time_us": 1736370123456789,
"channel": "main",
"from_node_id": 5678,
"to_node_id": 4294967295,
"portnum": 1,
"long_name": "Alice",
"payload": "Hello, mesh!",
"to_long_name": null,
"reply_id": 122
}
],
"latest_import_time": 1736370123456789
}
```
Notes
- For `portnum=1` (text messages), packets are filtered to remove sequence-only payloads.
- Results are newest first. `since` is strictly greater than the supplied timestamp.
Store `latest_import_time` for the next poll and deduplicate by `id`. A bounded
result can omit older records if more packets arrive than the requested limit;
this endpoint is not a durable cursor or backfill API.
- `latest_import_time` is returned only when the list response has a positive import
timestamp; it is absent for empty results and single-packet lookups.
- `packet_id` lookup returns `{"packets":[]}` with HTTP 200 when missing. Its objects
omit `to_long_name` and `reply_id`; nullable `portnum` is possible in this mode.
- `contains` is case-insensitive. With `portnum=1`, matching is performed on decoded
displayed payload text (including redaction placeholders) after the database limit is applied, so fewer than `limit` results
may be returned. For other requests, it searches stored payload bytes cast to text;
this is not a general search over decoded protobuf fields.
- Invalid `limit` falls back to 50. Invalid `since`, `portnum`, and node filters are
logged and ignored. Invalid single-packet IDs return HTTP 400; handler failures
return HTTP 500 with `{"error":"Failed to fetch packets"}`.
---
## 3. Channels API
### GET `/api/channels`
Returns channels seen in a time period.
Query Parameters
- `period_type` (optional, string): `hour` or `day`. Default: `hour`.
- `length` (optional, int): Number of periods to look back. Default: `24`.
Response Example
```json
{
"channels": ["LongFast", "MediumFast", "ShortFast"]
}
```
---
Errors: storage/period failures return HTTP 200 with `channels: []` and an `error`
field. Non-integer `length` is parsed outside that handler and can return HTTP 500.
Use a positive integer length and the literal `hour` or `day`.
## 4. Stats API
### GET `/api/stats`
Returns packet statistics aggregated by time periods, with optional filtering.
Query Parameters
- `period_type` (optional, string): `hour` or `day`. Default: `hour`.
- `length` (optional, int): Number of periods to include. Default: `24`.
- `channel` (optional, string): Filter by channel (case-insensitive).
- `portnum` (optional, int): Filter by port number.
- `to_node` (optional, int): Filter by destination node ID.
- `from_node` (optional, int): Filter by source node ID.
- `node` (optional, int): If provided, return combined `sent` and `seen` totals for that node.
Response Example (series)
```json
{
"period_type": "hour",
"length": 24,
"channel": "LongFast",
"portnum": 1,
"to_node": 12345678,
"from_node": 87654321,
"data": [
{ "period": "2025-08-08 14:00", "count": 10 },
{ "period": "2025-08-08 15:00", "count": 7 }
]
}
```
Response Example (`node` totals)
```json
{
"node_id": 12345678,
"period_type": "hour",
"length": 24,
"sent": 0,
"seen": 0
}
```
---
The series response contains only buckets with records, ordered oldest first;
missing hours/days are not filled with zeroes. Periods are UTC strings.
Current `node`-mode limitation: the handler reads a `total` key that the statistics
helper does not provide, so `sent` and `seen` currently return zero. It also uses
recipient filtering for the second query, rather than gateway observations. This
mode ignores the other filters. For usable sent/observation totals, request
`/api/stats/count?from_node=1234&period_type=day&length=1` instead.
Errors: HTTP 400 for an unsupported `period_type`, non-integer `length`, `node`,
`portnum`, `from_node`, or `to_node`. Storage failures can return HTTP 500.
Use a positive `length`; the handler does not impose a positive lower bound.
### GET `/api/stats/count`
Returns total packet counts, optionally filtered.
Query Parameters
- `packet_id` (optional, int): Filter packet_seen by packet ID.
- `period_type` (optional, string): `hour` or `day`.
- `length` (optional, int): Number of periods to include.
- `channel` (optional, string): Filter by channel.
- `from_node` (optional, int): Filter by source node ID.
- `to_node` (optional, int): Filter by destination node ID.
Response Example
```json
{
"total_packets": 12345,
"total_seen": 67890
}
```
---
Without filters, counts cover the whole retained database. With time, channel,
or direction filters, omitted time settings default to `period_type=day&length=1`.
`total_seen` counts observation rows for packets matching the packet import-time
window, not distinct gateways. Channel matching is case-insensitive.
`packet_id` applies only to `total_seen` and overrides its other filters: it counts
all observations of that database packet ID. It does not narrow `total_packets`.
In particular, `packet_id` alone leaves `total_packets` as the global packet total.
Errors: HTTP 400 for non-integer ID/length filters. Unsupported `period_type` or
storage failures can return HTTP 500; use `hour` or `day` and a positive length.
### GET `/api/stats/top`
Returns nodes sorted by packets seen, with pagination.
Query Parameters
- `period_type` (optional, string): `hour` or `day`. Default: `day`.
- `length` (optional, int): Number of periods to include. Default: `1`.
- `channel` (optional, string): Filter by channel.
- `limit` (optional, int): Max nodes to return. Default: `20`, max `100`.
- `offset` (optional, int): Pagination offset. Default: `0`.
Response Example
```json
{
"total": 250,
"limit": 20,
"offset": 0,
"nodes": [
{
"node_id": 1234,
"long_name": "Alice",
"short_name": "A",
"channel": "main",
"sent": 100,
"seen": 240,
"avg": 2.4
}
]
}
```
---
`sent` counts packet records from each node; `seen` counts observation records for
that sender's packets. `avg` is `round(seen / max(sent, 1), 2)`, not a distinct-gateway
count. Windows are anchored to the newest packet and newest observation in the
respective tables, not wall-clock time. Nodes with zero activity are included;
`total` counts nodes matching the channel filter, not just active nodes.
Channel matching is exact. Use positive `length` and `limit`, and a nonnegative
`offset`. Only the upper limit of 100 is enforced. Invalid numeric strings can
return HTTP 500; any `period_type` other than the literal `hour` is treated as days.
## 5. Edges API
### GET `/api/edges`
Returns network edges (connections between nodes) based on traceroutes and neighbor info.
Traceroute edges are collected over the last 12 hours. Neighbor edges are based on
port 71 packets.
A completed traceroute is observed as a response packet, whose `from`/`to` are reversed
with respect to the traced path, so edges are built as `to -> route[] -> from`. `route[]`
may contain `0xFFFFFFFF` placeholders for hops the mesh could not identify; the edges on
either side of such a placeholder are omitted, because the nodes around an unknown hop
are not neighbours.
Query Parameters
- `type` (optional, string): `traceroute` or `neighbor`. If omitted, returns both.
- `node_id` (optional, int): Filter edges to only those touching a node.
Response Example
```json
{
"edges": [
{ "from": 12345678, "to": 87654321, "type": "traceroute" },
{ "from": 11111111, "to": 22222222, "type": "neighbor" }
]
}
```
---
Unknown `type` values return an empty edge list. Invalid `node_id` returns HTTP 400;
storage failures can return HTTP 500. A missing node is not an error and normally
returns an empty list. Neighbor edges come from the latest stored port-71 sample
(the storage helper defaults to 50 packets), not the traceroute 12-hour window.
## 6. Daily Snapshots and Configuration
### GET `/api/snapshots/daily`
Returns stored daily snapshots. For new snapshots, `packet_count` is the number of
packet records imported during `date` (00:00 UTC inclusive to the next midnight
exclusive). The scheduled capture records the previous complete UTC day. Repeated
observations of the same packet are not counted separately. `node_count` counts distinct
packet senders whose packets were imported or observed during that UTC day (including
observations of previously imported packets). `gateway_count` counts distinct MQTT
gateways with packet observations imported during that day. These are activity counts,
not database totals; recipients alone do not count as active nodes. Activity uses local
import timestamps, not device timestamps. Older snapshots retain their originally stored
counts and are not automatically converted. Counts depend on the packet and observation
history still retained at capture time.
Query Parameters
- `length` (optional, int): Return the latest N snapshot records, clamped to 1-3650.
Omit for all stored snapshots. Results are always ordered by date ascending.
This is a record limit, not a guarantee of consecutive calendar dates.
Response Example
```json
{"data":[{"date":"2026-10-24","node_count":143,"packet_count":28465,"gateway_count":17,"captured_at_us":1792886400000000}]}
```
No stored snapshots returns `{"data":[]}`. Invalid `length` returns HTTP 400;
storage failures return HTTP 500. `captured_at_us` is the capture time, which may
be later than the day summarized by `date`.
### GET `/api/config`
Returns a safe subset of server configuration.
`site.map_channel_colors` contains channel color overrides from the optional
`[map_channel_colors]` INI section. Each entry is `channel = #RRGGBB`; invalid colors
are omitted. Channel matching on the map ignores case, spaces, hyphens, and underscores.
Unlisted channels use generated colors. For example:
```ini
[map_channel_colors]
LongFast = #4363d8
LocalChat = #18aa18
```
No query parameters are supported. Only the `site`, MQTT server/topics, and cleanup
fields shown here are exposed; credentials and the database connection string are
not returned. Feature flags and cleanup booleans are lowercase strings (`"true"` /
`"false"`), not JSON booleans. Cleanup scheduling values are strings; map bounds are
numbers and refresh intervals are integers. The removed `starting` option is not
returned: `/` always serves the dashboard. `site.api` controls visibility of the API
documentation link in the navigation bar, defaults to `"true"`, and can be disabled
with `api = False` in `[site]`. This setting does not disable documentation or API
routes. Restart the web server and reload the page after changing it. Handler
failures return HTTP 500.
Restart the web server and reload the map after changing these settings. Omitting
the section uses generated colors for every channel.
Response Example
```json
{
"site": {
"domain": "example.com",
"language": "en",
"title": "Meshview",
"message": "",
"nodes": "true",
"chat": "true",
"everything": "true",
"graphs": "true",
"stats": "true",
"net": "true",
"map": "true",
"top": "true",
"api": "true",
"map_top_left_lat": 39.0,
"map_top_left_lon": -123.0,
"map_bottom_right_lat": 36.0,
"map_bottom_right_lon": -121.0,
"map_interval": 3,
"map_channel_colors": {"LongFast":"#4363d8"},
"firehose_interval": 3,
"weekly_net_message": "Weekly Mesh check-in message.",
"net_tag": "#BayMeshNet",
"version": "3.0.0"
},
"mqtt": {
"server": "mqtt.example.com",
"topics": ["msh/region/#"]
},
"cleanup": {
"enabled": "false",
"days_to_keep": "14",
"hour": "2",
"minute": "0",
"vacuum": "false"
}
}
```
---
## 7. Language API
### GET `/api/lang`
Returns translation strings.
Query Parameters
- `lang` (optional, string): Language code (e.g., `en`, `es`). Default from config or `en`.
- `section` (optional, string): Return only one section (e.g., `nodelist`, `firehose`).
Response Example
```json
{
"title": "Meshview",
"search_placeholder": "Search..."
}
```
---
Unknown or invalid language codes fall back to the English file. An unknown section
returns HTTP 404. The response has no wrapper: it is either the full translation
object or the requested section. Translation-file failures can return HTTP 500.
## 8. Packets Seen API
### GET `/api/packets_seen/{packet_id}`
Returns packet_seen entries for a packet.
Path Parameters
- `packet_id` (required, int): Packet ID.
Response Example
```json
{
"seen": [
{
"packet_id": 123,
"node_id": 456,
"rx_time": 1753188300,
"hop_limit": 7,
"hop_start": 0,
"channel": "main",
"rx_snr": 5.0,
"rx_rssi": -90,
"topic": "msh/region/#",
"import_time_us": 1736370123456789
}
]
}
```
---
`node_id` identifies the observing MQTT gateway. `rx_time` is the device-provided
receive time in Unix seconds, while `import_time_us` is local import time
in microseconds. Signal fields can be null. Multiple rows can describe the same
gateway; consumers wanting unique gateways must deduplicate them. Hop count is
usually `max(0, hop_start - hop_limit)` when both values are known. Observations
do not by themselves prove a direct radio link from the sender to that gateway.
No observations, including for an unknown packet, returns `{"seen":[]}` with HTTP
200. Invalid path IDs return HTTP 400; handler failures return HTTP 500.
## 9. Traceroute API
### GET `/api/traceroute/{packet_id}`
Returns traceroute details and derived paths for a packet.
Path Parameters
- `packet_id` (required, int): Packet ID.
A completed traceroute is observed as a response packet, whose `from`/`to` are reversed
with respect to the traced path. `initiator` and `target` resolve this: the forward path
runs `initiator -> forward_hops -> target` and the return path runs
`target -> reverse_hops -> initiator`, in both directions of travel. `forward_hops` and
`reverse_hops` contain only the intermediate hops, never the endpoints.
A gateway usually reports a response that is still travelling home, so `reverse_hops` is
often incomplete. `reverse_complete` says whether that observation had reached the
initiator; only then does the corresponding `winning_paths.reverse` entry end at the
initiator.
`winning_paths` is built from response observations, since a response proves the request
reached the target. `complete` on a `unique_forward_paths` entry says whether some
response reported that hop list, and so whether it is known to end at the target.
Response Example
```json
{
"packet": {
"id": 123,
"from": 222,
"to": 111,
"initiator": 111,
"target": 222,
"channel": "main"
},
"traceroute_packets": [
{
"index": 0,
"gateway_node_id": 333,
"done": true,
"forward_hops": [444, 555],
"reverse_hops": [555, 444],
"reverse_complete": true
}
],
"unique_forward_paths": [
{ "path": [444, 555], "count": 2, "complete": true }
],
"unique_reverse_paths": [
[555, 444]
],
"winning_paths": {
"forward": [[111, 444, 555, 222]],
"reverse": [[222, 555, 444, 111]]
}
}
```
---
`traceroute_packets` can be empty even when the packet exists. Unknown database
packet IDs return HTTP 404. Invalid integer IDs and storage failures can return
HTTP 500; this handler does not implement a separate HTTP 400 validation branch.
## 10. Health API
### GET `/health`
Returns service health and database status.
Response Example
```json
{
"status": "healthy",
"timestamp": "2025-07-22T12:45:00+00:00",
"version": "3.0.3",
"git_revision": "abc1234",
"cleanup": {
"enabled": true,
"days_to_keep": 14,
"scheduled_time": "02:00",
"vacuum": false,
"status": "ok",
"status_file": "dbcleanup.status.json",
"last_run": {
"status": "ok",
"started_at": "2026-06-04T09:00:00+00:00",
"completed_at": "2026-06-04T09:00:03+00:00",
"cutoff_at": "2026-05-21T09:00:00+00:00",
"days_to_keep": 14,
"vacuum_requested": false,
"vacuum_completed": false,
"rows_deleted": {
"packet": 1200,
"packet_seen": 3400,
"traceroute": 42,
"node": 3
},
"error": null
}
},
"backup": {
"enabled": true,
"backup_dir": "./backups",
"scheduled_time": "02:00",
"status": "ok",
"status_file": "dbbackup.status.json",
"last_run": {
"status": "ok",
"started_at": "2026-06-04T09:00:00+00:00",
"completed_at": "2026-06-04T09:00:02+00:00",
"backup_dir": "./backups",
"database_path": "packets.db",
"backup_file": "backups/packets_backup_20260604_090000.db.gz",
"original_size_bytes": 12939444,
"compressed_size_bytes": 4211560,
"compression_percent": 67.5,
"error": null
}
},
"database": "connected",
"database_size": "12.34 MB",
"database_size_bytes": 12939444
}
```
---
No query parameters. HTTP 200 reports `status: "healthy"` with database connectivity.
A database failure returns HTTP 503 with `status: "unhealthy"` and
`database: "disconnected"`. `seconds_since_last_message` is included only when a
latest imported packet exists; SQLite size fields appear only when available.
Cleanup and backup reports include configured schedules and status-file contents
when present. Their status may be `disabled`, `unknown`, `error`, or the last job's
recorded status; a failed backup/cleanup does not itself change the top-level HTTP
status. The optional `last_run` objects depend on the job's stored report.
## 11. Version API
### GET `/version`
Returns version metadata.
Response Example
```json
{
"version": "3.0.3",
"release_date": "2026-1-15",
"git_revision": "abc1234",
"git_revision_short": "abc1234"
}
```
No query parameters. HTTP 500 with an `error` field if version metadata cannot be
retrieved. A revision may be `unknown` if Git metadata is unavailable.
## 12. Node Contact URL
### GET `/api/node/{node_id}/qr`
Returns a Meshtastic shared-contact URL as JSON, not a PNG or SVG image. The client
can encode `meshtastic_url` in a QR code. No query parameters are supported.
Path Parameters
- `node_id` (required, int): Node number in decimal or `0x` hexadecimal form.
Response Example
```json
{
"node_id":1234,
"long_name":"Alice",
"short_name":"A",
"role":"CLIENT",
"meshtastic_url":"https://meshtastic.org/v/#BASE64URL_CONTACT"
}
```
The example contact payload is a placeholder, not an importable contact. The URL
encodes node identity and available user metadata as a base64url SharedContact
protobuf, with `manually_verified` false. Metadata can be null.
Errors: HTTP 400 for invalid IDs; HTTP 404 when the node is absent; HTTP 500 for
contact serialization failures or unhandled storage errors.
## 13. Predicted Radio Coverage
### GET `/api/coverage/{node_id}`
Computes an ITM area-model prediction centered on the node's last stored position.
This is a model prediction, not a measured coverage boundary or terrain profile.
The optional `pyitm` dependency is required. Calculations run off the event loop
and reuse cached model results. All parameters are optional except the node ID.
Path Parameters
- `node_id` (required, int): Node number in decimal or `0x` hexadecimal form.
Query Parameters
- `mode` (string, default `perimeter`): `perimeter` or `heatmap`. Currently every
value other than the exact string `perimeter` selects the heatmap branch.
- `freq_mhz` (number, default `907`): Frequency in MHz; range 1-10000.
- `tx_dbm` (number, default `20`): Transmit power in dBm; range -50 to 60.
- `tx_height_m` (number, default `5`): Transmit antenna height in meters; range 0-1000.
- `rx_height_m` (number, default `1.5`): Receive antenna height in meters; range 0-1000.
- `radius_km` (number, default `40`): Maximum distance in kilometers; range 1-200.
- `step_km` (number, default `0.25`): Radial sample spacing in kilometers; range 0.05-50.
- `reliability` (number, default `0.5`): ITM time fraction; range 0.01-0.99.
- `threshold_dbm` (number, default `-120`): Perimeter received-power threshold in dBm;
range -200 to 0. Ignored by heatmap computation, although still validated.
Numeric bounds are inclusive, values must be finite, and `radius_km / step_km`
must not exceed 4000. Smaller steps increase computation cost.
Response Example (`mode=perimeter`)
```json
{
"mode":"perimeter",
"threshold_dbm":-120.0,
"perimeter":[[30.21,-93.20],[30.209,-93.198]]
}
```
`perimeter` contains `[latitude, longitude]` degree pairs for the furthest qualifying
sample on each modeled bearing. Bearings with no qualifying sample are omitted;
the list is not necessarily a closed GeoJSON polygon.
Response Example (`mode=heatmap`)
```json
{
"mode":"heatmap",
"min_dbm":-130.0,
"max_dbm":-80.0,
"points":[[30.21,-93.20,-110.5]]
}
```
`points` contains `[latitude, longitude, received_power_dbm]` triples. Min/max values
provide a color-scale range, extended from the defaults to include computed values.
An empty perimeter or point list is a valid result when no samples qualify.
Errors: HTTP 400 for invalid IDs, nonnumeric/nonfinite/out-of-range parameters, or
an excessive radius/step ratio; HTTP 404 for an unknown node or missing/zero-valued
stored coordinates; HTTP 503 when `pyitm` is unavailable. Dependency availability is checked
before numeric query validation and node lookup. Unexpected model/storage failures
can return HTTP 500.
+37
View File
@@ -0,0 +1,37 @@
# Coverage
## Predicted coverage
Meshview can display a predicted coverage boundary for a node. This is a **model**
estimate, not a guarantee of real-world performance.
### How it works
The coverage boundary is computed using the Longley-Rice / ITM **area mode**
propagation model. Area mode estimates average path loss over generic terrain
and does not use a terrain profile. This means it captures general distance
effects, but **does not** account for terrain shadows, buildings, or foliage.
### What you are seeing
The UI draws a **perimeter** (not a heatmap) that represents the furthest
distance where predicted signal strength is above a threshold (default
`-120 dBm`). The model is run radially from the node in multiple directions,
and the last point above the threshold forms the outline.
### Key parameters
- **Frequency**: default `907 MHz`
- **Transmit power**: default `20 dBm`
- **Antenna heights**: default `5 m` (TX) and `1.5 m` (RX)
- **Reliability**: default `0.5` (median)
- **Terrain irregularity**: default `90 m` (average terrain)
### Limitations
- No terrain or building data is used (area mode only).
- Results are sensitive to power, height, and threshold.
- Environmental factors can cause large real-world deviations.
+146
View File
@@ -0,0 +1,146 @@
# Database Changes With Alembic
This guide explains how to make database schema changes in MeshView using Alembic migrations.
## Overview
When you need to add, modify, or remove columns from database tables, you must:
1. Update the SQLAlchemy model
2. Create an Alembic migration
3. Let the system automatically apply the migration
## Step-by-Step Process
### 1. Update the Model
Edit `meshview/models.py` to add/modify the column in the appropriate model class:
```python
class Traceroute(Base):
__tablename__ = "traceroute"
id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
# ... existing columns ...
route_return: Mapped[bytes] = mapped_column(nullable=True) # New column
```
### 2. Create an Alembic Migration
Generate a new migration file with a descriptive message:
```bash
./env/bin/alembic revision -m "add route_return to traceroute"
```
This creates a new file in `alembic/versions/` with a unique revision ID.
### 3. Fill in the Migration
Edit the generated migration file to implement the actual database changes:
```python
def upgrade() -> None:
# Add route_return column to traceroute table
with op.batch_alter_table('traceroute', schema=None) as batch_op:
batch_op.add_column(sa.Column('route_return', sa.LargeBinary(), nullable=True))
def downgrade() -> None:
# Remove route_return column from traceroute table
with op.batch_alter_table('traceroute', schema=None) as batch_op:
batch_op.drop_column('route_return')
```
### 4. Migration Runs Automatically
When you restart the application with `mvrun.py`:
1. The writer process (`startdb.py`) starts up
2. It checks if the database schema is up to date
3. If new migrations are pending, it runs them automatically
4. The reader process (web server) waits for migrations to complete before starting
**No manual migration command is needed** - the application handles this automatically on startup.
### 5. Commit Both Files
Add both files to git:
```bash
git add meshview/models.py
git add alembic/versions/ac311b3782a1_add_route_return_to_traceroute.py
git commit -m "Add route_return column to traceroute table"
```
## Important Notes
### SQLite Compatibility
Always use `batch_alter_table` for SQLite compatibility:
```python
with op.batch_alter_table('table_name', schema=None) as batch_op:
batch_op.add_column(...)
```
SQLite has limited ALTER TABLE support, and `batch_alter_table` works around these limitations.
### Migration Process
- **Writer process** (`startdb.py`): Runs migrations on startup
- **Reader process** (web server in `main.py`): Waits for migrations to complete
- Migrations are checked and applied every time the application starts
- The system uses a migration status table to coordinate between processes
### Common Column Types
```python
# Integer
column: Mapped[int] = mapped_column(BigInteger, nullable=True)
# String
column: Mapped[str] = mapped_column(nullable=True)
# Bytes/Binary
column: Mapped[bytes] = mapped_column(nullable=True)
# DateTime
column: Mapped[datetime] = mapped_column(nullable=True)
# Boolean
column: Mapped[bool] = mapped_column(nullable=True)
# Float
column: Mapped[float] = mapped_column(nullable=True)
```
### Migration File Location
Migrations are stored in: `alembic/versions/`
Each migration file includes:
- Revision ID (unique identifier)
- Down revision (previous migration in chain)
- Create date
- `upgrade()` function (applies changes)
- `downgrade()` function (reverts changes)
## Troubleshooting
### Migration Not Running
If migrations don't run automatically:
1. Check that the database is writable
2. Look for errors in the startup logs
3. Verify the migration chain is correct (each migration references the previous one)
### Manual Migration (Not Recommended)
If you need to manually run migrations for debugging:
```bash
./env/bin/alembic upgrade head
```
However, the application normally handles this automatically.
+14
View File
@@ -0,0 +1,14 @@
# Technical Documentation
This directory contains technical documentation for MeshView that goes beyond initial setup and basic usage.
These documents are intended for developers, contributors, and advanced users who need deeper insight into the system's architecture, database migrations, API endpoints, and internal workings.
## Contents
- [ALEMBIC_SETUP.md](ALEMBIC_SETUP.md) - Database migration setup and management
- [TIMESTAMP_MIGRATION.md](TIMESTAMP_MIGRATION.md) - Details on timestamp schema changes
- [API_Documentation.md](API_Documentation.md) - REST API endpoints and usage
- [CODE_IMPROVEMENTS.md](CODE_IMPROVEMENTS.md) - Suggested code improvements and refactoring ideas
For initial setup and basic usage instructions, please see the main [README.md](../README.md) in the root directory.
+193
View File
@@ -0,0 +1,193 @@
# High-Resolution Timestamp Migration
This document describes the implementation of GitHub issue #55: storing high-resolution timestamps as integers in the database for improved performance and query efficiency.
## Overview
The meshview database now stores timestamps in two formats:
1. **TEXT format** (`import_time`): Human-readable ISO8601 format with microseconds (e.g., `2025-03-12 04:15:56.058038`)
2. **INTEGER format** (`import_time_us`): Microseconds since Unix epoch (1970-01-01 00:00:00 UTC)
The dual format approach provides:
- **Backward compatibility**: Existing `import_time` TEXT columns remain unchanged
- **Performance**: Fast integer comparisons and math operations
- **Precision**: Microsecond resolution for accurate timing
- **Efficiency**: Compact storage and fast indexed lookups
## Database Changes
### New Columns Added
Three tables have new `import_time_us` columns:
1. **packet.import_time_us** (INTEGER)
- Stores when the packet was imported into the database
- Indexed for fast queries
2. **packet_seen.import_time_us** (INTEGER)
- Stores when the packet_seen record was imported
- Indexed for performance
3. **traceroute.import_time_us** (INTEGER)
- Stores when the traceroute was imported
- Indexed for fast lookups
### New Indexes
The following indexes were created for optimal query performance:
```sql
CREATE INDEX idx_packet_import_time_us ON packet(import_time_us DESC);
CREATE INDEX idx_packet_from_node_time_us ON packet(from_node_id, import_time_us DESC);
CREATE INDEX idx_packet_seen_import_time_us ON packet_seen(import_time_us);
CREATE INDEX idx_traceroute_import_time_us ON traceroute(import_time_us);
```
## Migration Process
### For Existing Databases
Run the migration script to add the new columns and populate them from existing data:
```bash
python migrate_add_timestamp_us.py [database_path]
```
If no path is provided, it defaults to `packets.db` in the current directory.
The migration script:
1. Checks if migration is needed (idempotent)
2. Adds `import_time_us` columns to the three tables
3. Populates the new columns from existing `import_time` values
4. Creates indexes for optimal performance
5. Verifies the migration completed successfully
### For New Databases
New databases created with the updated schema will automatically include the `import_time_us` columns. The MQTT store module populates both columns when inserting new records.
## Code Changes
### Models (meshview/models.py)
The ORM models now include the new `import_time_us` fields:
```python
class Packet(Base):
import_time: Mapped[datetime] = mapped_column(nullable=True)
import_time_us: Mapped[int] = mapped_column(BigInteger, nullable=True)
```
### MQTT Store (meshview/mqtt_store.py)
The data ingestion logic now populates both timestamp columns using UTC time:
```python
now = datetime.datetime.now(datetime.timezone.utc)
now_us = int(now.timestamp() * 1_000_000)
# Both columns are populated
import_time=now,
import_time_us=now_us,
```
**Important**: All new timestamps use UTC (Coordinated Universal Time) for consistency across time zones.
## Using the New Timestamps
### Example Queries
**Query packets from the last 7 days:**
```sql
-- Old way (slower)
SELECT * FROM packet
WHERE import_time >= datetime('now', '-7 days');
-- New way (faster)
SELECT * FROM packet
WHERE import_time_us >= (strftime('%s', 'now', '-7 days') * 1000000);
```
**Query packets in a specific time range:**
```sql
SELECT * FROM packet
WHERE import_time_us BETWEEN 1759254380000000 AND 1759254390000000;
```
**Calculate time differences (in microseconds):**
```sql
SELECT
id,
(import_time_us - LAG(import_time_us) OVER (ORDER BY import_time_us)) / 1000000.0 as seconds_since_last
FROM packet
LIMIT 10;
```
### Converting Timestamps
**From datetime to microseconds (UTC):**
```python
import datetime
now = datetime.datetime.now(datetime.timezone.utc)
now_us = int(now.timestamp() * 1_000_000)
```
**From microseconds to datetime:**
```python
import datetime
timestamp_us = 1759254380813451
dt = datetime.datetime.fromtimestamp(timestamp_us / 1_000_000)
```
**In SQL queries:**
```sql
-- Datetime to microseconds
SELECT CAST((strftime('%s', import_time) || substr(import_time, 21, 6)) AS INTEGER);
-- Microseconds to datetime (approximate)
SELECT datetime(import_time_us / 1000000, 'unixepoch');
```
## Performance Benefits
The integer timestamp columns provide significant performance improvements:
1. **Faster comparisons**: Integer comparisons are much faster than string/datetime comparisons
2. **Smaller index size**: Integer indexes are more compact than datetime indexes
3. **Range queries**: BETWEEN operations on integers are highly optimized
4. **Math operations**: Easy to calculate time differences, averages, etc.
5. **Sorting**: Integer sorting is faster than datetime sorting
## Backward Compatibility
The original `import_time` TEXT columns remain unchanged:
- Existing code continues to work
- Human-readable timestamps still available
- Gradual migration to new columns possible
- No breaking changes for existing queries
## Future Work
Future improvements could include:
- Migrating queries to use `import_time_us` columns
- Deprecating the TEXT `import_time` columns (after transition period)
- Adding helper functions for timestamp conversion
- Creating views that expose both formats
## Testing
The migration was tested on a production database with:
- 132,466 packet records
- 1,385,659 packet_seen records
- 28,414 traceroute records
All records were successfully migrated with microsecond precision preserved.
## References
- GitHub Issue: #55 - Storing High-Resolution Timestamps in SQLite
- SQLite datetime functions: https://www.sqlite.org/lang_datefunc.html
- Python datetime module: https://docs.python.org/3/library/datetime.html
-23
View File
@@ -1,23 +0,0 @@
#!/bin/sh
protoc \
-Iproto_def \
--python_out=. \
proto_def/meshtastic/admin.proto \
proto_def/meshtastic/apponly.proto \
proto_def/meshtastic/atak.proto \
proto_def/meshtastic/cannedmessages.proto \
proto_def/meshtastic/channel.proto \
proto_def/meshtastic/clientonly.proto \
proto_def/meshtastic/config.proto \
proto_def/meshtastic/connection_status.proto \
proto_def/meshtastic/localonly.proto \
proto_def/meshtastic/mesh.proto \
proto_def/meshtastic/module_config.proto \
proto_def/meshtastic/mqtt.proto \
proto_def/meshtastic/paxcount.proto \
proto_def/meshtastic/portnums.proto \
proto_def/meshtastic/remote_hardware.proto \
proto_def/meshtastic/rtttl.proto \
proto_def/meshtastic/storeforward.proto \
proto_def/meshtastic/telemetry.proto \
proto_def/meshtastic/xmodem.proto
+3 -31
View File
@@ -1,40 +1,12 @@
import asyncio
import argparse
from meshview import mqtt_reader
from meshview import database
from meshview import store
from meshview import web
from meshview import http
async def load_database_from_mqtt(topic):
async for topic, env in mqtt_reader.get_topic_envelopes(topic):
await store.process_envelope(topic, env)
async def main(args):
database.init_database(args.database)
await database.create_tables()
async def main():
async with asyncio.TaskGroup() as tg:
tg.create_task(load_database_from_mqtt(args.topic))
tg.create_task(web.run_server(args.bind, args.port, args.tls_cert))
if args.acme_challenge:
tg.create_task(http.run_server(args.bind, args.acme_challenge))
tg.create_task(web.run_server())
if __name__ == '__main__':
parser = argparse.ArgumentParser('meshview')
parser.add_argument('--bind', nargs='*', default=['::1'])
parser.add_argument('--acme-challenge')
parser.add_argument('--port', default=8080, type=int)
parser.add_argument('--tls-cert')
parser.add_argument('--topic', nargs='*', default=['msh/US/bayarea/#'])
parser.add_argument('--database', default='sqlite+aiosqlite:///packets.db')
args = parser.parse_args()
asyncio.run(main(args))
asyncio.run(main())
-39
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)
-28
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)
-40
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)
-26
View File
@@ -1,26 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/cannedmessages.proto
"""Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1fmeshtastic/cannedmessages.proto\x12\nmeshtastic\"-\n\x19\x43\x61nnedMessageModuleConfig\x12\x10\n\x08messages\x18\x01 \x01(\tBn\n\x13\x63om.geeksville.meshB\x19\x43\x61nnedMessageConfigProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.cannedmessages_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\031CannedMessageConfigProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_CANNEDMESSAGEMODULECONFIG._serialized_start=47
_CANNEDMESSAGEMODULECONFIG._serialized_end=92
# @@protoc_insertion_point(module_scope)
-34
View File
@@ -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\"E\n\x0eModuleSettings\x12\x1a\n\x12position_precision\x18\x01 \x01(\r\x12\x17\n\x0fis_client_muted\x18\x02 \x01(\x08\"\xa1\x01\n\x07\x43hannel\x12\r\n\x05index\x18\x01 \x01(\x05\x12-\n\x08settings\x18\x02 \x01(\x0b\x32\x1b.meshtastic.ChannelSettings\x12&\n\x04role\x18\x03 \x01(\x0e\x32\x18.meshtastic.Channel.Role\"0\n\x04Role\x12\x0c\n\x08\x44ISABLED\x10\x00\x12\x0b\n\x07PRIMARY\x10\x01\x12\r\n\tSECONDARY\x10\x02\x42\x62\n\x13\x63om.geeksville.meshB\rChannelProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.channel_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\rChannelProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_CHANNELSETTINGS.fields_by_name['channel_num']._options = None
_CHANNELSETTINGS.fields_by_name['channel_num']._serialized_options = b'\030\001'
_CHANNELSETTINGS._serialized_start=41
_CHANNELSETTINGS._serialized_end=225
_MODULESETTINGS._serialized_start=227
_MODULESETTINGS._serialized_end=296
_CHANNEL._serialized_start=299
_CHANNEL._serialized_end=460
_CHANNEL_ROLE._serialized_start=412
_CHANNEL_ROLE._serialized_end=460
# @@protoc_insertion_point(module_scope)
-27
View File
@@ -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)
-70
View File
@@ -1,70 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/config.proto
"""Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x17meshtastic/config.proto\x12\nmeshtastic\"\xc2\x1f\n\x06\x43onfig\x12\x31\n\x06\x64\x65vice\x18\x01 \x01(\x0b\x32\x1f.meshtastic.Config.DeviceConfigH\x00\x12\x35\n\x08position\x18\x02 \x01(\x0b\x32!.meshtastic.Config.PositionConfigH\x00\x12/\n\x05power\x18\x03 \x01(\x0b\x32\x1e.meshtastic.Config.PowerConfigH\x00\x12\x33\n\x07network\x18\x04 \x01(\x0b\x32 .meshtastic.Config.NetworkConfigH\x00\x12\x33\n\x07\x64isplay\x18\x05 \x01(\x0b\x32 .meshtastic.Config.DisplayConfigH\x00\x12-\n\x04lora\x18\x06 \x01(\x0b\x32\x1d.meshtastic.Config.LoRaConfigH\x00\x12\x37\n\tbluetooth\x18\x07 \x01(\x0b\x32\".meshtastic.Config.BluetoothConfigH\x00\x1a\x91\x05\n\x0c\x44\x65viceConfig\x12\x32\n\x04role\x18\x01 \x01(\x0e\x32$.meshtastic.Config.DeviceConfig.Role\x12\x16\n\x0eserial_enabled\x18\x02 \x01(\x08\x12\x19\n\x11\x64\x65\x62ug_log_enabled\x18\x03 \x01(\x08\x12\x13\n\x0b\x62utton_gpio\x18\x04 \x01(\r\x12\x13\n\x0b\x62uzzer_gpio\x18\x05 \x01(\r\x12I\n\x10rebroadcast_mode\x18\x06 \x01(\x0e\x32/.meshtastic.Config.DeviceConfig.RebroadcastMode\x12 \n\x18node_info_broadcast_secs\x18\x07 \x01(\r\x12\"\n\x1a\x64ouble_tap_as_button_press\x18\x08 \x01(\x08\x12\x12\n\nis_managed\x18\t \x01(\x08\x12\x1c\n\x14\x64isable_triple_click\x18\n \x01(\x08\x12\r\n\x05tzdef\x18\x0b \x01(\t\x12\x1e\n\x16led_heartbeat_disabled\x18\x0c \x01(\x08\"\xaa\x01\n\x04Role\x12\n\n\x06\x43LIENT\x10\x00\x12\x0f\n\x0b\x43LIENT_MUTE\x10\x01\x12\n\n\x06ROUTER\x10\x02\x12\x11\n\rROUTER_CLIENT\x10\x03\x12\x0c\n\x08REPEATER\x10\x04\x12\x0b\n\x07TRACKER\x10\x05\x12\n\n\x06SENSOR\x10\x06\x12\x07\n\x03TAK\x10\x07\x12\x11\n\rCLIENT_HIDDEN\x10\x08\x12\x12\n\x0eLOST_AND_FOUND\x10\t\x12\x0f\n\x0bTAK_TRACKER\x10\n\"Q\n\x0fRebroadcastMode\x12\x07\n\x03\x41LL\x10\x00\x12\x15\n\x11\x41LL_SKIP_DECODING\x10\x01\x12\x0e\n\nLOCAL_ONLY\x10\x02\x12\x0e\n\nKNOWN_ONLY\x10\x03\x1a\x91\x05\n\x0ePositionConfig\x12\x1f\n\x17position_broadcast_secs\x18\x01 \x01(\r\x12(\n position_broadcast_smart_enabled\x18\x02 \x01(\x08\x12\x16\n\x0e\x66ixed_position\x18\x03 \x01(\x08\x12\x17\n\x0bgps_enabled\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x1b\n\x13gps_update_interval\x18\x05 \x01(\r\x12\x1c\n\x10gps_attempt_time\x18\x06 \x01(\rB\x02\x18\x01\x12\x16\n\x0eposition_flags\x18\x07 \x01(\r\x12\x0f\n\x07rx_gpio\x18\x08 \x01(\r\x12\x0f\n\x07tx_gpio\x18\t \x01(\r\x12(\n broadcast_smart_minimum_distance\x18\n \x01(\r\x12-\n%broadcast_smart_minimum_interval_secs\x18\x0b \x01(\r\x12\x13\n\x0bgps_en_gpio\x18\x0c \x01(\r\x12;\n\x08gps_mode\x18\r \x01(\x0e\x32).meshtastic.Config.PositionConfig.GpsMode\"\xab\x01\n\rPositionFlags\x12\t\n\x05UNSET\x10\x00\x12\x0c\n\x08\x41LTITUDE\x10\x01\x12\x10\n\x0c\x41LTITUDE_MSL\x10\x02\x12\x16\n\x12GEOIDAL_SEPARATION\x10\x04\x12\x07\n\x03\x44OP\x10\x08\x12\t\n\x05HVDOP\x10\x10\x12\r\n\tSATINVIEW\x10 \x12\n\n\x06SEQ_NO\x10@\x12\x0e\n\tTIMESTAMP\x10\x80\x01\x12\x0c\n\x07HEADING\x10\x80\x02\x12\n\n\x05SPEED\x10\x80\x04\"5\n\x07GpsMode\x12\x0c\n\x08\x44ISABLED\x10\x00\x12\x0b\n\x07\x45NABLED\x10\x01\x12\x0f\n\x0bNOT_PRESENT\x10\x02\x1a\xea\x01\n\x0bPowerConfig\x12\x17\n\x0fis_power_saving\x18\x01 \x01(\x08\x12&\n\x1eon_battery_shutdown_after_secs\x18\x02 \x01(\r\x12\x1f\n\x17\x61\x64\x63_multiplier_override\x18\x03 \x01(\x02\x12\x1b\n\x13wait_bluetooth_secs\x18\x04 \x01(\r\x12\x10\n\x08sds_secs\x18\x06 \x01(\r\x12\x0f\n\x07ls_secs\x18\x07 \x01(\r\x12\x15\n\rmin_wake_secs\x18\x08 \x01(\r\x12\"\n\x1a\x64\x65vice_battery_ina_address\x18\t \x01(\r\x1a\xfe\x02\n\rNetworkConfig\x12\x14\n\x0cwifi_enabled\x18\x01 \x01(\x08\x12\x11\n\twifi_ssid\x18\x03 \x01(\t\x12\x10\n\x08wifi_psk\x18\x04 \x01(\t\x12\x12\n\nntp_server\x18\x05 \x01(\t\x12\x13\n\x0b\x65th_enabled\x18\x06 \x01(\x08\x12\x42\n\x0c\x61\x64\x64ress_mode\x18\x07 \x01(\x0e\x32,.meshtastic.Config.NetworkConfig.AddressMode\x12@\n\x0bipv4_config\x18\x08 \x01(\x0b\x32+.meshtastic.Config.NetworkConfig.IpV4Config\x12\x16\n\x0ersyslog_server\x18\t \x01(\t\x1a\x46\n\nIpV4Config\x12\n\n\x02ip\x18\x01 \x01(\x07\x12\x0f\n\x07gateway\x18\x02 \x01(\x07\x12\x0e\n\x06subnet\x18\x03 \x01(\x07\x12\x0b\n\x03\x64ns\x18\x04 \x01(\x07\"#\n\x0b\x41\x64\x64ressMode\x12\x08\n\x04\x44HCP\x10\x00\x12\n\n\x06STATIC\x10\x01\x1a\xbe\x05\n\rDisplayConfig\x12\x16\n\x0escreen_on_secs\x18\x01 \x01(\r\x12H\n\ngps_format\x18\x02 \x01(\x0e\x32\x34.meshtastic.Config.DisplayConfig.GpsCoordinateFormat\x12!\n\x19\x61uto_screen_carousel_secs\x18\x03 \x01(\r\x12\x19\n\x11\x63ompass_north_top\x18\x04 \x01(\x08\x12\x13\n\x0b\x66lip_screen\x18\x05 \x01(\x08\x12<\n\x05units\x18\x06 \x01(\x0e\x32-.meshtastic.Config.DisplayConfig.DisplayUnits\x12\x37\n\x04oled\x18\x07 \x01(\x0e\x32).meshtastic.Config.DisplayConfig.OledType\x12\x41\n\x0b\x64isplaymode\x18\x08 \x01(\x0e\x32,.meshtastic.Config.DisplayConfig.DisplayMode\x12\x14\n\x0cheading_bold\x18\t \x01(\x08\x12\x1d\n\x15wake_on_tap_or_motion\x18\n \x01(\x08\"M\n\x13GpsCoordinateFormat\x12\x07\n\x03\x44\x45\x43\x10\x00\x12\x07\n\x03\x44MS\x10\x01\x12\x07\n\x03Line truncated
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.config_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\014ConfigProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_CONFIG_POSITIONCONFIG.fields_by_name['gps_enabled']._options = None
_CONFIG_POSITIONCONFIG.fields_by_name['gps_enabled']._serialized_options = b'\030\001'
_CONFIG_POSITIONCONFIG.fields_by_name['gps_attempt_time']._options = None
_CONFIG_POSITIONCONFIG.fields_by_name['gps_attempt_time']._serialized_options = b'\030\001'
_CONFIG._serialized_start=40
_CONFIG._serialized_end=4074
_CONFIG_DEVICECONFIG._serialized_start=416
_CONFIG_DEVICECONFIG._serialized_end=1073
_CONFIG_DEVICECONFIG_ROLE._serialized_start=820
_CONFIG_DEVICECONFIG_ROLE._serialized_end=990
_CONFIG_DEVICECONFIG_REBROADCASTMODE._serialized_start=992
_CONFIG_DEVICECONFIG_REBROADCASTMODE._serialized_end=1073
_CONFIG_POSITIONCONFIG._serialized_start=1076
_CONFIG_POSITIONCONFIG._serialized_end=1733
_CONFIG_POSITIONCONFIG_POSITIONFLAGS._serialized_start=1507
_CONFIG_POSITIONCONFIG_POSITIONFLAGS._serialized_end=1678
_CONFIG_POSITIONCONFIG_GPSMODE._serialized_start=1680
_CONFIG_POSITIONCONFIG_GPSMODE._serialized_end=1733
_CONFIG_POWERCONFIG._serialized_start=1736
_CONFIG_POWERCONFIG._serialized_end=1970
_CONFIG_NETWORKCONFIG._serialized_start=1973
_CONFIG_NETWORKCONFIG._serialized_end=2355
_CONFIG_NETWORKCONFIG_IPV4CONFIG._serialized_start=2248
_CONFIG_NETWORKCONFIG_IPV4CONFIG._serialized_end=2318
_CONFIG_NETWORKCONFIG_ADDRESSMODE._serialized_start=2320
_CONFIG_NETWORKCONFIG_ADDRESSMODE._serialized_end=2355
_CONFIG_DISPLAYCONFIG._serialized_start=2358
_CONFIG_DISPLAYCONFIG._serialized_end=3060
_CONFIG_DISPLAYCONFIG_GPSCOORDINATEFORMAT._serialized_start=2795
_CONFIG_DISPLAYCONFIG_GPSCOORDINATEFORMAT._serialized_end=2872
_CONFIG_DISPLAYCONFIG_DISPLAYUNITS._serialized_start=2874
_CONFIG_DISPLAYCONFIG_DISPLAYUNITS._serialized_end=2914
_CONFIG_DISPLAYCONFIG_OLEDTYPE._serialized_start=2916
_CONFIG_DISPLAYCONFIG_OLEDTYPE._serialized_end=2993
_CONFIG_DISPLAYCONFIG_DISPLAYMODE._serialized_start=2995
_CONFIG_DISPLAYCONFIG_DISPLAYMODE._serialized_end=3060
_CONFIG_LORACONFIG._serialized_start=3063
_CONFIG_LORACONFIG._serialized_end=3879
_CONFIG_LORACONFIG_REGIONCODE._serialized_start=3523
_CONFIG_LORACONFIG_REGIONCODE._serialized_end=3728
_CONFIG_LORACONFIG_MODEMPRESET._serialized_start=3731
_CONFIG_LORACONFIG_MODEMPRESET._serialized_end=3879
_CONFIG_BLUETOOTHCONFIG._serialized_start=3882
_CONFIG_BLUETOOTHCONFIG._serialized_end=4055
_CONFIG_BLUETOOTHCONFIG_PAIRINGMODE._serialized_start=3999
_CONFIG_BLUETOOTHCONFIG_PAIRINGMODE._serialized_end=4055
# @@protoc_insertion_point(module_scope)
-36
View File
@@ -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)
-30
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)
-92
View File
@@ -1,92 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/mesh.proto
"""Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
from meshtastic import channel_pb2 as meshtastic_dot_channel__pb2
from meshtastic import config_pb2 as meshtastic_dot_config__pb2
from meshtastic import module_config_pb2 as meshtastic_dot_module__config__pb2
from meshtastic import portnums_pb2 as meshtastic_dot_portnums__pb2
from meshtastic import telemetry_pb2 as meshtastic_dot_telemetry__pb2
from meshtastic import xmodem_pb2 as meshtastic_dot_xmodem__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15meshtastic/mesh.proto\x12\nmeshtastic\x1a\x18meshtastic/channel.proto\x1a\x17meshtastic/config.proto\x1a\x1emeshtastic/module_config.proto\x1a\x19meshtastic/portnums.proto\x1a\x1ameshtastic/telemetry.proto\x1a\x17meshtastic/xmodem.proto\"\xe5\x05\n\x08Position\x12\x12\n\nlatitude_i\x18\x01 \x01(\x0f\x12\x13\n\x0blongitude_i\x18\x02 \x01(\x0f\x12\x10\n\x08\x61ltitude\x18\x03 \x01(\x05\x12\x0c\n\x04time\x18\x04 \x01(\x07\x12\x37\n\x0flocation_source\x18\x05 \x01(\x0e\x32\x1e.meshtastic.Position.LocSource\x12\x37\n\x0f\x61ltitude_source\x18\x06 \x01(\x0e\x32\x1e.meshtastic.Position.AltSource\x12\x11\n\ttimestamp\x18\x07 \x01(\x07\x12\x1f\n\x17timestamp_millis_adjust\x18\x08 \x01(\x05\x12\x14\n\x0c\x61ltitude_hae\x18\t \x01(\x11\x12#\n\x1b\x61ltitude_geoidal_separation\x18\n \x01(\x11\x12\x0c\n\x04PDOP\x18\x0b \x01(\r\x12\x0c\n\x04HDOP\x18\x0c \x01(\r\x12\x0c\n\x04VDOP\x18\r \x01(\r\x12\x14\n\x0cgps_accuracy\x18\x0e \x01(\r\x12\x14\n\x0cground_speed\x18\x0f \x01(\r\x12\x14\n\x0cground_track\x18\x10 \x01(\r\x12\x13\n\x0b\x66ix_quality\x18\x11 \x01(\r\x12\x10\n\x08\x66ix_type\x18\x12 \x01(\r\x12\x14\n\x0csats_in_view\x18\x13 \x01(\r\x12\x11\n\tsensor_id\x18\x14 \x01(\r\x12\x13\n\x0bnext_update\x18\x15 \x01(\r\x12\x12\n\nseq_number\x18\x16 \x01(\r\x12\x16\n\x0eprecision_bits\x18\x17 \x01(\r\"N\n\tLocSource\x12\r\n\tLOC_UNSET\x10\x00\x12\x0e\n\nLOC_MANUAL\x10\x01\x12\x10\n\x0cLOC_INTERNAL\x10\x02\x12\x10\n\x0cLOC_EXTERNAL\x10\x03\"b\n\tAltSource\x12\r\n\tALT_UNSET\x10\x00\x12\x0e\n\nALT_MANUAL\x10\x01\x12\x10\n\x0c\x41LT_INTERNAL\x10\x02\x12\x10\n\x0c\x41LT_EXTERNAL\x10\x03\x12\x12\n\x0e\x41LT_BAROMETRIC\x10\x04\"\xc4\x01\n\x04User\x12\n\n\x02id\x18\x01 \x01(\t\x12\x11\n\tlong_name\x18\x02 \x01(\t\x12\x12\n\nshort_name\x18\x03 \x01(\t\x12\x13\n\x07macaddr\x18\x04 \x01(\x0c\x42\x02\x18\x01\x12+\n\x08hw_model\x18\x05 \x01(\x0e\x32\x19.meshtastic.HardwareModel\x12\x13\n\x0bis_licensed\x18\x06 \x01(\x08\x12\x32\n\x04role\x18\x07 \x01(\x0e\x32$.meshtastic.Config.DeviceConfig.Role\"\x1f\n\x0eRouteDiscovery\x12\r\n\x05route\x18\x01 \x03(\x07\"\xfc\x02\n\x07Routing\x12\x33\n\rroute_request\x18\x01 \x01(\x0b\x32\x1a.meshtastic.RouteDiscoveryH\x00\x12\x31\n\x0broute_reply\x18\x02 \x01(\x0b\x32\x1a.meshtastic.RouteDiscoveryH\x00\x12\x31\n\x0c\x65rror_reason\x18\x03 \x01(\x0e\x32\x19.meshtastic.Routing.ErrorH\x00\"\xca\x01\n\x05\x45rror\x12\x08\n\x04NONE\x10\x00\x12\x0c\n\x08NO_ROUTE\x10\x01\x12\x0b\n\x07GOT_NAK\x10\x02\x12\x0b\n\x07TIMEOUT\x10\x03\x12\x10\n\x0cNO_INTERFACE\x10\x04\x12\x12\n\x0eMAX_RETRANSMIT\x10\x05\x12\x0e\n\nNO_CHANNEL\x10\x06\x12\r\n\tTOO_LARGE\x10\x07\x12\x0f\n\x0bNO_RESPONSE\x10\x08\x12\x14\n\x10\x44UTY_CYCLE_LIMIT\x10\t\x12\x0f\n\x0b\x42\x41\x44_REQUEST\x10 \x12\x12\n\x0eNOT_AUTHORIZED\x10!B\t\n\x07variant\"\xa7\x01\n\x04\x44\x61ta\x12$\n\x07portnum\x18\x01 \x01(\x0e\x32\x13.meshtastic.PortNum\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\x12\x15\n\rwant_response\x18\x03 \x01(\x08\x12\x0c\n\x04\x64\x65st\x18\x04 \x01(\x07\x12\x0e\n\x06source\x18\x05 \x01(\x07\x12\x12\n\nrequest_id\x18\x06 \x01(\x07\x12\x10\n\x08reply_id\x18\x07 \x01(\x07\x12\r\n\x05\x65moji\x18\x08 \x01(\x07\"\x93\x01\n\x08Waypoint\x12\n\n\x02id\x18\x01 \x01(\r\x12\x12\n\nlatitude_i\x18\x02 \x01(\x0f\x12\x13\n\x0blongitude_i\x18\x03 \x01(\x0f\x12\x0e\n\x06\x65xpire\x18\x04 \x01(\r\x12\x11\n\tlocked_to\x18\x05 \x01(\r\x12\x0c\n\x04name\x18\x06 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x07 \x01(\t\x12\x0c\n\x04icon\x18\x08 \x01(\x07\"l\n\x16MqttClientProxyMessage\x12\r\n\x05topic\x18\x01 \x01(\t\x12\x0e\n\x04\x64\x61ta\x18\x02 \x01(\x0cH\x00\x12\x0e\n\x04text\x18\x03 \x01(\tH\x00\x12\x10\n\x08retained\x18\x04 \x01(\x08\x42\x11\n\x0fpayload_variant\"\x95\x04\n\nMeshPacket\x12\x0c\n\x04\x66rom\x18\x01 \x01(\x07\x12\n\n\x02to\x18\x02 \x01(\x07\x12\x0f\n\x07\x63hannel\x18\x03 \x01(\r\x12#\n\x07\x64\x65\x63oded\x18\x04 \x01(\x0b\x32\x10.meshtastic.DataH\x00\x12\x13\n\tencrypted\x18\x05 \x01(\x0cH\x00\x12\n\n\x02id\x18\x06 \x01(\x07\x12\x0f\n\x07rx_time\x18\x07 \x01(\x07\x12\x0e\n\x06rx_snr\x18\x08 \x01(\x02\x12\x11\n\thop_limit\x18\t \x01(\r\x12\x10\n\x08want_ack\x18\n \x01(\x08\x12\x31\n\x08priority\x18\x0b \x01(\x0e\x32\x1f.meshtastic.MeshPacket.Priority\x12\x0f\n\x07rx_rssi\x18\x0c \x01(\x05\x12\x33\n\x07\x64\x65layed\x18\r \x01(\x0e\x32\x1e.meshtastic.MeshPacket.DelayedB\x02\x18\x01\x12\x10\n\x08via_mqtt\x18\x0e \x01(\x08\x12\x11\n\thop_start\x18\x0f \x01(\r\"[\n\x08Priority\x12\t\n\x05UNSET\x10\x00\x12\x07\n\x03MIN\x10\x01\x12\x0e\n\nBACKGROUND\x10\n\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10@\x12\x0c\n\x08RELIABLE\x10\x46\x12\x07\n\x03\x41\x43K\x10x\x12\x07\n\x03MAX\x10\x7f\"B\n\x07\x44\x65layed\x12\x0c\n\x08NO_DELAY\x10\x00\x12\x15\n\x11\x44\x45LAYED_BROADCAST\x10\x01\x12\x12\n\x0e\x44\x45LAYED_DIRECT\x10\x02\x42\x11\n\x0fpayload_variant\"\xfe\x01\n\x08NodeInfo\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x1e\n\x04user\x18\x02 \x01(\x0b\x32\x10.meshtastic.User\x12&\n\x08position\x18\x03 \x0Line truncated
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.mesh_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\nMeshProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_USER.fields_by_name['macaddr']._options = None
_USER.fields_by_name['macaddr']._serialized_options = b'\030\001'
_MESHPACKET.fields_by_name['delayed']._options = None
_MESHPACKET.fields_by_name['delayed']._serialized_options = b'\030\001'
_HARDWAREMODEL._serialized_start=4737
_HARDWAREMODEL._serialized_end=5819
_CONSTANTS._serialized_start=5821
_CONSTANTS._serialized_end=5865
_CRITICALERRORCODE._serialized_start=5868
_CRITICALERRORCODE._serialized_end=6106
_POSITION._serialized_start=201
_POSITION._serialized_end=942
_POSITION_LOCSOURCE._serialized_start=764
_POSITION_LOCSOURCE._serialized_end=842
_POSITION_ALTSOURCE._serialized_start=844
_POSITION_ALTSOURCE._serialized_end=942
_USER._serialized_start=945
_USER._serialized_end=1141
_ROUTEDISCOVERY._serialized_start=1143
_ROUTEDISCOVERY._serialized_end=1174
_ROUTING._serialized_start=1177
_ROUTING._serialized_end=1557
_ROUTING_ERROR._serialized_start=1344
_ROUTING_ERROR._serialized_end=1546
_DATA._serialized_start=1560
_DATA._serialized_end=1727
_WAYPOINT._serialized_start=1730
_WAYPOINT._serialized_end=1877
_MQTTCLIENTPROXYMESSAGE._serialized_start=1879
_MQTTCLIENTPROXYMESSAGE._serialized_end=1987
_MESHPACKET._serialized_start=1990
_MESHPACKET._serialized_end=2523
_MESHPACKET_PRIORITY._serialized_start=2345
_MESHPACKET_PRIORITY._serialized_end=2436
_MESHPACKET_DELAYED._serialized_start=2438
_MESHPACKET_DELAYED._serialized_end=2504
_NODEINFO._serialized_start=2526
_NODEINFO._serialized_end=2780
_MYNODEINFO._serialized_start=2782
_MYNODEINFO._serialized_end=2862
_LOGRECORD._serialized_start=2865
_LOGRECORD._serialized_end=3057
_LOGRECORD_LEVEL._serialized_start=2969
_LOGRECORD_LEVEL._serialized_end=3057
_QUEUESTATUS._serialized_start=3059
_QUEUESTATUS._serialized_end=3139
_FROMRADIO._serialized_start=3142
_FROMRADIO._serialized_end=3745
_TORADIO._serialized_start=3748
_TORADIO._serialized_end=4024
_COMPRESSED._serialized_start=4026
_COMPRESSED._serialized_end=4090
_NEIGHBORINFO._serialized_start=4093
_NEIGHBORINFO._serialized_end=4228
_NEIGHBOR._serialized_start=4230
_NEIGHBOR._serialized_end=4330
_DEVICEMETADATA._serialized_start=4333
_DEVICEMETADATA._serialized_end=4634
_HEARTBEAT._serialized_start=4636
_HEARTBEAT._serialized_end=4647
_NODEREMOTEHARDWAREPIN._serialized_start=4649
_NODEREMOTEHARDWAREPIN._serialized_end=4734
# @@protoc_insertion_point(module_scope)
-66
View File
@@ -1,66 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/module_config.proto
"""Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1emeshtastic/module_config.proto\x12\nmeshtastic\"\xd3\"\n\x0cModuleConfig\x12\x33\n\x04mqtt\x18\x01 \x01(\x0b\x32#.meshtastic.ModuleConfig.MQTTConfigH\x00\x12\x37\n\x06serial\x18\x02 \x01(\x0b\x32%.meshtastic.ModuleConfig.SerialConfigH\x00\x12T\n\x15\x65xternal_notification\x18\x03 \x01(\x0b\x32\x33.meshtastic.ModuleConfig.ExternalNotificationConfigH\x00\x12\x44\n\rstore_forward\x18\x04 \x01(\x0b\x32+.meshtastic.ModuleConfig.StoreForwardConfigH\x00\x12>\n\nrange_test\x18\x05 \x01(\x0b\x32(.meshtastic.ModuleConfig.RangeTestConfigH\x00\x12=\n\ttelemetry\x18\x06 \x01(\x0b\x32(.meshtastic.ModuleConfig.TelemetryConfigH\x00\x12\x46\n\x0e\x63\x61nned_message\x18\x07 \x01(\x0b\x32,.meshtastic.ModuleConfig.CannedMessageConfigH\x00\x12\x35\n\x05\x61udio\x18\x08 \x01(\x0b\x32$.meshtastic.ModuleConfig.AudioConfigH\x00\x12H\n\x0fremote_hardware\x18\t \x01(\x0b\x32-.meshtastic.ModuleConfig.RemoteHardwareConfigH\x00\x12\x44\n\rneighbor_info\x18\n \x01(\x0b\x32+.meshtastic.ModuleConfig.NeighborInfoConfigH\x00\x12J\n\x10\x61mbient_lighting\x18\x0b \x01(\x0b\x32..meshtastic.ModuleConfig.AmbientLightingConfigH\x00\x12J\n\x10\x64\x65tection_sensor\x18\x0c \x01(\x0b\x32..meshtastic.ModuleConfig.DetectionSensorConfigH\x00\x12?\n\npaxcounter\x18\r \x01(\x0b\x32).meshtastic.ModuleConfig.PaxcounterConfigH\x00\x1a\xb0\x02\n\nMQTTConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x01(\t\x12\x10\n\x08username\x18\x03 \x01(\t\x12\x10\n\x08password\x18\x04 \x01(\t\x12\x1a\n\x12\x65ncryption_enabled\x18\x05 \x01(\x08\x12\x14\n\x0cjson_enabled\x18\x06 \x01(\x08\x12\x13\n\x0btls_enabled\x18\x07 \x01(\x08\x12\x0c\n\x04root\x18\x08 \x01(\t\x12\x1f\n\x17proxy_to_client_enabled\x18\t \x01(\x08\x12\x1d\n\x15map_reporting_enabled\x18\n \x01(\x08\x12G\n\x13map_report_settings\x18\x0b \x01(\x0b\x32*.meshtastic.ModuleConfig.MapReportSettings\x1aN\n\x11MapReportSettings\x12\x1d\n\x15publish_interval_secs\x18\x01 \x01(\r\x12\x1a\n\x12position_precision\x18\x02 \x01(\r\x1a\x82\x01\n\x14RemoteHardwareConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\"\n\x1a\x61llow_undefined_pin_access\x18\x02 \x01(\x08\x12\x35\n\x0e\x61vailable_pins\x18\x03 \x03(\x0b\x32\x1d.meshtastic.RemoteHardwarePin\x1a>\n\x12NeighborInfoConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x17\n\x0fupdate_interval\x18\x02 \x01(\r\x1a\xd2\x01\n\x15\x44\x65tectionSensorConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x1e\n\x16minimum_broadcast_secs\x18\x02 \x01(\r\x12\x1c\n\x14state_broadcast_secs\x18\x03 \x01(\r\x12\x11\n\tsend_bell\x18\x04 \x01(\x08\x12\x0c\n\x04name\x18\x05 \x01(\t\x12\x13\n\x0bmonitor_pin\x18\x06 \x01(\r\x12 \n\x18\x64\x65tection_triggered_high\x18\x07 \x01(\x08\x12\x12\n\nuse_pullup\x18\x08 \x01(\x08\x1a\xe4\x02\n\x0b\x41udioConfig\x12\x16\n\x0e\x63odec2_enabled\x18\x01 \x01(\x08\x12\x0f\n\x07ptt_pin\x18\x02 \x01(\r\x12@\n\x07\x62itrate\x18\x03 \x01(\x0e\x32/.meshtastic.ModuleConfig.AudioConfig.Audio_Baud\x12\x0e\n\x06i2s_ws\x18\x04 \x01(\r\x12\x0e\n\x06i2s_sd\x18\x05 \x01(\r\x12\x0f\n\x07i2s_din\x18\x06 \x01(\r\x12\x0f\n\x07i2s_sck\x18\x07 \x01(\r\"\xa7\x01\n\nAudio_Baud\x12\x12\n\x0e\x43ODEC2_DEFAULT\x10\x00\x12\x0f\n\x0b\x43ODEC2_3200\x10\x01\x12\x0f\n\x0b\x43ODEC2_2400\x10\x02\x12\x0f\n\x0b\x43ODEC2_1600\x10\x03\x12\x0f\n\x0b\x43ODEC2_1400\x10\x04\x12\x0f\n\x0b\x43ODEC2_1300\x10\x05\x12\x0f\n\x0b\x43ODEC2_1200\x10\x06\x12\x0e\n\nCODEC2_700\x10\x07\x12\x0f\n\x0b\x43ODEC2_700B\x10\x08\x1av\n\x10PaxcounterConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\"\n\x1apaxcounter_update_interval\x18\x02 \x01(\r\x12\x16\n\x0ewifi_threshold\x18\x03 \x01(\x05\x12\x15\n\rble_threshold\x18\x04 \x01(\x05\x1a\xe4\x04\n\x0cSerialConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0c\n\x04\x65\x63ho\x18\x02 \x01(\x08\x12\x0b\n\x03rxd\x18\x03 \x01(\r\x12\x0b\n\x03txd\x18\x04 \x01(\r\x12?\n\x04\x62\x61ud\x18\x05 \x01(\x0e\x32\x31.meshtastic.ModuleConfig.SerialConfig.Serial_Baud\x12\x0f\n\x07timeout\x18\x06 \x01(\r\x12?\n\x04mode\x18\x07 \x01(\x0e\x32\x31.meshtastic.ModuleConfig.SerialConfig.Serial_Mode\x12$\n\x1coverride_console_serial_port\x18\x08 \x01(\x08\"\x8a\x02\n\x0bSerial_Baud\x12\x10\n\x0c\x42\x41UD_DEFAULT\x10\x00\x12\x0c\n\x08\x42\x41UD_110\x10\x01\x12\x0c\n\x08\x42\x41UD_300\x10\x02\x12\x0c\n\x08\x42\x41UD_600\x10\x03\x12\r\n\tBAUD_1200\x10\x04\x12\r\n\tBAUD_2400\x10\x05\x12\r\n\tBAUD_4800\x10\x06\x12\r\n\tBAUD_9600\x10\x07\x12\x0e\n\nBAUD_19200\x10\x08\x12\x0e\n\nBAUD_38400\x10\t\x12\x0e\n\nBAUD_57600\x10\n\x12\x0f\n\x0b\x42\x41UD_115200\x10\x0b\x12\x0f\n\x0b\x42\x41UD_230400\x10\x0c\x12\x0f\n\x0b\x42\x41UD_460800\x10\r\x12\x0f\n\x0b\x42\x41UD_576000\x10\x0e\x12\x0f\n\x0b\x42\x41UD_921600\x10\x0f\"U\n\x0bSerial_Mode\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x00\x12\n\n\x06SIMPLE\x10\x01\x12\t\n\x05PROTO\x10\x02\x12\x0b\n\x07TEXTMSG\x10\x03\x12\x08\n\x04NMEA\x10\x04\x12\x0b\n\x07\x43\x41LTOPO\x10\x05\x1a\xe9\x02\n\x1a\x45xternalNotificationConfig\x12\x0f\n\x0Line truncated
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.module_config_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\022ModuleConfigProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_REMOTEHARDWAREPINTYPE._serialized_start=4586
_REMOTEHARDWAREPINTYPE._serialized_end=4659
_MODULECONFIG._serialized_start=47
_MODULECONFIG._serialized_end=4482
_MODULECONFIG_MQTTCONFIG._serialized_start=945
_MODULECONFIG_MQTTCONFIG._serialized_end=1249
_MODULECONFIG_MAPREPORTSETTINGS._serialized_start=1251
_MODULECONFIG_MAPREPORTSETTINGS._serialized_end=1329
_MODULECONFIG_REMOTEHARDWARECONFIG._serialized_start=1332
_MODULECONFIG_REMOTEHARDWARECONFIG._serialized_end=1462
_MODULECONFIG_NEIGHBORINFOCONFIG._serialized_start=1464
_MODULECONFIG_NEIGHBORINFOCONFIG._serialized_end=1526
_MODULECONFIG_DETECTIONSENSORCONFIG._serialized_start=1529
_MODULECONFIG_DETECTIONSENSORCONFIG._serialized_end=1739
_MODULECONFIG_AUDIOCONFIG._serialized_start=1742
_MODULECONFIG_AUDIOCONFIG._serialized_end=2098
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD._serialized_start=1931
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD._serialized_end=2098
_MODULECONFIG_PAXCOUNTERCONFIG._serialized_start=2100
_MODULECONFIG_PAXCOUNTERCONFIG._serialized_end=2218
_MODULECONFIG_SERIALCONFIG._serialized_start=2221
_MODULECONFIG_SERIALCONFIG._serialized_end=2833
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD._serialized_start=2480
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD._serialized_end=2746
_MODULECONFIG_SERIALCONFIG_SERIAL_MODE._serialized_start=2748
_MODULECONFIG_SERIALCONFIG_SERIAL_MODE._serialized_end=2833
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG._serialized_start=2836
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG._serialized_end=3197
_MODULECONFIG_STOREFORWARDCONFIG._serialized_start=3200
_MODULECONFIG_STOREFORWARDCONFIG._serialized_end=3332
_MODULECONFIG_RANGETESTCONFIG._serialized_start=3334
_MODULECONFIG_RANGETESTCONFIG._serialized_end=3398
_MODULECONFIG_TELEMETRYCONFIG._serialized_start=3401
_MODULECONFIG_TELEMETRYCONFIG._serialized_end=3759
_MODULECONFIG_CANNEDMESSAGECONFIG._serialized_start=3762
_MODULECONFIG_CANNEDMESSAGECONFIG._serialized_end=4360
_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR._serialized_start=4261
_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR._serialized_end=4360
_MODULECONFIG_AMBIENTLIGHTINGCONFIG._serialized_start=4362
_MODULECONFIG_AMBIENTLIGHTINGCONFIG._serialized_end=4463
_REMOTEHARDWAREPIN._serialized_start=4484
_REMOTEHARDWAREPIN._serialized_end=4584
# @@protoc_insertion_point(module_scope)
-30
View File
@@ -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)
-26
View File
@@ -1,26 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/paxcount.proto
"""Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x19meshtastic/paxcount.proto\x12\nmeshtastic\"5\n\x08Paxcount\x12\x0c\n\x04wifi\x18\x01 \x01(\r\x12\x0b\n\x03\x62le\x18\x02 \x01(\r\x12\x0e\n\x06uptime\x18\x03 \x01(\rBc\n\x13\x63om.geeksville.meshB\x0ePaxcountProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.paxcount_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\016PaxcountProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_PAXCOUNT._serialized_start=41
_PAXCOUNT._serialized_end=94
# @@protoc_insertion_point(module_scope)
-26
View File
@@ -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)
+1
View File
@@ -0,0 +1 @@
569a2b3ae7b6bda1a7ab177463a55d8ede3bef53
View File
Whitespace-only changes.
+74
View File
@@ -0,0 +1,74 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/protobuf/admin.proto
"""Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
from meshtastic.protobuf import channel_pb2 as meshtastic_dot_protobuf_dot_channel__pb2
from meshtastic.protobuf import config_pb2 as meshtastic_dot_protobuf_dot_config__pb2
from meshtastic.protobuf import connection_status_pb2 as meshtastic_dot_protobuf_dot_connection__status__pb2
from meshtastic.protobuf import device_ui_pb2 as meshtastic_dot_protobuf_dot_device__ui__pb2
from meshtastic.protobuf import mesh_pb2 as meshtastic_dot_protobuf_dot_mesh__pb2
from meshtastic.protobuf import module_config_pb2 as meshtastic_dot_protobuf_dot_module__config__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1fmeshtastic/protobuf/admin.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/config.proto\x1a+meshtastic/protobuf/connection_status.proto\x1a#meshtastic/protobuf/device_ui.proto\x1a\x1emeshtastic/protobuf/mesh.proto\x1a\'meshtastic/protobuf/module_config.proto\"\xb5\x1d\n\x0c\x41\x64minMessage\x12\x17\n\x0fsession_passkey\x18\x65 \x01(\x0c\x12\x1d\n\x13get_channel_request\x18\x01 \x01(\rH\x00\x12<\n\x14get_channel_response\x18\x02 \x01(\x0b\x32\x1c.meshtastic.protobuf.ChannelH\x00\x12\x1b\n\x11get_owner_request\x18\x03 \x01(\x08H\x00\x12\x37\n\x12get_owner_response\x18\x04 \x01(\x0b\x32\x19.meshtastic.protobuf.UserH\x00\x12J\n\x12get_config_request\x18\x05 \x01(\x0e\x32,.meshtastic.protobuf.AdminMessage.ConfigTypeH\x00\x12:\n\x13get_config_response\x18\x06 \x01(\x0b\x32\x1b.meshtastic.protobuf.ConfigH\x00\x12W\n\x19get_module_config_request\x18\x07 \x01(\x0e\x32\x32.meshtastic.protobuf.AdminMessage.ModuleConfigTypeH\x00\x12G\n\x1aget_module_config_response\x18\x08 \x01(\x0b\x32!.meshtastic.protobuf.ModuleConfigH\x00\x12\x34\n*get_canned_message_module_messages_request\x18\n \x01(\x08H\x00\x12\x35\n+get_canned_message_module_messages_response\x18\x0b \x01(\tH\x00\x12%\n\x1bget_device_metadata_request\x18\x0c \x01(\x08H\x00\x12K\n\x1cget_device_metadata_response\x18\r \x01(\x0b\x32#.meshtastic.protobuf.DeviceMetadataH\x00\x12\x1e\n\x14get_ringtone_request\x18\x0e \x01(\x08H\x00\x12\x1f\n\x15get_ringtone_response\x18\x0f \x01(\tH\x00\x12.\n$get_device_connection_status_request\x18\x10 \x01(\x08H\x00\x12\\\n%get_device_connection_status_response\x18\x11 \x01(\x0b\x32+.meshtastic.protobuf.DeviceConnectionStatusH\x00\x12:\n\x0cset_ham_mode\x18\x12 \x01(\x0b\x32\".meshtastic.protobuf.HamParametersH\x00\x12/\n%get_node_remote_hardware_pins_request\x18\x13 \x01(\x08H\x00\x12\x65\n&get_node_remote_hardware_pins_response\x18\x14 \x01(\x0b\x32\x33.meshtastic.protobuf.NodeRemoteHardwarePinsResponseH\x00\x12 \n\x16\x65nter_dfu_mode_request\x18\x15 \x01(\x08H\x00\x12\x1d\n\x13\x64\x65lete_file_request\x18\x16 \x01(\tH\x00\x12\x13\n\tset_scale\x18\x17 \x01(\rH\x00\x12N\n\x12\x62\x61\x63kup_preferences\x18\x18 \x01(\x0e\x32\x30.meshtastic.protobuf.AdminMessage.BackupLocationH\x00\x12O\n\x13restore_preferences\x18\x19 \x01(\x0e\x32\x30.meshtastic.protobuf.AdminMessage.BackupLocationH\x00\x12U\n\x19remove_backup_preferences\x18\x1a \x01(\x0e\x32\x30.meshtastic.protobuf.AdminMessage.BackupLocationH\x00\x12H\n\x10send_input_event\x18\x1b \x01(\x0b\x32,.meshtastic.protobuf.AdminMessage.InputEventH\x00\x12.\n\tset_owner\x18 \x01(\x0b\x32\x19.meshtastic.protobuf.UserH\x00\x12\x33\n\x0bset_channel\x18! \x01(\x0b\x32\x1c.meshtastic.protobuf.ChannelH\x00\x12\x31\n\nset_config\x18\" \x01(\x0b\x32\x1b.meshtastic.protobuf.ConfigH\x00\x12>\n\x11set_module_config\x18# \x01(\x0b\x32!.meshtastic.protobuf.ModuleConfigH\x00\x12,\n\"set_canned_message_module_messages\x18$ \x01(\tH\x00\x12\x1e\n\x14set_ringtone_message\x18% \x01(\tH\x00\x12\x1b\n\x11remove_by_nodenum\x18& \x01(\rH\x00\x12\x1b\n\x11set_favorite_node\x18\' \x01(\rH\x00\x12\x1e\n\x14remove_favorite_node\x18( \x01(\rH\x00\x12;\n\x12set_fixed_position\x18) \x01(\x0b\x32\x1d.meshtastic.protobuf.PositionH\x00\x12\x1f\n\x15remove_fixed_position\x18* \x01(\x08H\x00\x12\x17\n\rset_time_only\x18+ \x01(\x07H\x00\x12\x1f\n\x15get_ui_config_request\x18, \x01(\x08H\x00\x12\x45\n\x16get_ui_config_response\x18- \x01(\x0b\x32#.meshtastic.protobuf.DeviceUIConfigH\x00\x12>\n\x0fstore_ui_config\x18. \x01(\x0b\x32#.meshtastic.protobuf.DeviceUIConfigH\x00\x12\x1a\n\x10set_ignored_node\x18/ \x01(\rH\x00\x12\x1d\n\x13remove_ignored_node\x18\x30 \x01(\rH\x00\x12\x1b\n\x11toggle_muted_node\x18\x31 \x01(\rH\x00\x12\x1d\n\x13\x62\x65gin_edit_settings\x18@ \x01(\x08H\x00\x12\x1e\n\x14\x63ommit_edit_settings\x18\x41 \x01(\x08H\x00\x12\x39\n\x0b\x61\x64\x64_contact\x18\x42 \x01(\x0b\x32\".meshtastic.protobuf.SharedContactH\x00\x12\x45\n\x10key_verification\x18\x43 \x01(\x0b\x32).meshtastic.protobuf.KeyVerificationAdminH\x00\x12\x1e\n\x14\x66\x61\x63tory_reset_device\x18^ \x01(\x05H\x00\x12 \n\x12reboot_ota_seconds\x18_ \x01(\x05\x42\x02\x18\x01H\x00\x12\x18\n\x0e\x65xit_simulator\x18` \x01(\x08H\x00\x12\x18\n\x0ereboot_seconds\x18\x61 \x01(\x05H\x00\x12\x1a\n\x10shutdown_seconds\x18\x62 \x01(\x05H\x00\x12\x1e\n\x14\x66\x61\x63tory_reset_config\x18\x63 \x01(\x05H\x00\x12\x16\n\x0cnodedb_reset\x18\x64 \x01(\x08H\x00\x12\x41\n\x0bota_request\x18\x66 \x01(\x0b\x32*.meshtastic.protobuf.AdminMessage.OTAEventH\x00\x12:\n\rsensor_config\x18g \x01(\x0b\x32!.meshtastic.protobuf.SensorConfigH\x00\x12:\n\rlockdown_auth\x18h \x01(\x0b\x32!.meshtastic.protobuf.LockdownAuthH\x00\x1aS\n\nInputEvent\x12\x12\n\nevent_code\x18\x01 \x01(\r\x12\x0f\n\x07kb_char\x18\x02 \x01(\r\x12\x0f\n\x07touch_x\x18\x03 \x01(\r\x12\x0f\n\x07touch_y\x18\x04 \x01(\r\x1aS\n\x08OTAEvent\x12\x35\n\x0freboot_ota_mode\x18\x01 \x01(\x0e\x32\xLine truncated
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.admin_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\013AdminProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_ADMINMESSAGE.fields_by_name['reboot_ota_seconds']._options = None
_ADMINMESSAGE.fields_by_name['reboot_ota_seconds']._serialized_options = b'\030\001'
_OTAMODE._serialized_start=6748
_OTAMODE._serialized_end=6803
_ADMINMESSAGE._serialized_start=281
_ADMINMESSAGE._serialized_end=4046
_ADMINMESSAGE_INPUTEVENT._serialized_start=3192
_ADMINMESSAGE_INPUTEVENT._serialized_end=3275
_ADMINMESSAGE_OTAEVENT._serialized_start=3277
_ADMINMESSAGE_OTAEVENT._serialized_end=3360
_ADMINMESSAGE_CONFIGTYPE._serialized_start=3363
_ADMINMESSAGE_CONFIGTYPE._serialized_end=3577
_ADMINMESSAGE_MODULECONFIGTYPE._serialized_start=3580
_ADMINMESSAGE_MODULECONFIGTYPE._serialized_end=3990
_ADMINMESSAGE_BACKUPLOCATION._serialized_start=3992
_ADMINMESSAGE_BACKUPLOCATION._serialized_end=4027
_LOCKDOWNAUTH._serialized_start=4049
_LOCKDOWNAUTH._serialized_end=4199
_HAMPARAMETERS._serialized_start=4201
_HAMPARAMETERS._serialized_end=4311
_NODEREMOTEHARDWAREPINSRESPONSE._serialized_start=4313
_NODEREMOTEHARDWAREPINSRESPONSE._serialized_end=4424
_SHAREDCONTACT._serialized_start=4426
_SHAREDCONTACT._serialized_end=4550
_KEYVERIFICATIONADMIN._serialized_start=4553
_KEYVERIFICATIONADMIN._serialized_end=4846
_KEYVERIFICATIONADMIN_MESSAGETYPE._serialized_start=4723
_KEYVERIFICATIONADMIN_MESSAGETYPE._serialized_end=4826
_SENSORCONFIG._serialized_start=4849
_SENSORCONFIG._serialized_end=5266
_SCD4X_CONFIG._serialized_start=5269
_SCD4X_CONFIG._serialized_end=5623
_SEN5X_CONFIG._serialized_start=5626
_SEN5X_CONFIG._serialized_end=5800
_SEN6X_CONFIG._serialized_start=5803
_SEN6X_CONFIG._serialized_end=6219
_SCD30_CONFIG._serialized_start=6222
_SCD30_CONFIG._serialized_end=6530
_SHTXX_CONFIG._serialized_start=6532
_SHTXX_CONFIG._serialized_end=6590
_DS248X_CONFIG._serialized_start=6592
_DS248X_CONFIG._serialized_end=6675
_AS3935_CONFIG._serialized_start=6677
_AS3935_CONFIG._serialized_end=6746
# @@protoc_insertion_point(module_scope)
+360
View File
@@ -0,0 +1,360 @@
from meshtastic.protobuf import channel_pb2 as _channel_pb2
from meshtastic.protobuf import config_pb2 as _config_pb2
from meshtastic.protobuf import connection_status_pb2 as _connection_status_pb2
from meshtastic.protobuf import device_ui_pb2 as _device_ui_pb2
from meshtastic.protobuf import mesh_pb2 as _mesh_pb2
from meshtastic.protobuf import module_config_pb2 as _module_config_pb2
from google.protobuf.internal import containers as _containers
from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Mapping, Optional as _Optional, Union as _Union
DESCRIPTOR: _descriptor.FileDescriptor
NO_REBOOT_OTA: OTAMode
OTA_BLE: OTAMode
OTA_WIFI: OTAMode
class AS3935_config(_message.Message):
__slots__ = ["set_tuning_cap_pf"]
SET_TUNING_CAP_PF_FIELD_NUMBER: _ClassVar[int]
set_tuning_cap_pf: int
def __init__(self, set_tuning_cap_pf: _Optional[int] = ...) -> None: ...
class AdminMessage(_message.Message):
__slots__ = ["add_contact", "backup_preferences", "begin_edit_settings", "commit_edit_settings", "delete_file_request", "enter_dfu_mode_request", "exit_simulator", "factory_reset_config", "factory_reset_device", "get_canned_message_module_messages_request", "get_canned_message_module_messages_response", "get_channel_request", "get_channel_response", "get_config_request", "get_config_response", "get_device_connection_status_request", "get_device_connection_status_response", "get_device_metadata_request", "get_device_metadata_response", "get_module_config_request", "get_module_config_response", "get_node_remote_hardware_pins_request", "get_node_remote_hardware_pins_response", "get_owner_request", "get_owner_response", "get_ringtone_request", "get_ringtone_response", "get_ui_config_request", "get_ui_config_response", "key_verification", "lockdown_auth", "nodedb_reset", "ota_request", "reboot_ota_seconds", "reboot_seconds", "remove_backup_preferences", "remove_by_nodenum", "remove_favorite_node", "remove_fixed_position", "remove_ignored_node", "restore_preferences", "send_input_event", "sensor_config", "session_passkey", "set_canned_message_module_messages", "set_channel", "set_config", "set_favorite_node", "set_fixed_position", "set_ham_mode", "set_ignored_node", "set_module_config", "set_owner", "set_ringtone_message", "set_scale", "set_time_only", "shutdown_seconds", "store_ui_config", "toggle_muted_node"]
class BackupLocation(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class ConfigType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class ModuleConfigType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class InputEvent(_message.Message):
__slots__ = ["event_code", "kb_char", "touch_x", "touch_y"]
EVENT_CODE_FIELD_NUMBER: _ClassVar[int]
KB_CHAR_FIELD_NUMBER: _ClassVar[int]
TOUCH_X_FIELD_NUMBER: _ClassVar[int]
TOUCH_Y_FIELD_NUMBER: _ClassVar[int]
event_code: int
kb_char: int
touch_x: int
touch_y: int
def __init__(self, event_code: _Optional[int] = ..., kb_char: _Optional[int] = ..., touch_x: _Optional[int] = ..., touch_y: _Optional[int] = ...) -> None: ...
class OTAEvent(_message.Message):
__slots__ = ["ota_hash", "reboot_ota_mode"]
OTA_HASH_FIELD_NUMBER: _ClassVar[int]
REBOOT_OTA_MODE_FIELD_NUMBER: _ClassVar[int]
ota_hash: bytes
reboot_ota_mode: OTAMode
def __init__(self, reboot_ota_mode: _Optional[_Union[OTAMode, str]] = ..., ota_hash: _Optional[bytes] = ...) -> None: ...
ADD_CONTACT_FIELD_NUMBER: _ClassVar[int]
AMBIENTLIGHTING_CONFIG: AdminMessage.ModuleConfigType
AUDIO_CONFIG: AdminMessage.ModuleConfigType
BACKUP_PREFERENCES_FIELD_NUMBER: _ClassVar[int]
BEGIN_EDIT_SETTINGS_FIELD_NUMBER: _ClassVar[int]
BLUETOOTH_CONFIG: AdminMessage.ConfigType
CANNEDMSG_CONFIG: AdminMessage.ModuleConfigType
COMMIT_EDIT_SETTINGS_FIELD_NUMBER: _ClassVar[int]
DELETE_FILE_REQUEST_FIELD_NUMBER: _ClassVar[int]
DETECTIONSENSOR_CONFIG: AdminMessage.ModuleConfigType
DEVICEUI_CONFIG: AdminMessage.ConfigType
DEVICE_CONFIG: AdminMessage.ConfigType
DISPLAY_CONFIG: AdminMessage.ConfigType
ENTER_DFU_MODE_REQUEST_FIELD_NUMBER: _ClassVar[int]
EXIT_SIMULATOR_FIELD_NUMBER: _ClassVar[int]
EXTNOTIF_CONFIG: AdminMessage.ModuleConfigType
FACTORY_RESET_CONFIG_FIELD_NUMBER: _ClassVar[int]
FACTORY_RESET_DEVICE_FIELD_NUMBER: _ClassVar[int]
FLASH: AdminMessage.BackupLocation
GET_CANNED_MESSAGE_MODULE_MESSAGES_REQUEST_FIELD_NUMBER: _ClassVar[int]
GET_CANNED_MESSAGE_MODULE_MESSAGES_RESPONSE_FIELD_NUMBER: _ClassVar[int]
GET_CHANNEL_REQUEST_FIELD_NUMBER: _ClassVar[int]
GET_CHANNEL_RESPONSE_FIELD_NUMBER: _ClassVar[int]
GET_CONFIG_REQUEST_FIELD_NUMBER: _ClassVar[int]
GET_CONFIG_RESPONSE_FIELD_NUMBER: _ClassVar[int]
GET_DEVICE_CONNECTION_STATUS_REQUEST_FIELD_NUMBER: _ClassVar[int]
GET_DEVICE_CONNECTION_STATUS_RESPONSE_FIELD_NUMBER: _ClassVar[int]
GET_DEVICE_METADATA_REQUEST_FIELD_NUMBER: _ClassVar[int]
GET_DEVICE_METADATA_RESPONSE_FIELD_NUMBER: _ClassVar[int]
GET_MODULE_CONFIG_REQUEST_FIELD_NUMBER: _ClassVar[int]
GET_MODULE_CONFIG_RESPONSE_FIELD_NUMBER: _ClassVar[int]
GET_NODE_REMOTE_HARDWARE_PINS_REQUEST_FIELD_NUMBER: _ClassVar[int]
GET_NODE_REMOTE_HARDWARE_PINS_RESPONSE_FIELD_NUMBER: _ClassVar[int]
GET_OWNER_REQUEST_FIELD_NUMBER: _ClassVar[int]
GET_OWNER_RESPONSE_FIELD_NUMBER: _ClassVar[int]
GET_RINGTONE_REQUEST_FIELD_NUMBER: _ClassVar[int]
GET_RINGTONE_RESPONSE_FIELD_NUMBER: _ClassVar[int]
GET_UI_CONFIG_REQUEST_FIELD_NUMBER: _ClassVar[int]
GET_UI_CONFIG_RESPONSE_FIELD_NUMBER: _ClassVar[int]
KEY_VERIFICATION_FIELD_NUMBER: _ClassVar[int]
LOCKDOWN_AUTH_FIELD_NUMBER: _ClassVar[int]
LORA_CONFIG: AdminMessage.ConfigType
MESHBEACON_CONFIG: AdminMessage.ModuleConfigType
MQTT_CONFIG: AdminMessage.ModuleConfigType
NEIGHBORINFO_CONFIG: AdminMessage.ModuleConfigType
NETWORK_CONFIG: AdminMessage.ConfigType
NODEDB_RESET_FIELD_NUMBER: _ClassVar[int]
OTA_REQUEST_FIELD_NUMBER: _ClassVar[int]
PAXCOUNTER_CONFIG: AdminMessage.ModuleConfigType
POSITION_CONFIG: AdminMessage.ConfigType
POWER_CONFIG: AdminMessage.ConfigType
RANGETEST_CONFIG: AdminMessage.ModuleConfigType
REBOOT_OTA_SECONDS_FIELD_NUMBER: _ClassVar[int]
REBOOT_SECONDS_FIELD_NUMBER: _ClassVar[int]
REMOTEHARDWARE_CONFIG: AdminMessage.ModuleConfigType
REMOVE_BACKUP_PREFERENCES_FIELD_NUMBER: _ClassVar[int]
REMOVE_BY_NODENUM_FIELD_NUMBER: _ClassVar[int]
REMOVE_FAVORITE_NODE_FIELD_NUMBER: _ClassVar[int]
REMOVE_FIXED_POSITION_FIELD_NUMBER: _ClassVar[int]
REMOVE_IGNORED_NODE_FIELD_NUMBER: _ClassVar[int]
RESTORE_PREFERENCES_FIELD_NUMBER: _ClassVar[int]
SD: AdminMessage.BackupLocation
SECURITY_CONFIG: AdminMessage.ConfigType
SEND_INPUT_EVENT_FIELD_NUMBER: _ClassVar[int]
SENSOR_CONFIG_FIELD_NUMBER: _ClassVar[int]
SERIAL_CONFIG: AdminMessage.ModuleConfigType
SESSIONKEY_CONFIG: AdminMessage.ConfigType
SESSION_PASSKEY_FIELD_NUMBER: _ClassVar[int]
SET_CANNED_MESSAGE_MODULE_MESSAGES_FIELD_NUMBER: _ClassVar[int]
SET_CHANNEL_FIELD_NUMBER: _ClassVar[int]
SET_CONFIG_FIELD_NUMBER: _ClassVar[int]
SET_FAVORITE_NODE_FIELD_NUMBER: _ClassVar[int]
SET_FIXED_POSITION_FIELD_NUMBER: _ClassVar[int]
SET_HAM_MODE_FIELD_NUMBER: _ClassVar[int]
SET_IGNORED_NODE_FIELD_NUMBER: _ClassVar[int]
SET_MODULE_CONFIG_FIELD_NUMBER: _ClassVar[int]
SET_OWNER_FIELD_NUMBER: _ClassVar[int]
SET_RINGTONE_MESSAGE_FIELD_NUMBER: _ClassVar[int]
SET_SCALE_FIELD_NUMBER: _ClassVar[int]
SET_TIME_ONLY_FIELD_NUMBER: _ClassVar[int]
SHUTDOWN_SECONDS_FIELD_NUMBER: _ClassVar[int]
STATUSMESSAGE_CONFIG: AdminMessage.ModuleConfigType
STOREFORWARD_CONFIG: AdminMessage.ModuleConfigType
STORE_UI_CONFIG_FIELD_NUMBER: _ClassVar[int]
TAK_CONFIG: AdminMessage.ModuleConfigType
TELEMETRY_CONFIG: AdminMessage.ModuleConfigType
TOGGLE_MUTED_NODE_FIELD_NUMBER: _ClassVar[int]
TRAFFICMANAGEMENT_CONFIG: AdminMessage.ModuleConfigType
add_contact: SharedContact
backup_preferences: AdminMessage.BackupLocation
begin_edit_settings: bool
commit_edit_settings: bool
delete_file_request: str
enter_dfu_mode_request: bool
exit_simulator: bool
factory_reset_config: int
factory_reset_device: int
get_canned_message_module_messages_request: bool
get_canned_message_module_messages_response: str
get_channel_request: int
get_channel_response: _channel_pb2.Channel
get_config_request: AdminMessage.ConfigType
get_config_response: _config_pb2.Config
get_device_connection_status_request: bool
get_device_connection_status_response: _connection_status_pb2.DeviceConnectionStatus
get_device_metadata_request: bool
get_device_metadata_response: _mesh_pb2.DeviceMetadata
get_module_config_request: AdminMessage.ModuleConfigType
get_module_config_response: _module_config_pb2.ModuleConfig
get_node_remote_hardware_pins_request: bool
get_node_remote_hardware_pins_response: NodeRemoteHardwarePinsResponse
get_owner_request: bool
get_owner_response: _mesh_pb2.User
get_ringtone_request: bool
get_ringtone_response: str
get_ui_config_request: bool
get_ui_config_response: _device_ui_pb2.DeviceUIConfig
key_verification: KeyVerificationAdmin
lockdown_auth: LockdownAuth
nodedb_reset: bool
ota_request: AdminMessage.OTAEvent
reboot_ota_seconds: int
reboot_seconds: int
remove_backup_preferences: AdminMessage.BackupLocation
remove_by_nodenum: int
remove_favorite_node: int
remove_fixed_position: bool
remove_ignored_node: int
restore_preferences: AdminMessage.BackupLocation
send_input_event: AdminMessage.InputEvent
sensor_config: SensorConfig
session_passkey: bytes
set_canned_message_module_messages: str
set_channel: _channel_pb2.Channel
set_config: _config_pb2.Config
set_favorite_node: int
set_fixed_position: _mesh_pb2.Position
set_ham_mode: HamParameters
set_ignored_node: int
set_module_config: _module_config_pb2.ModuleConfig
set_owner: _mesh_pb2.User
set_ringtone_message: str
set_scale: int
set_time_only: int
shutdown_seconds: int
store_ui_config: _device_ui_pb2.DeviceUIConfig
toggle_muted_node: int
def __init__(self, session_passkey: _Optional[bytes] = ..., get_channel_request: _Optional[int] = ..., get_channel_response: _Optional[_Union[_channel_pb2.Channel, _Mapping]] = ..., get_owner_request: bool = ..., get_owner_response: _Optional[_Union[_mesh_pb2.User, _Mapping]] = ..., get_config_request: _Optional[_Union[AdminMessage.ConfigType, str]] = ..., get_config_response: _Optional[_Union[_config_pb2.Config, _Mapping]] = ..., get_module_config_request: _Optional[_Union[AdminMessage.ModuleConfigType, str]] = ..., get_module_config_response: _Optional[_Union[_module_config_pb2.ModuleConfig, _Mapping]] = ..., get_canned_message_module_messages_request: bool = ..., get_canned_message_module_messages_response: _Optional[str] = ..., get_device_metadata_request: bool = ..., get_device_metadata_response: _Optional[_Union[_mesh_pb2.DeviceMetadata, _Mapping]] = ..., get_ringtone_request: bool = ..., get_ringtone_response: _Optional[str] = ..., get_device_connection_status_request: bool = ..., get_device_connection_status_response: _Optional[_Union[_connection_status_pb2.DeviceConnectionStatus, _Mapping]] = ..., set_ham_mode: _Optional[_Union[HamParameters, _Mapping]] = ..., get_node_remote_hardware_pins_request: bool = ..., get_node_remote_hardware_pins_response: _Optional[_Union[NodeRemoteHardwarePinsResponse, _Mapping]] = ..., enter_dfu_mode_request: bool = ..., delete_file_request: _Optional[str] = ..., set_scale: _Optional[int] = ..., backup_preferences: _Optional[_Union[AdminMessage.BackupLocation, str]] = ..., restore_preferences: _Optional[_Union[AdminMessage.BackupLocation, str]] = ..., remove_backup_preferences: _Optional[_Union[AdminMessage.BackupLocation, str]] = ..., send_input_event: _Optional[_Union[AdminMessage.InputEvent, _Mapping]] = ..., set_owner: _Optional[_Union[_mesh_pb2.User, _Mapping]] = ..., set_channel: _Optional[_Union[_channel_pb2.Channel, _Mapping]] = ..., set_config: _Optional[_Union[_config_pb2.Config, _Mapping]] = ..., set_module_config: _Optional[_Union[_module_config_pb2.ModuleConfig, _Mapping]] = ..., set_canned_message_module_messages: _Optional[str] = ..., set_ringtone_message: _Optional[str] = ..., remove_by_nodenum: _Optional[int] = ..., set_favorite_node: _Optional[int] = ..., remove_favorite_node: _Optional[int] = ..., set_fixed_position: _Optional[_Union[_mesh_pb2.Position, _Mapping]] = ..., remove_fixed_position: bool = ..., set_time_only: _Optional[int] = ..., get_ui_config_request: bool = ..., get_ui_config_response: _Optional[_Union[_device_ui_pb2.DeviceUIConfig, _Mapping]] = ..., store_ui_config: _Optional[_Union[_device_ui_pb2.DeviceUIConfig, _Mapping]] = ..., set_ignored_node: _Optional[int] = ..., remove_ignored_node: _Optional[int] = ..., toggle_muted_node: _Optional[int] = ..., begin_edit_settings: bool = ..., commit_edit_settings: bool = ..., add_contact: _Optional[_Union[SharedContact, _Mapping]] = ..., key_verification: _Optional[_Union[KeyVerificationAdmin, _Mapping]] = ..., factory_reset_device: _Optional[int] = ..., reboot_ota_seconds: _Optional[int] = ..., exit_simulator: bool = ..., reboot_seconds: _Optional[int] = ..., shutdown_seconds: _Optional[int] = ..., factory_reset_config: _Optional[int] = ..., nodedb_reset: bool = ..., ota_request: _Optional[_Union[AdminMessage.OTAEvent, _Mapping]] = ..., sensor_config: _Optional[_Union[SensorConfig, _Mapping]] = ..., lockdown_auth: _Optional[_Union[LockdownAuth, _Mapping]] = ...) -> None: ...
class DS248X_config(_message.Message):
__slots__ = ["main_temperature_channel"]
MAIN_TEMPERATURE_CHANNEL_FIELD_NUMBER: _ClassVar[int]
main_temperature_channel: int
def __init__(self, main_temperature_channel: _Optional[int] = ...) -> None: ...
class HamParameters(_message.Message):
__slots__ = ["call_sign", "frequency", "long_name", "short_name", "tx_power"]
CALL_SIGN_FIELD_NUMBER: _ClassVar[int]
FREQUENCY_FIELD_NUMBER: _ClassVar[int]
LONG_NAME_FIELD_NUMBER: _ClassVar[int]
SHORT_NAME_FIELD_NUMBER: _ClassVar[int]
TX_POWER_FIELD_NUMBER: _ClassVar[int]
call_sign: str
frequency: float
long_name: str
short_name: str
tx_power: int
def __init__(self, call_sign: _Optional[str] = ..., tx_power: _Optional[int] = ..., frequency: _Optional[float] = ..., short_name: _Optional[str] = ..., long_name: _Optional[str] = ...) -> None: ...
class KeyVerificationAdmin(_message.Message):
__slots__ = ["message_type", "nonce", "remote_nodenum", "security_number"]
class MessageType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
DO_NOT_VERIFY: KeyVerificationAdmin.MessageType
DO_VERIFY: KeyVerificationAdmin.MessageType
INITIATE_VERIFICATION: KeyVerificationAdmin.MessageType
MESSAGE_TYPE_FIELD_NUMBER: _ClassVar[int]
NONCE_FIELD_NUMBER: _ClassVar[int]
PROVIDE_SECURITY_NUMBER: KeyVerificationAdmin.MessageType
REMOTE_NODENUM_FIELD_NUMBER: _ClassVar[int]
SECURITY_NUMBER_FIELD_NUMBER: _ClassVar[int]
message_type: KeyVerificationAdmin.MessageType
nonce: int
remote_nodenum: int
security_number: int
def __init__(self, message_type: _Optional[_Union[KeyVerificationAdmin.MessageType, str]] = ..., remote_nodenum: _Optional[int] = ..., nonce: _Optional[int] = ..., security_number: _Optional[int] = ...) -> None: ...
class LockdownAuth(_message.Message):
__slots__ = ["boots_remaining", "disable", "lock_now", "max_session_seconds", "passphrase", "valid_until_epoch"]
BOOTS_REMAINING_FIELD_NUMBER: _ClassVar[int]
DISABLE_FIELD_NUMBER: _ClassVar[int]
LOCK_NOW_FIELD_NUMBER: _ClassVar[int]
MAX_SESSION_SECONDS_FIELD_NUMBER: _ClassVar[int]
PASSPHRASE_FIELD_NUMBER: _ClassVar[int]
VALID_UNTIL_EPOCH_FIELD_NUMBER: _ClassVar[int]
boots_remaining: int
disable: bool
lock_now: bool
max_session_seconds: int
passphrase: bytes
valid_until_epoch: int
def __init__(self, passphrase: _Optional[bytes] = ..., boots_remaining: _Optional[int] = ..., valid_until_epoch: _Optional[int] = ..., lock_now: bool = ..., max_session_seconds: _Optional[int] = ..., disable: bool = ...) -> None: ...
class NodeRemoteHardwarePinsResponse(_message.Message):
__slots__ = ["node_remote_hardware_pins"]
NODE_REMOTE_HARDWARE_PINS_FIELD_NUMBER: _ClassVar[int]
node_remote_hardware_pins: _containers.RepeatedCompositeFieldContainer[_mesh_pb2.NodeRemoteHardwarePin]
def __init__(self, node_remote_hardware_pins: _Optional[_Iterable[_Union[_mesh_pb2.NodeRemoteHardwarePin, _Mapping]]] = ...) -> None: ...
class SCD30_config(_message.Message):
__slots__ = ["set_altitude", "set_asc", "set_measurement_interval", "set_target_co2_conc", "set_temperature", "soft_reset"]
SET_ALTITUDE_FIELD_NUMBER: _ClassVar[int]
SET_ASC_FIELD_NUMBER: _ClassVar[int]
SET_MEASUREMENT_INTERVAL_FIELD_NUMBER: _ClassVar[int]
SET_TARGET_CO2_CONC_FIELD_NUMBER: _ClassVar[int]
SET_TEMPERATURE_FIELD_NUMBER: _ClassVar[int]
SOFT_RESET_FIELD_NUMBER: _ClassVar[int]
set_altitude: int
set_asc: bool
set_measurement_interval: int
set_target_co2_conc: int
set_temperature: float
soft_reset: bool
def __init__(self, set_asc: bool = ..., set_target_co2_conc: _Optional[int] = ..., set_temperature: _Optional[float] = ..., set_altitude: _Optional[int] = ..., set_measurement_interval: _Optional[int] = ..., soft_reset: bool = ...) -> None: ...
class SCD4X_config(_message.Message):
__slots__ = ["factory_reset", "set_altitude", "set_ambient_pressure", "set_asc", "set_power_mode", "set_target_co2_conc", "set_temperature"]
FACTORY_RESET_FIELD_NUMBER: _ClassVar[int]
SET_ALTITUDE_FIELD_NUMBER: _ClassVar[int]
SET_AMBIENT_PRESSURE_FIELD_NUMBER: _ClassVar[int]
SET_ASC_FIELD_NUMBER: _ClassVar[int]
SET_POWER_MODE_FIELD_NUMBER: _ClassVar[int]
SET_TARGET_CO2_CONC_FIELD_NUMBER: _ClassVar[int]
SET_TEMPERATURE_FIELD_NUMBER: _ClassVar[int]
factory_reset: bool
set_altitude: int
set_ambient_pressure: int
set_asc: bool
set_power_mode: bool
set_target_co2_conc: int
set_temperature: float
def __init__(self, set_asc: bool = ..., set_target_co2_conc: _Optional[int] = ..., set_temperature: _Optional[float] = ..., set_altitude: _Optional[int] = ..., set_ambient_pressure: _Optional[int] = ..., factory_reset: bool = ..., set_power_mode: bool = ...) -> None: ...
class SEN5X_config(_message.Message):
__slots__ = ["set_one_shot_mode", "set_temperature", "start_fan_cleaning"]
SET_ONE_SHOT_MODE_FIELD_NUMBER: _ClassVar[int]
SET_TEMPERATURE_FIELD_NUMBER: _ClassVar[int]
START_FAN_CLEANING_FIELD_NUMBER: _ClassVar[int]
set_one_shot_mode: bool
set_temperature: float
start_fan_cleaning: bool
def __init__(self, set_temperature: _Optional[float] = ..., set_one_shot_mode: bool = ..., start_fan_cleaning: bool = ...) -> None: ...
class SEN6X_config(_message.Message):
__slots__ = ["factory_reset", "set_altitude", "set_ambient_pressure", "set_asc", "set_one_shot_mode", "set_target_co2_conc", "set_temperature", "start_fan_cleaning"]
FACTORY_RESET_FIELD_NUMBER: _ClassVar[int]
SET_ALTITUDE_FIELD_NUMBER: _ClassVar[int]
SET_AMBIENT_PRESSURE_FIELD_NUMBER: _ClassVar[int]
SET_ASC_FIELD_NUMBER: _ClassVar[int]
SET_ONE_SHOT_MODE_FIELD_NUMBER: _ClassVar[int]
SET_TARGET_CO2_CONC_FIELD_NUMBER: _ClassVar[int]
SET_TEMPERATURE_FIELD_NUMBER: _ClassVar[int]
START_FAN_CLEANING_FIELD_NUMBER: _ClassVar[int]
factory_reset: bool
set_altitude: int
set_ambient_pressure: int
set_asc: bool
set_one_shot_mode: bool
set_target_co2_conc: int
set_temperature: float
start_fan_cleaning: bool
def __init__(self, set_temperature: _Optional[float] = ..., set_one_shot_mode: bool = ..., start_fan_cleaning: bool = ..., set_asc: bool = ..., set_target_co2_conc: _Optional[int] = ..., set_altitude: _Optional[int] = ..., set_ambient_pressure: _Optional[int] = ..., factory_reset: bool = ...) -> None: ...
class SHTXX_config(_message.Message):
__slots__ = ["set_accuracy"]
SET_ACCURACY_FIELD_NUMBER: _ClassVar[int]
set_accuracy: int
def __init__(self, set_accuracy: _Optional[int] = ...) -> None: ...
class SensorConfig(_message.Message):
__slots__ = ["as3935_config", "ds248x_config", "scd30_config", "scd4x_config", "sen5x_config", "sen6x_config", "shtxx_config"]
AS3935_CONFIG_FIELD_NUMBER: _ClassVar[int]
DS248X_CONFIG_FIELD_NUMBER: _ClassVar[int]
SCD30_CONFIG_FIELD_NUMBER: _ClassVar[int]
SCD4X_CONFIG_FIELD_NUMBER: _ClassVar[int]
SEN5X_CONFIG_FIELD_NUMBER: _ClassVar[int]
SEN6X_CONFIG_FIELD_NUMBER: _ClassVar[int]
SHTXX_CONFIG_FIELD_NUMBER: _ClassVar[int]
as3935_config: AS3935_config
ds248x_config: DS248X_config
scd30_config: SCD30_config
scd4x_config: SCD4X_config
sen5x_config: SEN5X_config
sen6x_config: SEN6X_config
shtxx_config: SHTXX_config
def __init__(self, scd4x_config: _Optional[_Union[SCD4X_config, _Mapping]] = ..., sen5x_config: _Optional[_Union[SEN5X_config, _Mapping]] = ..., scd30_config: _Optional[_Union[SCD30_config, _Mapping]] = ..., shtxx_config: _Optional[_Union[SHTXX_config, _Mapping]] = ..., ds248x_config: _Optional[_Union[DS248X_config, _Mapping]] = ..., sen6x_config: _Optional[_Union[SEN6X_config, _Mapping]] = ..., as3935_config: _Optional[_Union[AS3935_config, _Mapping]] = ...) -> None: ...
class SharedContact(_message.Message):
__slots__ = ["manually_verified", "node_num", "should_ignore", "user"]
MANUALLY_VERIFIED_FIELD_NUMBER: _ClassVar[int]
NODE_NUM_FIELD_NUMBER: _ClassVar[int]
SHOULD_IGNORE_FIELD_NUMBER: _ClassVar[int]
USER_FIELD_NUMBER: _ClassVar[int]
manually_verified: bool
node_num: int
should_ignore: bool
user: _mesh_pb2.User
def __init__(self, node_num: _Optional[int] = ..., user: _Optional[_Union[_mesh_pb2.User, _Mapping]] = ..., should_ignore: bool = ..., manually_verified: bool = ...) -> None: ...
class OTAMode(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
+28
View File
@@ -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.internal import builder as _builder
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
from meshtastic.protobuf import channel_pb2 as meshtastic_dot_protobuf_dot_channel__pb2
from meshtastic.protobuf import config_pb2 as meshtastic_dot_protobuf_dot_config__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n!meshtastic/protobuf/apponly.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/config.proto\"\x81\x01\n\nChannelSet\x12\x36\n\x08settings\x18\x01 \x03(\x0b\x32$.meshtastic.protobuf.ChannelSettings\x12;\n\x0blora_config\x18\x02 \x01(\x0b\x32&.meshtastic.protobuf.Config.LoRaConfigBc\n\x14org.meshtastic.protoB\rAppOnlyProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.apponly_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\rAppOnlyProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_CHANNELSET._serialized_start=128
_CHANNELSET._serialized_end=257
# @@protoc_insertion_point(module_scope)
+16
View File
@@ -0,0 +1,16 @@
from meshtastic.protobuf import channel_pb2 as _channel_pb2
from meshtastic.protobuf import config_pb2 as _config_pb2
from google.protobuf.internal import containers as _containers
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Mapping, Optional as _Optional, Union as _Union
DESCRIPTOR: _descriptor.FileDescriptor
class ChannelSet(_message.Message):
__slots__ = ["lora_config", "settings"]
LORA_CONFIG_FIELD_NUMBER: _ClassVar[int]
SETTINGS_FIELD_NUMBER: _ClassVar[int]
lora_config: _config_pb2.Config.LoRaConfig
settings: _containers.RepeatedCompositeFieldContainer[_channel_pb2.ChannelSettings]
def __init__(self, settings: _Optional[_Iterable[_Union[_channel_pb2.ChannelSettings, _Mapping]]] = ..., lora_config: _Optional[_Union[_config_pb2.Config.LoRaConfig, _Mapping]] = ...) -> None: ...
+157
View File
@@ -0,0 +1,157 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/protobuf/atak.proto
"""Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
from meshtastic.protobuf import field_metadata_pb2 as meshtastic_dot_protobuf_dot_field__metadata__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1emeshtastic/protobuf/atak.proto\x12\x13meshtastic.protobuf\x1a(meshtastic/protobuf/field_metadata.proto\"\xa5\x02\n\tTAKPacket\x12\x15\n\ris_compressed\x18\x01 \x01(\x08\x12-\n\x07\x63ontact\x18\x02 \x01(\x0b\x32\x1c.meshtastic.protobuf.Contact\x12)\n\x05group\x18\x03 \x01(\x0b\x32\x1a.meshtastic.protobuf.Group\x12+\n\x06status\x18\x04 \x01(\x0b\x32\x1b.meshtastic.protobuf.Status\x12\'\n\x03pli\x18\x05 \x01(\x0b\x32\x18.meshtastic.protobuf.PLIH\x00\x12,\n\x04\x63hat\x18\x06 \x01(\x0b\x32\x1c.meshtastic.protobuf.GeoChatH\x00\x12\x10\n\x06\x64\x65tail\x18\x07 \x01(\x0cH\x00\x42\x11\n\x0fpayload_variant\"\xfd\x02\n\x07GeoChat\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0f\n\x02to\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0bto_callsign\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x17\n\x0freceipt_for_uid\x18\x04 \x01(\t\x12>\n\x0creceipt_type\x18\x05 \x01(\x0e\x32(.meshtastic.protobuf.GeoChat.ReceiptType\x12\x11\n\x04lang\x18\x06 \x01(\tH\x02\x88\x01\x01\x12\x14\n\x07room_id\x18\x07 \x01(\tH\x03\x88\x01\x01\x12\x1d\n\x10voice_profile_id\x18\x08 \x01(\tH\x04\x88\x01\x01\"T\n\x0bReceiptType\x12\x14\n\x10ReceiptType_None\x10\x00\x12\x19\n\x15ReceiptType_Delivered\x10\x01\x12\x14\n\x10ReceiptType_Read\x10\x02\x42\x05\n\x03_toB\x0e\n\x0c_to_callsignB\x07\n\x05_langB\n\n\x08_room_idB\x13\n\x11_voice_profile_id\"_\n\x05Group\x12-\n\x04role\x18\x01 \x01(\x0e\x32\x1f.meshtastic.protobuf.MemberRole\x12\'\n\x04team\x18\x02 \x01(\x0e\x32\x19.meshtastic.protobuf.Team\"\x19\n\x06Status\x12\x0f\n\x07\x62\x61ttery\x18\x01 \x01(\r\"4\n\x07\x43ontact\x12\x10\n\x08\x63\x61llsign\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65vice_callsign\x18\x02 \x01(\t\"_\n\x03PLI\x12\x12\n\nlatitude_i\x18\x01 \x01(\x0f\x12\x13\n\x0blongitude_i\x18\x02 \x01(\x0f\x12\x10\n\x08\x61ltitude\x18\x03 \x01(\x05\x12\r\n\x05speed\x18\x04 \x01(\r\x12\x0e\n\x06\x63ourse\x18\x05 \x01(\r\"\xb0\x01\n\rAircraftTrack\x12\x0c\n\x04icao\x18\x01 \x01(\t\x12\x14\n\x0cregistration\x18\x02 \x01(\t\x12\x0e\n\x06\x66light\x18\x03 \x01(\t\x12\x15\n\raircraft_type\x18\x04 \x01(\t\x12\x0e\n\x06squawk\x18\x05 \x01(\r\x12\x10\n\x08\x63\x61tegory\x18\x06 \x01(\t\x12\x10\n\x08rssi_x10\x18\x07 \x01(\x11\x12\x0b\n\x03gps\x18\x08 \x01(\x08\x12\x13\n\x0b\x63ot_host_id\x18\t \x01(\t\"7\n\x0b\x43otGeoPoint\x12\x13\n\x0blat_delta_i\x18\x01 \x01(\x11\x12\x13\n\x0blon_delta_i\x18\x02 \x01(\x11\"\x80\x07\n\nDrawnShape\x12\x32\n\x04kind\x18\x01 \x01(\x0e\x32$.meshtastic.protobuf.DrawnShape.Kind\x12\x38\n\x05style\x18\x02 \x01(\x0e\x32).meshtastic.protobuf.DrawnShape.StyleMode\x12\x10\n\x08major_cm\x18\x03 \x01(\r\x12\x10\n\x08minor_cm\x18\x04 \x01(\r\x12\x11\n\tangle_deg\x18\x05 \x01(\r\x12/\n\x0cstroke_color\x18\x06 \x01(\x0e\x32\x19.meshtastic.protobuf.Team\x12\x13\n\x0bstroke_argb\x18\x07 \x01(\x07\x12\x19\n\x11stroke_weight_x10\x18\x08 \x01(\r\x12-\n\nfill_color\x18\t \x01(\x0e\x32\x19.meshtastic.protobuf.Team\x12\x11\n\tfill_argb\x18\n \x01(\x07\x12\x11\n\tlabels_on\x18\x0b \x01(\x08\x12\x19\n\x11vertex_lat_deltas\x18\x12 \x03(\x11\x12\x19\n\x11vertex_lon_deltas\x18\x13 \x03(\x11\x12\x11\n\ttruncated\x18\r \x01(\x08\x12\x1c\n\x14\x62ullseye_distance_dm\x18\x0e \x01(\r\x12\x1c\n\x14\x62ullseye_bearing_ref\x18\x0f \x01(\r\x12\x16\n\x0e\x62ullseye_flags\x18\x10 \x01(\r\x12\x18\n\x10\x62ullseye_uid_ref\x18\x11 \x01(\t\"\xe2\x01\n\x04Kind\x12\x14\n\x10Kind_Unspecified\x10\x00\x12\x0f\n\x0bKind_Circle\x10\x01\x12\x12\n\x0eKind_Rectangle\x10\x02\x12\x11\n\rKind_Freeform\x10\x03\x12\x15\n\x11Kind_Telestration\x10\x04\x12\x10\n\x0cKind_Polygon\x10\x05\x12\x16\n\x12Kind_RangingCircle\x10\x06\x12\x11\n\rKind_Bullseye\x10\x07\x12\x10\n\x0cKind_Ellipse\x10\x08\x12\x12\n\x0eKind_Vehicle2D\x10\t\x12\x12\n\x0eKind_Vehicle3D\x10\n\"u\n\tStyleMode\x12\x19\n\x15StyleMode_Unspecified\x10\x00\x12\x18\n\x14StyleMode_StrokeOnly\x10\x01\x12\x16\n\x12StyleMode_FillOnly\x10\x02\x12\x1b\n\x17StyleMode_StrokeAndFill\x10\x03J\x04\x08\x0c\x10\r\"\xf7\x03\n\x06Marker\x12.\n\x04kind\x18\x01 \x01(\x0e\x32 .meshtastic.protobuf.Marker.Kind\x12(\n\x05\x63olor\x18\x02 \x01(\x0e\x32\x19.meshtastic.protobuf.Team\x12\x12\n\ncolor_argb\x18\x03 \x01(\x07\x12\x11\n\treadiness\x18\x04 \x01(\x08\x12\x12\n\nparent_uid\x18\x05 \x01(\t\x12\x13\n\x0bparent_type\x18\x06 \x01(\t\x12\x17\n\x0fparent_callsign\x18\x07 \x01(\t\x12\x0f\n\x07iconset\x18\x08 \x01(\t\"\x98\x02\n\x04Kind\x12\x14\n\x10Kind_Unspecified\x10\x00\x12\r\n\tKind_Spot\x10\x01\x12\x11\n\rKind_Waypoint\x10\x02\x12\x13\n\x0fKind_Checkpoint\x10\x03\x12\x15\n\x11Kind_SelfPosition\x10\x04\x12\x13\n\x0fKind_Symbol2525\x10\x05\x12\x10\n\x0cKind_SpotMap\x10\x06\x12\x13\n\x0fKind_CustomIcon\x10\x07\x12\x12\n\x0eKind_GoToPoint\x10\x08\x12\x15\n\x11Kind_InitialPoint\x10\t\x12\x15\n\x11Kind_ContactPoint\x10\n\x12\x18\n\x14Kind_ObservationPost\x10\x0b\x12\x14\n\x10Kind_ImageMarker\x10\x0c\"\xe0\x01\n\x0fRangeAndBearing\x12\x30\n\x06\x61nchor\x18\x01 \x01(\x0b\x32 .meshtastic.protobuf.CotGeoPoint\x12\x12\n\nanchor_uid\x18\x02 \x01(Line truncated
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.atak_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\nATAKProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_TEAM.values_by_name["Unspecifed_Color"]._options = None
_TEAM.values_by_name["Unspecifed_Color"]._serialized_options = b'\312\363\030\020:\016Default (Cyan)'
_TEAM.values_by_name["White"]._options = None
_TEAM.values_by_name["White"]._serialized_options = b'\312\363\030\007:\005White'
_TEAM.values_by_name["Yellow"]._options = None
_TEAM.values_by_name["Yellow"]._serialized_options = b'\312\363\030\010:\006Yellow'
_TEAM.values_by_name["Orange"]._options = None
_TEAM.values_by_name["Orange"]._serialized_options = b'\312\363\030\010:\006Orange'
_TEAM.values_by_name["Magenta"]._options = None
_TEAM.values_by_name["Magenta"]._serialized_options = b'\312\363\030\t:\007Magenta'
_TEAM.values_by_name["Red"]._options = None
_TEAM.values_by_name["Red"]._serialized_options = b'\312\363\030\005:\003Red'
_TEAM.values_by_name["Maroon"]._options = None
_TEAM.values_by_name["Maroon"]._serialized_options = b'\312\363\030\010:\006Maroon'
_TEAM.values_by_name["Purple"]._options = None
_TEAM.values_by_name["Purple"]._serialized_options = b'\312\363\030\010:\006Purple'
_TEAM.values_by_name["Dark_Blue"]._options = None
_TEAM.values_by_name["Dark_Blue"]._serialized_options = b'\312\363\030\013:\tDark Blue'
_TEAM.values_by_name["Blue"]._options = None
_TEAM.values_by_name["Blue"]._serialized_options = b'\312\363\030\006:\004Blue'
_TEAM.values_by_name["Cyan"]._options = None
_TEAM.values_by_name["Cyan"]._serialized_options = b'\312\363\030\006:\004Cyan'
_TEAM.values_by_name["Teal"]._options = None
_TEAM.values_by_name["Teal"]._serialized_options = b'\312\363\030\006:\004Teal'
_TEAM.values_by_name["Green"]._options = None
_TEAM.values_by_name["Green"]._serialized_options = b'\312\363\030\007:\005Green'
_TEAM.values_by_name["Dark_Green"]._options = None
_TEAM.values_by_name["Dark_Green"]._serialized_options = b'\312\363\030\014:\nDark Green'
_TEAM.values_by_name["Brown"]._options = None
_TEAM.values_by_name["Brown"]._serialized_options = b'\312\363\030\007:\005Brown'
_MEMBERROLE.values_by_name["Unspecifed"]._options = None
_MEMBERROLE.values_by_name["Unspecifed"]._serialized_options = b'\312\363\030\027:\025Default (Team Member)'
_MEMBERROLE.values_by_name["TeamMember"]._options = None
_MEMBERROLE.values_by_name["TeamMember"]._serialized_options = b'\312\363\030\r:\013Team Member'
_MEMBERROLE.values_by_name["TeamLead"]._options = None
_MEMBERROLE.values_by_name["TeamLead"]._serialized_options = b'\312\363\030\013:\tTeam Lead'
_MEMBERROLE.values_by_name["HQ"]._options = None
_MEMBERROLE.values_by_name["HQ"]._serialized_options = b'\312\363\030\004:\002HQ'
_MEMBERROLE.values_by_name["Sniper"]._options = None
_MEMBERROLE.values_by_name["Sniper"]._serialized_options = b'\312\363\030\010:\006Sniper'
_MEMBERROLE.values_by_name["Medic"]._options = None
_MEMBERROLE.values_by_name["Medic"]._serialized_options = b'\312\363\030\007:\005Medic'
_MEMBERROLE.values_by_name["ForwardObserver"]._options = None
_MEMBERROLE.values_by_name["ForwardObserver"]._serialized_options = b'\312\363\030\022:\020Forward Observer'
_MEMBERROLE.values_by_name["RTO"]._options = None
_MEMBERROLE.values_by_name["RTO"]._serialized_options = b'\312\363\030\005:\003RTO'
_MEMBERROLE.values_by_name["K9"]._options = None
_MEMBERROLE.values_by_name["K9"]._serialized_options = b'\312\363\030\004:\002K9'
_TAKTALKROOMDATA.fields_by_name['sender_callsign']._options = None
_TAKTALKROOMDATA.fields_by_name['sender_callsign']._serialized_options = b'\030\001'
_TEAM._serialized_start=7941
_TEAM._serialized_end=8347
_MEMBERROLE._serialized_start=8350
_MEMBERROLE._serialized_end=8624
_COTHOW._serialized_start=8627
_COTHOW._serialized_end=8777
_COTTYPE._serialized_start=8780
_COTTYPE._serialized_end=11727
_GEOPOINTSOURCE._serialized_start=11729
_GEOPOINTSOURCE._serialized_end=11854
_TAKPACKET._serialized_start=98
_TAKPACKET._serialized_end=391
_GEOCHAT._serialized_start=394
_GEOCHAT._serialized_end=775
_GEOCHAT_RECEIPTTYPE._serialized_start=626
_GEOCHAT_RECEIPTTYPE._serialized_end=710
_GROUP._serialized_start=777
_GROUP._serialized_end=872
_STATUS._serialized_start=874
_STATUS._serialized_end=899
_CONTACT._serialized_start=901
_CONTACT._serialized_end=953
_PLI._serialized_start=955
_PLI._serialized_end=1050
_AIRCRAFTTRACK._serialized_start=1053
_AIRCRAFTTRACK._serialized_end=1229
_COTGEOPOINT._serialized_start=1231
_COTGEOPOINT._serialized_end=1286
_DRAWNSHAPE._serialized_start=1289
_DRAWNSHAPE._serialized_end=2185
_DRAWNSHAPE_KIND._serialized_start=1834
_DRAWNSHAPE_KIND._serialized_end=2060
_DRAWNSHAPE_STYLEMODE._serialized_start=2062
_DRAWNSHAPE_STYLEMODE._serialized_end=2179
_MARKER._serialized_start=2188
_MARKER._serialized_end=2691
_MARKER_KIND._serialized_start=2411
_MARKER_KIND._serialized_end=2691
_RANGEANDBEARING._serialized_start=2694
_RANGEANDBEARING._serialized_end=2918
_ROUTE._serialized_start=2921
_ROUTE._serialized_end=3473
_ROUTE_LINK._serialized_start=3148
_ROUTE_LINK._serialized_end=3253
_ROUTE_METHOD._serialized_start=3256
_ROUTE_METHOD._serialized_end=3391
_ROUTE_DIRECTION._serialized_start=3393
_ROUTE_DIRECTION._serialized_end=3473
_CASEVACREPORT._serialized_start=3476
_CASEVACREPORT._serialized_end=4878
_CASEVACREPORT_PRECEDENCE._serialized_start=4400
_CASEVACREPORT_PRECEDENCE._serialized_end=4571
_CASEVACREPORT_HLZMARKING._serialized_start=4574
_CASEVACREPORT_HLZMARKING._serialized_end=4729
_CASEVACREPORT_SECURITY._serialized_start=4732
_CASEVACREPORT_SECURITY._serialized_end=4878
_ZMISTENTRY._serialized_start=4880
_ZMISTENTRY._serialized_end=4962
_EMERGENCYALERT._serialized_start=4965
_EMERGENCYALERT._serialized_end=5243
_EMERGENCYALERT_TYPE._serialized_start=5093
_EMERGENCYALERT_TYPE._serialized_end=5243
_TASKREQUEST._serialized_start=5246
_TASKREQUEST._serialized_end=5718
_TASKREQUEST_PRIORITY._serialized_start=5454
_TASKREQUEST_PRIORITY._serialized_end=5571
_TASKREQUEST_STATUS._serialized_start=5574
_TASKREQUEST_STATUS._serialized_end=5718
_TAKENVIRONMENT._serialized_start=5720
_TAKENVIRONMENT._serialized_end=5816
_SENSORFOV._serialized_start=5819
_SENSORFOV._serialized_end=6225
_SENSORFOV_SENSORTYPE._serialized_start=6043
_SENSORFOV_SENSORTYPE._serialized_end=6213
_TAKTALKMESSAGE._serialized_start=6227
_TAKTALKMESSAGE._serialized_end=6312
_TAKTALKROOMDATA._serialized_start=6314
_TAKTALKROOMDATA._serialized_end=6418
_MARTI._serialized_start=6420
_MARTI._serialized_end=6450
_TAKPACKETV2._serialized_start=6453
_TAKPACKETV2._serialized_end=7938
# @@protoc_insertion_point(module_scope)
+757
View File
@@ -0,0 +1,757 @@
from meshtastic.protobuf import field_metadata_pb2 as _field_metadata_pb2
from google.protobuf.internal import containers as _containers
from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Mapping, Optional as _Optional, Union as _Union
Blue: Team
Brown: Team
CotHow_Unspecified: CotHow
CotHow_h_e: CotHow
CotHow_h_g_i_g_o: CotHow
CotHow_m_f: CotHow
CotHow_m_g: CotHow
CotHow_m_p: CotHow
CotHow_m_r: CotHow
CotHow_m_s: CotHow
CotType_Other: CotType
CotType_a_f_A: CotType
CotType_a_f_A_C: CotType
CotType_a_f_A_C_F: CotType
CotType_a_f_A_C_H: CotType
CotType_a_f_A_C_L: CotType
CotType_a_f_A_M: CotType
CotType_a_f_A_M_F: CotType
CotType_a_f_A_M_F_C_H: CotType
CotType_a_f_A_M_F_F: CotType
CotType_a_f_A_M_F_L: CotType
CotType_a_f_A_M_F_P: CotType
CotType_a_f_A_M_F_U_L: CotType
CotType_a_f_A_M_H: CotType
CotType_a_f_A_M_H_A: CotType
CotType_a_f_A_M_H_C: CotType
CotType_a_f_A_M_H_Q: CotType
CotType_a_f_A_M_H_U_M: CotType
CotType_a_f_F_B: CotType
CotType_a_f_G: CotType
CotType_a_f_G_E: CotType
CotType_a_f_G_E_S: CotType
CotType_a_f_G_E_S_E: CotType
CotType_a_f_G_E_V: CotType
CotType_a_f_G_E_V_A: CotType
CotType_a_f_G_E_V_A_T: CotType
CotType_a_f_G_E_V_C: CotType
CotType_a_f_G_E_V_C_U: CotType
CotType_a_f_G_E_V_C_ps: CotType
CotType_a_f_G_E_X_M: CotType
CotType_a_f_G_I: CotType
CotType_a_f_G_U: CotType
CotType_a_f_G_U_C: CotType
CotType_a_f_G_U_C_E_C_W: CotType
CotType_a_f_G_U_C_F: CotType
CotType_a_f_G_U_C_F_T_A: CotType
CotType_a_f_G_U_C_I: CotType
CotType_a_f_G_U_C_I_L: CotType
CotType_a_f_G_U_C_I_Z: CotType
CotType_a_f_G_U_C_I_d: CotType
CotType_a_f_G_U_C_R_O: CotType
CotType_a_f_G_U_C_R_V: CotType
CotType_a_f_G_U_C_R_X: CotType
CotType_a_f_G_U_C_V_S: CotType
CotType_a_f_G_U_H: CotType
CotType_a_f_G_U_S_M_C: CotType
CotType_a_f_G_U_U_M_S_E: CotType
CotType_a_f_S: CotType
CotType_a_f_S_N_N_R: CotType
CotType_a_h_A: CotType
CotType_a_h_A_M_F_F: CotType
CotType_a_h_A_M_H_A: CotType
CotType_a_h_G: CotType
CotType_a_h_G_E_V: CotType
CotType_a_h_G_E_V_A_T: CotType
CotType_a_h_G_E_X_M: CotType
CotType_a_h_G_I: CotType
CotType_a_h_G_U_C_F: CotType
CotType_a_h_G_U_C_I: CotType
CotType_a_h_G_U_C_I_d: CotType
CotType_a_h_S: CotType
CotType_a_n_A: CotType
CotType_a_n_A_C: CotType
CotType_a_n_A_C_F: CotType
CotType_a_n_A_C_H: CotType
CotType_a_n_A_M_F_F: CotType
CotType_a_n_A_M_F_Q: CotType
CotType_a_n_G: CotType
CotType_a_n_G_E_V: CotType
CotType_a_n_G_E_V_A_T: CotType
CotType_a_n_G_E_X_M: CotType
CotType_a_n_G_I: CotType
CotType_a_n_G_U_C_F: CotType
CotType_a_n_G_U_C_I: CotType
CotType_a_n_G_U_C_I_d: CotType
CotType_a_n_S: CotType
CotType_a_u_A: CotType
CotType_a_u_A_C: CotType
CotType_a_u_A_C_F: CotType
CotType_a_u_G: CotType
CotType_a_u_G_E_V: CotType
CotType_a_u_G_E_V_A_T: CotType
CotType_a_u_G_E_X_M: CotType
CotType_a_u_G_I: CotType
CotType_a_u_G_U_C_F: CotType
CotType_a_u_G_U_C_I: CotType
CotType_a_u_G_U_C_I_d: CotType
CotType_a_u_S: CotType
CotType_b_a_g: CotType
CotType_b_a_o_c: CotType
CotType_b_a_o_can: CotType
CotType_b_a_o_opn: CotType
CotType_b_a_o_pan: CotType
CotType_b_a_o_tbl: CotType
CotType_b_f_t_a: CotType
CotType_b_f_t_r: CotType
CotType_b_i_v: CotType
CotType_b_i_x_i: CotType
CotType_b_m_p_c: CotType
CotType_b_m_p_c_cp: CotType
CotType_b_m_p_c_ip: CotType
CotType_b_m_p_s_m: CotType
CotType_b_m_p_s_p_i: CotType
CotType_b_m_p_s_p_loc: CotType
CotType_b_m_p_s_p_op: CotType
CotType_b_m_p_w: CotType
CotType_b_m_p_w_GOTO: CotType
CotType_b_m_r: CotType
CotType_b_r_f_h_c: CotType
CotType_b_t_f: CotType
CotType_b_t_f_d: CotType
CotType_b_t_f_r: CotType
CotType_m_t_t: CotType
CotType_t_s: CotType
CotType_t_x_d_d: CotType
CotType_u_d_c_c: CotType
CotType_u_d_c_e: CotType
CotType_u_d_f: CotType
CotType_u_d_f_m: CotType
CotType_u_d_p: CotType
CotType_u_d_r: CotType
CotType_u_d_v: CotType
CotType_u_d_v_m: CotType
CotType_u_r_b_bullseye: CotType
CotType_u_r_b_c_c: CotType
CotType_u_rb_a: CotType
CotType_y: CotType
Cyan: Team
DESCRIPTOR: _descriptor.FileDescriptor
Dark_Blue: Team
Dark_Green: Team
ForwardObserver: MemberRole
GeoPointSource_GPS: GeoPointSource
GeoPointSource_NETWORK: GeoPointSource
GeoPointSource_USER: GeoPointSource
GeoPointSource_Unspecified: GeoPointSource
Green: Team
HQ: MemberRole
K9: MemberRole
Magenta: Team
Maroon: Team
Medic: MemberRole
Orange: Team
Purple: Team
RTO: MemberRole
Red: Team
Sniper: MemberRole
Teal: Team
TeamLead: MemberRole
TeamMember: MemberRole
Unspecifed: MemberRole
Unspecifed_Color: Team
White: Team
Yellow: Team
class AircraftTrack(_message.Message):
__slots__ = ["aircraft_type", "category", "cot_host_id", "flight", "gps", "icao", "registration", "rssi_x10", "squawk"]
AIRCRAFT_TYPE_FIELD_NUMBER: _ClassVar[int]
CATEGORY_FIELD_NUMBER: _ClassVar[int]
COT_HOST_ID_FIELD_NUMBER: _ClassVar[int]
FLIGHT_FIELD_NUMBER: _ClassVar[int]
GPS_FIELD_NUMBER: _ClassVar[int]
ICAO_FIELD_NUMBER: _ClassVar[int]
REGISTRATION_FIELD_NUMBER: _ClassVar[int]
RSSI_X10_FIELD_NUMBER: _ClassVar[int]
SQUAWK_FIELD_NUMBER: _ClassVar[int]
aircraft_type: str
category: str
cot_host_id: str
flight: str
gps: bool
icao: str
registration: str
rssi_x10: int
squawk: int
def __init__(self, icao: _Optional[str] = ..., registration: _Optional[str] = ..., flight: _Optional[str] = ..., aircraft_type: _Optional[str] = ..., squawk: _Optional[int] = ..., category: _Optional[str] = ..., rssi_x10: _Optional[int] = ..., gps: bool = ..., cot_host_id: _Optional[str] = ...) -> None: ...
class CasevacReport(_message.Message):
__slots__ = ["ambulatory_patients", "child", "convenience_count", "enemy", "epw", "equipment_detail", "equipment_flags", "frequency", "friendlies", "hlz_marking", "hlz_remarks", "litter_patients", "marked_by", "medline_remarks", "non_us_civilian", "non_us_military", "obstacles", "precedence", "priority_count", "routine_count", "security", "terrain_flags", "terrain_other_detail", "terrain_slope_dir", "title", "urgent_count", "urgent_surgical_count", "us_civilian", "us_military", "winds_are_from", "zmist", "zone_marker", "zone_protected_coord"]
class HlzMarking(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class Precedence(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class Security(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
AMBULATORY_PATIENTS_FIELD_NUMBER: _ClassVar[int]
CHILD_FIELD_NUMBER: _ClassVar[int]
CONVENIENCE_COUNT_FIELD_NUMBER: _ClassVar[int]
ENEMY_FIELD_NUMBER: _ClassVar[int]
EPW_FIELD_NUMBER: _ClassVar[int]
EQUIPMENT_DETAIL_FIELD_NUMBER: _ClassVar[int]
EQUIPMENT_FLAGS_FIELD_NUMBER: _ClassVar[int]
FREQUENCY_FIELD_NUMBER: _ClassVar[int]
FRIENDLIES_FIELD_NUMBER: _ClassVar[int]
HLZ_MARKING_FIELD_NUMBER: _ClassVar[int]
HLZ_REMARKS_FIELD_NUMBER: _ClassVar[int]
HlzMarking_None: CasevacReport.HlzMarking
HlzMarking_Other: CasevacReport.HlzMarking
HlzMarking_Panels: CasevacReport.HlzMarking
HlzMarking_PyroSignal: CasevacReport.HlzMarking
HlzMarking_Smoke: CasevacReport.HlzMarking
HlzMarking_Unspecified: CasevacReport.HlzMarking
LITTER_PATIENTS_FIELD_NUMBER: _ClassVar[int]
MARKED_BY_FIELD_NUMBER: _ClassVar[int]
MEDLINE_REMARKS_FIELD_NUMBER: _ClassVar[int]
NON_US_CIVILIAN_FIELD_NUMBER: _ClassVar[int]
NON_US_MILITARY_FIELD_NUMBER: _ClassVar[int]
OBSTACLES_FIELD_NUMBER: _ClassVar[int]
PRECEDENCE_FIELD_NUMBER: _ClassVar[int]
PRIORITY_COUNT_FIELD_NUMBER: _ClassVar[int]
Precedence_Convenience: CasevacReport.Precedence
Precedence_Priority: CasevacReport.Precedence
Precedence_Routine: CasevacReport.Precedence
Precedence_Unspecified: CasevacReport.Precedence
Precedence_Urgent: CasevacReport.Precedence
Precedence_UrgentSurgical: CasevacReport.Precedence
ROUTINE_COUNT_FIELD_NUMBER: _ClassVar[int]
SECURITY_FIELD_NUMBER: _ClassVar[int]
Security_EnemyInArea: CasevacReport.Security
Security_EnemyInArmedContact: CasevacReport.Security
Security_NoEnemy: CasevacReport.Security
Security_PossibleEnemy: CasevacReport.Security
Security_Unspecified: CasevacReport.Security
TERRAIN_FLAGS_FIELD_NUMBER: _ClassVar[int]
TERRAIN_OTHER_DETAIL_FIELD_NUMBER: _ClassVar[int]
TERRAIN_SLOPE_DIR_FIELD_NUMBER: _ClassVar[int]
TITLE_FIELD_NUMBER: _ClassVar[int]
URGENT_COUNT_FIELD_NUMBER: _ClassVar[int]
URGENT_SURGICAL_COUNT_FIELD_NUMBER: _ClassVar[int]
US_CIVILIAN_FIELD_NUMBER: _ClassVar[int]
US_MILITARY_FIELD_NUMBER: _ClassVar[int]
WINDS_ARE_FROM_FIELD_NUMBER: _ClassVar[int]
ZMIST_FIELD_NUMBER: _ClassVar[int]
ZONE_MARKER_FIELD_NUMBER: _ClassVar[int]
ZONE_PROTECTED_COORD_FIELD_NUMBER: _ClassVar[int]
ambulatory_patients: int
child: int
convenience_count: int
enemy: str
epw: int
equipment_detail: str
equipment_flags: int
frequency: str
friendlies: str
hlz_marking: CasevacReport.HlzMarking
hlz_remarks: str
litter_patients: int
marked_by: str
medline_remarks: str
non_us_civilian: int
non_us_military: int
obstacles: str
precedence: CasevacReport.Precedence
priority_count: int
routine_count: int
security: CasevacReport.Security
terrain_flags: int
terrain_other_detail: str
terrain_slope_dir: str
title: str
urgent_count: int
urgent_surgical_count: int
us_civilian: int
us_military: int
winds_are_from: str
zmist: _containers.RepeatedCompositeFieldContainer[ZMistEntry]
zone_marker: str
zone_protected_coord: str
def __init__(self, precedence: _Optional[_Union[CasevacReport.Precedence, str]] = ..., equipment_flags: _Optional[int] = ..., litter_patients: _Optional[int] = ..., ambulatory_patients: _Optional[int] = ..., security: _Optional[_Union[CasevacReport.Security, str]] = ..., hlz_marking: _Optional[_Union[CasevacReport.HlzMarking, str]] = ..., zone_marker: _Optional[str] = ..., us_military: _Optional[int] = ..., us_civilian: _Optional[int] = ..., non_us_military: _Optional[int] = ..., non_us_civilian: _Optional[int] = ..., epw: _Optional[int] = ..., child: _Optional[int] = ..., terrain_flags: _Optional[int] = ..., frequency: _Optional[str] = ..., title: _Optional[str] = ..., medline_remarks: _Optional[str] = ..., urgent_count: _Optional[int] = ..., urgent_surgical_count: _Optional[int] = ..., priority_count: _Optional[int] = ..., routine_count: _Optional[int] = ..., convenience_count: _Optional[int] = ..., equipment_detail: _Optional[str] = ..., zone_protected_coord: _Optional[str] = ..., terrain_slope_dir: _Optional[str] = ..., terrain_other_detail: _Optional[str] = ..., marked_by: _Optional[str] = ..., obstacles: _Optional[str] = ..., winds_are_from: _Optional[str] = ..., friendlies: _Optional[str] = ..., enemy: _Optional[str] = ..., hlz_remarks: _Optional[str] = ..., zmist: _Optional[_Iterable[_Union[ZMistEntry, _Mapping]]] = ...) -> None: ...
class Contact(_message.Message):
__slots__ = ["callsign", "device_callsign"]
CALLSIGN_FIELD_NUMBER: _ClassVar[int]
DEVICE_CALLSIGN_FIELD_NUMBER: _ClassVar[int]
callsign: str
device_callsign: str
def __init__(self, callsign: _Optional[str] = ..., device_callsign: _Optional[str] = ...) -> None: ...
class CotGeoPoint(_message.Message):
__slots__ = ["lat_delta_i", "lon_delta_i"]
LAT_DELTA_I_FIELD_NUMBER: _ClassVar[int]
LON_DELTA_I_FIELD_NUMBER: _ClassVar[int]
lat_delta_i: int
lon_delta_i: int
def __init__(self, lat_delta_i: _Optional[int] = ..., lon_delta_i: _Optional[int] = ...) -> None: ...
class DrawnShape(_message.Message):
__slots__ = ["angle_deg", "bullseye_bearing_ref", "bullseye_distance_dm", "bullseye_flags", "bullseye_uid_ref", "fill_argb", "fill_color", "kind", "labels_on", "major_cm", "minor_cm", "stroke_argb", "stroke_color", "stroke_weight_x10", "style", "truncated", "vertex_lat_deltas", "vertex_lon_deltas"]
class Kind(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class StyleMode(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
ANGLE_DEG_FIELD_NUMBER: _ClassVar[int]
BULLSEYE_BEARING_REF_FIELD_NUMBER: _ClassVar[int]
BULLSEYE_DISTANCE_DM_FIELD_NUMBER: _ClassVar[int]
BULLSEYE_FLAGS_FIELD_NUMBER: _ClassVar[int]
BULLSEYE_UID_REF_FIELD_NUMBER: _ClassVar[int]
FILL_ARGB_FIELD_NUMBER: _ClassVar[int]
FILL_COLOR_FIELD_NUMBER: _ClassVar[int]
KIND_FIELD_NUMBER: _ClassVar[int]
Kind_Bullseye: DrawnShape.Kind
Kind_Circle: DrawnShape.Kind
Kind_Ellipse: DrawnShape.Kind
Kind_Freeform: DrawnShape.Kind
Kind_Polygon: DrawnShape.Kind
Kind_RangingCircle: DrawnShape.Kind
Kind_Rectangle: DrawnShape.Kind
Kind_Telestration: DrawnShape.Kind
Kind_Unspecified: DrawnShape.Kind
Kind_Vehicle2D: DrawnShape.Kind
Kind_Vehicle3D: DrawnShape.Kind
LABELS_ON_FIELD_NUMBER: _ClassVar[int]
MAJOR_CM_FIELD_NUMBER: _ClassVar[int]
MINOR_CM_FIELD_NUMBER: _ClassVar[int]
STROKE_ARGB_FIELD_NUMBER: _ClassVar[int]
STROKE_COLOR_FIELD_NUMBER: _ClassVar[int]
STROKE_WEIGHT_X10_FIELD_NUMBER: _ClassVar[int]
STYLE_FIELD_NUMBER: _ClassVar[int]
StyleMode_FillOnly: DrawnShape.StyleMode
StyleMode_StrokeAndFill: DrawnShape.StyleMode
StyleMode_StrokeOnly: DrawnShape.StyleMode
StyleMode_Unspecified: DrawnShape.StyleMode
TRUNCATED_FIELD_NUMBER: _ClassVar[int]
VERTEX_LAT_DELTAS_FIELD_NUMBER: _ClassVar[int]
VERTEX_LON_DELTAS_FIELD_NUMBER: _ClassVar[int]
angle_deg: int
bullseye_bearing_ref: int
bullseye_distance_dm: int
bullseye_flags: int
bullseye_uid_ref: str
fill_argb: int
fill_color: Team
kind: DrawnShape.Kind
labels_on: bool
major_cm: int
minor_cm: int
stroke_argb: int
stroke_color: Team
stroke_weight_x10: int
style: DrawnShape.StyleMode
truncated: bool
vertex_lat_deltas: _containers.RepeatedScalarFieldContainer[int]
vertex_lon_deltas: _containers.RepeatedScalarFieldContainer[int]
def __init__(self, kind: _Optional[_Union[DrawnShape.Kind, str]] = ..., style: _Optional[_Union[DrawnShape.StyleMode, str]] = ..., major_cm: _Optional[int] = ..., minor_cm: _Optional[int] = ..., angle_deg: _Optional[int] = ..., stroke_color: _Optional[_Union[Team, str]] = ..., stroke_argb: _Optional[int] = ..., stroke_weight_x10: _Optional[int] = ..., fill_color: _Optional[_Union[Team, str]] = ..., fill_argb: _Optional[int] = ..., labels_on: bool = ..., vertex_lat_deltas: _Optional[_Iterable[int]] = ..., vertex_lon_deltas: _Optional[_Iterable[int]] = ..., truncated: bool = ..., bullseye_distance_dm: _Optional[int] = ..., bullseye_bearing_ref: _Optional[int] = ..., bullseye_flags: _Optional[int] = ..., bullseye_uid_ref: _Optional[str] = ...) -> None: ...
class EmergencyAlert(_message.Message):
__slots__ = ["authoring_uid", "cancel_reference_uid", "type"]
class Type(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
AUTHORING_UID_FIELD_NUMBER: _ClassVar[int]
CANCEL_REFERENCE_UID_FIELD_NUMBER: _ClassVar[int]
TYPE_FIELD_NUMBER: _ClassVar[int]
Type_Alert911: EmergencyAlert.Type
Type_Cancel: EmergencyAlert.Type
Type_Custom: EmergencyAlert.Type
Type_GeoFenceBreached: EmergencyAlert.Type
Type_InContact: EmergencyAlert.Type
Type_RingTheBell: EmergencyAlert.Type
Type_Unspecified: EmergencyAlert.Type
authoring_uid: str
cancel_reference_uid: str
type: EmergencyAlert.Type
def __init__(self, type: _Optional[_Union[EmergencyAlert.Type, str]] = ..., authoring_uid: _Optional[str] = ..., cancel_reference_uid: _Optional[str] = ...) -> None: ...
class GeoChat(_message.Message):
__slots__ = ["lang", "message", "receipt_for_uid", "receipt_type", "room_id", "to", "to_callsign", "voice_profile_id"]
class ReceiptType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
LANG_FIELD_NUMBER: _ClassVar[int]
MESSAGE_FIELD_NUMBER: _ClassVar[int]
RECEIPT_FOR_UID_FIELD_NUMBER: _ClassVar[int]
RECEIPT_TYPE_FIELD_NUMBER: _ClassVar[int]
ROOM_ID_FIELD_NUMBER: _ClassVar[int]
ReceiptType_Delivered: GeoChat.ReceiptType
ReceiptType_None: GeoChat.ReceiptType
ReceiptType_Read: GeoChat.ReceiptType
TO_CALLSIGN_FIELD_NUMBER: _ClassVar[int]
TO_FIELD_NUMBER: _ClassVar[int]
VOICE_PROFILE_ID_FIELD_NUMBER: _ClassVar[int]
lang: str
message: str
receipt_for_uid: str
receipt_type: GeoChat.ReceiptType
room_id: str
to: str
to_callsign: str
voice_profile_id: str
def __init__(self, message: _Optional[str] = ..., to: _Optional[str] = ..., to_callsign: _Optional[str] = ..., receipt_for_uid: _Optional[str] = ..., receipt_type: _Optional[_Union[GeoChat.ReceiptType, str]] = ..., lang: _Optional[str] = ..., room_id: _Optional[str] = ..., voice_profile_id: _Optional[str] = ...) -> None: ...
class Group(_message.Message):
__slots__ = ["role", "team"]
ROLE_FIELD_NUMBER: _ClassVar[int]
TEAM_FIELD_NUMBER: _ClassVar[int]
role: MemberRole
team: Team
def __init__(self, role: _Optional[_Union[MemberRole, str]] = ..., team: _Optional[_Union[Team, str]] = ...) -> None: ...
class Marker(_message.Message):
__slots__ = ["color", "color_argb", "iconset", "kind", "parent_callsign", "parent_type", "parent_uid", "readiness"]
class Kind(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
COLOR_ARGB_FIELD_NUMBER: _ClassVar[int]
COLOR_FIELD_NUMBER: _ClassVar[int]
ICONSET_FIELD_NUMBER: _ClassVar[int]
KIND_FIELD_NUMBER: _ClassVar[int]
Kind_Checkpoint: Marker.Kind
Kind_ContactPoint: Marker.Kind
Kind_CustomIcon: Marker.Kind
Kind_GoToPoint: Marker.Kind
Kind_ImageMarker: Marker.Kind
Kind_InitialPoint: Marker.Kind
Kind_ObservationPost: Marker.Kind
Kind_SelfPosition: Marker.Kind
Kind_Spot: Marker.Kind
Kind_SpotMap: Marker.Kind
Kind_Symbol2525: Marker.Kind
Kind_Unspecified: Marker.Kind
Kind_Waypoint: Marker.Kind
PARENT_CALLSIGN_FIELD_NUMBER: _ClassVar[int]
PARENT_TYPE_FIELD_NUMBER: _ClassVar[int]
PARENT_UID_FIELD_NUMBER: _ClassVar[int]
READINESS_FIELD_NUMBER: _ClassVar[int]
color: Team
color_argb: int
iconset: str
kind: Marker.Kind
parent_callsign: str
parent_type: str
parent_uid: str
readiness: bool
def __init__(self, kind: _Optional[_Union[Marker.Kind, str]] = ..., color: _Optional[_Union[Team, str]] = ..., color_argb: _Optional[int] = ..., readiness: bool = ..., parent_uid: _Optional[str] = ..., parent_type: _Optional[str] = ..., parent_callsign: _Optional[str] = ..., iconset: _Optional[str] = ...) -> None: ...
class Marti(_message.Message):
__slots__ = ["dest_callsign"]
DEST_CALLSIGN_FIELD_NUMBER: _ClassVar[int]
dest_callsign: _containers.RepeatedScalarFieldContainer[str]
def __init__(self, dest_callsign: _Optional[_Iterable[str]] = ...) -> None: ...
class PLI(_message.Message):
__slots__ = ["altitude", "course", "latitude_i", "longitude_i", "speed"]
ALTITUDE_FIELD_NUMBER: _ClassVar[int]
COURSE_FIELD_NUMBER: _ClassVar[int]
LATITUDE_I_FIELD_NUMBER: _ClassVar[int]
LONGITUDE_I_FIELD_NUMBER: _ClassVar[int]
SPEED_FIELD_NUMBER: _ClassVar[int]
altitude: int
course: int
latitude_i: int
longitude_i: int
speed: int
def __init__(self, latitude_i: _Optional[int] = ..., longitude_i: _Optional[int] = ..., altitude: _Optional[int] = ..., speed: _Optional[int] = ..., course: _Optional[int] = ...) -> None: ...
class RangeAndBearing(_message.Message):
__slots__ = ["anchor", "anchor_uid", "bearing_cdeg", "range_cm", "stroke_argb", "stroke_color", "stroke_weight_x10"]
ANCHOR_FIELD_NUMBER: _ClassVar[int]
ANCHOR_UID_FIELD_NUMBER: _ClassVar[int]
BEARING_CDEG_FIELD_NUMBER: _ClassVar[int]
RANGE_CM_FIELD_NUMBER: _ClassVar[int]
STROKE_ARGB_FIELD_NUMBER: _ClassVar[int]
STROKE_COLOR_FIELD_NUMBER: _ClassVar[int]
STROKE_WEIGHT_X10_FIELD_NUMBER: _ClassVar[int]
anchor: CotGeoPoint
anchor_uid: str
bearing_cdeg: int
range_cm: int
stroke_argb: int
stroke_color: Team
stroke_weight_x10: int
def __init__(self, anchor: _Optional[_Union[CotGeoPoint, _Mapping]] = ..., anchor_uid: _Optional[str] = ..., range_cm: _Optional[int] = ..., bearing_cdeg: _Optional[int] = ..., stroke_color: _Optional[_Union[Team, str]] = ..., stroke_argb: _Optional[int] = ..., stroke_weight_x10: _Optional[int] = ...) -> None: ...
class Route(_message.Message):
__slots__ = ["direction", "links", "method", "prefix", "stroke_weight_x10", "truncated"]
class Direction(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class Method(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class Link(_message.Message):
__slots__ = ["callsign", "link_type", "point", "uid"]
CALLSIGN_FIELD_NUMBER: _ClassVar[int]
LINK_TYPE_FIELD_NUMBER: _ClassVar[int]
POINT_FIELD_NUMBER: _ClassVar[int]
UID_FIELD_NUMBER: _ClassVar[int]
callsign: str
link_type: int
point: CotGeoPoint
uid: str
def __init__(self, point: _Optional[_Union[CotGeoPoint, _Mapping]] = ..., uid: _Optional[str] = ..., callsign: _Optional[str] = ..., link_type: _Optional[int] = ...) -> None: ...
DIRECTION_FIELD_NUMBER: _ClassVar[int]
Direction_Exfil: Route.Direction
Direction_Infil: Route.Direction
Direction_Unspecified: Route.Direction
LINKS_FIELD_NUMBER: _ClassVar[int]
METHOD_FIELD_NUMBER: _ClassVar[int]
Method_Driving: Route.Method
Method_Flying: Route.Method
Method_Swimming: Route.Method
Method_Unspecified: Route.Method
Method_Walking: Route.Method
Method_Watercraft: Route.Method
PREFIX_FIELD_NUMBER: _ClassVar[int]
STROKE_WEIGHT_X10_FIELD_NUMBER: _ClassVar[int]
TRUNCATED_FIELD_NUMBER: _ClassVar[int]
direction: Route.Direction
links: _containers.RepeatedCompositeFieldContainer[Route.Link]
method: Route.Method
prefix: str
stroke_weight_x10: int
truncated: bool
def __init__(self, method: _Optional[_Union[Route.Method, str]] = ..., direction: _Optional[_Union[Route.Direction, str]] = ..., prefix: _Optional[str] = ..., stroke_weight_x10: _Optional[int] = ..., links: _Optional[_Iterable[_Union[Route.Link, _Mapping]]] = ..., truncated: bool = ...) -> None: ...
class SensorFov(_message.Message):
__slots__ = ["azimuth_deg", "elevation_deg", "fov_horizontal_deg", "fov_vertical_deg", "model", "range_m", "roll_deg", "type"]
class SensorType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
AZIMUTH_DEG_FIELD_NUMBER: _ClassVar[int]
ELEVATION_DEG_FIELD_NUMBER: _ClassVar[int]
FOV_HORIZONTAL_DEG_FIELD_NUMBER: _ClassVar[int]
FOV_VERTICAL_DEG_FIELD_NUMBER: _ClassVar[int]
MODEL_FIELD_NUMBER: _ClassVar[int]
RANGE_M_FIELD_NUMBER: _ClassVar[int]
ROLL_DEG_FIELD_NUMBER: _ClassVar[int]
SensorType_Camera: SensorFov.SensorType
SensorType_Laser: SensorFov.SensorType
SensorType_Nvg: SensorFov.SensorType
SensorType_Other: SensorFov.SensorType
SensorType_Rf: SensorFov.SensorType
SensorType_Thermal: SensorFov.SensorType
SensorType_Unspecified: SensorFov.SensorType
TYPE_FIELD_NUMBER: _ClassVar[int]
azimuth_deg: int
elevation_deg: int
fov_horizontal_deg: int
fov_vertical_deg: int
model: str
range_m: int
roll_deg: int
type: SensorFov.SensorType
def __init__(self, type: _Optional[_Union[SensorFov.SensorType, str]] = ..., azimuth_deg: _Optional[int] = ..., range_m: _Optional[int] = ..., fov_horizontal_deg: _Optional[int] = ..., fov_vertical_deg: _Optional[int] = ..., elevation_deg: _Optional[int] = ..., roll_deg: _Optional[int] = ..., model: _Optional[str] = ...) -> None: ...
class Status(_message.Message):
__slots__ = ["battery"]
BATTERY_FIELD_NUMBER: _ClassVar[int]
battery: int
def __init__(self, battery: _Optional[int] = ...) -> None: ...
class TAKEnvironment(_message.Message):
__slots__ = ["temperature_c_x10", "wind_direction_deg", "wind_speed_cm_s"]
TEMPERATURE_C_X10_FIELD_NUMBER: _ClassVar[int]
WIND_DIRECTION_DEG_FIELD_NUMBER: _ClassVar[int]
WIND_SPEED_CM_S_FIELD_NUMBER: _ClassVar[int]
temperature_c_x10: int
wind_direction_deg: int
wind_speed_cm_s: int
def __init__(self, temperature_c_x10: _Optional[int] = ..., wind_direction_deg: _Optional[int] = ..., wind_speed_cm_s: _Optional[int] = ...) -> None: ...
class TAKPacket(_message.Message):
__slots__ = ["chat", "contact", "detail", "group", "is_compressed", "pli", "status"]
CHAT_FIELD_NUMBER: _ClassVar[int]
CONTACT_FIELD_NUMBER: _ClassVar[int]
DETAIL_FIELD_NUMBER: _ClassVar[int]
GROUP_FIELD_NUMBER: _ClassVar[int]
IS_COMPRESSED_FIELD_NUMBER: _ClassVar[int]
PLI_FIELD_NUMBER: _ClassVar[int]
STATUS_FIELD_NUMBER: _ClassVar[int]
chat: GeoChat
contact: Contact
detail: bytes
group: Group
is_compressed: bool
pli: PLI
status: Status
def __init__(self, is_compressed: bool = ..., contact: _Optional[_Union[Contact, _Mapping]] = ..., group: _Optional[_Union[Group, _Mapping]] = ..., status: _Optional[_Union[Status, _Mapping]] = ..., pli: _Optional[_Union[PLI, _Mapping]] = ..., chat: _Optional[_Union[GeoChat, _Mapping]] = ..., detail: _Optional[bytes] = ...) -> None: ...
class TAKPacketV2(_message.Message):
__slots__ = ["aircraft", "alt_src", "altitude", "battery", "callsign", "casevac", "chat", "cot_type_id", "cot_type_str", "course", "device_callsign", "emergency", "endpoint", "environment", "geo_src", "how", "latitude_i", "longitude_i", "marker", "marti", "phone", "rab", "raw_detail", "remarks", "role", "route", "sensor_fov", "shape", "speed", "stale_seconds", "tak_device", "tak_os", "tak_platform", "tak_version", "taktalk", "taktalk_room", "task", "team", "uid"]
AIRCRAFT_FIELD_NUMBER: _ClassVar[int]
ALTITUDE_FIELD_NUMBER: _ClassVar[int]
ALT_SRC_FIELD_NUMBER: _ClassVar[int]
BATTERY_FIELD_NUMBER: _ClassVar[int]
CALLSIGN_FIELD_NUMBER: _ClassVar[int]
CASEVAC_FIELD_NUMBER: _ClassVar[int]
CHAT_FIELD_NUMBER: _ClassVar[int]
COT_TYPE_ID_FIELD_NUMBER: _ClassVar[int]
COT_TYPE_STR_FIELD_NUMBER: _ClassVar[int]
COURSE_FIELD_NUMBER: _ClassVar[int]
DEVICE_CALLSIGN_FIELD_NUMBER: _ClassVar[int]
EMERGENCY_FIELD_NUMBER: _ClassVar[int]
ENDPOINT_FIELD_NUMBER: _ClassVar[int]
ENVIRONMENT_FIELD_NUMBER: _ClassVar[int]
GEO_SRC_FIELD_NUMBER: _ClassVar[int]
HOW_FIELD_NUMBER: _ClassVar[int]
LATITUDE_I_FIELD_NUMBER: _ClassVar[int]
LONGITUDE_I_FIELD_NUMBER: _ClassVar[int]
MARKER_FIELD_NUMBER: _ClassVar[int]
MARTI_FIELD_NUMBER: _ClassVar[int]
PHONE_FIELD_NUMBER: _ClassVar[int]
RAB_FIELD_NUMBER: _ClassVar[int]
RAW_DETAIL_FIELD_NUMBER: _ClassVar[int]
REMARKS_FIELD_NUMBER: _ClassVar[int]
ROLE_FIELD_NUMBER: _ClassVar[int]
ROUTE_FIELD_NUMBER: _ClassVar[int]
SENSOR_FOV_FIELD_NUMBER: _ClassVar[int]
SHAPE_FIELD_NUMBER: _ClassVar[int]
SPEED_FIELD_NUMBER: _ClassVar[int]
STALE_SECONDS_FIELD_NUMBER: _ClassVar[int]
TAKTALK_FIELD_NUMBER: _ClassVar[int]
TAKTALK_ROOM_FIELD_NUMBER: _ClassVar[int]
TAK_DEVICE_FIELD_NUMBER: _ClassVar[int]
TAK_OS_FIELD_NUMBER: _ClassVar[int]
TAK_PLATFORM_FIELD_NUMBER: _ClassVar[int]
TAK_VERSION_FIELD_NUMBER: _ClassVar[int]
TASK_FIELD_NUMBER: _ClassVar[int]
TEAM_FIELD_NUMBER: _ClassVar[int]
UID_FIELD_NUMBER: _ClassVar[int]
aircraft: AircraftTrack
alt_src: GeoPointSource
altitude: int
battery: int
callsign: str
casevac: CasevacReport
chat: GeoChat
cot_type_id: CotType
cot_type_str: str
course: int
device_callsign: str
emergency: EmergencyAlert
endpoint: str
environment: TAKEnvironment
geo_src: GeoPointSource
how: CotHow
latitude_i: int
longitude_i: int
marker: Marker
marti: Marti
phone: str
rab: RangeAndBearing
raw_detail: bytes
remarks: str
role: MemberRole
route: Route
sensor_fov: SensorFov
shape: DrawnShape
speed: int
stale_seconds: int
tak_device: str
tak_os: str
tak_platform: str
tak_version: str
taktalk: TakTalkMessage
taktalk_room: TakTalkRoomData
task: TaskRequest
team: Team
uid: str
def __init__(self, cot_type_id: _Optional[_Union[CotType, str]] = ..., how: _Optional[_Union[CotHow, str]] = ..., callsign: _Optional[str] = ..., team: _Optional[_Union[Team, str]] = ..., role: _Optional[_Union[MemberRole, str]] = ..., latitude_i: _Optional[int] = ..., longitude_i: _Optional[int] = ..., altitude: _Optional[int] = ..., speed: _Optional[int] = ..., course: _Optional[int] = ..., battery: _Optional[int] = ..., geo_src: _Optional[_Union[GeoPointSource, str]] = ..., alt_src: _Optional[_Union[GeoPointSource, str]] = ..., uid: _Optional[str] = ..., device_callsign: _Optional[str] = ..., stale_seconds: _Optional[int] = ..., tak_version: _Optional[str] = ..., tak_device: _Optional[str] = ..., tak_platform: _Optional[str] = ..., tak_os: _Optional[str] = ..., endpoint: _Optional[str] = ..., phone: _Optional[str] = ..., cot_type_str: _Optional[str] = ..., remarks: _Optional[str] = ..., environment: _Optional[_Union[TAKEnvironment, _Mapping]] = ..., sensor_fov: _Optional[_Union[SensorFov, _Mapping]] = ..., marti: _Optional[_Union[Marti, _Mapping]] = ..., chat: _Optional[_Union[GeoChat, _Mapping]] = ..., aircraft: _Optional[_Union[AircraftTrack, _Mapping]] = ..., raw_detail: _Optional[bytes] = ..., shape: _Optional[_Union[DrawnShape, _Mapping]] = ..., marker: _Optional[_Union[Marker, _Mapping]] = ..., rab: _Optional[_Union[RangeAndBearing, _Mapping]] = ..., route: _Optional[_Union[Route, _Mapping]] = ..., casevac: _Optional[_Union[CasevacReport, _Mapping]] = ..., emergency: _Optional[_Union[EmergencyAlert, _Mapping]] = ..., task: _Optional[_Union[TaskRequest, _Mapping]] = ..., taktalk: _Optional[_Union[TakTalkMessage, _Mapping]] = ..., taktalk_room: _Optional[_Union[TakTalkRoomData, _Mapping]] = ...) -> None: ...
class TakTalkMessage(_message.Message):
__slots__ = ["chatroom_id", "from_voice", "lang", "text"]
CHATROOM_ID_FIELD_NUMBER: _ClassVar[int]
FROM_VOICE_FIELD_NUMBER: _ClassVar[int]
LANG_FIELD_NUMBER: _ClassVar[int]
TEXT_FIELD_NUMBER: _ClassVar[int]
chatroom_id: str
from_voice: bool
lang: str
text: str
def __init__(self, text: _Optional[str] = ..., chatroom_id: _Optional[str] = ..., lang: _Optional[str] = ..., from_voice: bool = ...) -> None: ...
class TakTalkRoomData(_message.Message):
__slots__ = ["participants", "room_id", "room_name", "sender_callsign"]
PARTICIPANTS_FIELD_NUMBER: _ClassVar[int]
ROOM_ID_FIELD_NUMBER: _ClassVar[int]
ROOM_NAME_FIELD_NUMBER: _ClassVar[int]
SENDER_CALLSIGN_FIELD_NUMBER: _ClassVar[int]
participants: _containers.RepeatedScalarFieldContainer[str]
room_id: str
room_name: str
sender_callsign: str
def __init__(self, sender_callsign: _Optional[str] = ..., room_id: _Optional[str] = ..., room_name: _Optional[str] = ..., participants: _Optional[_Iterable[str]] = ...) -> None: ...
class TaskRequest(_message.Message):
__slots__ = ["assignee_uid", "note", "priority", "status", "target_uid", "task_type"]
class Priority(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class Status(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
ASSIGNEE_UID_FIELD_NUMBER: _ClassVar[int]
NOTE_FIELD_NUMBER: _ClassVar[int]
PRIORITY_FIELD_NUMBER: _ClassVar[int]
Priority_Critical: TaskRequest.Priority
Priority_High: TaskRequest.Priority
Priority_Low: TaskRequest.Priority
Priority_Normal: TaskRequest.Priority
Priority_Unspecified: TaskRequest.Priority
STATUS_FIELD_NUMBER: _ClassVar[int]
Status_Acknowledged: TaskRequest.Status
Status_Cancelled: TaskRequest.Status
Status_Completed: TaskRequest.Status
Status_InProgress: TaskRequest.Status
Status_Pending: TaskRequest.Status
Status_Unspecified: TaskRequest.Status
TARGET_UID_FIELD_NUMBER: _ClassVar[int]
TASK_TYPE_FIELD_NUMBER: _ClassVar[int]
assignee_uid: str
note: str
priority: TaskRequest.Priority
status: TaskRequest.Status
target_uid: str
task_type: str
def __init__(self, task_type: _Optional[str] = ..., target_uid: _Optional[str] = ..., assignee_uid: _Optional[str] = ..., priority: _Optional[_Union[TaskRequest.Priority, str]] = ..., status: _Optional[_Union[TaskRequest.Status, str]] = ..., note: _Optional[str] = ...) -> None: ...
class ZMistEntry(_message.Message):
__slots__ = ["i", "m", "s", "t", "title", "z"]
I_FIELD_NUMBER: _ClassVar[int]
M_FIELD_NUMBER: _ClassVar[int]
S_FIELD_NUMBER: _ClassVar[int]
TITLE_FIELD_NUMBER: _ClassVar[int]
T_FIELD_NUMBER: _ClassVar[int]
Z_FIELD_NUMBER: _ClassVar[int]
i: str
m: str
s: str
t: str
title: str
z: str
def __init__(self, title: _Optional[str] = ..., z: _Optional[str] = ..., m: _Optional[str] = ..., i: _Optional[str] = ..., s: _Optional[str] = ..., t: _Optional[str] = ...) -> None: ...
class Team(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class MemberRole(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class CotHow(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class CotType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class GeoPointSource(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
+26
View File
@@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/protobuf/cannedmessages.proto
"""Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n(meshtastic/protobuf/cannedmessages.proto\x12\x13meshtastic.protobuf\"-\n\x19\x43\x61nnedMessageModuleConfig\x12\x10\n\x08messages\x18\x01 \x01(\tBo\n\x14org.meshtastic.protoB\x19\x43\x61nnedMessageConfigProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.cannedmessages_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\031CannedMessageConfigProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_CANNEDMESSAGEMODULECONFIG._serialized_start=65
_CANNEDMESSAGEMODULECONFIG._serialized_end=110
# @@protoc_insertion_point(module_scope)
@@ -0,0 +1,11 @@
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from typing import ClassVar as _ClassVar, Optional as _Optional
DESCRIPTOR: _descriptor.FileDescriptor
class CannedMessageModuleConfig(_message.Message):
__slots__ = ["messages"]
MESSAGES_FIELD_NUMBER: _ClassVar[int]
messages: str
def __init__(self, messages: _Optional[str] = ...) -> None: ...
+34
View File
@@ -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.internal import builder as _builder
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n!meshtastic/protobuf/channel.proto\x12\x13meshtastic.protobuf\"\xd3\x01\n\x0f\x43hannelSettings\x12\x17\n\x0b\x63hannel_num\x18\x01 \x01(\rB\x02\x18\x01\x12\x0b\n\x03psk\x18\x02 \x01(\x0c\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\n\n\x02id\x18\x04 \x01(\x07\x12\x16\n\x0euplink_enabled\x18\x05 \x01(\x08\x12\x18\n\x10\x64ownlink_enabled\x18\x06 \x01(\x08\x12<\n\x0fmodule_settings\x18\x07 \x01(\x0b\x32#.meshtastic.protobuf.ModuleSettings\x12\x10\n\x08use_aead\x18\x08 \x01(\x08\">\n\x0eModuleSettings\x12\x1a\n\x12position_precision\x18\x01 \x01(\r\x12\x10\n\x08is_muted\x18\x02 \x01(\x08\"\xb3\x01\n\x07\x43hannel\x12\r\n\x05index\x18\x01 \x01(\x05\x12\x36\n\x08settings\x18\x02 \x01(\x0b\x32$.meshtastic.protobuf.ChannelSettings\x12/\n\x04role\x18\x03 \x01(\x0e\x32!.meshtastic.protobuf.Channel.Role\"0\n\x04Role\x12\x0c\n\x08\x44ISABLED\x10\x00\x12\x0b\n\x07PRIMARY\x10\x01\x12\r\n\tSECONDARY\x10\x02\x42\x63\n\x14org.meshtastic.protoB\rChannelProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.channel_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\rChannelProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_CHANNELSETTINGS.fields_by_name['channel_num']._options = None
_CHANNELSETTINGS.fields_by_name['channel_num']._serialized_options = b'\030\001'
_CHANNELSETTINGS._serialized_start=59
_CHANNELSETTINGS._serialized_end=270
_MODULESETTINGS._serialized_start=272
_MODULESETTINGS._serialized_end=334
_CHANNEL._serialized_start=337
_CHANNEL._serialized_end=516
_CHANNEL_ROLE._serialized_start=468
_CHANNEL_ROLE._serialized_end=516
# @@protoc_insertion_point(module_scope)
+49
View File
@@ -0,0 +1,49 @@
from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from typing import ClassVar as _ClassVar, Mapping as _Mapping, Optional as _Optional, Union as _Union
DESCRIPTOR: _descriptor.FileDescriptor
class Channel(_message.Message):
__slots__ = ["index", "role", "settings"]
class Role(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
DISABLED: Channel.Role
INDEX_FIELD_NUMBER: _ClassVar[int]
PRIMARY: Channel.Role
ROLE_FIELD_NUMBER: _ClassVar[int]
SECONDARY: Channel.Role
SETTINGS_FIELD_NUMBER: _ClassVar[int]
index: int
role: Channel.Role
settings: ChannelSettings
def __init__(self, index: _Optional[int] = ..., settings: _Optional[_Union[ChannelSettings, _Mapping]] = ..., role: _Optional[_Union[Channel.Role, str]] = ...) -> None: ...
class ChannelSettings(_message.Message):
__slots__ = ["channel_num", "downlink_enabled", "id", "module_settings", "name", "psk", "uplink_enabled", "use_aead"]
CHANNEL_NUM_FIELD_NUMBER: _ClassVar[int]
DOWNLINK_ENABLED_FIELD_NUMBER: _ClassVar[int]
ID_FIELD_NUMBER: _ClassVar[int]
MODULE_SETTINGS_FIELD_NUMBER: _ClassVar[int]
NAME_FIELD_NUMBER: _ClassVar[int]
PSK_FIELD_NUMBER: _ClassVar[int]
UPLINK_ENABLED_FIELD_NUMBER: _ClassVar[int]
USE_AEAD_FIELD_NUMBER: _ClassVar[int]
channel_num: int
downlink_enabled: bool
id: int
module_settings: ModuleSettings
name: str
psk: bytes
uplink_enabled: bool
use_aead: bool
def __init__(self, channel_num: _Optional[int] = ..., psk: _Optional[bytes] = ..., name: _Optional[str] = ..., id: _Optional[int] = ..., uplink_enabled: bool = ..., downlink_enabled: bool = ..., module_settings: _Optional[_Union[ModuleSettings, _Mapping]] = ..., use_aead: bool = ...) -> None: ...
class ModuleSettings(_message.Message):
__slots__ = ["is_muted", "position_precision"]
IS_MUTED_FIELD_NUMBER: _ClassVar[int]
POSITION_PRECISION_FIELD_NUMBER: _ClassVar[int]
is_muted: bool
position_precision: int
def __init__(self, position_precision: _Optional[int] = ..., is_muted: bool = ...) -> None: ...
+28
View File
@@ -0,0 +1,28 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/protobuf/clientonly.proto
"""Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
from meshtastic.protobuf import localonly_pb2 as meshtastic_dot_protobuf_dot_localonly__pb2
from meshtastic.protobuf import mesh_pb2 as meshtastic_dot_protobuf_dot_mesh__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n$meshtastic/protobuf/clientonly.proto\x12\x13meshtastic.protobuf\x1a#meshtastic/protobuf/localonly.proto\x1a\x1emeshtastic/protobuf/mesh.proto\"\xa0\x04\n\rDeviceProfile\x12\x16\n\tlong_name\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x17\n\nshort_name\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0b\x63hannel_url\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x35\n\x06\x63onfig\x18\x04 \x01(\x0b\x32 .meshtastic.protobuf.LocalConfigH\x03\x88\x01\x01\x12\x42\n\rmodule_config\x18\x05 \x01(\x0b\x32&.meshtastic.protobuf.LocalModuleConfigH\x04\x88\x01\x01\x12:\n\x0e\x66ixed_position\x18\x06 \x01(\x0b\x32\x1d.meshtastic.protobuf.PositionH\x05\x88\x01\x01\x12\x15\n\x08ringtone\x18\x07 \x01(\tH\x06\x88\x01\x01\x12\x1c\n\x0f\x63\x61nned_messages\x18\x08 \x01(\tH\x07\x88\x01\x01\x12\x1c\n\x0fis_unmessagable\x18\t \x01(\x08H\x08\x88\x01\x01\x12\x18\n\x0bis_licensed\x18\n \x01(\x08H\t\x88\x01\x01\x42\x0c\n\n_long_nameB\r\n\x0b_short_nameB\x0e\n\x0c_channel_urlB\t\n\x07_configB\x10\n\x0e_module_configB\x11\n\x0f_fixed_positionB\x0b\n\t_ringtoneB\x12\n\x10_canned_messagesB\x12\n\x10_is_unmessagableB\x0e\n\x0c_is_licensedBf\n\x14org.meshtastic.protoB\x10\x43lientOnlyProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.clientonly_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\020ClientOnlyProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_DEVICEPROFILE._serialized_start=131
_DEVICEPROFILE._serialized_end=675
# @@protoc_insertion_point(module_scope)
+31
View File
@@ -0,0 +1,31 @@
from meshtastic.protobuf import localonly_pb2 as _localonly_pb2
from meshtastic.protobuf import mesh_pb2 as _mesh_pb2
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from typing import ClassVar as _ClassVar, Mapping as _Mapping, Optional as _Optional, Union as _Union
DESCRIPTOR: _descriptor.FileDescriptor
class DeviceProfile(_message.Message):
__slots__ = ["canned_messages", "channel_url", "config", "fixed_position", "is_licensed", "is_unmessagable", "long_name", "module_config", "ringtone", "short_name"]
CANNED_MESSAGES_FIELD_NUMBER: _ClassVar[int]
CHANNEL_URL_FIELD_NUMBER: _ClassVar[int]
CONFIG_FIELD_NUMBER: _ClassVar[int]
FIXED_POSITION_FIELD_NUMBER: _ClassVar[int]
IS_LICENSED_FIELD_NUMBER: _ClassVar[int]
IS_UNMESSAGABLE_FIELD_NUMBER: _ClassVar[int]
LONG_NAME_FIELD_NUMBER: _ClassVar[int]
MODULE_CONFIG_FIELD_NUMBER: _ClassVar[int]
RINGTONE_FIELD_NUMBER: _ClassVar[int]
SHORT_NAME_FIELD_NUMBER: _ClassVar[int]
canned_messages: str
channel_url: str
config: _localonly_pb2.LocalConfig
fixed_position: _mesh_pb2.Position
is_licensed: bool
is_unmessagable: bool
long_name: str
module_config: _localonly_pb2.LocalModuleConfig
ringtone: str
short_name: str
def __init__(self, long_name: _Optional[str] = ..., short_name: _Optional[str] = ..., channel_url: _Optional[str] = ..., config: _Optional[_Union[_localonly_pb2.LocalConfig, _Mapping]] = ..., module_config: _Optional[_Union[_localonly_pb2.LocalModuleConfig, _Mapping]] = ..., fixed_position: _Optional[_Union[_mesh_pb2.Position, _Mapping]] = ..., ringtone: _Optional[str] = ..., canned_messages: _Optional[str] = ..., is_unmessagable: bool = ..., is_licensed: bool = ...) -> None: ...
+484
View File
@@ -0,0 +1,484 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/protobuf/config.proto
"""Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
from meshtastic.protobuf import device_ui_pb2 as meshtastic_dot_protobuf_dot_device__ui__pb2
from meshtastic.protobuf import field_metadata_pb2 as meshtastic_dot_protobuf_dot_field__metadata__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n meshtastic/protobuf/config.proto\x12\x13meshtastic.protobuf\x1a#meshtastic/protobuf/device_ui.proto\x1a(meshtastic/protobuf/field_metadata.proto\"\x93\x86\x01\n\x06\x43onfig\x12:\n\x06\x64\x65vice\x18\x01 \x01(\x0b\x32(.meshtastic.protobuf.Config.DeviceConfigH\x00\x12>\n\x08position\x18\x02 \x01(\x0b\x32*.meshtastic.protobuf.Config.PositionConfigH\x00\x12\x38\n\x05power\x18\x03 \x01(\x0b\x32\'.meshtastic.protobuf.Config.PowerConfigH\x00\x12<\n\x07network\x18\x04 \x01(\x0b\x32).meshtastic.protobuf.Config.NetworkConfigH\x00\x12<\n\x07\x64isplay\x18\x05 \x01(\x0b\x32).meshtastic.protobuf.Config.DisplayConfigH\x00\x12\x36\n\x04lora\x18\x06 \x01(\x0b\x32&.meshtastic.protobuf.Config.LoRaConfigH\x00\x12@\n\tbluetooth\x18\x07 \x01(\x0b\x32+.meshtastic.protobuf.Config.BluetoothConfigH\x00\x12>\n\x08security\x18\x08 \x01(\x0b\x32*.meshtastic.protobuf.Config.SecurityConfigH\x00\x12\x42\n\nsessionkey\x18\t \x01(\x0b\x32,.meshtastic.protobuf.Config.SessionkeyConfigH\x00\x12\x38\n\tdevice_ui\x18\n \x01(\x0b\x32#.meshtastic.protobuf.DeviceUIConfigH\x00\x1a\x80\x1f\n\x0c\x44\x65viceConfig\x12N\n\x04role\x18\x01 \x01(\x0e\x32-.meshtastic.protobuf.Config.DeviceConfig.RoleB\x11\xca\xf3\x18\r:\x0b\x44\x65vice Role\x12\x1a\n\x0eserial_enabled\x18\x02 \x01(\x08\x42\x02\x18\x01\x12u\n\x0b\x62utton_gpio\x18\x04 \x01(\rB`\xca\xf3\x18\\:\x0b\x42utton GPIOBMGPIO pin for the user button, can be remapped on boards with multiple buttons\x12\x43\n\x0b\x62uzzer_gpio\x18\x05 \x01(\rB.\xca\xf3\x18*:\x0b\x42uzzer GPIOB\x1bGPIO pin for the PWM buzzer\x12j\n\x10rebroadcast_mode\x18\x06 \x01(\x0e\x32\x38.meshtastic.protobuf.Config.DeviceConfig.RebroadcastModeB\x16\xca\xf3\x18\x12:\x10Rebroadcast Mode\x12\x9a\x01\n\x18node_info_broadcast_secs\x18\x07 \x01(\rBx\xca\xf3\x18t\x19\x00\x00\x00\x00\x00 \xac@*\x01s:\x1cNode Info Broadcast IntervalBHHow often node information is sent. Defaults to 3 hours, minimum 1 hour.\x12\x84\x01\n\x1a\x64ouble_tap_as_button_press\x18\x08 \x01(\x08\x42`\xca\xf3\x18\\:\x14\x44ouble Tap as ButtonBDTreat double tap on supported accelerometers as a user button press.\x12\x16\n\nis_managed\x18\t \x01(\x08\x42\x02\x18\x01\x12i\n\x14\x64isable_triple_click\x18\n \x01(\x08\x42K\xca\xf3\x18G:\x14\x44isable Triple ClickB/Disables the user button triple-press shortcut.\x12@\n\x05tzdef\x18\x0b \x01(\tB1\xca\xf3\x18-:\tTime ZoneB POSIX timezone definition string\x12\xc5\x01\n\x16led_heartbeat_disabled\x18\x0c \x01(\x08\x42\xa4\x01\xca\xf3\x18\x9f\x01:\x15\x44isable LED HeartbeatB\x85\x01Turns off the blinking LED on the device. On most devices this is one of up to 4 LEDs; the charger and GPS LEDs are not controllable.\x12U\n\x0b\x62uzzer_mode\x18\r \x01(\x0e\x32\x33.meshtastic.protobuf.Config.DeviceConfig.BuzzerModeB\x0b\xca\xf3\x18\x07R\x05\x32.7.0\"\xef\x0b\n\x04Role\x12G\n\x06\x43LIENT\x10\x00\x1a;\xca\xf3\x18\x37:\x06\x43lientB-App connected or standalone messaging device.\x12\\\n\x0b\x43LIENT_MUTE\x10\x01\x1aK\xca\xf3\x18G:\x0b\x43lient MuteB8Device that does not forward packets from other devices.\x12\xae\x01\n\x06ROUTER\x10\x02\x1a\xa1\x01\xca\xf3\x18\x9c\x01:\x06RouterB\x91\x01Infrastructure node on a tower or mountain top only. Not to be used for roofs or mobile nodes. Needs exceptional coverage. Visible in Nodes list.\x12(\n\rROUTER_CLIENT\x10\x03\x1a\x15\x08\x01\xca\xf3\x18\x0f:\rRouter Client\x12\xb3\x01\n\x08REPEATER\x10\x04\x1a\xa4\x01\x08\x01\xca\xf3\x18\x9d\x01:\x08RepeaterB\x90\x01\x44\x65precated infrastructure role that creates gaps in the mesh rebroadcast chain. Switch this node to a Router-based role (Router or Router Late).\x12H\n\x07TRACKER\x10\x05\x1a;\xca\xf3\x18\x37:\x07TrackerB,Broadcasts GPS position packets as priority.\x12\x43\n\x06SENSOR\x10\x06\x1a\x37\xca\xf3\x18\x33:\x06SensorB)Broadcasts telemetry packets as priority.\x12X\n\x03TAK\x10\x07\x1aO\xca\xf3\x18K:\x03TAKBDOptimized for ATAK system communication, reduces routine broadcasts.\x12k\n\rCLIENT_HIDDEN\x10\x08\x1aX\xca\xf3\x18T:\rClient HiddenBCDevice that only broadcasts as needed for stealth or power savings.\x12\x85\x01\n\x0eLOST_AND_FOUND\x10\t\x1aq\xca\xf3\x18m:\x0eLost and FoundB[Broadcasts location as message to default channel regularly to assist with device recovery.\x12h\n\x0bTAK_TRACKER\x10\n\x1aW\xca\xf3\x18S:\x0bTAK TrackerBDEnables automatic TAK PLI broadcasts and reduces routine broadcasts.\x12\xbc\x01\n\x0bROUTER_LATE\x10\x0b\x1a\xaa\x01\xca\xf3\x18\xa5\x01:\x0bRouter LateB\x95\x01Infrastructure node that always rebroadcasts packets once but only after all other modes. Visible in Nodes list. Not a good choice for rooftop nodes.\x12\xa7\x01\n\x0b\x43LIENT_BASE\x10\x0c\x1a\x95\x01\xca\xf3\x18\x90\x01:\x0b\x43lient BaseB\x80\x01Rooftop or attic node that rebroadcasts like Router Late for packets from or to favorited nodes, and like Client for all others.\"\xf6\x08\n\x0fRebroadcastMode\x12\x8c\x01\n\x03\x41LL\x10\x00\x1a\x82\x01\xca\xf3\x18~:\x03\x41llBwRebroadcast anLine truncated
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.config_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\014ConfigProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_CONFIG_DEVICECONFIG_ROLE.values_by_name["CLIENT"]._options = None
_CONFIG_DEVICECONFIG_ROLE.values_by_name["CLIENT"]._serialized_options = b'\312\363\0307:\006ClientB-App connected or standalone messaging device.'
_CONFIG_DEVICECONFIG_ROLE.values_by_name["CLIENT_MUTE"]._options = None
_CONFIG_DEVICECONFIG_ROLE.values_by_name["CLIENT_MUTE"]._serialized_options = b'\312\363\030G:\013Client MuteB8Device that does not forward packets from other devices.'
_CONFIG_DEVICECONFIG_ROLE.values_by_name["ROUTER"]._options = None
_CONFIG_DEVICECONFIG_ROLE.values_by_name["ROUTER"]._serialized_options = b'\312\363\030\234\001:\006RouterB\221\001Infrastructure node on a tower or mountain top only. Not to be used for roofs or mobile nodes. Needs exceptional coverage. Visible in Nodes list.'
_CONFIG_DEVICECONFIG_ROLE.values_by_name["ROUTER_CLIENT"]._options = None
_CONFIG_DEVICECONFIG_ROLE.values_by_name["ROUTER_CLIENT"]._serialized_options = b'\010\001\312\363\030\017:\rRouter Client'
_CONFIG_DEVICECONFIG_ROLE.values_by_name["REPEATER"]._options = None
_CONFIG_DEVICECONFIG_ROLE.values_by_name["REPEATER"]._serialized_options = b'\010\001\312\363\030\235\001:\010RepeaterB\220\001Deprecated infrastructure role that creates gaps in the mesh rebroadcast chain. Switch this node to a Router-based role (Router or Router Late).'
_CONFIG_DEVICECONFIG_ROLE.values_by_name["TRACKER"]._options = None
_CONFIG_DEVICECONFIG_ROLE.values_by_name["TRACKER"]._serialized_options = b'\312\363\0307:\007TrackerB,Broadcasts GPS position packets as priority.'
_CONFIG_DEVICECONFIG_ROLE.values_by_name["SENSOR"]._options = None
_CONFIG_DEVICECONFIG_ROLE.values_by_name["SENSOR"]._serialized_options = b'\312\363\0303:\006SensorB)Broadcasts telemetry packets as priority.'
_CONFIG_DEVICECONFIG_ROLE.values_by_name["TAK"]._options = None
_CONFIG_DEVICECONFIG_ROLE.values_by_name["TAK"]._serialized_options = b'\312\363\030K:\003TAKBDOptimized for ATAK system communication, reduces routine broadcasts.'
_CONFIG_DEVICECONFIG_ROLE.values_by_name["CLIENT_HIDDEN"]._options = None
_CONFIG_DEVICECONFIG_ROLE.values_by_name["CLIENT_HIDDEN"]._serialized_options = b'\312\363\030T:\rClient HiddenBCDevice that only broadcasts as needed for stealth or power savings.'
_CONFIG_DEVICECONFIG_ROLE.values_by_name["LOST_AND_FOUND"]._options = None
_CONFIG_DEVICECONFIG_ROLE.values_by_name["LOST_AND_FOUND"]._serialized_options = b'\312\363\030m:\016Lost and FoundB[Broadcasts location as message to default channel regularly to assist with device recovery.'
_CONFIG_DEVICECONFIG_ROLE.values_by_name["TAK_TRACKER"]._options = None
_CONFIG_DEVICECONFIG_ROLE.values_by_name["TAK_TRACKER"]._serialized_options = b'\312\363\030S:\013TAK TrackerBDEnables automatic TAK PLI broadcasts and reduces routine broadcasts.'
_CONFIG_DEVICECONFIG_ROLE.values_by_name["ROUTER_LATE"]._options = None
_CONFIG_DEVICECONFIG_ROLE.values_by_name["ROUTER_LATE"]._serialized_options = b'\312\363\030\245\001:\013Router LateB\225\001Infrastructure node that always rebroadcasts packets once but only after all other modes. Visible in Nodes list. Not a good choice for rooftop nodes.'
_CONFIG_DEVICECONFIG_ROLE.values_by_name["CLIENT_BASE"]._options = None
_CONFIG_DEVICECONFIG_ROLE.values_by_name["CLIENT_BASE"]._serialized_options = b'\312\363\030\220\001:\013Client BaseB\200\001Rooftop or attic node that rebroadcasts like Router Late for packets from or to favorited nodes, and like Client for all others.'
_CONFIG_DEVICECONFIG_REBROADCASTMODE.values_by_name["ALL"]._options = None
_CONFIG_DEVICECONFIG_REBROADCASTMODE.values_by_name["ALL"]._serialized_options = b'\312\363\030~:\003AllBwRebroadcast any observed message, if it was on our private channel or from another channel with the same LoRa settings.'
_CONFIG_DEVICECONFIG_REBROADCASTMODE.values_by_name["ALL_SKIP_DECODING"]._options = None
_CONFIG_DEVICECONFIG_REBROADCASTMODE.values_by_name["ALL_SKIP_DECODING"]._serialized_options = b'\312\363\030~:\021All Skip DecodingBiBehaves as All. Skipping packet decoding applied only to the Repeater role, which is no longer supported.'
_CONFIG_DEVICECONFIG_REBROADCASTMODE.values_by_name["LOCAL_ONLY"]._options = None
_CONFIG_DEVICECONFIG_REBROADCASTMODE.values_by_name["LOCAL_ONLY"]._serialized_options = b'\312\363\030\271\001:\nLocal OnlyB\252\001Ignores observed messages from foreign meshes that are open or those which it cannot decrypt. Only rebroadcasts messages on the node\'s local primary / secondary channels.'
_CONFIG_DEVICECONFIG_REBROADCASTMODE.values_by_name["KNOWN_ONLY"]._options = None
_CONFIG_DEVICECONFIG_REBROADCASTMODE.values_by_name["KNOWN_ONLY"]._serialized_options = b'\312\363\030\264\001:\nKnown OnlyB\245\001Ignores observed messages from foreign meshes like Local Only, but takes it a step further by also ignoring messages from nodes not already in the node\'s known list.'
_CONFIG_DEVICECONFIG_REBROADCASTMODE.values_by_name["NONE"]._options = None
_CONFIG_DEVICECONFIG_REBROADCASTMODE.values_by_name["NONE"]._serialized_options = b'\312\363\030n:\004NoneBfInhibits all rebroadcasts, like the Client Mute role. Not allowed on the Router and Router Late roles.'
_CONFIG_DEVICECONFIG_REBROADCASTMODE.values_by_name["CORE_PORTNUMS_ONLY"]._options = None
_CONFIG_DEVICECONFIG_REBROADCASTMODE.values_by_name["CORE_PORTNUMS_ONLY"]._serialized_options = b'\312\363\030\373\001:\022Core Portnums OnlyB\344\001Ignores packets on non-core portnums such as Range Test, PAX Counter and ATAK, and does not rebroadcast them. Core portnums include Text, Position, NodeInfo, Telemetry, Routing, Admin, Waypoint, Traceroute and Store and Forward.'
_CONFIG_DEVICECONFIG.fields_by_name['role']._options = None
_CONFIG_DEVICECONFIG.fields_by_name['role']._serialized_options = b'\312\363\030\r:\013Device Role'
_CONFIG_DEVICECONFIG.fields_by_name['serial_enabled']._options = None
_CONFIG_DEVICECONFIG.fields_by_name['serial_enabled']._serialized_options = b'\030\001'
_CONFIG_DEVICECONFIG.fields_by_name['button_gpio']._options = None
_CONFIG_DEVICECONFIG.fields_by_name['button_gpio']._serialized_options = b'\312\363\030\\:\013Button GPIOBMGPIO pin for the user button, can be remapped on boards with multiple buttons'
_CONFIG_DEVICECONFIG.fields_by_name['buzzer_gpio']._options = None
_CONFIG_DEVICECONFIG.fields_by_name['buzzer_gpio']._serialized_options = b'\312\363\030*:\013Buzzer GPIOB\033GPIO pin for the PWM buzzer'
_CONFIG_DEVICECONFIG.fields_by_name['rebroadcast_mode']._options = None
_CONFIG_DEVICECONFIG.fields_by_name['rebroadcast_mode']._serialized_options = b'\312\363\030\022:\020Rebroadcast Mode'
_CONFIG_DEVICECONFIG.fields_by_name['node_info_broadcast_secs']._options = None
_CONFIG_DEVICECONFIG.fields_by_name['node_info_broadcast_secs']._serialized_options = b'\312\363\030t\031\000\000\000\000\000 \254@*\001s:\034Node Info Broadcast IntervalBHHow often node information is sent. Defaults to 3 hours, minimum 1 hour.'
_CONFIG_DEVICECONFIG.fields_by_name['double_tap_as_button_press']._options = None
_CONFIG_DEVICECONFIG.fields_by_name['double_tap_as_button_press']._serialized_options = b'\312\363\030\\:\024Double Tap as ButtonBDTreat double tap on supported accelerometers as a user button press.'
_CONFIG_DEVICECONFIG.fields_by_name['is_managed']._options = None
_CONFIG_DEVICECONFIG.fields_by_name['is_managed']._serialized_options = b'\030\001'
_CONFIG_DEVICECONFIG.fields_by_name['disable_triple_click']._options = None
_CONFIG_DEVICECONFIG.fields_by_name['disable_triple_click']._serialized_options = b'\312\363\030G:\024Disable Triple ClickB/Disables the user button triple-press shortcut.'
_CONFIG_DEVICECONFIG.fields_by_name['tzdef']._options = None
_CONFIG_DEVICECONFIG.fields_by_name['tzdef']._serialized_options = b'\312\363\030-:\tTime ZoneB POSIX timezone definition string'
_CONFIG_DEVICECONFIG.fields_by_name['led_heartbeat_disabled']._options = None
_CONFIG_DEVICECONFIG.fields_by_name['led_heartbeat_disabled']._serialized_options = b'\312\363\030\237\001:\025Disable LED HeartbeatB\205\001Turns off the blinking LED on the device. On most devices this is one of up to 4 LEDs; the charger and GPS LEDs are not controllable.'
_CONFIG_DEVICECONFIG.fields_by_name['buzzer_mode']._options = None
_CONFIG_DEVICECONFIG.fields_by_name['buzzer_mode']._serialized_options = b'\312\363\030\007R\0052.7.0'
_CONFIG_POSITIONCONFIG_POSITIONFLAGS.values_by_name["ALTITUDE"]._options = None
_CONFIG_POSITIONCONFIG_POSITIONFLAGS.values_by_name["ALTITUDE"]._serialized_options = b'\312\363\030Q:\010AltitudeBEInclude an altitude value in position reports, when one is available.'
_CONFIG_POSITIONCONFIG_POSITIONFLAGS.values_by_name["ALTITUDE_MSL"]._options = None
_CONFIG_POSITIONCONFIG_POSITIONFLAGS.values_by_name["ALTITUDE_MSL"]._serialized_options = b'\312\363\030\034:\032Altitude is Mean Sea Level'
_CONFIG_POSITIONCONFIG_POSITIONFLAGS.values_by_name["GEOIDAL_SEPARATION"]._options = None
_CONFIG_POSITIONCONFIG_POSITIONFLAGS.values_by_name["GEOIDAL_SEPARATION"]._serialized_options = b'\312\363\030\035:\033Altitude Geoidal Separation'
_CONFIG_POSITIONCONFIG_POSITIONFLAGS.values_by_name["DOP"]._options = None
_CONFIG_POSITIONCONFIG_POSITIONFLAGS.values_by_name["DOP"]._serialized_options = b'\312\363\030H:\003DOPBAInclude the dilution of precision value. PDOP is used by default.'
_CONFIG_POSITIONCONFIG_POSITIONFLAGS.values_by_name["HVDOP"]._options = None
_CONFIG_POSITIONCONFIG_POSITIONFLAGS.values_by_name["HVDOP"]._serialized_options = b'\312\363\030Q:\013HDOP / VDOPBBIf DOP is set, send separate HDOP and VDOP values instead of PDOP.'
_CONFIG_POSITIONCONFIG_POSITIONFLAGS.values_by_name["SATINVIEW"]._options = None
_CONFIG_POSITIONCONFIG_POSITIONFLAGS.values_by_name["SATINVIEW"]._serialized_options = b'\312\363\030\026:\024Number of satellites'
_CONFIG_POSITIONCONFIG_POSITIONFLAGS.values_by_name["SEQ_NO"]._options = None
_CONFIG_POSITIONCONFIG_POSITIONFLAGS.values_by_name["SEQ_NO"]._serialized_options = b'\312\363\030\021:\017Sequence number'
_CONFIG_POSITIONCONFIG_POSITIONFLAGS.values_by_name["TIMESTAMP"]._options = None
_CONFIG_POSITIONCONFIG_POSITIONFLAGS.values_by_name["TIMESTAMP"]._serialized_options = b'\312\363\030\013:\tTimestamp'
_CONFIG_POSITIONCONFIG_POSITIONFLAGS.values_by_name["HEADING"]._options = None
_CONFIG_POSITIONCONFIG_POSITIONFLAGS.values_by_name["HEADING"]._serialized_options = b'\312\363\030\021:\017Vehicle heading'
_CONFIG_POSITIONCONFIG_POSITIONFLAGS.values_by_name["SPEED"]._options = None
_CONFIG_POSITIONCONFIG_POSITIONFLAGS.values_by_name["SPEED"]._serialized_options = b'\312\363\030\017:\rVehicle speed'
_CONFIG_POSITIONCONFIG_GPSMODE.values_by_name["DISABLED"]._options = None
_CONFIG_POSITIONCONFIG_GPSMODE.values_by_name["DISABLED"]._serialized_options = b'\312\363\030\n:\010Disabled'
_CONFIG_POSITIONCONFIG_GPSMODE.values_by_name["ENABLED"]._options = None
_CONFIG_POSITIONCONFIG_GPSMODE.values_by_name["ENABLED"]._serialized_options = b'\312\363\030\t:\007Enabled'
_CONFIG_POSITIONCONFIG_GPSMODE.values_by_name["NOT_PRESENT"]._options = None
_CONFIG_POSITIONCONFIG_GPSMODE.values_by_name["NOT_PRESENT"]._serialized_options = b'\312\363\030\r:\013Not Present'
_CONFIG_POSITIONCONFIG.fields_by_name['position_broadcast_secs']._options = None
_CONFIG_POSITIONCONFIG.fields_by_name['position_broadcast_secs']._serialized_options = b'\312\363\030T*\001s:\022Broadcast IntervalB;The longest a node will go without broadcasting a position.'
_CONFIG_POSITIONCONFIG.fields_by_name['position_broadcast_smart_enabled']._options = None
_CONFIG_POSITIONCONFIG.fields_by_name['position_broadcast_smart_enabled']._serialized_options = b'\312\363\030\020:\016Smart Position'
_CONFIG_POSITIONCONFIG.fields_by_name['fixed_position']._options = None
_CONFIG_POSITIONCONFIG.fields_by_name['fixed_position']._serialized_options = b'\312\363\030\224\001:\016Fixed PositionB\201\001The last known latitude, longitude and altitude are broadcast over the mesh on the position interval, rather than a live GPS fix.'
_CONFIG_POSITIONCONFIG.fields_by_name['gps_enabled']._options = None
_CONFIG_POSITIONCONFIG.fields_by_name['gps_enabled']._serialized_options = b'\030\001'
_CONFIG_POSITIONCONFIG.fields_by_name['gps_update_interval']._options = None
_CONFIG_POSITIONCONFIG.fields_by_name['gps_update_interval']._serialized_options = b'\312\363\030=*\001s:\017Update IntervalB\'How often to try to get a GPS position.'
_CONFIG_POSITIONCONFIG.fields_by_name['gps_attempt_time']._options = None
_CONFIG_POSITIONCONFIG.fields_by_name['gps_attempt_time']._serialized_options = b'\030\001'
_CONFIG_POSITIONCONFIG.fields_by_name['position_flags']._options = None
_CONFIG_POSITIONCONFIG.fields_by_name['position_flags']._serialized_options = b'\312\363\030N:\016Position FlagsB<Optional fields to include when assembling position messages'
_CONFIG_POSITIONCONFIG.fields_by_name['rx_gpio']._options = None
_CONFIG_POSITIONCONFIG.fields_by_name['rx_gpio']._serialized_options = b'\312\363\030)\010\001:\020GPS Receive GPIOB\023GPIO pin for GPS RX'
_CONFIG_POSITIONCONFIG.fields_by_name['tx_gpio']._options = None
_CONFIG_POSITIONCONFIG.fields_by_name['tx_gpio']._serialized_options = b'\312\363\030*\010\001:\021GPS Transmit GPIOB\023GPIO pin for GPS TX'
_CONFIG_POSITIONCONFIG.fields_by_name['broadcast_smart_minimum_distance']._options = None
_CONFIG_POSITIONCONFIG.fields_by_name['broadcast_smart_minimum_distance']._serialized_options = b'\312\363\030f*\001m:\020Minimum DistanceBOThe minimum change in distance before a smart position broadcast is considered.'
_CONFIG_POSITIONCONFIG.fields_by_name['broadcast_smart_minimum_interval_secs']._options = None
_CONFIG_POSITIONCONFIG.fields_by_name['broadcast_smart_minimum_interval_secs']._serialized_options = b'\312\363\030m*\001s:\020Minimum IntervalBVThe shortest interval between position updates once the minimum distance has been met.'
_CONFIG_POSITIONCONFIG.fields_by_name['gps_en_gpio']._options = None
_CONFIG_POSITIONCONFIG.fields_by_name['gps_en_gpio']._serialized_options = b'\312\363\030,\010\001:\017GPS Enable GPIOB\027GPIO pin for GPS enable'
_CONFIG_POSITIONCONFIG.fields_by_name['gps_mode']._options = None
_CONFIG_POSITIONCONFIG.fields_by_name['gps_mode']._serialized_options = b'\312\363\030\n:\010GPS Mode'
_CONFIG_POWERCONFIG.fields_by_name['is_power_saving']._options = None
_CONFIG_POWERCONFIG.fields_by_name['is_power_saving']._serialized_options = b'\312\363\030\366\001:\014Power SavingB\345\001Will sleep everything as much as possible, for the Tracker and Sensor roles this also includes the LoRa radio. Don\'t use this setting if you want to use your device with the phone apps or are using a device without a user button.'
_CONFIG_POWERCONFIG.fields_by_name['on_battery_shutdown_after_secs']._options = None
_CONFIG_POWERCONFIG.fields_by_name['on_battery_shutdown_after_secs']._serialized_options = b'\312\363\030\237\001*\001s:\026Shutdown on Power LossB\201\001How long after external power is removed before the device powers off. Zero to disable; values under 30 seconds are raised to 30.'
_CONFIG_POWERCONFIG.fields_by_name['adc_multiplier_override']._options = None
_CONFIG_POWERCONFIG.fields_by_name['adc_multiplier_override']._serialized_options = b'\312\363\030\016:\014ADC Override'
_CONFIG_POWERCONFIG.fields_by_name['wait_bluetooth_secs']._options = None
_CONFIG_POWERCONFIG.fields_by_name['wait_bluetooth_secs']._serialized_options = b'\312\363\030 *\001s:\033Wait for Bluetooth Duration'
_CONFIG_NETWORKCONFIG_IPV4CONFIG.fields_by_name['ip']._options = None
_CONFIG_NETWORKCONFIG_IPV4CONFIG.fields_by_name['ip']._serialized_options = b'\312\363\030\004:\002IP'
_CONFIG_NETWORKCONFIG_IPV4CONFIG.fields_by_name['gateway']._options = None
_CONFIG_NETWORKCONFIG_IPV4CONFIG.fields_by_name['gateway']._serialized_options = b'\312\363\030\t:\007Gateway'
_CONFIG_NETWORKCONFIG_IPV4CONFIG.fields_by_name['subnet']._options = None
_CONFIG_NETWORKCONFIG_IPV4CONFIG.fields_by_name['subnet']._serialized_options = b'\312\363\030\010:\006Subnet'
_CONFIG_NETWORKCONFIG_IPV4CONFIG.fields_by_name['dns']._options = None
_CONFIG_NETWORKCONFIG_IPV4CONFIG.fields_by_name['dns']._serialized_options = b'\312\363\030\005:\003DNS'
_CONFIG_NETWORKCONFIG_ADDRESSMODE.values_by_name["DHCP"]._options = None
_CONFIG_NETWORKCONFIG_ADDRESSMODE.values_by_name["DHCP"]._serialized_options = b'\312\363\030\006:\004DHCP'
_CONFIG_NETWORKCONFIG_ADDRESSMODE.values_by_name["STATIC"]._options = None
_CONFIG_NETWORKCONFIG_ADDRESSMODE.values_by_name["STATIC"]._serialized_options = b'\312\363\030\010:\006Static'
_CONFIG_NETWORKCONFIG_PROTOCOLFLAGS.values_by_name["NO_BROADCAST"]._options = None
_CONFIG_NETWORKCONFIG_PROTOCOLFLAGS.values_by_name["NO_BROADCAST"]._serialized_options = b'\312\363\030\006:\004None'
_CONFIG_NETWORKCONFIG_PROTOCOLFLAGS.values_by_name["UDP_BROADCAST"]._options = None
_CONFIG_NETWORKCONFIG_PROTOCOLFLAGS.values_by_name["UDP_BROADCAST"]._serialized_options = b'\312\363\030\017:\rUDP Broadcast'
_CONFIG_NETWORKCONFIG.fields_by_name['wifi_enabled']._options = None
_CONFIG_NETWORKCONFIG.fields_by_name['wifi_enabled']._serialized_options = b'\312\363\030O:\014WiFi EnabledB?Enabling WiFi will disable the Bluetooth connection to the app.'
_CONFIG_NETWORKCONFIG.fields_by_name['wifi_ssid']._options = None
_CONFIG_NETWORKCONFIG.fields_by_name['wifi_ssid']._serialized_options = b'\312\363\030\':\004SSIDB\037WiFi network name to connect to'
_CONFIG_NETWORKCONFIG.fields_by_name['wifi_psk']._options = None
_CONFIG_NETWORKCONFIG.fields_by_name['wifi_psk']._serialized_options = b'\312\363\030,:\010PasswordB WiFi password for authentication'
_CONFIG_NETWORKCONFIG.fields_by_name['ntp_server']._options = None
_CONFIG_NETWORKCONFIG.fields_by_name['ntp_server']._serialized_options = b'\312\363\030E:\nNTP ServerB7NTP server address. Defaults to meshtastic.pool.ntp.org'
_CONFIG_NETWORKCONFIG.fields_by_name['eth_enabled']._options = None
_CONFIG_NETWORKCONFIG.fields_by_name['eth_enabled']._serialized_options = b'\312\363\030h:\020Ethernet EnabledBTOn ESP32 boards, enabling Ethernet will disable the Bluetooth connection to the app.'
_CONFIG_NETWORKCONFIG.fields_by_name['address_mode']._options = None
_CONFIG_NETWORKCONFIG.fields_by_name['address_mode']._serialized_options = b'\312\363\030\016:\014Address Mode'
_CONFIG_NETWORKCONFIG.fields_by_name['rsyslog_server']._options = None
_CONFIG_NETWORKCONFIG.fields_by_name['rsyslog_server']._serialized_options = b'\312\363\030\020:\016Rsyslog Server'
_CONFIG_NETWORKCONFIG.fields_by_name['enabled_protocols']._options = None
_CONFIG_NETWORKCONFIG.fields_by_name['enabled_protocols']._serialized_options = b'\312\363\030W:\021Enabled ProtocolsB;Enable broadcasting packets via UDP over the local network.R\0052.6.0'
_CONFIG_NETWORKCONFIG.fields_by_name['ipv6_enabled']._options = None
_CONFIG_NETWORKCONFIG.fields_by_name['ipv6_enabled']._serialized_options = b'\312\363\030\010R\0062.7.16'
_CONFIG_DISPLAYCONFIG_DISPLAYUNITS.values_by_name["METRIC"]._options = None
_CONFIG_DISPLAYCONFIG_DISPLAYUNITS.values_by_name["METRIC"]._serialized_options = b'\312\363\030\010:\006Metric'
_CONFIG_DISPLAYCONFIG_DISPLAYUNITS.values_by_name["IMPERIAL"]._options = None
_CONFIG_DISPLAYCONFIG_DISPLAYUNITS.values_by_name["IMPERIAL"]._serialized_options = b'\312\363\030\n:\010Imperial'
_CONFIG_DISPLAYCONFIG_OLEDTYPE.values_by_name["OLED_AUTO"]._options = None
_CONFIG_DISPLAYCONFIG_OLEDTYPE.values_by_name["OLED_AUTO"]._serialized_options = b'\312\363\030\026:\024Detect Automatically'
_CONFIG_DISPLAYCONFIG_OLEDTYPE.values_by_name["OLED_SSD1306"]._options = None
_CONFIG_DISPLAYCONFIG_OLEDTYPE.values_by_name["OLED_SSD1306"]._serialized_options = b'\312\363\030\t:\007SSD1306'
_CONFIG_DISPLAYCONFIG_OLEDTYPE.values_by_name["OLED_SH1106"]._options = None
_CONFIG_DISPLAYCONFIG_OLEDTYPE.values_by_name["OLED_SH1106"]._serialized_options = b'\312\363\030\010:\006SH1106'
_CONFIG_DISPLAYCONFIG_OLEDTYPE.values_by_name["OLED_SH1107"]._options = None
_CONFIG_DISPLAYCONFIG_OLEDTYPE.values_by_name["OLED_SH1107"]._serialized_options = b'\312\363\030\010:\006SH1107'
_CONFIG_DISPLAYCONFIG_OLEDTYPE.values_by_name["OLED_SH1107_128_128"]._options = None
_CONFIG_DISPLAYCONFIG_OLEDTYPE.values_by_name["OLED_SH1107_128_128"]._serialized_options = b'\312\363\030\020:\016SH1107 128x128'
_CONFIG_DISPLAYCONFIG_OLEDTYPE.values_by_name["OLED_SH1107_ROTATED"]._options = None
_CONFIG_DISPLAYCONFIG_OLEDTYPE.values_by_name["OLED_SH1107_ROTATED"]._serialized_options = b'\312\363\030\020:\016SH1107 Rotated'
_CONFIG_DISPLAYCONFIG_DISPLAYMODE.values_by_name["DEFAULT"]._options = None
_CONFIG_DISPLAYCONFIG_DISPLAYMODE.values_by_name["DEFAULT"]._serialized_options = b'\312\363\030\036:\034Default 128x64 screen layout'
_CONFIG_DISPLAYCONFIG_DISPLAYMODE.values_by_name["TWOCOLOR"]._options = None
_CONFIG_DISPLAYCONFIG_DISPLAYMODE.values_by_name["TWOCOLOR"]._serialized_options = b'\312\363\030 :\036Optimized for 2 color displays'
_CONFIG_DISPLAYCONFIG_DISPLAYMODE.values_by_name["INVERTED"]._options = None
_CONFIG_DISPLAYCONFIG_DISPLAYMODE.values_by_name["INVERTED"]._serialized_options = b'\312\363\030\':%Inverted top bar for 2 color displays'
_CONFIG_DISPLAYCONFIG_DISPLAYMODE.values_by_name["COLOR"]._options = None
_CONFIG_DISPLAYCONFIG_DISPLAYMODE.values_by_name["COLOR"]._serialized_options = b'\312\363\030\031:\027TFT Full Color Displays'
_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION.values_by_name["DEGREES_0"]._options = None
_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION.values_by_name["DEGREES_0"]._serialized_options = b'\312\363\030\005:\0030\302\260'
_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION.values_by_name["DEGREES_90"]._options = None
_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION.values_by_name["DEGREES_90"]._serialized_options = b'\312\363\030\006:\00490\302\260'
_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION.values_by_name["DEGREES_180"]._options = None
_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION.values_by_name["DEGREES_180"]._serialized_options = b'\312\363\030\007:\005180\302\260'
_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION.values_by_name["DEGREES_270"]._options = None
_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION.values_by_name["DEGREES_270"]._serialized_options = b'\312\363\030\007:\005270\302\260'
_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION.values_by_name["DEGREES_0_INVERTED"]._options = None
_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION.values_by_name["DEGREES_0_INVERTED"]._serialized_options = b'\312\363\030\016:\0140\302\260 Inverted'
_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION.values_by_name["DEGREES_90_INVERTED"]._options = None
_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION.values_by_name["DEGREES_90_INVERTED"]._serialized_options = b'\312\363\030\017:\r90\302\260 Inverted'
_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION.values_by_name["DEGREES_180_INVERTED"]._options = None
_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION.values_by_name["DEGREES_180_INVERTED"]._serialized_options = b'\312\363\030\020:\016180\302\260 Inverted'
_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION.values_by_name["DEGREES_270_INVERTED"]._options = None
_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION.values_by_name["DEGREES_270_INVERTED"]._serialized_options = b'\312\363\030\020:\016270\302\260 Inverted'
_CONFIG_DISPLAYCONFIG.fields_by_name['screen_on_secs']._options = None
_CONFIG_DISPLAYCONFIG.fields_by_name['screen_on_secs']._serialized_options = b'\312\363\030m*\001s:\rScreen on forBYHow long the screen remains on after the user button is pressed or messages are received.'
_CONFIG_DISPLAYCONFIG.fields_by_name['gps_format']._options = None
_CONFIG_DISPLAYCONFIG.fields_by_name['gps_format']._serialized_options = b'\030\001\312\363\030\010Z\0062.7.10'
_CONFIG_DISPLAYCONFIG.fields_by_name['auto_screen_carousel_secs']._options = None
_CONFIG_DISPLAYCONFIG.fields_by_name['auto_screen_carousel_secs']._serialized_options = b'\312\363\030g*\001s:\021Carousel IntervalBOAutomatically moves to the next screen page, like a carousel, on this interval.'
_CONFIG_DISPLAYCONFIG.fields_by_name['compass_north_top']._options = None
_CONFIG_DISPLAYCONFIG.fields_by_name['compass_north_top']._serialized_options = b'\030\001\312\363\030m:\022Always point northBPThe compass heading on the screen outside of the circle will always point north.Z\0052.7.1'
_CONFIG_DISPLAYCONFIG.fields_by_name['flip_screen']._options = None
_CONFIG_DISPLAYCONFIG.fields_by_name['flip_screen']._serialized_options = b'\312\363\030%:\013Flip ScreenB\026Flip screen vertically'
_CONFIG_DISPLAYCONFIG.fields_by_name['units']._options = None
_CONFIG_DISPLAYCONFIG.fields_by_name['units']._serialized_options = b'\312\363\0302:\rDisplay UnitsB!Units shown on the device screen.'
_CONFIG_DISPLAYCONFIG.fields_by_name['oled']._options = None
_CONFIG_DISPLAYCONFIG.fields_by_name['oled']._serialized_options = b'\312\363\0306:\tOLED TypeB)Override automatic OLED screen detection.'
_CONFIG_DISPLAYCONFIG.fields_by_name['displaymode']._options = None
_CONFIG_DISPLAYCONFIG.fields_by_name['displaymode']._serialized_options = b'\312\363\030/:\014Display ModeB\037Override default screen layout.'
_CONFIG_DISPLAYCONFIG.fields_by_name['heading_bold']._options = None
_CONFIG_DISPLAYCONFIG.fields_by_name['heading_bold']._serialized_options = b'\312\363\0304:\014Bold HeadingB$Bold the heading text on the screen.'
_CONFIG_DISPLAYCONFIG.fields_by_name['wake_on_tap_or_motion']._options = None
_CONFIG_DISPLAYCONFIG.fields_by_name['wake_on_tap_or_motion']._serialized_options = b'\312\363\030W:\034Wake Screen on tap or motionB7Requires that there be an accelerometer on your device.'
_CONFIG_DISPLAYCONFIG.fields_by_name['compass_orientation']._options = None
_CONFIG_DISPLAYCONFIG.fields_by_name['compass_orientation']._serialized_options = b'\312\363\030a:\023Compass OrientationBJIndicates how to rotate or invert the compass output for accurate display.'
_CONFIG_DISPLAYCONFIG.fields_by_name['use_12h_clock']._options = None
_CONFIG_DISPLAYCONFIG.fields_by_name['use_12h_clock']._serialized_options = b'\312\363\030A:\r12 Hour ClockB(Sets the screen clock format to 12-hour.R\0062.5.22'
_CONFIG_DISPLAYCONFIG.fields_by_name['use_long_node_name']._options = None
_CONFIG_DISPLAYCONFIG.fields_by_name['use_long_node_name']._serialized_options = b'\312\363\030\010R\0062.7.13'
_CONFIG_DISPLAYCONFIG.fields_by_name['enable_message_bubbles']._options = None
_CONFIG_DISPLAYCONFIG.fields_by_name['enable_message_bubbles']._serialized_options = b'\312\363\030\010R\0062.7.19'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["UNSET"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["UNSET"]._serialized_options = b'\312\363\030\025:\023Please set a region'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["US"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["US"]._serialized_options = b'\312\363\030\017:\rUnited States'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["EU_433"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["EU_433"]._serialized_options = b'\312\363\030\027:\025European Union 433MHz'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["EU_868"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["EU_868"]._serialized_options = b'\312\363\030\027:\025European Union 868MHz'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["CN"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["CN"]._serialized_options = b'\312\363\030\007:\005China'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["JP"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["JP"]._serialized_options = b'\312\363\030\007:\005Japan'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["ANZ"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["ANZ"]._serialized_options = b'\312\363\030\031:\027Australia / New Zealand'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["KR"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["KR"]._serialized_options = b'\312\363\030\007:\005Korea'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["TW"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["TW"]._serialized_options = b'\312\363\030\010:\006Taiwan'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["RU"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["RU"]._serialized_options = b'\312\363\030\010:\006Russia'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["IN"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["IN"]._serialized_options = b'\312\363\030\007:\005India'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["NZ_865"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["NZ_865"]._serialized_options = b'\312\363\030\024:\022New Zealand 865MHz'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["TH"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["TH"]._serialized_options = b'\312\363\030\n:\010Thailand'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["LORA_24"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["LORA_24"]._serialized_options = b'\312\363\030\t:\0072.4 GHz'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["UA_433"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["UA_433"]._serialized_options = b'\312\363\030\020:\016Ukraine 433MHz'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["UA_868"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["UA_868"]._serialized_options = b'\010\001\312\363\030\020:\016Ukraine 868MHz'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["MY_433"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["MY_433"]._serialized_options = b'\312\363\030\021:\017Malaysia 433MHz'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["MY_919"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["MY_919"]._serialized_options = b'\312\363\030\021:\017Malaysia 919MHz'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["SG_923"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["SG_923"]._serialized_options = b'\312\363\030\022:\020Singapore 923MHz'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["PH_433"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["PH_433"]._serialized_options = b'\312\363\030\024:\022Philippines 433MHz'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["PH_868"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["PH_868"]._serialized_options = b'\312\363\030\024:\022Philippines 868MHz'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["PH_915"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["PH_915"]._serialized_options = b'\312\363\030\024:\022Philippines 915MHz'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["ANZ_433"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["ANZ_433"]._serialized_options = b'\312\363\030 :\036Australia / New Zealand 433MHz'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["KZ_433"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["KZ_433"]._serialized_options = b'\312\363\030\023:\021Kazakhstan 433MHz'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["KZ_863"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["KZ_863"]._serialized_options = b'\312\363\030\023:\021Kazakhstan 863MHz'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["NP_865"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["NP_865"]._serialized_options = b'\312\363\030\016:\014Nepal 865MHz'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["BR_902"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["BR_902"]._serialized_options = b'\312\363\030\017:\rBrazil 902MHz'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["ITU1_2M"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["ITU1_2M"]._serialized_options = b'\312\363\030\033:\031ITU Region 1 / Amateur 2m'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["ITU2_2M"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["ITU2_2M"]._serialized_options = b'\312\363\030\033:\031ITU Region 2 / Amateur 2m'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["EU_866"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["EU_866"]._serialized_options = b'\312\363\030\027:\025European Union 866MHz'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["EU_874"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["EU_874"]._serialized_options = b'\312\363\030\027:\025European Union 874MHz'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["EU_917"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["EU_917"]._serialized_options = b'\312\363\030\027:\025European Union 917MHz'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["EU_N_868"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["EU_N_868"]._serialized_options = b'\312\363\030 :\036European Union 868MHz (Narrow)'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["ITU3_2M"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["ITU3_2M"]._serialized_options = b'\312\363\030\033:\031ITU Region 3 / Amateur 2m'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["ITU1_70CM"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["ITU1_70CM"]._serialized_options = b'\312\363\030\035:\033ITU Region 1 / Amateur 70cm'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["ITU2_70CM"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["ITU2_70CM"]._serialized_options = b'\312\363\030\035:\033ITU Region 2 / Amateur 70cm'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["ITU3_70CM"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["ITU3_70CM"]._serialized_options = b'\312\363\030\035:\033ITU Region 3 / Amateur 70cm'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["ITU2_125CM"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["ITU2_125CM"]._serialized_options = b'\312\363\030\036:\034ITU Region 2 / Amateur 1.25m'
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["LONG_FAST"]._options = None
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["LONG_FAST"]._serialized_options = b'\312\363\030%:\021Long Range - FastJ\020longfast|default'
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["LONG_SLOW"]._options = None
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["LONG_SLOW"]._serialized_options = b'\010\001\312\363\030\023:\021Long Range - Slow'
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["VERY_LONG_SLOW"]._options = None
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["VERY_LONG_SLOW"]._serialized_options = b'\010\001\312\363\030\030:\026Very Long Range - Slow'
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["MEDIUM_SLOW"]._options = None
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["MEDIUM_SLOW"]._serialized_options = b'\312\363\030\025:\023Medium Range - Slow'
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["MEDIUM_FAST"]._options = None
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["MEDIUM_FAST"]._serialized_options = b'\312\363\030\025:\023Medium Range - Fast'
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["SHORT_SLOW"]._options = None
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["SHORT_SLOW"]._serialized_options = b'\312\363\030\024:\022Short Range - Slow'
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["SHORT_FAST"]._options = None
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["SHORT_FAST"]._serialized_options = b'\312\363\030\024:\022Short Range - Fast'
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["LONG_MODERATE"]._options = None
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["LONG_MODERATE"]._serialized_options = b'\312\363\030\027:\025Long Range - Moderate'
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["SHORT_TURBO"]._options = None
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["SHORT_TURBO"]._serialized_options = b'\312\363\030\025:\023Short Range - Turbo'
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["LONG_TURBO"]._options = None
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["LONG_TURBO"]._serialized_options = b'\312\363\030\024:\022Long Range - Turbo'
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["LITE_FAST"]._options = None
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["LITE_FAST"]._serialized_options = b'\312\363\030\r:\013Lite - Fast'
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["LITE_SLOW"]._options = None
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["LITE_SLOW"]._serialized_options = b'\312\363\030\r:\013Lite - Slow'
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["NARROW_FAST"]._options = None
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["NARROW_FAST"]._serialized_options = b'\312\363\030\017:\rNarrow - Fast'
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["NARROW_SLOW"]._options = None
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["NARROW_SLOW"]._serialized_options = b'\312\363\030\017:\rNarrow - Slow'
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["TINY_FAST"]._options = None
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["TINY_FAST"]._serialized_options = b'\312\363\030\r:\013Tiny - Fast'
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["TINY_SLOW"]._options = None
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["TINY_SLOW"]._serialized_options = b'\312\363\030\r:\013Tiny - Slow'
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["MEDIUM_TURBO"]._options = None
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["MEDIUM_TURBO"]._serialized_options = b'\312\363\030\026:\024Medium Range - Turbo'
_CONFIG_LORACONFIG.fields_by_name['use_preset']._options = None
_CONFIG_LORACONFIG.fields_by_name['use_preset']._serialized_options = b'\312\363\030h:\nUse PresetBZUse the modem preset settings instead of a manual bandwidth, spread factor and coding rate'
_CONFIG_LORACONFIG.fields_by_name['modem_preset']._options = None
_CONFIG_LORACONFIG.fields_by_name['modem_preset']._serialized_options = b'\312\363\030\t:\007Presets'
_CONFIG_LORACONFIG.fields_by_name['bandwidth']._options = None
_CONFIG_LORACONFIG.fields_by_name['bandwidth']._serialized_options = b'\312\363\030\020*\003kHz:\tBandwidth'
_CONFIG_LORACONFIG.fields_by_name['spread_factor']._options = None
_CONFIG_LORACONFIG.fields_by_name['spread_factor']._serialized_options = b'\312\363\030Z\031\000\000\000\000\000\000\024@!\000\000\000\000\000\000(@:\rSpread FactorB7Number of chirps per symbol, as 2 raised to this value.'
_CONFIG_LORACONFIG.fields_by_name['coding_rate']._options = None
_CONFIG_LORACONFIG.fields_by_name['coding_rate']._serialized_options = b'\312\363\030\210\001:\013Coding RateByError-correction redundancy, as the denominator of 4/n. Higher values survive noisier links but make every packet longer.'
_CONFIG_LORACONFIG.fields_by_name['region']._options = None
_CONFIG_LORACONFIG.fields_by_name['region']._serialized_options = b'\312\363\0309:\006RegionB/The region where you will be using your radios.'
_CONFIG_LORACONFIG.fields_by_name['hop_limit']._options = None
_CONFIG_LORACONFIG.fields_by_name['hop_limit']._serialized_options = b'\312\363\030\204\001\031\000\000\000\000\000\000\000\000!\000\000\000\000\000\000\034@:\tHop LimitBIHow many times a message may be repeated before it stops being forwarded.J\032hops|ttl|range|rebroadcast'
_CONFIG_LORACONFIG.fields_by_name['tx_enabled']._options = None
_CONFIG_LORACONFIG.fields_by_name['tx_enabled']._serialized_options = b'\312\363\030l:\020Transmit EnabledBXAllow the LoRa radio to transmit. Turn off while hot-swapping antennas or bench testing.'
_CONFIG_LORACONFIG.fields_by_name['tx_power']._options = None
_CONFIG_LORACONFIG.fields_by_name['tx_power']._serialized_options = b'\312\363\030\266\001\031\000\000\000\000\000\000\000\000!\000\000\000\000\000\000B@*\003dBm:\016Transmit PowerBxRadio transmit power. Leave at zero to use the highest level legal for the region, which is what most radios should use.J\023tx|power|dbm|output'
_CONFIG_LORACONFIG.fields_by_name['channel_num']._options = None
_CONFIG_LORACONFIG.fields_by_name['channel_num']._serialized_options = b'\312\363\030\275\001:\016Frequency SlotB\252\001Your node\'s operating frequency is calculated based on the region, modem preset, and this field. When 0, the region picks the slot, usually from the primary channel name.'
_CONFIG_LORACONFIG.fields_by_name['override_duty_cycle']._options = None
_CONFIG_LORACONFIG.fields_by_name['override_duty_cycle']._serialized_options = b'\312\363\030\025:\023Override Duty Cycle'
_CONFIG_LORACONFIG.fields_by_name['sx126x_rx_boosted_gain']._options = None
_CONFIG_LORACONFIG.fields_by_name['sx126x_rx_boosted_gain']._serialized_options = b'\312\363\030F:\017RX Boosted GainB3Enable RX boosted gain mode on SX126x-based radios.'
_CONFIG_LORACONFIG.fields_by_name['override_frequency']._options = None
_CONFIG_LORACONFIG.fields_by_name['override_frequency']._serialized_options = b'\312\363\030\031*\003MHz:\022Frequency Override'
_CONFIG_LORACONFIG.fields_by_name['pa_fan_disabled']._options = None
_CONFIG_LORACONFIG.fields_by_name['pa_fan_disabled']._serialized_options = b'\312\363\030\021:\017PA Fan Disabled'
_CONFIG_LORACONFIG.fields_by_name['ignore_incoming']._options = None
_CONFIG_LORACONFIG.fields_by_name['ignore_incoming']._serialized_options = b'\312\363\030\021:\017Ignore Incoming'
_CONFIG_LORACONFIG.fields_by_name['ignore_mqtt']._options = None
_CONFIG_LORACONFIG.fields_by_name['ignore_mqtt']._serialized_options = b'\312\363\030`:\013Ignore MQTTBQIgnore packets received over LoRa that travelled via MQTT anywhere on their path.'
_CONFIG_LORACONFIG.fields_by_name['config_ok_to_mqtt']._options = None
_CONFIG_LORACONFIG.fields_by_name['config_ok_to_mqtt']._serialized_options = b'\312\363\030\014:\nOK to MQTT'
_CONFIG_LORACONFIG.fields_by_name['fem_lna_mode']._options = None
_CONFIG_LORACONFIG.fields_by_name['fem_lna_mode']._serialized_options = b'\312\363\030\010R\0062.7.20'
_CONFIG_BLUETOOTHCONFIG_PAIRINGMODE.values_by_name["RANDOM_PIN"]._options = None
_CONFIG_BLUETOOTHCONFIG_PAIRINGMODE.values_by_name["RANDOM_PIN"]._serialized_options = b'\312\363\030\014:\nRandom PIN'
_CONFIG_BLUETOOTHCONFIG_PAIRINGMODE.values_by_name["FIXED_PIN"]._options = None
_CONFIG_BLUETOOTHCONFIG_PAIRINGMODE.values_by_name["FIXED_PIN"]._serialized_options = b'\312\363\030\013:\tFixed PIN'
_CONFIG_BLUETOOTHCONFIG_PAIRINGMODE.values_by_name["NO_PIN"]._options = None
_CONFIG_BLUETOOTHCONFIG_PAIRINGMODE.values_by_name["NO_PIN"]._serialized_options = b'\312\363\030\025:\023No PIN (Just Works)'
_CONFIG_BLUETOOTHCONFIG.fields_by_name['enabled']._options = None
_CONFIG_BLUETOOTHCONFIG.fields_by_name['enabled']._serialized_options = b'\312\363\0303:\021Bluetooth EnabledB\036Enable Bluetooth on the device'
_CONFIG_BLUETOOTHCONFIG.fields_by_name['mode']._options = None
_CONFIG_BLUETOOTHCONFIG.fields_by_name['mode']._serialized_options = b'\312\363\030*:\014Pairing ModeB\032Bluetooth pairing strategy'
_CONFIG_BLUETOOTHCONFIG.fields_by_name['fixed_pin']._options = None
_CONFIG_BLUETOOTHCONFIG.fields_by_name['fixed_pin']._serialized_options = b'\312\363\030X:\tFixed PinBKFixed PIN for Bluetooth pairing. Used when pairing mode is set to fixed PIN'
_CONFIG_SECURITYCONFIG_PACKETSIGNATUREPOLICY.values_by_name["PACKET_SIGNATURE_POLICY_COMPATIBLE"]._options = None
_CONFIG_SECURITYCONFIG_PACKETSIGNATUREPOLICY.values_by_name["PACKET_SIGNATURE_POLICY_COMPATIBLE"]._serialized_options = b'\312\363\030\227\001:\034Compatible - Accept UnsignedBwAccept unsigned traffic for maximum compatibility. A signature that can be checked and is wrong still drops the packet.'
_CONFIG_SECURITYCONFIG_PACKETSIGNATUREPOLICY.values_by_name["PACKET_SIGNATURE_POLICY_BALANCED"]._options = None
_CONFIG_SECURITYCONFIG_PACKETSIGNATUREPOLICY.values_by_name["PACKET_SIGNATURE_POLICY_BALANCED"]._serialized_options = b'\312\363\030\200\001:\037Balanced - Prefer AuthenticatedB]Prefer authenticated packets, but still accept unsigned traffic from nodes not known to sign.'
_CONFIG_SECURITYCONFIG_PACKETSIGNATUREPOLICY.values_by_name["PACKET_SIGNATURE_POLICY_STRICT"]._options = None
_CONFIG_SECURITYCONFIG_PACKETSIGNATUREPOLICY.values_by_name["PACKET_SIGNATURE_POLICY_STRICT"]._serialized_options = b'\312\363\030\227\001:\037Strict - Require AuthenticationBtAccept only packets with a verified signature or successful PKI decryption. Packets from older nodes may be ignored.'
_CONFIG_SECURITYCONFIG.fields_by_name['public_key']._options = None
_CONFIG_SECURITYCONFIG.fields_by_name['public_key']._serialized_options = b'\312\363\030\202\001:\nPublic KeyBtGenerated from your private key and sent out to other nodes on the mesh to allow them to compute a shared secret key'
_CONFIG_SECURITYCONFIG.fields_by_name['private_key']._options = None
_CONFIG_SECURITYCONFIG.fields_by_name['private_key']._serialized_options = b'\312\363\030?:\013Private KeyB0Used to create a shared key with a remote device'
_CONFIG_SECURITYCONFIG.fields_by_name['admin_key']._options = None
_CONFIG_SECURITYCONFIG.fields_by_name['admin_key']._serialized_options = b'\312\363\030V:\tAdmin KeyBIPublic keys (up to three) authorized to send admin messages to this node.'
_CONFIG_SECURITYCONFIG.fields_by_name['is_managed']._options = None
_CONFIG_SECURITYCONFIG.fields_by_name['is_managed']._serialized_options = b'\312\363\030\210\001:\016Managed DeviceBvSettings are changed by a mesh administrator using an admin key, not from the local app. Needs at least one admin key.'
_CONFIG_SECURITYCONFIG.fields_by_name['serial_enabled']._options = None
_CONFIG_SECURITYCONFIG.fields_by_name['serial_enabled']._serialized_options = b'\312\363\0305:\016Serial ConsoleB#Serial Console over the Stream API.'
_CONFIG_SECURITYCONFIG.fields_by_name['debug_log_api_enabled']._options = None
_CONFIG_SECURITYCONFIG.fields_by_name['debug_log_api_enabled']._serialized_options = b'\312\363\030r:\nDebug LogsBdOutput live debug logging over serial, view and export position-redacted device logs over Bluetooth.'
_CONFIG_SECURITYCONFIG.fields_by_name['packet_signature_policy']._options = None
_CONFIG_SECURITYCONFIG.fields_by_name['packet_signature_policy']._serialized_options = b'\312\363\030\007R\0052.8.0'
_CONFIG._serialized_start=138
_CONFIG._serialized_end=17309
_CONFIG_DEVICECONFIG._serialized_start=767
_CONFIG_DEVICECONFIG._serialized_end=4735
_CONFIG_DEVICECONFIG_ROLE._serialized_start=1964
_CONFIG_DEVICECONFIG_ROLE._serialized_end=3483
_CONFIG_DEVICECONFIG_REBROADCASTMODE._serialized_start=3486
_CONFIG_DEVICECONFIG_REBROADCASTMODE._serialized_end=4628
_CONFIG_DEVICECONFIG_BUZZERMODE._serialized_start=4630
_CONFIG_DEVICECONFIG_BUZZERMODE._serialized_end=4735
_CONFIG_POSITIONCONFIG._serialized_start=4738
_CONFIG_POSITIONCONFIG._serialized_end=6693
_CONFIG_POSITIONCONFIG_POSITIONFLAGS._serialized_start=5984
_CONFIG_POSITIONCONFIG_POSITIONFLAGS._serialized_end=6588
_CONFIG_POSITIONCONFIG_GPSMODE._serialized_start=6590
_CONFIG_POSITIONCONFIG_GPSMODE._serialized_end=6693
_CONFIG_POWERCONFIG._serialized_start=6696
_CONFIG_POWERCONFIG._serialized_end=7437
_CONFIG_NETWORKCONFIG._serialized_start=7440
_CONFIG_NETWORKCONFIG._serialized_end=8567
_CONFIG_NETWORKCONFIG_IPV4CONFIG._serialized_start=8297
_CONFIG_NETWORKCONFIG_IPV4CONFIG._serialized_end=8417
_CONFIG_NETWORKCONFIG_ADDRESSMODE._serialized_start=8419
_CONFIG_NETWORKCONFIG_ADDRESSMODE._serialized_end=8480
_CONFIG_NETWORKCONFIG_PROTOCOLFLAGS._serialized_start=8482
_CONFIG_NETWORKCONFIG_PROTOCOLFLAGS._serialized_end=8567
_CONFIG_DISPLAYCONFIG._serialized_start=8570
_CONFIG_DISPLAYCONFIG._serialized_end=11054
_CONFIG_DISPLAYCONFIG_DEPRECATEDGPSCOORDINATEFORMAT._serialized_start=10153
_CONFIG_DISPLAYCONFIG_DEPRECATEDGPSCOORDINATEFORMAT._serialized_end=10196
_CONFIG_DISPLAYCONFIG_DISPLAYUNITS._serialized_start=10198
_CONFIG_DISPLAYCONFIG_DISPLAYUNITS._serialized_end=10268
_CONFIG_DISPLAYCONFIG_OLEDTYPE._serialized_start=10271
_CONFIG_DISPLAYCONFIG_OLEDTYPE._serialized_end=10513
_CONFIG_DISPLAYCONFIG_DISPLAYMODE._serialized_start=10516
_CONFIG_DISPLAYCONFIG_DISPLAYMODE._serialized_end=10731
_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION._serialized_start=10734
_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION._serialized_end=11054
_CONFIG_LORACONFIG._serialized_start=11057
_CONFIG_LORACONFIG._serialized_end=15305
_CONFIG_LORACONFIG_REGIONCODE._serialized_start=13099
_CONFIG_LORACONFIG_REGIONCODE._serialized_end=14513
_CONFIG_LORACONFIG_MODEMPRESET._serialized_start=14516
_CONFIG_LORACONFIG_MODEMPRESET._serialized_end=15245
_CONFIG_LORACONFIG_FEM_LNA_MODE._serialized_start=15247
_CONFIG_LORACONFIG_FEM_LNA_MODE._serialized_end=15305
_CONFIG_BLUETOOTHCONFIG._serialized_start=15308
_CONFIG_BLUETOOTHCONFIG._serialized_end=15751
_CONFIG_BLUETOOTHCONFIG_PAIRINGMODE._serialized_start=15633
_CONFIG_BLUETOOTHCONFIG_PAIRINGMODE._serialized_end=15751
_CONFIG_SECURITYCONFIG._serialized_start=15754
_CONFIG_SECURITYCONFIG._serialized_end=17270
_CONFIG_SECURITYCONFIG_PACKETSIGNATUREPOLICY._serialized_start=16676
_CONFIG_SECURITYCONFIG_PACKETSIGNATUREPOLICY._serialized_end=17270
_CONFIG_SESSIONKEYCONFIG._serialized_start=17272
_CONFIG_SESSIONKEYCONFIG._serialized_end=17290
# @@protoc_insertion_point(module_scope)
+410
View File
@@ -0,0 +1,410 @@
from meshtastic.protobuf import device_ui_pb2 as _device_ui_pb2
from meshtastic.protobuf import field_metadata_pb2 as _field_metadata_pb2
from google.protobuf.internal import containers as _containers
from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Mapping, Optional as _Optional, Union as _Union
DESCRIPTOR: _descriptor.FileDescriptor
class Config(_message.Message):
__slots__ = ["bluetooth", "device", "device_ui", "display", "lora", "network", "position", "power", "security", "sessionkey"]
class BluetoothConfig(_message.Message):
__slots__ = ["enabled", "fixed_pin", "mode"]
class PairingMode(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
ENABLED_FIELD_NUMBER: _ClassVar[int]
FIXED_PIN: Config.BluetoothConfig.PairingMode
FIXED_PIN_FIELD_NUMBER: _ClassVar[int]
MODE_FIELD_NUMBER: _ClassVar[int]
NO_PIN: Config.BluetoothConfig.PairingMode
RANDOM_PIN: Config.BluetoothConfig.PairingMode
enabled: bool
fixed_pin: int
mode: Config.BluetoothConfig.PairingMode
def __init__(self, enabled: bool = ..., mode: _Optional[_Union[Config.BluetoothConfig.PairingMode, str]] = ..., fixed_pin: _Optional[int] = ...) -> None: ...
class DeviceConfig(_message.Message):
__slots__ = ["button_gpio", "buzzer_gpio", "buzzer_mode", "disable_triple_click", "double_tap_as_button_press", "is_managed", "led_heartbeat_disabled", "node_info_broadcast_secs", "rebroadcast_mode", "role", "serial_enabled", "tzdef"]
class BuzzerMode(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class RebroadcastMode(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class Role(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
ALL: Config.DeviceConfig.RebroadcastMode
ALL_ENABLED: Config.DeviceConfig.BuzzerMode
ALL_SKIP_DECODING: Config.DeviceConfig.RebroadcastMode
BUTTON_GPIO_FIELD_NUMBER: _ClassVar[int]
BUZZER_GPIO_FIELD_NUMBER: _ClassVar[int]
BUZZER_MODE_FIELD_NUMBER: _ClassVar[int]
CLIENT: Config.DeviceConfig.Role
CLIENT_BASE: Config.DeviceConfig.Role
CLIENT_HIDDEN: Config.DeviceConfig.Role
CLIENT_MUTE: Config.DeviceConfig.Role
CORE_PORTNUMS_ONLY: Config.DeviceConfig.RebroadcastMode
DIRECT_MSG_ONLY: Config.DeviceConfig.BuzzerMode
DISABLED: Config.DeviceConfig.BuzzerMode
DISABLE_TRIPLE_CLICK_FIELD_NUMBER: _ClassVar[int]
DOUBLE_TAP_AS_BUTTON_PRESS_FIELD_NUMBER: _ClassVar[int]
IS_MANAGED_FIELD_NUMBER: _ClassVar[int]
KNOWN_ONLY: Config.DeviceConfig.RebroadcastMode
LED_HEARTBEAT_DISABLED_FIELD_NUMBER: _ClassVar[int]
LOCAL_ONLY: Config.DeviceConfig.RebroadcastMode
LOST_AND_FOUND: Config.DeviceConfig.Role
NODE_INFO_BROADCAST_SECS_FIELD_NUMBER: _ClassVar[int]
NONE: Config.DeviceConfig.RebroadcastMode
NOTIFICATIONS_ONLY: Config.DeviceConfig.BuzzerMode
REBROADCAST_MODE_FIELD_NUMBER: _ClassVar[int]
REPEATER: Config.DeviceConfig.Role
ROLE_FIELD_NUMBER: _ClassVar[int]
ROUTER: Config.DeviceConfig.Role
ROUTER_CLIENT: Config.DeviceConfig.Role
ROUTER_LATE: Config.DeviceConfig.Role
SENSOR: Config.DeviceConfig.Role
SERIAL_ENABLED_FIELD_NUMBER: _ClassVar[int]
SYSTEM_ONLY: Config.DeviceConfig.BuzzerMode
TAK: Config.DeviceConfig.Role
TAK_TRACKER: Config.DeviceConfig.Role
TRACKER: Config.DeviceConfig.Role
TZDEF_FIELD_NUMBER: _ClassVar[int]
button_gpio: int
buzzer_gpio: int
buzzer_mode: Config.DeviceConfig.BuzzerMode
disable_triple_click: bool
double_tap_as_button_press: bool
is_managed: bool
led_heartbeat_disabled: bool
node_info_broadcast_secs: int
rebroadcast_mode: Config.DeviceConfig.RebroadcastMode
role: Config.DeviceConfig.Role
serial_enabled: bool
tzdef: str
def __init__(self, role: _Optional[_Union[Config.DeviceConfig.Role, str]] = ..., serial_enabled: bool = ..., button_gpio: _Optional[int] = ..., buzzer_gpio: _Optional[int] = ..., rebroadcast_mode: _Optional[_Union[Config.DeviceConfig.RebroadcastMode, str]] = ..., node_info_broadcast_secs: _Optional[int] = ..., double_tap_as_button_press: bool = ..., is_managed: bool = ..., disable_triple_click: bool = ..., tzdef: _Optional[str] = ..., led_heartbeat_disabled: bool = ..., buzzer_mode: _Optional[_Union[Config.DeviceConfig.BuzzerMode, str]] = ...) -> None: ...
class DisplayConfig(_message.Message):
__slots__ = ["auto_screen_carousel_secs", "compass_north_top", "compass_orientation", "displaymode", "enable_message_bubbles", "flip_screen", "gps_format", "heading_bold", "oled", "screen_on_secs", "units", "use_12h_clock", "use_long_node_name", "wake_on_tap_or_motion"]
class CompassOrientation(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class DeprecatedGpsCoordinateFormat(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class DisplayMode(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class DisplayUnits(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class OledType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
AUTO_SCREEN_CAROUSEL_SECS_FIELD_NUMBER: _ClassVar[int]
COLOR: Config.DisplayConfig.DisplayMode
COMPASS_NORTH_TOP_FIELD_NUMBER: _ClassVar[int]
COMPASS_ORIENTATION_FIELD_NUMBER: _ClassVar[int]
DEFAULT: Config.DisplayConfig.DisplayMode
DEGREES_0: Config.DisplayConfig.CompassOrientation
DEGREES_0_INVERTED: Config.DisplayConfig.CompassOrientation
DEGREES_180: Config.DisplayConfig.CompassOrientation
DEGREES_180_INVERTED: Config.DisplayConfig.CompassOrientation
DEGREES_270: Config.DisplayConfig.CompassOrientation
DEGREES_270_INVERTED: Config.DisplayConfig.CompassOrientation
DEGREES_90: Config.DisplayConfig.CompassOrientation
DEGREES_90_INVERTED: Config.DisplayConfig.CompassOrientation
DISPLAYMODE_FIELD_NUMBER: _ClassVar[int]
ENABLE_MESSAGE_BUBBLES_FIELD_NUMBER: _ClassVar[int]
FLIP_SCREEN_FIELD_NUMBER: _ClassVar[int]
GPS_FORMAT_FIELD_NUMBER: _ClassVar[int]
HEADING_BOLD_FIELD_NUMBER: _ClassVar[int]
IMPERIAL: Config.DisplayConfig.DisplayUnits
INVERTED: Config.DisplayConfig.DisplayMode
METRIC: Config.DisplayConfig.DisplayUnits
OLED_AUTO: Config.DisplayConfig.OledType
OLED_FIELD_NUMBER: _ClassVar[int]
OLED_SH1106: Config.DisplayConfig.OledType
OLED_SH1107: Config.DisplayConfig.OledType
OLED_SH1107_128_128: Config.DisplayConfig.OledType
OLED_SH1107_ROTATED: Config.DisplayConfig.OledType
OLED_SSD1306: Config.DisplayConfig.OledType
SCREEN_ON_SECS_FIELD_NUMBER: _ClassVar[int]
TWOCOLOR: Config.DisplayConfig.DisplayMode
UNITS_FIELD_NUMBER: _ClassVar[int]
UNUSED: Config.DisplayConfig.DeprecatedGpsCoordinateFormat
USE_12H_CLOCK_FIELD_NUMBER: _ClassVar[int]
USE_LONG_NODE_NAME_FIELD_NUMBER: _ClassVar[int]
WAKE_ON_TAP_OR_MOTION_FIELD_NUMBER: _ClassVar[int]
auto_screen_carousel_secs: int
compass_north_top: bool
compass_orientation: Config.DisplayConfig.CompassOrientation
displaymode: Config.DisplayConfig.DisplayMode
enable_message_bubbles: bool
flip_screen: bool
gps_format: Config.DisplayConfig.DeprecatedGpsCoordinateFormat
heading_bold: bool
oled: Config.DisplayConfig.OledType
screen_on_secs: int
units: Config.DisplayConfig.DisplayUnits
use_12h_clock: bool
use_long_node_name: bool
wake_on_tap_or_motion: bool
def __init__(self, screen_on_secs: _Optional[int] = ..., gps_format: _Optional[_Union[Config.DisplayConfig.DeprecatedGpsCoordinateFormat, str]] = ..., auto_screen_carousel_secs: _Optional[int] = ..., compass_north_top: bool = ..., flip_screen: bool = ..., units: _Optional[_Union[Config.DisplayConfig.DisplayUnits, str]] = ..., oled: _Optional[_Union[Config.DisplayConfig.OledType, str]] = ..., displaymode: _Optional[_Union[Config.DisplayConfig.DisplayMode, str]] = ..., heading_bold: bool = ..., wake_on_tap_or_motion: bool = ..., compass_orientation: _Optional[_Union[Config.DisplayConfig.CompassOrientation, str]] = ..., use_12h_clock: bool = ..., use_long_node_name: bool = ..., enable_message_bubbles: bool = ...) -> None: ...
class LoRaConfig(_message.Message):
__slots__ = ["bandwidth", "channel_num", "coding_rate", "config_ok_to_mqtt", "fem_lna_mode", "frequency_offset", "hop_limit", "ignore_incoming", "ignore_mqtt", "modem_preset", "override_duty_cycle", "override_frequency", "pa_fan_disabled", "region", "serial_hal_only", "spread_factor", "sx126x_rx_boosted_gain", "tx_enabled", "tx_power", "use_preset"]
class FEM_LNA_Mode(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class ModemPreset(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class RegionCode(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
ANZ: Config.LoRaConfig.RegionCode
ANZ_433: Config.LoRaConfig.RegionCode
BANDWIDTH_FIELD_NUMBER: _ClassVar[int]
BR_902: Config.LoRaConfig.RegionCode
CHANNEL_NUM_FIELD_NUMBER: _ClassVar[int]
CN: Config.LoRaConfig.RegionCode
CODING_RATE_FIELD_NUMBER: _ClassVar[int]
CONFIG_OK_TO_MQTT_FIELD_NUMBER: _ClassVar[int]
DISABLED: Config.LoRaConfig.FEM_LNA_Mode
ENABLED: Config.LoRaConfig.FEM_LNA_Mode
EU_433: Config.LoRaConfig.RegionCode
EU_866: Config.LoRaConfig.RegionCode
EU_868: Config.LoRaConfig.RegionCode
EU_874: Config.LoRaConfig.RegionCode
EU_917: Config.LoRaConfig.RegionCode
EU_N_868: Config.LoRaConfig.RegionCode
FEM_LNA_MODE_FIELD_NUMBER: _ClassVar[int]
FREQUENCY_OFFSET_FIELD_NUMBER: _ClassVar[int]
HOP_LIMIT_FIELD_NUMBER: _ClassVar[int]
IGNORE_INCOMING_FIELD_NUMBER: _ClassVar[int]
IGNORE_MQTT_FIELD_NUMBER: _ClassVar[int]
IN: Config.LoRaConfig.RegionCode
ITU1_2M: Config.LoRaConfig.RegionCode
ITU1_70CM: Config.LoRaConfig.RegionCode
ITU2_125CM: Config.LoRaConfig.RegionCode
ITU2_2M: Config.LoRaConfig.RegionCode
ITU2_70CM: Config.LoRaConfig.RegionCode
ITU3_2M: Config.LoRaConfig.RegionCode
ITU3_70CM: Config.LoRaConfig.RegionCode
JP: Config.LoRaConfig.RegionCode
KR: Config.LoRaConfig.RegionCode
KZ_433: Config.LoRaConfig.RegionCode
KZ_863: Config.LoRaConfig.RegionCode
LITE_FAST: Config.LoRaConfig.ModemPreset
LITE_SLOW: Config.LoRaConfig.ModemPreset
LONG_FAST: Config.LoRaConfig.ModemPreset
LONG_MODERATE: Config.LoRaConfig.ModemPreset
LONG_SLOW: Config.LoRaConfig.ModemPreset
LONG_TURBO: Config.LoRaConfig.ModemPreset
LORA_24: Config.LoRaConfig.RegionCode
MEDIUM_FAST: Config.LoRaConfig.ModemPreset
MEDIUM_SLOW: Config.LoRaConfig.ModemPreset
MEDIUM_TURBO: Config.LoRaConfig.ModemPreset
MODEM_PRESET_FIELD_NUMBER: _ClassVar[int]
MY_433: Config.LoRaConfig.RegionCode
MY_919: Config.LoRaConfig.RegionCode
NARROW_FAST: Config.LoRaConfig.ModemPreset
NARROW_SLOW: Config.LoRaConfig.ModemPreset
NOT_PRESENT: Config.LoRaConfig.FEM_LNA_Mode
NP_865: Config.LoRaConfig.RegionCode
NZ_865: Config.LoRaConfig.RegionCode
OVERRIDE_DUTY_CYCLE_FIELD_NUMBER: _ClassVar[int]
OVERRIDE_FREQUENCY_FIELD_NUMBER: _ClassVar[int]
PA_FAN_DISABLED_FIELD_NUMBER: _ClassVar[int]
PH_433: Config.LoRaConfig.RegionCode
PH_868: Config.LoRaConfig.RegionCode
PH_915: Config.LoRaConfig.RegionCode
REGION_FIELD_NUMBER: _ClassVar[int]
RU: Config.LoRaConfig.RegionCode
SERIAL_HAL_ONLY_FIELD_NUMBER: _ClassVar[int]
SG_923: Config.LoRaConfig.RegionCode
SHORT_FAST: Config.LoRaConfig.ModemPreset
SHORT_SLOW: Config.LoRaConfig.ModemPreset
SHORT_TURBO: Config.LoRaConfig.ModemPreset
SPREAD_FACTOR_FIELD_NUMBER: _ClassVar[int]
SX126X_RX_BOOSTED_GAIN_FIELD_NUMBER: _ClassVar[int]
TH: Config.LoRaConfig.RegionCode
TINY_FAST: Config.LoRaConfig.ModemPreset
TINY_SLOW: Config.LoRaConfig.ModemPreset
TW: Config.LoRaConfig.RegionCode
TX_ENABLED_FIELD_NUMBER: _ClassVar[int]
TX_POWER_FIELD_NUMBER: _ClassVar[int]
UA_433: Config.LoRaConfig.RegionCode
UA_868: Config.LoRaConfig.RegionCode
UNSET: Config.LoRaConfig.RegionCode
US: Config.LoRaConfig.RegionCode
USE_PRESET_FIELD_NUMBER: _ClassVar[int]
VERY_LONG_SLOW: Config.LoRaConfig.ModemPreset
bandwidth: int
channel_num: int
coding_rate: int
config_ok_to_mqtt: bool
fem_lna_mode: Config.LoRaConfig.FEM_LNA_Mode
frequency_offset: float
hop_limit: int
ignore_incoming: _containers.RepeatedScalarFieldContainer[int]
ignore_mqtt: bool
modem_preset: Config.LoRaConfig.ModemPreset
override_duty_cycle: bool
override_frequency: float
pa_fan_disabled: bool
region: Config.LoRaConfig.RegionCode
serial_hal_only: bool
spread_factor: int
sx126x_rx_boosted_gain: bool
tx_enabled: bool
tx_power: int
use_preset: bool
def __init__(self, use_preset: bool = ..., modem_preset: _Optional[_Union[Config.LoRaConfig.ModemPreset, str]] = ..., bandwidth: _Optional[int] = ..., spread_factor: _Optional[int] = ..., coding_rate: _Optional[int] = ..., frequency_offset: _Optional[float] = ..., region: _Optional[_Union[Config.LoRaConfig.RegionCode, str]] = ..., hop_limit: _Optional[int] = ..., tx_enabled: bool = ..., tx_power: _Optional[int] = ..., channel_num: _Optional[int] = ..., override_duty_cycle: bool = ..., sx126x_rx_boosted_gain: bool = ..., override_frequency: _Optional[float] = ..., pa_fan_disabled: bool = ..., ignore_incoming: _Optional[_Iterable[int]] = ..., ignore_mqtt: bool = ..., config_ok_to_mqtt: bool = ..., fem_lna_mode: _Optional[_Union[Config.LoRaConfig.FEM_LNA_Mode, str]] = ..., serial_hal_only: bool = ...) -> None: ...
class NetworkConfig(_message.Message):
__slots__ = ["address_mode", "enabled_protocols", "eth_enabled", "ipv4_config", "ipv6_enabled", "ntp_server", "rsyslog_server", "wifi_enabled", "wifi_psk", "wifi_ssid"]
class AddressMode(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class ProtocolFlags(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class IpV4Config(_message.Message):
__slots__ = ["dns", "gateway", "ip", "subnet"]
DNS_FIELD_NUMBER: _ClassVar[int]
GATEWAY_FIELD_NUMBER: _ClassVar[int]
IP_FIELD_NUMBER: _ClassVar[int]
SUBNET_FIELD_NUMBER: _ClassVar[int]
dns: int
gateway: int
ip: int
subnet: int
def __init__(self, ip: _Optional[int] = ..., gateway: _Optional[int] = ..., subnet: _Optional[int] = ..., dns: _Optional[int] = ...) -> None: ...
ADDRESS_MODE_FIELD_NUMBER: _ClassVar[int]
DHCP: Config.NetworkConfig.AddressMode
ENABLED_PROTOCOLS_FIELD_NUMBER: _ClassVar[int]
ETH_ENABLED_FIELD_NUMBER: _ClassVar[int]
IPV4_CONFIG_FIELD_NUMBER: _ClassVar[int]
IPV6_ENABLED_FIELD_NUMBER: _ClassVar[int]
NO_BROADCAST: Config.NetworkConfig.ProtocolFlags
NTP_SERVER_FIELD_NUMBER: _ClassVar[int]
RSYSLOG_SERVER_FIELD_NUMBER: _ClassVar[int]
STATIC: Config.NetworkConfig.AddressMode
UDP_BROADCAST: Config.NetworkConfig.ProtocolFlags
WIFI_ENABLED_FIELD_NUMBER: _ClassVar[int]
WIFI_PSK_FIELD_NUMBER: _ClassVar[int]
WIFI_SSID_FIELD_NUMBER: _ClassVar[int]
address_mode: Config.NetworkConfig.AddressMode
enabled_protocols: int
eth_enabled: bool
ipv4_config: Config.NetworkConfig.IpV4Config
ipv6_enabled: bool
ntp_server: str
rsyslog_server: str
wifi_enabled: bool
wifi_psk: str
wifi_ssid: str
def __init__(self, wifi_enabled: bool = ..., wifi_ssid: _Optional[str] = ..., wifi_psk: _Optional[str] = ..., ntp_server: _Optional[str] = ..., eth_enabled: bool = ..., address_mode: _Optional[_Union[Config.NetworkConfig.AddressMode, str]] = ..., ipv4_config: _Optional[_Union[Config.NetworkConfig.IpV4Config, _Mapping]] = ..., rsyslog_server: _Optional[str] = ..., enabled_protocols: _Optional[int] = ..., ipv6_enabled: bool = ...) -> None: ...
class PositionConfig(_message.Message):
__slots__ = ["broadcast_smart_minimum_distance", "broadcast_smart_minimum_interval_secs", "fixed_position", "gps_attempt_time", "gps_en_gpio", "gps_enabled", "gps_mode", "gps_update_interval", "position_broadcast_secs", "position_broadcast_smart_enabled", "position_flags", "rx_gpio", "tx_gpio"]
class GpsMode(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class PositionFlags(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
ALTITUDE: Config.PositionConfig.PositionFlags
ALTITUDE_MSL: Config.PositionConfig.PositionFlags
BROADCAST_SMART_MINIMUM_DISTANCE_FIELD_NUMBER: _ClassVar[int]
BROADCAST_SMART_MINIMUM_INTERVAL_SECS_FIELD_NUMBER: _ClassVar[int]
DISABLED: Config.PositionConfig.GpsMode
DOP: Config.PositionConfig.PositionFlags
ENABLED: Config.PositionConfig.GpsMode
FIXED_POSITION_FIELD_NUMBER: _ClassVar[int]
GEOIDAL_SEPARATION: Config.PositionConfig.PositionFlags
GPS_ATTEMPT_TIME_FIELD_NUMBER: _ClassVar[int]
GPS_ENABLED_FIELD_NUMBER: _ClassVar[int]
GPS_EN_GPIO_FIELD_NUMBER: _ClassVar[int]
GPS_MODE_FIELD_NUMBER: _ClassVar[int]
GPS_UPDATE_INTERVAL_FIELD_NUMBER: _ClassVar[int]
HEADING: Config.PositionConfig.PositionFlags
HVDOP: Config.PositionConfig.PositionFlags
NOT_PRESENT: Config.PositionConfig.GpsMode
POSITION_BROADCAST_SECS_FIELD_NUMBER: _ClassVar[int]
POSITION_BROADCAST_SMART_ENABLED_FIELD_NUMBER: _ClassVar[int]
POSITION_FLAGS_FIELD_NUMBER: _ClassVar[int]
RX_GPIO_FIELD_NUMBER: _ClassVar[int]
SATINVIEW: Config.PositionConfig.PositionFlags
SEQ_NO: Config.PositionConfig.PositionFlags
SPEED: Config.PositionConfig.PositionFlags
TIMESTAMP: Config.PositionConfig.PositionFlags
TX_GPIO_FIELD_NUMBER: _ClassVar[int]
UNSET: Config.PositionConfig.PositionFlags
broadcast_smart_minimum_distance: int
broadcast_smart_minimum_interval_secs: int
fixed_position: bool
gps_attempt_time: int
gps_en_gpio: int
gps_enabled: bool
gps_mode: Config.PositionConfig.GpsMode
gps_update_interval: int
position_broadcast_secs: int
position_broadcast_smart_enabled: bool
position_flags: int
rx_gpio: int
tx_gpio: int
def __init__(self, position_broadcast_secs: _Optional[int] = ..., position_broadcast_smart_enabled: bool = ..., fixed_position: bool = ..., gps_enabled: bool = ..., gps_update_interval: _Optional[int] = ..., gps_attempt_time: _Optional[int] = ..., position_flags: _Optional[int] = ..., rx_gpio: _Optional[int] = ..., tx_gpio: _Optional[int] = ..., broadcast_smart_minimum_distance: _Optional[int] = ..., broadcast_smart_minimum_interval_secs: _Optional[int] = ..., gps_en_gpio: _Optional[int] = ..., gps_mode: _Optional[_Union[Config.PositionConfig.GpsMode, str]] = ...) -> None: ...
class PowerConfig(_message.Message):
__slots__ = ["adc_multiplier_override", "device_battery_ina_address", "is_power_saving", "ls_secs", "min_wake_secs", "on_battery_shutdown_after_secs", "powermon_enables", "sds_secs", "wait_bluetooth_secs"]
ADC_MULTIPLIER_OVERRIDE_FIELD_NUMBER: _ClassVar[int]
DEVICE_BATTERY_INA_ADDRESS_FIELD_NUMBER: _ClassVar[int]
IS_POWER_SAVING_FIELD_NUMBER: _ClassVar[int]
LS_SECS_FIELD_NUMBER: _ClassVar[int]
MIN_WAKE_SECS_FIELD_NUMBER: _ClassVar[int]
ON_BATTERY_SHUTDOWN_AFTER_SECS_FIELD_NUMBER: _ClassVar[int]
POWERMON_ENABLES_FIELD_NUMBER: _ClassVar[int]
SDS_SECS_FIELD_NUMBER: _ClassVar[int]
WAIT_BLUETOOTH_SECS_FIELD_NUMBER: _ClassVar[int]
adc_multiplier_override: float
device_battery_ina_address: int
is_power_saving: bool
ls_secs: int
min_wake_secs: int
on_battery_shutdown_after_secs: int
powermon_enables: int
sds_secs: int
wait_bluetooth_secs: int
def __init__(self, is_power_saving: bool = ..., on_battery_shutdown_after_secs: _Optional[int] = ..., adc_multiplier_override: _Optional[float] = ..., wait_bluetooth_secs: _Optional[int] = ..., sds_secs: _Optional[int] = ..., ls_secs: _Optional[int] = ..., min_wake_secs: _Optional[int] = ..., device_battery_ina_address: _Optional[int] = ..., powermon_enables: _Optional[int] = ...) -> None: ...
class SecurityConfig(_message.Message):
__slots__ = ["admin_channel_enabled", "admin_key", "debug_log_api_enabled", "is_managed", "packet_signature_policy", "private_key", "public_key", "serial_enabled"]
class PacketSignaturePolicy(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
ADMIN_CHANNEL_ENABLED_FIELD_NUMBER: _ClassVar[int]
ADMIN_KEY_FIELD_NUMBER: _ClassVar[int]
DEBUG_LOG_API_ENABLED_FIELD_NUMBER: _ClassVar[int]
IS_MANAGED_FIELD_NUMBER: _ClassVar[int]
PACKET_SIGNATURE_POLICY_BALANCED: Config.SecurityConfig.PacketSignaturePolicy
PACKET_SIGNATURE_POLICY_COMPATIBLE: Config.SecurityConfig.PacketSignaturePolicy
PACKET_SIGNATURE_POLICY_FIELD_NUMBER: _ClassVar[int]
PACKET_SIGNATURE_POLICY_STRICT: Config.SecurityConfig.PacketSignaturePolicy
PRIVATE_KEY_FIELD_NUMBER: _ClassVar[int]
PUBLIC_KEY_FIELD_NUMBER: _ClassVar[int]
SERIAL_ENABLED_FIELD_NUMBER: _ClassVar[int]
admin_channel_enabled: bool
admin_key: _containers.RepeatedScalarFieldContainer[bytes]
debug_log_api_enabled: bool
is_managed: bool
packet_signature_policy: Config.SecurityConfig.PacketSignaturePolicy
private_key: bytes
public_key: bytes
serial_enabled: bool
def __init__(self, public_key: _Optional[bytes] = ..., private_key: _Optional[bytes] = ..., admin_key: _Optional[_Iterable[bytes]] = ..., is_managed: bool = ..., serial_enabled: bool = ..., debug_log_api_enabled: bool = ..., admin_channel_enabled: bool = ..., packet_signature_policy: _Optional[_Union[Config.SecurityConfig.PacketSignaturePolicy, str]] = ...) -> None: ...
class SessionkeyConfig(_message.Message):
__slots__ = []
def __init__(self) -> None: ...
BLUETOOTH_FIELD_NUMBER: _ClassVar[int]
DEVICE_FIELD_NUMBER: _ClassVar[int]
DEVICE_UI_FIELD_NUMBER: _ClassVar[int]
DISPLAY_FIELD_NUMBER: _ClassVar[int]
LORA_FIELD_NUMBER: _ClassVar[int]
NETWORK_FIELD_NUMBER: _ClassVar[int]
POSITION_FIELD_NUMBER: _ClassVar[int]
POWER_FIELD_NUMBER: _ClassVar[int]
SECURITY_FIELD_NUMBER: _ClassVar[int]
SESSIONKEY_FIELD_NUMBER: _ClassVar[int]
bluetooth: Config.BluetoothConfig
device: Config.DeviceConfig
device_ui: _device_ui_pb2.DeviceUIConfig
display: Config.DisplayConfig
lora: Config.LoRaConfig
network: Config.NetworkConfig
position: Config.PositionConfig
power: Config.PowerConfig
security: Config.SecurityConfig
sessionkey: Config.SessionkeyConfig
def __init__(self, device: _Optional[_Union[Config.DeviceConfig, _Mapping]] = ..., position: _Optional[_Union[Config.PositionConfig, _Mapping]] = ..., power: _Optional[_Union[Config.PowerConfig, _Mapping]] = ..., network: _Optional[_Union[Config.NetworkConfig, _Mapping]] = ..., display: _Optional[_Union[Config.DisplayConfig, _Mapping]] = ..., lora: _Optional[_Union[Config.LoRaConfig, _Mapping]] = ..., bluetooth: _Optional[_Union[Config.BluetoothConfig, _Mapping]] = ..., security: _Optional[_Union[Config.SecurityConfig, _Mapping]] = ..., sessionkey: _Optional[_Union[Config.SessionkeyConfig, _Mapping]] = ..., device_ui: _Optional[_Union[_device_ui_pb2.DeviceUIConfig, _Mapping]] = ...) -> None: ...
@@ -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.internal import builder as _builder
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n+meshtastic/protobuf/connection_status.proto\x12\x13meshtastic.protobuf\"\xd5\x02\n\x16\x44\x65viceConnectionStatus\x12<\n\x04wifi\x18\x01 \x01(\x0b\x32).meshtastic.protobuf.WifiConnectionStatusH\x00\x88\x01\x01\x12\x44\n\x08\x65thernet\x18\x02 \x01(\x0b\x32-.meshtastic.protobuf.EthernetConnectionStatusH\x01\x88\x01\x01\x12\x46\n\tbluetooth\x18\x03 \x01(\x0b\x32..meshtastic.protobuf.BluetoothConnectionStatusH\x02\x88\x01\x01\x12@\n\x06serial\x18\x04 \x01(\x0b\x32+.meshtastic.protobuf.SerialConnectionStatusH\x03\x88\x01\x01\x42\x07\n\x05_wifiB\x0b\n\t_ethernetB\x0c\n\n_bluetoothB\t\n\x07_serial\"p\n\x14WifiConnectionStatus\x12<\n\x06status\x18\x01 \x01(\x0b\x32,.meshtastic.protobuf.NetworkConnectionStatus\x12\x0c\n\x04ssid\x18\x02 \x01(\t\x12\x0c\n\x04rssi\x18\x03 \x01(\x05\"X\n\x18\x45thernetConnectionStatus\x12<\n\x06status\x18\x01 \x01(\x0b\x32,.meshtastic.protobuf.NetworkConnectionStatus\"{\n\x17NetworkConnectionStatus\x12\x12\n\nip_address\x18\x01 \x01(\x07\x12\x14\n\x0cis_connected\x18\x02 \x01(\x08\x12\x19\n\x11is_mqtt_connected\x18\x03 \x01(\x08\x12\x1b\n\x13is_syslog_connected\x18\x04 \x01(\x08\"L\n\x19\x42luetoothConnectionStatus\x12\x0b\n\x03pin\x18\x01 \x01(\r\x12\x0c\n\x04rssi\x18\x02 \x01(\x05\x12\x14\n\x0cis_connected\x18\x03 \x01(\x08\"<\n\x16SerialConnectionStatus\x12\x0c\n\x04\x62\x61ud\x18\x01 \x01(\r\x12\x14\n\x0cis_connected\x18\x02 \x01(\x08\x42\x66\n\x14org.meshtastic.protoB\x10\x43onnStatusProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.connection_status_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\020ConnStatusProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_DEVICECONNECTIONSTATUS._serialized_start=69
_DEVICECONNECTIONSTATUS._serialized_end=410
_WIFICONNECTIONSTATUS._serialized_start=412
_WIFICONNECTIONSTATUS._serialized_end=524
_ETHERNETCONNECTIONSTATUS._serialized_start=526
_ETHERNETCONNECTIONSTATUS._serialized_end=614
_NETWORKCONNECTIONSTATUS._serialized_start=616
_NETWORKCONNECTIONSTATUS._serialized_end=739
_BLUETOOTHCONNECTIONSTATUS._serialized_start=741
_BLUETOOTHCONNECTIONSTATUS._serialized_end=817
_SERIALCONNECTIONSTATUS._serialized_start=819
_SERIALCONNECTIONSTATUS._serialized_end=879
# @@protoc_insertion_point(module_scope)
@@ -0,0 +1,63 @@
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from typing import ClassVar as _ClassVar, Mapping as _Mapping, Optional as _Optional, Union as _Union
DESCRIPTOR: _descriptor.FileDescriptor
class BluetoothConnectionStatus(_message.Message):
__slots__ = ["is_connected", "pin", "rssi"]
IS_CONNECTED_FIELD_NUMBER: _ClassVar[int]
PIN_FIELD_NUMBER: _ClassVar[int]
RSSI_FIELD_NUMBER: _ClassVar[int]
is_connected: bool
pin: int
rssi: int
def __init__(self, pin: _Optional[int] = ..., rssi: _Optional[int] = ..., is_connected: bool = ...) -> None: ...
class DeviceConnectionStatus(_message.Message):
__slots__ = ["bluetooth", "ethernet", "serial", "wifi"]
BLUETOOTH_FIELD_NUMBER: _ClassVar[int]
ETHERNET_FIELD_NUMBER: _ClassVar[int]
SERIAL_FIELD_NUMBER: _ClassVar[int]
WIFI_FIELD_NUMBER: _ClassVar[int]
bluetooth: BluetoothConnectionStatus
ethernet: EthernetConnectionStatus
serial: SerialConnectionStatus
wifi: WifiConnectionStatus
def __init__(self, wifi: _Optional[_Union[WifiConnectionStatus, _Mapping]] = ..., ethernet: _Optional[_Union[EthernetConnectionStatus, _Mapping]] = ..., bluetooth: _Optional[_Union[BluetoothConnectionStatus, _Mapping]] = ..., serial: _Optional[_Union[SerialConnectionStatus, _Mapping]] = ...) -> None: ...
class EthernetConnectionStatus(_message.Message):
__slots__ = ["status"]
STATUS_FIELD_NUMBER: _ClassVar[int]
status: NetworkConnectionStatus
def __init__(self, status: _Optional[_Union[NetworkConnectionStatus, _Mapping]] = ...) -> None: ...
class NetworkConnectionStatus(_message.Message):
__slots__ = ["ip_address", "is_connected", "is_mqtt_connected", "is_syslog_connected"]
IP_ADDRESS_FIELD_NUMBER: _ClassVar[int]
IS_CONNECTED_FIELD_NUMBER: _ClassVar[int]
IS_MQTT_CONNECTED_FIELD_NUMBER: _ClassVar[int]
IS_SYSLOG_CONNECTED_FIELD_NUMBER: _ClassVar[int]
ip_address: int
is_connected: bool
is_mqtt_connected: bool
is_syslog_connected: bool
def __init__(self, ip_address: _Optional[int] = ..., is_connected: bool = ..., is_mqtt_connected: bool = ..., is_syslog_connected: bool = ...) -> None: ...
class SerialConnectionStatus(_message.Message):
__slots__ = ["baud", "is_connected"]
BAUD_FIELD_NUMBER: _ClassVar[int]
IS_CONNECTED_FIELD_NUMBER: _ClassVar[int]
baud: int
is_connected: bool
def __init__(self, baud: _Optional[int] = ..., is_connected: bool = ...) -> None: ...
class WifiConnectionStatus(_message.Message):
__slots__ = ["rssi", "ssid", "status"]
RSSI_FIELD_NUMBER: _ClassVar[int]
SSID_FIELD_NUMBER: _ClassVar[int]
STATUS_FIELD_NUMBER: _ClassVar[int]
rssi: int
ssid: str
status: NetworkConnectionStatus
def __init__(self, status: _Optional[_Union[NetworkConnectionStatus, _Mapping]] = ..., ssid: _Optional[str] = ..., rssi: _Optional[int] = ...) -> None: ...
+42
View File
@@ -0,0 +1,42 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/protobuf/device_ui.proto
"""Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n#meshtastic/protobuf/device_ui.proto\x12\x13meshtastic.protobuf\"\xff\x05\n\x0e\x44\x65viceUIConfig\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x19\n\x11screen_brightness\x18\x02 \x01(\r\x12\x16\n\x0escreen_timeout\x18\x03 \x01(\r\x12\x13\n\x0bscreen_lock\x18\x04 \x01(\x08\x12\x15\n\rsettings_lock\x18\x05 \x01(\x08\x12\x10\n\x08pin_code\x18\x06 \x01(\r\x12)\n\x05theme\x18\x07 \x01(\x0e\x32\x1a.meshtastic.protobuf.Theme\x12\x15\n\ralert_enabled\x18\x08 \x01(\x08\x12\x16\n\x0e\x62\x61nner_enabled\x18\t \x01(\x08\x12\x14\n\x0cring_tone_id\x18\n \x01(\r\x12/\n\x08language\x18\x0b \x01(\x0e\x32\x1d.meshtastic.protobuf.Language\x12\x34\n\x0bnode_filter\x18\x0c \x01(\x0b\x32\x1f.meshtastic.protobuf.NodeFilter\x12:\n\x0enode_highlight\x18\r \x01(\x0b\x32\".meshtastic.protobuf.NodeHighlight\x12\x18\n\x10\x63\x61libration_data\x18\x0e \x01(\x0c\x12*\n\x08map_data\x18\x0f \x01(\x0b\x32\x18.meshtastic.protobuf.Map\x12\x36\n\x0c\x63ompass_mode\x18\x10 \x01(\x0e\x32 .meshtastic.protobuf.CompassMode\x12\x18\n\x10screen_rgb_color\x18\x11 \x01(\r\x12\x1b\n\x13is_clockface_analog\x18\x12 \x01(\x08\x12K\n\ngps_format\x18\x13 \x01(\x0e\x32\x37.meshtastic.protobuf.DeviceUIConfig.GpsCoordinateFormat\"V\n\x13GpsCoordinateFormat\x12\x07\n\x03\x44\x45\x43\x10\x00\x12\x07\n\x03\x44MS\x10\x01\x12\x07\n\x03UTM\x10\x02\x12\x08\n\x04MGRS\x10\x03\x12\x07\n\x03OLC\x10\x04\x12\x08\n\x04OSGR\x10\x05\x12\x07\n\x03MLS\x10\x06\"\xa7\x01\n\nNodeFilter\x12\x16\n\x0eunknown_switch\x18\x01 \x01(\x08\x12\x16\n\x0eoffline_switch\x18\x02 \x01(\x08\x12\x19\n\x11public_key_switch\x18\x03 \x01(\x08\x12\x11\n\thops_away\x18\x04 \x01(\x05\x12\x17\n\x0fposition_switch\x18\x05 \x01(\x08\x12\x11\n\tnode_name\x18\x06 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x07 \x01(\x05\"~\n\rNodeHighlight\x12\x13\n\x0b\x63hat_switch\x18\x01 \x01(\x08\x12\x17\n\x0fposition_switch\x18\x02 \x01(\x08\x12\x18\n\x10telemetry_switch\x18\x03 \x01(\x08\x12\x12\n\niaq_switch\x18\x04 \x01(\x08\x12\x11\n\tnode_name\x18\x05 \x01(\t\"=\n\x08GeoPoint\x12\x0c\n\x04zoom\x18\x01 \x01(\x05\x12\x10\n\x08latitude\x18\x02 \x01(\x05\x12\x11\n\tlongitude\x18\x03 \x01(\x05\"U\n\x03Map\x12+\n\x04home\x18\x01 \x01(\x0b\x32\x1d.meshtastic.protobuf.GeoPoint\x12\r\n\x05style\x18\x02 \x01(\t\x12\x12\n\nfollow_gps\x18\x03 \x01(\x08*>\n\x0b\x43ompassMode\x12\x0b\n\x07\x44YNAMIC\x10\x00\x12\x0e\n\nFIXED_RING\x10\x01\x12\x12\n\x0e\x46REEZE_HEADING\x10\x02*%\n\x05Theme\x12\x08\n\x04\x44\x41RK\x10\x00\x12\t\n\x05LIGHT\x10\x01\x12\x07\n\x03RED\x10\x02*\xe0\x02\n\x08Language\x12\x0b\n\x07\x45NGLISH\x10\x00\x12\n\n\x06\x46RENCH\x10\x01\x12\n\n\x06GERMAN\x10\x02\x12\x0b\n\x07ITALIAN\x10\x03\x12\x0e\n\nPORTUGUESE\x10\x04\x12\x0b\n\x07SPANISH\x10\x05\x12\x0b\n\x07SWEDISH\x10\x06\x12\x0b\n\x07\x46INNISH\x10\x07\x12\n\n\x06POLISH\x10\x08\x12\x0b\n\x07TURKISH\x10\t\x12\x0b\n\x07SERBIAN\x10\n\x12\x0b\n\x07RUSSIAN\x10\x0b\x12\t\n\x05\x44UTCH\x10\x0c\x12\t\n\x05GREEK\x10\r\x12\r\n\tNORWEGIAN\x10\x0e\x12\r\n\tSLOVENIAN\x10\x0f\x12\r\n\tUKRAINIAN\x10\x10\x12\r\n\tBULGARIAN\x10\x11\x12\t\n\x05\x43ZECH\x10\x12\x12\n\n\x06\x44\x41NISH\x10\x13\x12\r\n\tHUNGARIAN\x10\x14\x12\x0f\n\x0b\x41ZERBAIJANI\x10\x15\x12\x16\n\x12SIMPLIFIED_CHINESE\x10\x1e\x12\x17\n\x13TRADITIONAL_CHINESE\x10\x1f\x42\x64\n\x14org.meshtastic.protoB\x0e\x44\x65viceUIProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.device_ui_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\016DeviceUIProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_COMPASSMODE._serialized_start=1278
_COMPASSMODE._serialized_end=1340
_THEME._serialized_start=1342
_THEME._serialized_end=1379
_LANGUAGE._serialized_start=1382
_LANGUAGE._serialized_end=1734
_DEVICEUICONFIG._serialized_start=61
_DEVICEUICONFIG._serialized_end=828
_DEVICEUICONFIG_GPSCOORDINATEFORMAT._serialized_start=742
_DEVICEUICONFIG_GPSCOORDINATEFORMAT._serialized_end=828
_NODEFILTER._serialized_start=831
_NODEFILTER._serialized_end=998
_NODEHIGHLIGHT._serialized_start=1000
_NODEHIGHLIGHT._serialized_end=1126
_GEOPOINT._serialized_start=1128
_GEOPOINT._serialized_end=1189
_MAP._serialized_start=1191
_MAP._serialized_end=1276
# @@protoc_insertion_point(module_scope)
+148
View File
@@ -0,0 +1,148 @@
from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from typing import ClassVar as _ClassVar, Mapping as _Mapping, Optional as _Optional, Union as _Union
AZERBAIJANI: Language
BULGARIAN: Language
CZECH: Language
DANISH: Language
DARK: Theme
DESCRIPTOR: _descriptor.FileDescriptor
DUTCH: Language
DYNAMIC: CompassMode
ENGLISH: Language
FINNISH: Language
FIXED_RING: CompassMode
FREEZE_HEADING: CompassMode
FRENCH: Language
GERMAN: Language
GREEK: Language
HUNGARIAN: Language
ITALIAN: Language
LIGHT: Theme
NORWEGIAN: Language
POLISH: Language
PORTUGUESE: Language
RED: Theme
RUSSIAN: Language
SERBIAN: Language
SIMPLIFIED_CHINESE: Language
SLOVENIAN: Language
SPANISH: Language
SWEDISH: Language
TRADITIONAL_CHINESE: Language
TURKISH: Language
UKRAINIAN: Language
class DeviceUIConfig(_message.Message):
__slots__ = ["alert_enabled", "banner_enabled", "calibration_data", "compass_mode", "gps_format", "is_clockface_analog", "language", "map_data", "node_filter", "node_highlight", "pin_code", "ring_tone_id", "screen_brightness", "screen_lock", "screen_rgb_color", "screen_timeout", "settings_lock", "theme", "version"]
class GpsCoordinateFormat(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
ALERT_ENABLED_FIELD_NUMBER: _ClassVar[int]
BANNER_ENABLED_FIELD_NUMBER: _ClassVar[int]
CALIBRATION_DATA_FIELD_NUMBER: _ClassVar[int]
COMPASS_MODE_FIELD_NUMBER: _ClassVar[int]
DEC: DeviceUIConfig.GpsCoordinateFormat
DMS: DeviceUIConfig.GpsCoordinateFormat
GPS_FORMAT_FIELD_NUMBER: _ClassVar[int]
IS_CLOCKFACE_ANALOG_FIELD_NUMBER: _ClassVar[int]
LANGUAGE_FIELD_NUMBER: _ClassVar[int]
MAP_DATA_FIELD_NUMBER: _ClassVar[int]
MGRS: DeviceUIConfig.GpsCoordinateFormat
MLS: DeviceUIConfig.GpsCoordinateFormat
NODE_FILTER_FIELD_NUMBER: _ClassVar[int]
NODE_HIGHLIGHT_FIELD_NUMBER: _ClassVar[int]
OLC: DeviceUIConfig.GpsCoordinateFormat
OSGR: DeviceUIConfig.GpsCoordinateFormat
PIN_CODE_FIELD_NUMBER: _ClassVar[int]
RING_TONE_ID_FIELD_NUMBER: _ClassVar[int]
SCREEN_BRIGHTNESS_FIELD_NUMBER: _ClassVar[int]
SCREEN_LOCK_FIELD_NUMBER: _ClassVar[int]
SCREEN_RGB_COLOR_FIELD_NUMBER: _ClassVar[int]
SCREEN_TIMEOUT_FIELD_NUMBER: _ClassVar[int]
SETTINGS_LOCK_FIELD_NUMBER: _ClassVar[int]
THEME_FIELD_NUMBER: _ClassVar[int]
UTM: DeviceUIConfig.GpsCoordinateFormat
VERSION_FIELD_NUMBER: _ClassVar[int]
alert_enabled: bool
banner_enabled: bool
calibration_data: bytes
compass_mode: CompassMode
gps_format: DeviceUIConfig.GpsCoordinateFormat
is_clockface_analog: bool
language: Language
map_data: Map
node_filter: NodeFilter
node_highlight: NodeHighlight
pin_code: int
ring_tone_id: int
screen_brightness: int
screen_lock: bool
screen_rgb_color: int
screen_timeout: int
settings_lock: bool
theme: Theme
version: int
def __init__(self, version: _Optional[int] = ..., screen_brightness: _Optional[int] = ..., screen_timeout: _Optional[int] = ..., screen_lock: bool = ..., settings_lock: bool = ..., pin_code: _Optional[int] = ..., theme: _Optional[_Union[Theme, str]] = ..., alert_enabled: bool = ..., banner_enabled: bool = ..., ring_tone_id: _Optional[int] = ..., language: _Optional[_Union[Language, str]] = ..., node_filter: _Optional[_Union[NodeFilter, _Mapping]] = ..., node_highlight: _Optional[_Union[NodeHighlight, _Mapping]] = ..., calibration_data: _Optional[bytes] = ..., map_data: _Optional[_Union[Map, _Mapping]] = ..., compass_mode: _Optional[_Union[CompassMode, str]] = ..., screen_rgb_color: _Optional[int] = ..., is_clockface_analog: bool = ..., gps_format: _Optional[_Union[DeviceUIConfig.GpsCoordinateFormat, str]] = ...) -> None: ...
class GeoPoint(_message.Message):
__slots__ = ["latitude", "longitude", "zoom"]
LATITUDE_FIELD_NUMBER: _ClassVar[int]
LONGITUDE_FIELD_NUMBER: _ClassVar[int]
ZOOM_FIELD_NUMBER: _ClassVar[int]
latitude: int
longitude: int
zoom: int
def __init__(self, zoom: _Optional[int] = ..., latitude: _Optional[int] = ..., longitude: _Optional[int] = ...) -> None: ...
class Map(_message.Message):
__slots__ = ["follow_gps", "home", "style"]
FOLLOW_GPS_FIELD_NUMBER: _ClassVar[int]
HOME_FIELD_NUMBER: _ClassVar[int]
STYLE_FIELD_NUMBER: _ClassVar[int]
follow_gps: bool
home: GeoPoint
style: str
def __init__(self, home: _Optional[_Union[GeoPoint, _Mapping]] = ..., style: _Optional[str] = ..., follow_gps: bool = ...) -> None: ...
class NodeFilter(_message.Message):
__slots__ = ["channel", "hops_away", "node_name", "offline_switch", "position_switch", "public_key_switch", "unknown_switch"]
CHANNEL_FIELD_NUMBER: _ClassVar[int]
HOPS_AWAY_FIELD_NUMBER: _ClassVar[int]
NODE_NAME_FIELD_NUMBER: _ClassVar[int]
OFFLINE_SWITCH_FIELD_NUMBER: _ClassVar[int]
POSITION_SWITCH_FIELD_NUMBER: _ClassVar[int]
PUBLIC_KEY_SWITCH_FIELD_NUMBER: _ClassVar[int]
UNKNOWN_SWITCH_FIELD_NUMBER: _ClassVar[int]
channel: int
hops_away: int
node_name: str
offline_switch: bool
position_switch: bool
public_key_switch: bool
unknown_switch: bool
def __init__(self, unknown_switch: bool = ..., offline_switch: bool = ..., public_key_switch: bool = ..., hops_away: _Optional[int] = ..., position_switch: bool = ..., node_name: _Optional[str] = ..., channel: _Optional[int] = ...) -> None: ...
class NodeHighlight(_message.Message):
__slots__ = ["chat_switch", "iaq_switch", "node_name", "position_switch", "telemetry_switch"]
CHAT_SWITCH_FIELD_NUMBER: _ClassVar[int]
IAQ_SWITCH_FIELD_NUMBER: _ClassVar[int]
NODE_NAME_FIELD_NUMBER: _ClassVar[int]
POSITION_SWITCH_FIELD_NUMBER: _ClassVar[int]
TELEMETRY_SWITCH_FIELD_NUMBER: _ClassVar[int]
chat_switch: bool
iaq_switch: bool
node_name: str
position_switch: bool
telemetry_switch: bool
def __init__(self, chat_switch: bool = ..., position_switch: bool = ..., telemetry_switch: bool = ..., iaq_switch: bool = ..., node_name: _Optional[str] = ...) -> None: ...
class CompassMode(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class Theme(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class Language(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
@@ -0,0 +1,33 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/protobuf/deviceonly_legacy.proto
"""Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
from meshtastic.protobuf import deviceonly_pb2 as meshtastic_dot_protobuf_dot_deviceonly__pb2
from meshtastic.protobuf import telemetry_pb2 as meshtastic_dot_protobuf_dot_telemetry__pb2
from meshtastic.protobuf import nanopb_pb2 as meshtastic_dot_protobuf_dot_nanopb__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n+meshtastic/protobuf/deviceonly_legacy.proto\x12\x13meshtastic.protobuf\x1a$meshtastic/protobuf/deviceonly.proto\x1a#meshtastic/protobuf/telemetry.proto\x1a meshtastic/protobuf/nanopb.proto\"\xf7\x02\n\x13NodeInfoLite_Legacy\x12\x0b\n\x03num\x18\x01 \x01(\r\x12+\n\x04user\x18\x02 \x01(\x0b\x32\x1d.meshtastic.protobuf.UserLite\x12\x33\n\x08position\x18\x03 \x01(\x0b\x32!.meshtastic.protobuf.PositionLite\x12\x0b\n\x03snr\x18\x04 \x01(\x02\x12\x12\n\nlast_heard\x18\x05 \x01(\x07\x12:\n\x0e\x64\x65vice_metrics\x18\x06 \x01(\x0b\x32\".meshtastic.protobuf.DeviceMetrics\x12\x0f\n\x07\x63hannel\x18\x07 \x01(\r\x12\x10\n\x08via_mqtt\x18\x08 \x01(\x08\x12\x16\n\thops_away\x18\t \x01(\rH\x00\x88\x01\x01\x12\x13\n\x0bis_favorite\x18\n \x01(\x08\x12\x12\n\nis_ignored\x18\x0b \x01(\x08\x12\x10\n\x08next_hop\x18\x0c \x01(\r\x12\x10\n\x08\x62itfield\x18\r \x01(\rB\x0c\n\n_hops_away\"\x92\x01\n\x13NodeDatabase_Legacy\x12\x0f\n\x07version\x18\x01 \x01(\r\x12j\n\x05nodes\x18\x02 \x03(\x0b\x32(.meshtastic.protobuf.NodeInfoLite_LegacyB1\x92?.\x92\x01+std::vector<meshtastic_NodeInfoLite_Legacy>Bt\n\x14org.meshtastic.protoB\x10\x44\x65viceOnlyLegacyZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x92?\x0b\xc2\x01\x08<vector>b\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.deviceonly_legacy_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\020DeviceOnlyLegacyZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000\222?\013\302\001\010<vector>'
_NODEDATABASE_LEGACY.fields_by_name['nodes']._options = None
_NODEDATABASE_LEGACY.fields_by_name['nodes']._serialized_options = b'\222?.\222\001+std::vector<meshtastic_NodeInfoLite_Legacy>'
_NODEINFOLITE_LEGACY._serialized_start=178
_NODEINFOLITE_LEGACY._serialized_end=553
_NODEDATABASE_LEGACY._serialized_start=556
_NODEDATABASE_LEGACY._serialized_end=702
# @@protoc_insertion_point(module_scope)
@@ -0,0 +1,47 @@
from meshtastic.protobuf import deviceonly_pb2 as _deviceonly_pb2
from meshtastic.protobuf import telemetry_pb2 as _telemetry_pb2
from meshtastic.protobuf import nanopb_pb2 as _nanopb_pb2
from google.protobuf.internal import containers as _containers
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Mapping, Optional as _Optional, Union as _Union
DESCRIPTOR: _descriptor.FileDescriptor
class NodeDatabase_Legacy(_message.Message):
__slots__ = ["nodes", "version"]
NODES_FIELD_NUMBER: _ClassVar[int]
VERSION_FIELD_NUMBER: _ClassVar[int]
nodes: _containers.RepeatedCompositeFieldContainer[NodeInfoLite_Legacy]
version: int
def __init__(self, version: _Optional[int] = ..., nodes: _Optional[_Iterable[_Union[NodeInfoLite_Legacy, _Mapping]]] = ...) -> None: ...
class NodeInfoLite_Legacy(_message.Message):
__slots__ = ["bitfield", "channel", "device_metrics", "hops_away", "is_favorite", "is_ignored", "last_heard", "next_hop", "num", "position", "snr", "user", "via_mqtt"]
BITFIELD_FIELD_NUMBER: _ClassVar[int]
CHANNEL_FIELD_NUMBER: _ClassVar[int]
DEVICE_METRICS_FIELD_NUMBER: _ClassVar[int]
HOPS_AWAY_FIELD_NUMBER: _ClassVar[int]
IS_FAVORITE_FIELD_NUMBER: _ClassVar[int]
IS_IGNORED_FIELD_NUMBER: _ClassVar[int]
LAST_HEARD_FIELD_NUMBER: _ClassVar[int]
NEXT_HOP_FIELD_NUMBER: _ClassVar[int]
NUM_FIELD_NUMBER: _ClassVar[int]
POSITION_FIELD_NUMBER: _ClassVar[int]
SNR_FIELD_NUMBER: _ClassVar[int]
USER_FIELD_NUMBER: _ClassVar[int]
VIA_MQTT_FIELD_NUMBER: _ClassVar[int]
bitfield: int
channel: int
device_metrics: _telemetry_pb2.DeviceMetrics
hops_away: int
is_favorite: bool
is_ignored: bool
last_heard: int
next_hop: int
num: int
position: _deviceonly_pb2.PositionLite
snr: float
user: _deviceonly_pb2.UserLite
via_mqtt: bool
def __init__(self, num: _Optional[int] = ..., user: _Optional[_Union[_deviceonly_pb2.UserLite, _Mapping]] = ..., position: _Optional[_Union[_deviceonly_pb2.PositionLite, _Mapping]] = ..., snr: _Optional[float] = ..., last_heard: _Optional[int] = ..., device_metrics: _Optional[_Union[_telemetry_pb2.DeviceMetrics, _Mapping]] = ..., channel: _Optional[int] = ..., via_mqtt: bool = ..., hops_away: _Optional[int] = ..., is_favorite: bool = ..., is_ignored: bool = ..., next_hop: _Optional[int] = ..., bitfield: _Optional[int] = ...) -> None: ...
+68
View File
@@ -0,0 +1,68 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/protobuf/deviceonly.proto
"""Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
from meshtastic.protobuf import channel_pb2 as meshtastic_dot_protobuf_dot_channel__pb2
from meshtastic.protobuf import config_pb2 as meshtastic_dot_protobuf_dot_config__pb2
from meshtastic.protobuf import localonly_pb2 as meshtastic_dot_protobuf_dot_localonly__pb2
from meshtastic.protobuf import mesh_pb2 as meshtastic_dot_protobuf_dot_mesh__pb2
from meshtastic.protobuf import telemetry_pb2 as meshtastic_dot_protobuf_dot_telemetry__pb2
from meshtastic.protobuf import nanopb_pb2 as meshtastic_dot_protobuf_dot_nanopb__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n$meshtastic/protobuf/deviceonly.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/config.proto\x1a#meshtastic/protobuf/localonly.proto\x1a\x1emeshtastic/protobuf/mesh.proto\x1a#meshtastic/protobuf/telemetry.proto\x1a meshtastic/protobuf/nanopb.proto\"\xb1\x01\n\x0cPositionLite\x12\x12\n\nlatitude_i\x18\x01 \x01(\x0f\x12\x13\n\x0blongitude_i\x18\x02 \x01(\x0f\x12\x10\n\x08\x61ltitude\x18\x03 \x01(\x05\x12\x0c\n\x04time\x18\x04 \x01(\x07\x12@\n\x0flocation_source\x18\x05 \x01(\x0e\x32\'.meshtastic.protobuf.Position.LocSource\x12\x16\n\x0eprecision_bits\x18\x06 \x01(\r\"\x94\x02\n\x08UserLite\x12\x13\n\x07macaddr\x18\x01 \x01(\x0c\x42\x02\x18\x01\x12\x11\n\tlong_name\x18\x02 \x01(\t\x12\x12\n\nshort_name\x18\x03 \x01(\t\x12\x34\n\x08hw_model\x18\x04 \x01(\x0e\x32\".meshtastic.protobuf.HardwareModel\x12\x13\n\x0bis_licensed\x18\x05 \x01(\x08\x12;\n\x04role\x18\x06 \x01(\x0e\x32-.meshtastic.protobuf.Config.DeviceConfig.Role\x12\x12\n\npublic_key\x18\x07 \x01(\x0c\x12\x1c\n\x0fis_unmessagable\x18\t \x01(\x08H\x00\x88\x01\x01\x42\x12\n\x10_is_unmessagable\"\xbc\x03\n\x0cNodeInfoLite\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x0b\n\x03snr\x18\x04 \x01(\x02\x12\x12\n\nlast_heard\x18\x05 \x01(\x07\x12\x0f\n\x07\x63hannel\x18\x07 \x01(\r\x12\x16\n\thops_away\x18\t \x01(\rH\x00\x88\x01\x01\x12\x10\n\x08next_hop\x18\x0c \x01(\r\x12\x10\n\x08\x62itfield\x18\r \x01(\r\x12\x11\n\tlong_name\x18\x0e \x01(\t\x12\x12\n\nshort_name\x18\x0f \x01(\t\x12\x34\n\x08hw_model\x18\x10 \x01(\x0e\x32\".meshtastic.protobuf.HardwareModel\x12;\n\x04role\x18\x11 \x01(\x0e\x32-.meshtastic.protobuf.Config.DeviceConfig.Role\x12\x12\n\npublic_key\x18\x12 \x01(\x0c\x12\x0e\n\x06snr_q4\x18\x13 \x01(\x11\x42\x0c\n\n_hops_awayJ\x04\x08\x02\x10\x03J\x04\x08\x03\x10\x04J\x04\x08\x06\x10\x07J\x04\x08\x08\x10\tJ\x04\x08\n\x10\x0bJ\x04\x08\x0b\x10\x0cR\x04userR\x08positionR\x0e\x64\x65vice_metricsR\x08via_mqttR\x0bis_favoriteR\nis_ignored\"\xa1\x03\n\x0b\x44\x65viceState\x12\x30\n\x07my_node\x18\x02 \x01(\x0b\x32\x1f.meshtastic.protobuf.MyNodeInfo\x12(\n\x05owner\x18\x03 \x01(\x0b\x32\x19.meshtastic.protobuf.User\x12\x36\n\rreceive_queue\x18\x05 \x03(\x0b\x32\x1f.meshtastic.protobuf.MeshPacket\x12\x0f\n\x07version\x18\x08 \x01(\r\x12\x38\n\x0frx_text_message\x18\x07 \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacket\x12\x13\n\x07no_save\x18\t \x01(\x08\x42\x02\x18\x01\x12\x19\n\rdid_gps_reset\x18\x0b \x01(\x08\x42\x02\x18\x01\x12\x34\n\x0brx_waypoint\x18\x0c \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacket\x12M\n\x19node_remote_hardware_pins\x18\r \x03(\x0b\x32*.meshtastic.protobuf.NodeRemoteHardwarePin\"U\n\x11NodePositionEntry\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x33\n\x08position\x18\x02 \x01(\x0b\x32!.meshtastic.protobuf.PositionLite\"]\n\x12NodeTelemetryEntry\x12\x0b\n\x03num\x18\x01 \x01(\r\x12:\n\x0e\x64\x65vice_metrics\x18\x02 \x01(\x0b\x32\".meshtastic.protobuf.DeviceMetrics\"i\n\x14NodeEnvironmentEntry\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x44\n\x13\x65nvironment_metrics\x18\x02 \x01(\x0b\x32\'.meshtastic.protobuf.EnvironmentMetrics\"R\n\x0fNodeStatusEntry\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x32\n\x06status\x18\x02 \x01(\x0b\x32\".meshtastic.protobuf.StatusMessage\"\xb0\x04\n\x0cNodeDatabase\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\\\n\x05nodes\x18\x02 \x03(\x0b\x32!.meshtastic.protobuf.NodeInfoLiteB*\x92?\'\x92\x01$std::vector<meshtastic_NodeInfoLite>\x12j\n\tpositions\x18\x03 \x03(\x0b\x32&.meshtastic.protobuf.NodePositionEntryB/\x92?,\x92\x01)std::vector<meshtastic_NodePositionEntry>\x12l\n\ttelemetry\x18\x04 \x03(\x0b\x32\'.meshtastic.protobuf.NodeTelemetryEntryB0\x92?-\x92\x01*std::vector<meshtastic_NodeTelemetryEntry>\x12\x63\n\x06status\x18\x05 \x03(\x0b\x32$.meshtastic.protobuf.NodeStatusEntryB-\x92?*\x92\x01\'std::vector<meshtastic_NodeStatusEntry>\x12r\n\x0b\x65nvironment\x18\x06 \x03(\x0b\x32).meshtastic.protobuf.NodeEnvironmentEntryB2\x92?/\x92\x01,std::vector<meshtastic_NodeEnvironmentEntry>\"N\n\x0b\x43hannelFile\x12.\n\x08\x63hannels\x18\x01 \x03(\x0b\x32\x1c.meshtastic.protobuf.Channel\x12\x0f\n\x07version\x18\x02 \x01(\r\"\x86\x02\n\x11\x42\x61\x63kupPreferences\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x11\n\ttimestamp\x18\x02 \x01(\x07\x12\x30\n\x06\x63onfig\x18\x03 \x01(\x0b\x32 .meshtastic.protobuf.LocalConfig\x12=\n\rmodule_config\x18\x04 \x01(\x0b\x32&.meshtastic.protobuf.LocalModuleConfig\x12\x32\n\x08\x63hannels\x18\x05 \x01(\x0b\x32 .meshtastic.protobuf.ChannelFile\x12(\n\x05owner\x18\x06 \x01(\x0b\x32\x19.meshtastic.protobuf.UserBn\n\x14org.meshtastic.protoB\nDeviceOnlyZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x92?\x0b\xc2\x01\x08<vector>b\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.deviceonly_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\nDeviceOnlyZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000\222?\013\302\001\010<vector>'
_USERLITE.fields_by_name['macaddr']._options = None
_USERLITE.fields_by_name['macaddr']._serialized_options = b'\030\001'
_DEVICESTATE.fields_by_name['no_save']._options = None
_DEVICESTATE.fields_by_name['no_save']._serialized_options = b'\030\001'
_DEVICESTATE.fields_by_name['did_gps_reset']._options = None
_DEVICESTATE.fields_by_name['did_gps_reset']._serialized_options = b'\030\001'
_NODEDATABASE.fields_by_name['nodes']._options = None
_NODEDATABASE.fields_by_name['nodes']._serialized_options = b'\222?\'\222\001$std::vector<meshtastic_NodeInfoLite>'
_NODEDATABASE.fields_by_name['positions']._options = None
_NODEDATABASE.fields_by_name['positions']._serialized_options = b'\222?,\222\001)std::vector<meshtastic_NodePositionEntry>'
_NODEDATABASE.fields_by_name['telemetry']._options = None
_NODEDATABASE.fields_by_name['telemetry']._serialized_options = b'\222?-\222\001*std::vector<meshtastic_NodeTelemetryEntry>'
_NODEDATABASE.fields_by_name['status']._options = None
_NODEDATABASE.fields_by_name['status']._serialized_options = b'\222?*\222\001\'std::vector<meshtastic_NodeStatusEntry>'
_NODEDATABASE.fields_by_name['environment']._options = None
_NODEDATABASE.fields_by_name['environment']._serialized_options = b'\222?/\222\001,std::vector<meshtastic_NodeEnvironmentEntry>'
_POSITIONLITE._serialized_start=271
_POSITIONLITE._serialized_end=448
_USERLITE._serialized_start=451
_USERLITE._serialized_end=727
_NODEINFOLITE._serialized_start=730
_NODEINFOLITE._serialized_end=1174
_DEVICESTATE._serialized_start=1177
_DEVICESTATE._serialized_end=1594
_NODEPOSITIONENTRY._serialized_start=1596
_NODEPOSITIONENTRY._serialized_end=1681
_NODETELEMETRYENTRY._serialized_start=1683
_NODETELEMETRYENTRY._serialized_end=1776
_NODEENVIRONMENTENTRY._serialized_start=1778
_NODEENVIRONMENTENTRY._serialized_end=1883
_NODESTATUSENTRY._serialized_start=1885
_NODESTATUSENTRY._serialized_end=1967
_NODEDATABASE._serialized_start=1970
_NODEDATABASE._serialized_end=2530
_CHANNELFILE._serialized_start=2532
_CHANNELFILE._serialized_end=2610
_BACKUPPREFERENCES._serialized_start=2613
_BACKUPPREFERENCES._serialized_end=2875
# @@protoc_insertion_point(module_scope)
+172
View File
@@ -0,0 +1,172 @@
from meshtastic.protobuf import channel_pb2 as _channel_pb2
from meshtastic.protobuf import config_pb2 as _config_pb2
from meshtastic.protobuf import localonly_pb2 as _localonly_pb2
from meshtastic.protobuf import mesh_pb2 as _mesh_pb2
from meshtastic.protobuf import telemetry_pb2 as _telemetry_pb2
from meshtastic.protobuf import nanopb_pb2 as _nanopb_pb2
from google.protobuf.internal import containers as _containers
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Mapping, Optional as _Optional, Union as _Union
DESCRIPTOR: _descriptor.FileDescriptor
class BackupPreferences(_message.Message):
__slots__ = ["channels", "config", "module_config", "owner", "timestamp", "version"]
CHANNELS_FIELD_NUMBER: _ClassVar[int]
CONFIG_FIELD_NUMBER: _ClassVar[int]
MODULE_CONFIG_FIELD_NUMBER: _ClassVar[int]
OWNER_FIELD_NUMBER: _ClassVar[int]
TIMESTAMP_FIELD_NUMBER: _ClassVar[int]
VERSION_FIELD_NUMBER: _ClassVar[int]
channels: ChannelFile
config: _localonly_pb2.LocalConfig
module_config: _localonly_pb2.LocalModuleConfig
owner: _mesh_pb2.User
timestamp: int
version: int
def __init__(self, version: _Optional[int] = ..., timestamp: _Optional[int] = ..., config: _Optional[_Union[_localonly_pb2.LocalConfig, _Mapping]] = ..., module_config: _Optional[_Union[_localonly_pb2.LocalModuleConfig, _Mapping]] = ..., channels: _Optional[_Union[ChannelFile, _Mapping]] = ..., owner: _Optional[_Union[_mesh_pb2.User, _Mapping]] = ...) -> None: ...
class ChannelFile(_message.Message):
__slots__ = ["channels", "version"]
CHANNELS_FIELD_NUMBER: _ClassVar[int]
VERSION_FIELD_NUMBER: _ClassVar[int]
channels: _containers.RepeatedCompositeFieldContainer[_channel_pb2.Channel]
version: int
def __init__(self, channels: _Optional[_Iterable[_Union[_channel_pb2.Channel, _Mapping]]] = ..., version: _Optional[int] = ...) -> None: ...
class DeviceState(_message.Message):
__slots__ = ["did_gps_reset", "my_node", "no_save", "node_remote_hardware_pins", "owner", "receive_queue", "rx_text_message", "rx_waypoint", "version"]
DID_GPS_RESET_FIELD_NUMBER: _ClassVar[int]
MY_NODE_FIELD_NUMBER: _ClassVar[int]
NODE_REMOTE_HARDWARE_PINS_FIELD_NUMBER: _ClassVar[int]
NO_SAVE_FIELD_NUMBER: _ClassVar[int]
OWNER_FIELD_NUMBER: _ClassVar[int]
RECEIVE_QUEUE_FIELD_NUMBER: _ClassVar[int]
RX_TEXT_MESSAGE_FIELD_NUMBER: _ClassVar[int]
RX_WAYPOINT_FIELD_NUMBER: _ClassVar[int]
VERSION_FIELD_NUMBER: _ClassVar[int]
did_gps_reset: bool
my_node: _mesh_pb2.MyNodeInfo
no_save: bool
node_remote_hardware_pins: _containers.RepeatedCompositeFieldContainer[_mesh_pb2.NodeRemoteHardwarePin]
owner: _mesh_pb2.User
receive_queue: _containers.RepeatedCompositeFieldContainer[_mesh_pb2.MeshPacket]
rx_text_message: _mesh_pb2.MeshPacket
rx_waypoint: _mesh_pb2.MeshPacket
version: int
def __init__(self, my_node: _Optional[_Union[_mesh_pb2.MyNodeInfo, _Mapping]] = ..., owner: _Optional[_Union[_mesh_pb2.User, _Mapping]] = ..., receive_queue: _Optional[_Iterable[_Union[_mesh_pb2.MeshPacket, _Mapping]]] = ..., version: _Optional[int] = ..., rx_text_message: _Optional[_Union[_mesh_pb2.MeshPacket, _Mapping]] = ..., no_save: bool = ..., did_gps_reset: bool = ..., rx_waypoint: _Optional[_Union[_mesh_pb2.MeshPacket, _Mapping]] = ..., node_remote_hardware_pins: _Optional[_Iterable[_Union[_mesh_pb2.NodeRemoteHardwarePin, _Mapping]]] = ...) -> None: ...
class NodeDatabase(_message.Message):
__slots__ = ["environment", "nodes", "positions", "status", "telemetry", "version"]
ENVIRONMENT_FIELD_NUMBER: _ClassVar[int]
NODES_FIELD_NUMBER: _ClassVar[int]
POSITIONS_FIELD_NUMBER: _ClassVar[int]
STATUS_FIELD_NUMBER: _ClassVar[int]
TELEMETRY_FIELD_NUMBER: _ClassVar[int]
VERSION_FIELD_NUMBER: _ClassVar[int]
environment: _containers.RepeatedCompositeFieldContainer[NodeEnvironmentEntry]
nodes: _containers.RepeatedCompositeFieldContainer[NodeInfoLite]
positions: _containers.RepeatedCompositeFieldContainer[NodePositionEntry]
status: _containers.RepeatedCompositeFieldContainer[NodeStatusEntry]
telemetry: _containers.RepeatedCompositeFieldContainer[NodeTelemetryEntry]
version: int
def __init__(self, version: _Optional[int] = ..., nodes: _Optional[_Iterable[_Union[NodeInfoLite, _Mapping]]] = ..., positions: _Optional[_Iterable[_Union[NodePositionEntry, _Mapping]]] = ..., telemetry: _Optional[_Iterable[_Union[NodeTelemetryEntry, _Mapping]]] = ..., status: _Optional[_Iterable[_Union[NodeStatusEntry, _Mapping]]] = ..., environment: _Optional[_Iterable[_Union[NodeEnvironmentEntry, _Mapping]]] = ...) -> None: ...
class NodeEnvironmentEntry(_message.Message):
__slots__ = ["environment_metrics", "num"]
ENVIRONMENT_METRICS_FIELD_NUMBER: _ClassVar[int]
NUM_FIELD_NUMBER: _ClassVar[int]
environment_metrics: _telemetry_pb2.EnvironmentMetrics
num: int
def __init__(self, num: _Optional[int] = ..., environment_metrics: _Optional[_Union[_telemetry_pb2.EnvironmentMetrics, _Mapping]] = ...) -> None: ...
class NodeInfoLite(_message.Message):
__slots__ = ["bitfield", "channel", "hops_away", "hw_model", "last_heard", "long_name", "next_hop", "num", "public_key", "role", "short_name", "snr", "snr_q4"]
BITFIELD_FIELD_NUMBER: _ClassVar[int]
CHANNEL_FIELD_NUMBER: _ClassVar[int]
HOPS_AWAY_FIELD_NUMBER: _ClassVar[int]
HW_MODEL_FIELD_NUMBER: _ClassVar[int]
LAST_HEARD_FIELD_NUMBER: _ClassVar[int]
LONG_NAME_FIELD_NUMBER: _ClassVar[int]
NEXT_HOP_FIELD_NUMBER: _ClassVar[int]
NUM_FIELD_NUMBER: _ClassVar[int]
PUBLIC_KEY_FIELD_NUMBER: _ClassVar[int]
ROLE_FIELD_NUMBER: _ClassVar[int]
SHORT_NAME_FIELD_NUMBER: _ClassVar[int]
SNR_FIELD_NUMBER: _ClassVar[int]
SNR_Q4_FIELD_NUMBER: _ClassVar[int]
bitfield: int
channel: int
hops_away: int
hw_model: _mesh_pb2.HardwareModel
last_heard: int
long_name: str
next_hop: int
num: int
public_key: bytes
role: _config_pb2.Config.DeviceConfig.Role
short_name: str
snr: float
snr_q4: int
def __init__(self, num: _Optional[int] = ..., snr: _Optional[float] = ..., last_heard: _Optional[int] = ..., channel: _Optional[int] = ..., hops_away: _Optional[int] = ..., next_hop: _Optional[int] = ..., bitfield: _Optional[int] = ..., long_name: _Optional[str] = ..., short_name: _Optional[str] = ..., hw_model: _Optional[_Union[_mesh_pb2.HardwareModel, str]] = ..., role: _Optional[_Union[_config_pb2.Config.DeviceConfig.Role, str]] = ..., public_key: _Optional[bytes] = ..., snr_q4: _Optional[int] = ...) -> None: ...
class NodePositionEntry(_message.Message):
__slots__ = ["num", "position"]
NUM_FIELD_NUMBER: _ClassVar[int]
POSITION_FIELD_NUMBER: _ClassVar[int]
num: int
position: PositionLite
def __init__(self, num: _Optional[int] = ..., position: _Optional[_Union[PositionLite, _Mapping]] = ...) -> None: ...
class NodeStatusEntry(_message.Message):
__slots__ = ["num", "status"]
NUM_FIELD_NUMBER: _ClassVar[int]
STATUS_FIELD_NUMBER: _ClassVar[int]
num: int
status: _mesh_pb2.StatusMessage
def __init__(self, num: _Optional[int] = ..., status: _Optional[_Union[_mesh_pb2.StatusMessage, _Mapping]] = ...) -> None: ...
class NodeTelemetryEntry(_message.Message):
__slots__ = ["device_metrics", "num"]
DEVICE_METRICS_FIELD_NUMBER: _ClassVar[int]
NUM_FIELD_NUMBER: _ClassVar[int]
device_metrics: _telemetry_pb2.DeviceMetrics
num: int
def __init__(self, num: _Optional[int] = ..., device_metrics: _Optional[_Union[_telemetry_pb2.DeviceMetrics, _Mapping]] = ...) -> None: ...
class PositionLite(_message.Message):
__slots__ = ["altitude", "latitude_i", "location_source", "longitude_i", "precision_bits", "time"]
ALTITUDE_FIELD_NUMBER: _ClassVar[int]
LATITUDE_I_FIELD_NUMBER: _ClassVar[int]
LOCATION_SOURCE_FIELD_NUMBER: _ClassVar[int]
LONGITUDE_I_FIELD_NUMBER: _ClassVar[int]
PRECISION_BITS_FIELD_NUMBER: _ClassVar[int]
TIME_FIELD_NUMBER: _ClassVar[int]
altitude: int
latitude_i: int
location_source: _mesh_pb2.Position.LocSource
longitude_i: int
precision_bits: int
time: int
def __init__(self, latitude_i: _Optional[int] = ..., longitude_i: _Optional[int] = ..., altitude: _Optional[int] = ..., time: _Optional[int] = ..., location_source: _Optional[_Union[_mesh_pb2.Position.LocSource, str]] = ..., precision_bits: _Optional[int] = ...) -> None: ...
class UserLite(_message.Message):
__slots__ = ["hw_model", "is_licensed", "is_unmessagable", "long_name", "macaddr", "public_key", "role", "short_name"]
HW_MODEL_FIELD_NUMBER: _ClassVar[int]
IS_LICENSED_FIELD_NUMBER: _ClassVar[int]
IS_UNMESSAGABLE_FIELD_NUMBER: _ClassVar[int]
LONG_NAME_FIELD_NUMBER: _ClassVar[int]
MACADDR_FIELD_NUMBER: _ClassVar[int]
PUBLIC_KEY_FIELD_NUMBER: _ClassVar[int]
ROLE_FIELD_NUMBER: _ClassVar[int]
SHORT_NAME_FIELD_NUMBER: _ClassVar[int]
hw_model: _mesh_pb2.HardwareModel
is_licensed: bool
is_unmessagable: bool
long_name: str
macaddr: bytes
public_key: bytes
role: _config_pb2.Config.DeviceConfig.Role
short_name: str
def __init__(self, macaddr: _Optional[bytes] = ..., long_name: _Optional[str] = ..., short_name: _Optional[str] = ..., hw_model: _Optional[_Union[_mesh_pb2.HardwareModel, str]] = ..., is_licensed: bool = ..., role: _Optional[_Union[_config_pb2.Config.DeviceConfig.Role, str]] = ..., public_key: _Optional[bytes] = ..., is_unmessagable: bool = ...) -> None: ...
+29
View File
@@ -0,0 +1,29 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/protobuf/field_metadata.proto
"""Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
from google.protobuf import descriptor_pb2 as google_dot_protobuf_dot_descriptor__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n(meshtastic/protobuf/field_metadata.proto\x12\x13meshtastic.protobuf\x1a google/protobuf/descriptor.proto\"\xfc\x01\n\rFieldMetadata\x12\x10\n\x08\x64iy_only\x18\x01 \x01(\x08\x12\x12\n\nadmin_only\x18\x02 \x01(\x08\x12\x11\n\tmin_value\x18\x03 \x01(\x01\x12\x11\n\tmax_value\x18\x04 \x01(\x01\x12\x0c\n\x04unit\x18\x05 \x01(\t\x12\x12\n\ndeprecated\x18\x06 \x01(\x08\x12\r\n\x05label\x18\x07 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x08 \x01(\t\x12\x10\n\x08keywords\x18\t \x01(\t\x12\x16\n\x0esince_firmware\x18\n \x01(\t\x12\x18\n\x10\x64\x65precated_since\x18\x0b \x01(\t\x12\x15\n\roem_fixed_gps\x18\x0c \x01(\x08:[\n\x0e\x66ield_metadata\x12\x1d.google.protobuf.FieldOptions\x18\xb9\x8e\x03 \x01(\x0b\x32\".meshtastic.protobuf.FieldMetadata:d\n\x13\x65num_value_metadata\x12!.google.protobuf.EnumValueOptions\x18\xb9\x8e\x03 \x01(\x0b\x32\".meshtastic.protobuf.FieldMetadataBi\n\x14org.meshtastic.protoB\x13\x46ieldMetadataProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.field_metadata_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
google_dot_protobuf_dot_descriptor__pb2.FieldOptions.RegisterExtension(field_metadata)
google_dot_protobuf_dot_descriptor__pb2.EnumValueOptions.RegisterExtension(enum_value_metadata)
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\023FieldMetadataProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_FIELDMETADATA._serialized_start=100
_FIELDMETADATA._serialized_end=352
# @@protoc_insertion_point(module_scope)
@@ -0,0 +1,38 @@
from google.protobuf import descriptor_pb2 as _descriptor_pb2
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from typing import ClassVar as _ClassVar, Optional as _Optional
DESCRIPTOR: _descriptor.FileDescriptor
ENUM_VALUE_METADATA_FIELD_NUMBER: _ClassVar[int]
FIELD_METADATA_FIELD_NUMBER: _ClassVar[int]
enum_value_metadata: _descriptor.FieldDescriptor
field_metadata: _descriptor.FieldDescriptor
class FieldMetadata(_message.Message):
__slots__ = ["admin_only", "deprecated", "deprecated_since", "description", "diy_only", "keywords", "label", "max_value", "min_value", "oem_fixed_gps", "since_firmware", "unit"]
ADMIN_ONLY_FIELD_NUMBER: _ClassVar[int]
DEPRECATED_FIELD_NUMBER: _ClassVar[int]
DEPRECATED_SINCE_FIELD_NUMBER: _ClassVar[int]
DESCRIPTION_FIELD_NUMBER: _ClassVar[int]
DIY_ONLY_FIELD_NUMBER: _ClassVar[int]
KEYWORDS_FIELD_NUMBER: _ClassVar[int]
LABEL_FIELD_NUMBER: _ClassVar[int]
MAX_VALUE_FIELD_NUMBER: _ClassVar[int]
MIN_VALUE_FIELD_NUMBER: _ClassVar[int]
OEM_FIXED_GPS_FIELD_NUMBER: _ClassVar[int]
SINCE_FIRMWARE_FIELD_NUMBER: _ClassVar[int]
UNIT_FIELD_NUMBER: _ClassVar[int]
admin_only: bool
deprecated: bool
deprecated_since: str
description: str
diy_only: bool
keywords: str
label: str
max_value: float
min_value: float
oem_fixed_gps: bool
since_firmware: str
unit: str
def __init__(self, diy_only: bool = ..., admin_only: bool = ..., min_value: _Optional[float] = ..., max_value: _Optional[float] = ..., unit: _Optional[str] = ..., deprecated: bool = ..., label: _Optional[str] = ..., description: _Optional[str] = ..., keywords: _Optional[str] = ..., since_firmware: _Optional[str] = ..., deprecated_since: _Optional[str] = ..., oem_fixed_gps: bool = ...) -> None: ...
+50
View File
@@ -0,0 +1,50 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/protobuf/interdevice.proto
"""Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n%meshtastic/protobuf/interdevice.proto\x12\x13meshtastic.protobuf\"\xde\x01\n\x0c\x46ileTransfer\x12\x35\n\toperation\x18\x01 \x01(\x0e\x32\".meshtastic.protobuf.FileOperation\x12\x10\n\x08\x66ilepath\x18\x02 \x01(\t\x12\x10\n\x08\x66iledata\x18\x03 \x01(\x0c\x12/\n\x06status\x18\x04 \x01(\x0e\x32\x1f.meshtastic.protobuf.FileStatus\x12\x0f\n\x07message\x18\x05 \x01(\t\x12\x0e\n\x06offset\x18\x06 \x01(\x04\x12\x0e\n\x06length\x18\x07 \x01(\r\x12\x11\n\tfile_size\x18\x08 \x01(\x04\"\x9f\x01\n\x10\x44irectoryListing\x12\x11\n\tdirectory\x18\x01 \x01(\t\x12\x11\n\tfilenames\x18\x02 \x03(\t\x12/\n\x06status\x18\x03 \x01(\x0e\x32\x1f.meshtastic.protobuf.FileStatus\x12\x0f\n\x07message\x18\x04 \x01(\t\x12\x0e\n\x06offset\x18\x05 \x01(\r\x12\x13\n\x0btotal_count\x18\x06 \x01(\r\"G\n\x0eI2CTransaction\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\r\x12\x12\n\nwrite_data\x18\x02 \x01(\x0c\x12\x10\n\x08read_len\x18\x03 \x01(\r\"\x92\x03\n\nSdCardInfo\x12\x0f\n\x07present\x18\x01 \x01(\x08\x12;\n\tcard_type\x18\x02 \x01(\x0e\x32(.meshtastic.protobuf.SdCardInfo.CardType\x12\x39\n\x08\x66\x61t_type\x18\x03 \x01(\x0e\x32\'.meshtastic.protobuf.SdCardInfo.FatType\x12\x11\n\tcard_size\x18\x04 \x01(\x04\x12\x12\n\nused_bytes\x18\x05 \x01(\x04\x12\x12\n\nfree_bytes\x18\x06 \x01(\x04\x12\x13\n\x0bstats_valid\x18\x07 \x01(\x08\x12\x0c\n\x04\x62usy\x18\x08 \x01(\x08\x12\x13\n\x0bunformatted\x18\t \x01(\x08\"K\n\x08\x43\x61rdType\x12\x08\n\x04NONE\x10\x00\x12\x07\n\x03MMC\x10\x01\x12\x06\n\x02SD\x10\x02\x12\x08\n\x04SDHC\x10\x03\x12\x08\n\x04SDXC\x10\x04\x12\x10\n\x0cUNKNOWN_CARD\x10\x05\";\n\x07\x46\x61tType\x12\x0f\n\x0bUNKNOWN_FAT\x10\x00\x12\t\n\x05\x46\x41T16\x10\x01\x12\t\n\x05\x46\x41T32\x10\x02\x12\t\n\x05\x45XFAT\x10\x03\"\xa4\x01\n\tI2CResult\x12\x35\n\x06status\x18\x01 \x01(\x0e\x32%.meshtastic.protobuf.I2CResult.Status\x12\x11\n\tread_data\x18\x02 \x01(\x0c\"M\n\x06Status\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x06\n\x02OK\x10\x01\x12\x10\n\x0cNACK_ADDRESS\x10\x02\x12\r\n\tNACK_DATA\x10\x03\x12\t\n\x05\x45RROR\x10\x04\"\xf0\x04\n\x12InterdeviceMessage\x12\n\n\x02id\x18\x0f \x01(\r\x12\x0e\n\x04nmea\x18\x01 \x01(\tH\x00\x12\x0e\n\x04\x62\x65\x65p\x18\x02 \x01(\rH\x00\x12>\n\x0fi2c_transaction\x18\x03 \x01(\x0b\x32#.meshtastic.protobuf.I2CTransactionH\x00\x12\x34\n\ni2c_result\x18\x04 \x01(\x0b\x32\x1e.meshtastic.protobuf.I2CResultH\x00\x12\x12\n\x08i2c_scan\x18\x05 \x01(\x08H\x00\x12\x19\n\x0fi2c_scan_result\x18\x06 \x01(\x0cH\x00\x12:\n\rfile_transfer\x18\x07 \x01(\x0b\x32!.meshtastic.protobuf.FileTransferH\x00\x12\x42\n\x11\x64irectory_listing\x18\x08 \x01(\x0b\x32%.meshtastic.protobuf.DirectoryListingH\x00\x12\x15\n\x0bget_sd_info\x18\t \x01(\x08H\x00\x12\x32\n\x07sd_info\x18\n \x01(\x0b\x32\x1f.meshtastic.protobuf.SdCardInfoH\x00\x12\x37\n\x04ping\x18\x0b \x01(\x0e\x32\'.meshtastic.protobuf.InterdeviceVersionH\x00\x12\x37\n\x04pong\x18\x0c \x01(\x0e\x32\'.meshtastic.protobuf.InterdeviceVersionH\x00\x12\x0e\n\x04nack\x18\r \x01(\x08H\x00\x12\x34\n\nsd_command\x18\x0e \x01(\x0e\x32\x1e.meshtastic.protobuf.SdCommandH\x00\x42\x06\n\x04\x64\x61ta*Z\n\x12InterdeviceVersion\x12#\n\x1fINTERDEVICE_VERSION_UNSPECIFIED\x10\x00\x12\x1f\n\x1bINTERDEVICE_VERSION_CURRENT\x10\x02*7\n\rFileOperation\x12\x07\n\x03GET\x10\x00\x12\x08\n\x04POST\x10\x01\x12\x07\n\x03PUT\x10\x02\x12\n\n\x06\x44\x45LETE\x10\x03*\xa6\x01\n\nFileStatus\x12\x14\n\x10\x46ILE_UNSPECIFIED\x10\x00\x12\x0b\n\x07\x46ILE_OK\x10\x01\x12\r\n\tFILE_BUSY\x10\x02\x12\x10\n\x0c\x46ILE_NO_CARD\x10\x03\x12\x12\n\x0e\x46ILE_NOT_FOUND\x10\x04\x12\x18\n\x14\x46ILE_OFFSET_CONFLICT\x10\x05\x12\x11\n\rFILE_IO_ERROR\x10\x06\x12\x13\n\x0f\x46ILE_NOT_A_FILE\x10\x07*R\n\tSdCommand\x12\x1a\n\x16SD_COMMAND_UNSPECIFIED\x10\x00\x12\x0c\n\x08SD_MOUNT\x10\x01\x12\x0c\n\x08SD_EJECT\x10\x02\x12\r\n\tSD_FORMAT\x10\x03\x42g\n\x14org.meshtastic.protoB\x11InterdeviceProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.interdevice_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\021InterdeviceProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_INTERDEVICEVERSION._serialized_start=1721
_INTERDEVICEVERSION._serialized_end=1811
_FILEOPERATION._serialized_start=1813
_FILEOPERATION._serialized_end=1868
_FILESTATUS._serialized_start=1871
_FILESTATUS._serialized_end=2037
_SDCOMMAND._serialized_start=2039
_SDCOMMAND._serialized_end=2121
_FILETRANSFER._serialized_start=63
_FILETRANSFER._serialized_end=285
_DIRECTORYLISTING._serialized_start=288
_DIRECTORYLISTING._serialized_end=447
_I2CTRANSACTION._serialized_start=449
_I2CTRANSACTION._serialized_end=520
_SDCARDINFO._serialized_start=523
_SDCARDINFO._serialized_end=925
_SDCARDINFO_CARDTYPE._serialized_start=789
_SDCARDINFO_CARDTYPE._serialized_end=864
_SDCARDINFO_FATTYPE._serialized_start=866
_SDCARDINFO_FATTYPE._serialized_end=925
_I2CRESULT._serialized_start=928
_I2CRESULT._serialized_end=1092
_I2CRESULT_STATUS._serialized_start=1015
_I2CRESULT_STATUS._serialized_end=1092
_INTERDEVICEMESSAGE._serialized_start=1095
_INTERDEVICEMESSAGE._serialized_end=1719
# @@protoc_insertion_point(module_scope)
+168
View File
@@ -0,0 +1,168 @@
from google.protobuf.internal import containers as _containers
from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Mapping, Optional as _Optional, Union as _Union
DELETE: FileOperation
DESCRIPTOR: _descriptor.FileDescriptor
FILE_BUSY: FileStatus
FILE_IO_ERROR: FileStatus
FILE_NOT_A_FILE: FileStatus
FILE_NOT_FOUND: FileStatus
FILE_NO_CARD: FileStatus
FILE_OFFSET_CONFLICT: FileStatus
FILE_OK: FileStatus
FILE_UNSPECIFIED: FileStatus
GET: FileOperation
INTERDEVICE_VERSION_CURRENT: InterdeviceVersion
INTERDEVICE_VERSION_UNSPECIFIED: InterdeviceVersion
POST: FileOperation
PUT: FileOperation
SD_COMMAND_UNSPECIFIED: SdCommand
SD_EJECT: SdCommand
SD_FORMAT: SdCommand
SD_MOUNT: SdCommand
class DirectoryListing(_message.Message):
__slots__ = ["directory", "filenames", "message", "offset", "status", "total_count"]
DIRECTORY_FIELD_NUMBER: _ClassVar[int]
FILENAMES_FIELD_NUMBER: _ClassVar[int]
MESSAGE_FIELD_NUMBER: _ClassVar[int]
OFFSET_FIELD_NUMBER: _ClassVar[int]
STATUS_FIELD_NUMBER: _ClassVar[int]
TOTAL_COUNT_FIELD_NUMBER: _ClassVar[int]
directory: str
filenames: _containers.RepeatedScalarFieldContainer[str]
message: str
offset: int
status: FileStatus
total_count: int
def __init__(self, directory: _Optional[str] = ..., filenames: _Optional[_Iterable[str]] = ..., status: _Optional[_Union[FileStatus, str]] = ..., message: _Optional[str] = ..., offset: _Optional[int] = ..., total_count: _Optional[int] = ...) -> None: ...
class FileTransfer(_message.Message):
__slots__ = ["file_size", "filedata", "filepath", "length", "message", "offset", "operation", "status"]
FILEDATA_FIELD_NUMBER: _ClassVar[int]
FILEPATH_FIELD_NUMBER: _ClassVar[int]
FILE_SIZE_FIELD_NUMBER: _ClassVar[int]
LENGTH_FIELD_NUMBER: _ClassVar[int]
MESSAGE_FIELD_NUMBER: _ClassVar[int]
OFFSET_FIELD_NUMBER: _ClassVar[int]
OPERATION_FIELD_NUMBER: _ClassVar[int]
STATUS_FIELD_NUMBER: _ClassVar[int]
file_size: int
filedata: bytes
filepath: str
length: int
message: str
offset: int
operation: FileOperation
status: FileStatus
def __init__(self, operation: _Optional[_Union[FileOperation, str]] = ..., filepath: _Optional[str] = ..., filedata: _Optional[bytes] = ..., status: _Optional[_Union[FileStatus, str]] = ..., message: _Optional[str] = ..., offset: _Optional[int] = ..., length: _Optional[int] = ..., file_size: _Optional[int] = ...) -> None: ...
class I2CResult(_message.Message):
__slots__ = ["read_data", "status"]
class Status(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
ERROR: I2CResult.Status
NACK_ADDRESS: I2CResult.Status
NACK_DATA: I2CResult.Status
OK: I2CResult.Status
READ_DATA_FIELD_NUMBER: _ClassVar[int]
STATUS_FIELD_NUMBER: _ClassVar[int]
UNSPECIFIED: I2CResult.Status
read_data: bytes
status: I2CResult.Status
def __init__(self, status: _Optional[_Union[I2CResult.Status, str]] = ..., read_data: _Optional[bytes] = ...) -> None: ...
class I2CTransaction(_message.Message):
__slots__ = ["address", "read_len", "write_data"]
ADDRESS_FIELD_NUMBER: _ClassVar[int]
READ_LEN_FIELD_NUMBER: _ClassVar[int]
WRITE_DATA_FIELD_NUMBER: _ClassVar[int]
address: int
read_len: int
write_data: bytes
def __init__(self, address: _Optional[int] = ..., write_data: _Optional[bytes] = ..., read_len: _Optional[int] = ...) -> None: ...
class InterdeviceMessage(_message.Message):
__slots__ = ["beep", "directory_listing", "file_transfer", "get_sd_info", "i2c_result", "i2c_scan", "i2c_scan_result", "i2c_transaction", "id", "nack", "nmea", "ping", "pong", "sd_command", "sd_info"]
BEEP_FIELD_NUMBER: _ClassVar[int]
DIRECTORY_LISTING_FIELD_NUMBER: _ClassVar[int]
FILE_TRANSFER_FIELD_NUMBER: _ClassVar[int]
GET_SD_INFO_FIELD_NUMBER: _ClassVar[int]
I2C_RESULT_FIELD_NUMBER: _ClassVar[int]
I2C_SCAN_FIELD_NUMBER: _ClassVar[int]
I2C_SCAN_RESULT_FIELD_NUMBER: _ClassVar[int]
I2C_TRANSACTION_FIELD_NUMBER: _ClassVar[int]
ID_FIELD_NUMBER: _ClassVar[int]
NACK_FIELD_NUMBER: _ClassVar[int]
NMEA_FIELD_NUMBER: _ClassVar[int]
PING_FIELD_NUMBER: _ClassVar[int]
PONG_FIELD_NUMBER: _ClassVar[int]
SD_COMMAND_FIELD_NUMBER: _ClassVar[int]
SD_INFO_FIELD_NUMBER: _ClassVar[int]
beep: int
directory_listing: DirectoryListing
file_transfer: FileTransfer
get_sd_info: bool
i2c_result: I2CResult
i2c_scan: bool
i2c_scan_result: bytes
i2c_transaction: I2CTransaction
id: int
nack: bool
nmea: str
ping: InterdeviceVersion
pong: InterdeviceVersion
sd_command: SdCommand
sd_info: SdCardInfo
def __init__(self, id: _Optional[int] = ..., nmea: _Optional[str] = ..., beep: _Optional[int] = ..., i2c_transaction: _Optional[_Union[I2CTransaction, _Mapping]] = ..., i2c_result: _Optional[_Union[I2CResult, _Mapping]] = ..., i2c_scan: bool = ..., i2c_scan_result: _Optional[bytes] = ..., file_transfer: _Optional[_Union[FileTransfer, _Mapping]] = ..., directory_listing: _Optional[_Union[DirectoryListing, _Mapping]] = ..., get_sd_info: bool = ..., sd_info: _Optional[_Union[SdCardInfo, _Mapping]] = ..., ping: _Optional[_Union[InterdeviceVersion, str]] = ..., pong: _Optional[_Union[InterdeviceVersion, str]] = ..., nack: bool = ..., sd_command: _Optional[_Union[SdCommand, str]] = ...) -> None: ...
class SdCardInfo(_message.Message):
__slots__ = ["busy", "card_size", "card_type", "fat_type", "free_bytes", "present", "stats_valid", "unformatted", "used_bytes"]
class CardType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class FatType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
BUSY_FIELD_NUMBER: _ClassVar[int]
CARD_SIZE_FIELD_NUMBER: _ClassVar[int]
CARD_TYPE_FIELD_NUMBER: _ClassVar[int]
EXFAT: SdCardInfo.FatType
FAT16: SdCardInfo.FatType
FAT32: SdCardInfo.FatType
FAT_TYPE_FIELD_NUMBER: _ClassVar[int]
FREE_BYTES_FIELD_NUMBER: _ClassVar[int]
MMC: SdCardInfo.CardType
NONE: SdCardInfo.CardType
PRESENT_FIELD_NUMBER: _ClassVar[int]
SD: SdCardInfo.CardType
SDHC: SdCardInfo.CardType
SDXC: SdCardInfo.CardType
STATS_VALID_FIELD_NUMBER: _ClassVar[int]
UNFORMATTED_FIELD_NUMBER: _ClassVar[int]
UNKNOWN_CARD: SdCardInfo.CardType
UNKNOWN_FAT: SdCardInfo.FatType
USED_BYTES_FIELD_NUMBER: _ClassVar[int]
busy: bool
card_size: int
card_type: SdCardInfo.CardType
fat_type: SdCardInfo.FatType
free_bytes: int
present: bool
stats_valid: bool
unformatted: bool
used_bytes: int
def __init__(self, present: bool = ..., card_type: _Optional[_Union[SdCardInfo.CardType, str]] = ..., fat_type: _Optional[_Union[SdCardInfo.FatType, str]] = ..., card_size: _Optional[int] = ..., used_bytes: _Optional[int] = ..., free_bytes: _Optional[int] = ..., stats_valid: bool = ..., busy: bool = ..., unformatted: bool = ...) -> None: ...
class InterdeviceVersion(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class FileOperation(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class FileStatus(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class SdCommand(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
+30
View File
@@ -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.internal import builder as _builder
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
from meshtastic.protobuf import config_pb2 as meshtastic_dot_protobuf_dot_config__pb2
from meshtastic.protobuf import module_config_pb2 as meshtastic_dot_protobuf_dot_module__config__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n#meshtastic/protobuf/localonly.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/config.proto\x1a\'meshtastic/protobuf/module_config.proto\"\xfa\x03\n\x0bLocalConfig\x12\x38\n\x06\x64\x65vice\x18\x01 \x01(\x0b\x32(.meshtastic.protobuf.Config.DeviceConfig\x12<\n\x08position\x18\x02 \x01(\x0b\x32*.meshtastic.protobuf.Config.PositionConfig\x12\x36\n\x05power\x18\x03 \x01(\x0b\x32\'.meshtastic.protobuf.Config.PowerConfig\x12:\n\x07network\x18\x04 \x01(\x0b\x32).meshtastic.protobuf.Config.NetworkConfig\x12:\n\x07\x64isplay\x18\x05 \x01(\x0b\x32).meshtastic.protobuf.Config.DisplayConfig\x12\x34\n\x04lora\x18\x06 \x01(\x0b\x32&.meshtastic.protobuf.Config.LoRaConfig\x12>\n\tbluetooth\x18\x07 \x01(\x0b\x32+.meshtastic.protobuf.Config.BluetoothConfig\x12\x0f\n\x07version\x18\x08 \x01(\r\x12<\n\x08security\x18\t \x01(\x0b\x32*.meshtastic.protobuf.Config.SecurityConfig\"\x98\n\n\x11LocalModuleConfig\x12:\n\x04mqtt\x18\x01 \x01(\x0b\x32,.meshtastic.protobuf.ModuleConfig.MQTTConfig\x12>\n\x06serial\x18\x02 \x01(\x0b\x32..meshtastic.protobuf.ModuleConfig.SerialConfig\x12[\n\x15\x65xternal_notification\x18\x03 \x01(\x0b\x32<.meshtastic.protobuf.ModuleConfig.ExternalNotificationConfig\x12K\n\rstore_forward\x18\x04 \x01(\x0b\x32\x34.meshtastic.protobuf.ModuleConfig.StoreForwardConfig\x12\x45\n\nrange_test\x18\x05 \x01(\x0b\x32\x31.meshtastic.protobuf.ModuleConfig.RangeTestConfig\x12\x44\n\ttelemetry\x18\x06 \x01(\x0b\x32\x31.meshtastic.protobuf.ModuleConfig.TelemetryConfig\x12M\n\x0e\x63\x61nned_message\x18\x07 \x01(\x0b\x32\x35.meshtastic.protobuf.ModuleConfig.CannedMessageConfig\x12<\n\x05\x61udio\x18\t \x01(\x0b\x32-.meshtastic.protobuf.ModuleConfig.AudioConfig\x12O\n\x0fremote_hardware\x18\n \x01(\x0b\x32\x36.meshtastic.protobuf.ModuleConfig.RemoteHardwareConfig\x12K\n\rneighbor_info\x18\x0b \x01(\x0b\x32\x34.meshtastic.protobuf.ModuleConfig.NeighborInfoConfig\x12Q\n\x10\x61mbient_lighting\x18\x0c \x01(\x0b\x32\x37.meshtastic.protobuf.ModuleConfig.AmbientLightingConfig\x12Q\n\x10\x64\x65tection_sensor\x18\r \x01(\x0b\x32\x37.meshtastic.protobuf.ModuleConfig.DetectionSensorConfig\x12\x46\n\npaxcounter\x18\x0e \x01(\x0b\x32\x32.meshtastic.protobuf.ModuleConfig.PaxcounterConfig\x12L\n\rstatusmessage\x18\x0f \x01(\x0b\x32\x35.meshtastic.protobuf.ModuleConfig.StatusMessageConfig\x12U\n\x12traffic_management\x18\x10 \x01(\x0b\x32\x39.meshtastic.protobuf.ModuleConfig.TrafficManagementConfig\x12\x38\n\x03tak\x18\x11 \x01(\x0b\x32+.meshtastic.protobuf.ModuleConfig.TAKConfig\x12G\n\x0bmesh_beacon\x18\x12 \x01(\x0b\x32\x32.meshtastic.protobuf.ModuleConfig.MeshBeaconConfig\x12\x0f\n\x07version\x18\x08 \x01(\rBe\n\x14org.meshtastic.protoB\x0fLocalOnlyProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.localonly_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\017LocalOnlyProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_LOCALCONFIG._serialized_start=136
_LOCALCONFIG._serialized_end=642
_LOCALMODULECONFIG._serialized_start=645
_LOCALMODULECONFIG._serialized_end=1949
# @@protoc_insertion_point(module_scope)
+69
View File
@@ -0,0 +1,69 @@
from meshtastic.protobuf import config_pb2 as _config_pb2
from meshtastic.protobuf import module_config_pb2 as _module_config_pb2
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from typing import ClassVar as _ClassVar, Mapping as _Mapping, Optional as _Optional, Union as _Union
DESCRIPTOR: _descriptor.FileDescriptor
class LocalConfig(_message.Message):
__slots__ = ["bluetooth", "device", "display", "lora", "network", "position", "power", "security", "version"]
BLUETOOTH_FIELD_NUMBER: _ClassVar[int]
DEVICE_FIELD_NUMBER: _ClassVar[int]
DISPLAY_FIELD_NUMBER: _ClassVar[int]
LORA_FIELD_NUMBER: _ClassVar[int]
NETWORK_FIELD_NUMBER: _ClassVar[int]
POSITION_FIELD_NUMBER: _ClassVar[int]
POWER_FIELD_NUMBER: _ClassVar[int]
SECURITY_FIELD_NUMBER: _ClassVar[int]
VERSION_FIELD_NUMBER: _ClassVar[int]
bluetooth: _config_pb2.Config.BluetoothConfig
device: _config_pb2.Config.DeviceConfig
display: _config_pb2.Config.DisplayConfig
lora: _config_pb2.Config.LoRaConfig
network: _config_pb2.Config.NetworkConfig
position: _config_pb2.Config.PositionConfig
power: _config_pb2.Config.PowerConfig
security: _config_pb2.Config.SecurityConfig
version: int
def __init__(self, device: _Optional[_Union[_config_pb2.Config.DeviceConfig, _Mapping]] = ..., position: _Optional[_Union[_config_pb2.Config.PositionConfig, _Mapping]] = ..., power: _Optional[_Union[_config_pb2.Config.PowerConfig, _Mapping]] = ..., network: _Optional[_Union[_config_pb2.Config.NetworkConfig, _Mapping]] = ..., display: _Optional[_Union[_config_pb2.Config.DisplayConfig, _Mapping]] = ..., lora: _Optional[_Union[_config_pb2.Config.LoRaConfig, _Mapping]] = ..., bluetooth: _Optional[_Union[_config_pb2.Config.BluetoothConfig, _Mapping]] = ..., version: _Optional[int] = ..., security: _Optional[_Union[_config_pb2.Config.SecurityConfig, _Mapping]] = ...) -> None: ...
class LocalModuleConfig(_message.Message):
__slots__ = ["ambient_lighting", "audio", "canned_message", "detection_sensor", "external_notification", "mesh_beacon", "mqtt", "neighbor_info", "paxcounter", "range_test", "remote_hardware", "serial", "statusmessage", "store_forward", "tak", "telemetry", "traffic_management", "version"]
AMBIENT_LIGHTING_FIELD_NUMBER: _ClassVar[int]
AUDIO_FIELD_NUMBER: _ClassVar[int]
CANNED_MESSAGE_FIELD_NUMBER: _ClassVar[int]
DETECTION_SENSOR_FIELD_NUMBER: _ClassVar[int]
EXTERNAL_NOTIFICATION_FIELD_NUMBER: _ClassVar[int]
MESH_BEACON_FIELD_NUMBER: _ClassVar[int]
MQTT_FIELD_NUMBER: _ClassVar[int]
NEIGHBOR_INFO_FIELD_NUMBER: _ClassVar[int]
PAXCOUNTER_FIELD_NUMBER: _ClassVar[int]
RANGE_TEST_FIELD_NUMBER: _ClassVar[int]
REMOTE_HARDWARE_FIELD_NUMBER: _ClassVar[int]
SERIAL_FIELD_NUMBER: _ClassVar[int]
STATUSMESSAGE_FIELD_NUMBER: _ClassVar[int]
STORE_FORWARD_FIELD_NUMBER: _ClassVar[int]
TAK_FIELD_NUMBER: _ClassVar[int]
TELEMETRY_FIELD_NUMBER: _ClassVar[int]
TRAFFIC_MANAGEMENT_FIELD_NUMBER: _ClassVar[int]
VERSION_FIELD_NUMBER: _ClassVar[int]
ambient_lighting: _module_config_pb2.ModuleConfig.AmbientLightingConfig
audio: _module_config_pb2.ModuleConfig.AudioConfig
canned_message: _module_config_pb2.ModuleConfig.CannedMessageConfig
detection_sensor: _module_config_pb2.ModuleConfig.DetectionSensorConfig
external_notification: _module_config_pb2.ModuleConfig.ExternalNotificationConfig
mesh_beacon: _module_config_pb2.ModuleConfig.MeshBeaconConfig
mqtt: _module_config_pb2.ModuleConfig.MQTTConfig
neighbor_info: _module_config_pb2.ModuleConfig.NeighborInfoConfig
paxcounter: _module_config_pb2.ModuleConfig.PaxcounterConfig
range_test: _module_config_pb2.ModuleConfig.RangeTestConfig
remote_hardware: _module_config_pb2.ModuleConfig.RemoteHardwareConfig
serial: _module_config_pb2.ModuleConfig.SerialConfig
statusmessage: _module_config_pb2.ModuleConfig.StatusMessageConfig
store_forward: _module_config_pb2.ModuleConfig.StoreForwardConfig
tak: _module_config_pb2.ModuleConfig.TAKConfig
telemetry: _module_config_pb2.ModuleConfig.TelemetryConfig
traffic_management: _module_config_pb2.ModuleConfig.TrafficManagementConfig
version: int
def __init__(self, mqtt: _Optional[_Union[_module_config_pb2.ModuleConfig.MQTTConfig, _Mapping]] = ..., serial: _Optional[_Union[_module_config_pb2.ModuleConfig.SerialConfig, _Mapping]] = ..., external_notification: _Optional[_Union[_module_config_pb2.ModuleConfig.ExternalNotificationConfig, _Mapping]] = ..., store_forward: _Optional[_Union[_module_config_pb2.ModuleConfig.StoreForwardConfig, _Mapping]] = ..., range_test: _Optional[_Union[_module_config_pb2.ModuleConfig.RangeTestConfig, _Mapping]] = ..., telemetry: _Optional[_Union[_module_config_pb2.ModuleConfig.TelemetryConfig, _Mapping]] = ..., canned_message: _Optional[_Union[_module_config_pb2.ModuleConfig.CannedMessageConfig, _Mapping]] = ..., audio: _Optional[_Union[_module_config_pb2.ModuleConfig.AudioConfig, _Mapping]] = ..., remote_hardware: _Optional[_Union[_module_config_pb2.ModuleConfig.RemoteHardwareConfig, _Mapping]] = ..., neighbor_info: _Optional[_Union[_module_config_pb2.ModuleConfig.NeighborInfoConfig, _Mapping]] = ..., ambient_lighting: _Optional[_Union[_module_config_pb2.ModuleConfig.AmbientLightingConfig, _Mapping]] = ..., detection_sensor: _Optional[_Union[_module_config_pb2.ModuleConfig.DetectionSensorConfig, _Mapping]] = ..., paxcounter: _Optional[_Union[_module_config_pb2.ModuleConfig.PaxcounterConfig, _Mapping]] = ..., statusmessage: _Optional[_Union[_module_config_pb2.ModuleConfig.StatusMessageConfig, _Mapping]] = ..., traffic_management: _Optional[_Union[_module_config_pb2.ModuleConfig.TrafficManagementConfig, _Mapping]] = ..., tak: _Optional[_Union[_module_config_pb2.ModuleConfig.TAKConfig, _Mapping]] = ..., mesh_beacon: _Optional[_Union[_module_config_pb2.ModuleConfig.MeshBeaconConfig, _Mapping]] = ..., version: _Optional[int] = ...) -> None: ...
+36
View File
@@ -0,0 +1,36 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/protobuf/lorawan_bridge.proto
"""Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n(meshtastic/protobuf/lorawan_bridge.proto\x12\x13meshtastic.protobuf\"\xa9\x08\n\rLoRaWANBridge\x12;\n\x06uplink\x18\x01 \x01(\x0b\x32).meshtastic.protobuf.LoRaWANBridge.UplinkH\x00\x12?\n\x08\x64ownlink\x18\x02 \x01(\x0b\x32+.meshtastic.protobuf.LoRaWANBridge.DownlinkH\x00\x12@\n\ttx_result\x18\x03 \x01(\x0b\x32+.meshtastic.protobuf.LoRaWANBridge.TxResultH\x00\x12@\n\x05\x63hunk\x18\x04 \x01(\x0b\x32/.meshtastic.protobuf.LoRaWANBridge.PayloadChunkH\x00\x1a\xaf\x01\n\x06Uplink\x12\x0f\n\x07\x66req_hz\x18\x01 \x01(\x07\x12\x0c\n\x04tmst\x18\x02 \x01(\x07\x12\x10\n\x08rssi_x10\x18\x03 \x01(\x11\x12\x0f\n\x07snr_x10\x18\x04 \x01(\x11\x12\x14\n\x0cradio_params\x18\x05 \x01(\r\x12\x13\n\x0b\x66sk_bitrate\x18\t \x01(\r\x12\x0f\n\x07payload\x18\x06 \x01(\x0c\x12\x12\n\npayload_id\x18\x07 \x01(\r\x12\x13\n\x0b\x63hunk_count\x18\x08 \x01(\r\x1a\xef\x01\n\x08\x44ownlink\x12\x0f\n\x07\x66req_hz\x18\x01 \x01(\x07\x12\x0c\n\x04tmst\x18\x02 \x01(\x07\x12\x14\n\x0cradio_params\x18\x03 \x01(\r\x12\x11\n\tpower_dbm\x18\x04 \x01(\r\x12\x11\n\timmediate\x18\x05 \x01(\x08\x12\x17\n\x0finvert_polarity\x18\x06 \x01(\x08\x12\x0e\n\x06no_crc\x18\x07 \x01(\x08\x12\x11\n\tmay_defer\x18\x08 \x01(\x08\x12\x12\n\nrequest_id\x18\x0c \x01(\r\x12\x0f\n\x07payload\x18\t \x01(\x0c\x12\x12\n\npayload_id\x18\n \x01(\r\x12\x13\n\x0b\x63hunk_count\x18\x0b \x01(\r\x1aN\n\x0cPayloadChunk\x12\x12\n\npayload_id\x18\x01 \x01(\r\x12\x13\n\x0b\x63hunk_index\x18\x02 \x01(\r\x12\x15\n\rpayload_chunk\x18\x03 \x01(\x0c\x1a\x96\x02\n\x08TxResult\x12\x0c\n\x04tmst\x18\x01 \x01(\x07\x12\x42\n\x06status\x18\x02 \x01(\x0e\x32\x32.meshtastic.protobuf.LoRaWANBridge.TxResult.Status\x12\x12\n\nrequest_id\x18\x03 \x01(\r\"\xa3\x01\n\x06Status\x12\x08\n\x04NONE\x10\x00\x12\x0c\n\x08TOO_LATE\x10\x01\x12\r\n\tTOO_EARLY\x10\x02\x12\x14\n\x10\x43OLLISION_PACKET\x10\x03\x12\x14\n\x10\x43OLLISION_BEACON\x10\x04\x12\x0b\n\x07TX_FREQ\x10\x05\x12\x0c\n\x08TX_POWER\x10\x06\x12\x10\n\x0cGPS_UNLOCKED\x10\x07\x12\x0c\n\x08\x44\x45\x46\x45RRED\x10\x08\x12\x0b\n\x07\x44ROPPED\x10\tB\t\n\x07variantBi\n\x14org.meshtastic.protoB\x13LoRaWANBridgeProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.lorawan_bridge_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\023LoRaWANBridgeProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_LORAWANBRIDGE._serialized_start=66
_LORAWANBRIDGE._serialized_end=1131
_LORAWANBRIDGE_UPLINK._serialized_start=342
_LORAWANBRIDGE_UPLINK._serialized_end=517
_LORAWANBRIDGE_DOWNLINK._serialized_start=520
_LORAWANBRIDGE_DOWNLINK._serialized_end=759
_LORAWANBRIDGE_PAYLOADCHUNK._serialized_start=761
_LORAWANBRIDGE_PAYLOADCHUNK._serialized_end=839
_LORAWANBRIDGE_TXRESULT._serialized_start=842
_LORAWANBRIDGE_TXRESULT._serialized_end=1120
_LORAWANBRIDGE_TXRESULT_STATUS._serialized_start=957
_LORAWANBRIDGE_TXRESULT_STATUS._serialized_end=1120
# @@protoc_insertion_point(module_scope)
@@ -0,0 +1,96 @@
from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from typing import ClassVar as _ClassVar, Mapping as _Mapping, Optional as _Optional, Union as _Union
DESCRIPTOR: _descriptor.FileDescriptor
class LoRaWANBridge(_message.Message):
__slots__ = ["chunk", "downlink", "tx_result", "uplink"]
class Downlink(_message.Message):
__slots__ = ["chunk_count", "freq_hz", "immediate", "invert_polarity", "may_defer", "no_crc", "payload", "payload_id", "power_dbm", "radio_params", "request_id", "tmst"]
CHUNK_COUNT_FIELD_NUMBER: _ClassVar[int]
FREQ_HZ_FIELD_NUMBER: _ClassVar[int]
IMMEDIATE_FIELD_NUMBER: _ClassVar[int]
INVERT_POLARITY_FIELD_NUMBER: _ClassVar[int]
MAY_DEFER_FIELD_NUMBER: _ClassVar[int]
NO_CRC_FIELD_NUMBER: _ClassVar[int]
PAYLOAD_FIELD_NUMBER: _ClassVar[int]
PAYLOAD_ID_FIELD_NUMBER: _ClassVar[int]
POWER_DBM_FIELD_NUMBER: _ClassVar[int]
RADIO_PARAMS_FIELD_NUMBER: _ClassVar[int]
REQUEST_ID_FIELD_NUMBER: _ClassVar[int]
TMST_FIELD_NUMBER: _ClassVar[int]
chunk_count: int
freq_hz: int
immediate: bool
invert_polarity: bool
may_defer: bool
no_crc: bool
payload: bytes
payload_id: int
power_dbm: int
radio_params: int
request_id: int
tmst: int
def __init__(self, freq_hz: _Optional[int] = ..., tmst: _Optional[int] = ..., radio_params: _Optional[int] = ..., power_dbm: _Optional[int] = ..., immediate: bool = ..., invert_polarity: bool = ..., no_crc: bool = ..., may_defer: bool = ..., request_id: _Optional[int] = ..., payload: _Optional[bytes] = ..., payload_id: _Optional[int] = ..., chunk_count: _Optional[int] = ...) -> None: ...
class PayloadChunk(_message.Message):
__slots__ = ["chunk_index", "payload_chunk", "payload_id"]
CHUNK_INDEX_FIELD_NUMBER: _ClassVar[int]
PAYLOAD_CHUNK_FIELD_NUMBER: _ClassVar[int]
PAYLOAD_ID_FIELD_NUMBER: _ClassVar[int]
chunk_index: int
payload_chunk: bytes
payload_id: int
def __init__(self, payload_id: _Optional[int] = ..., chunk_index: _Optional[int] = ..., payload_chunk: _Optional[bytes] = ...) -> None: ...
class TxResult(_message.Message):
__slots__ = ["request_id", "status", "tmst"]
class Status(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
COLLISION_BEACON: LoRaWANBridge.TxResult.Status
COLLISION_PACKET: LoRaWANBridge.TxResult.Status
DEFERRED: LoRaWANBridge.TxResult.Status
DROPPED: LoRaWANBridge.TxResult.Status
GPS_UNLOCKED: LoRaWANBridge.TxResult.Status
NONE: LoRaWANBridge.TxResult.Status
REQUEST_ID_FIELD_NUMBER: _ClassVar[int]
STATUS_FIELD_NUMBER: _ClassVar[int]
TMST_FIELD_NUMBER: _ClassVar[int]
TOO_EARLY: LoRaWANBridge.TxResult.Status
TOO_LATE: LoRaWANBridge.TxResult.Status
TX_FREQ: LoRaWANBridge.TxResult.Status
TX_POWER: LoRaWANBridge.TxResult.Status
request_id: int
status: LoRaWANBridge.TxResult.Status
tmst: int
def __init__(self, tmst: _Optional[int] = ..., status: _Optional[_Union[LoRaWANBridge.TxResult.Status, str]] = ..., request_id: _Optional[int] = ...) -> None: ...
class Uplink(_message.Message):
__slots__ = ["chunk_count", "freq_hz", "fsk_bitrate", "payload", "payload_id", "radio_params", "rssi_x10", "snr_x10", "tmst"]
CHUNK_COUNT_FIELD_NUMBER: _ClassVar[int]
FREQ_HZ_FIELD_NUMBER: _ClassVar[int]
FSK_BITRATE_FIELD_NUMBER: _ClassVar[int]
PAYLOAD_FIELD_NUMBER: _ClassVar[int]
PAYLOAD_ID_FIELD_NUMBER: _ClassVar[int]
RADIO_PARAMS_FIELD_NUMBER: _ClassVar[int]
RSSI_X10_FIELD_NUMBER: _ClassVar[int]
SNR_X10_FIELD_NUMBER: _ClassVar[int]
TMST_FIELD_NUMBER: _ClassVar[int]
chunk_count: int
freq_hz: int
fsk_bitrate: int
payload: bytes
payload_id: int
radio_params: int
rssi_x10: int
snr_x10: int
tmst: int
def __init__(self, freq_hz: _Optional[int] = ..., tmst: _Optional[int] = ..., rssi_x10: _Optional[int] = ..., snr_x10: _Optional[int] = ..., radio_params: _Optional[int] = ..., fsk_bitrate: _Optional[int] = ..., payload: _Optional[bytes] = ..., payload_id: _Optional[int] = ..., chunk_count: _Optional[int] = ...) -> None: ...
CHUNK_FIELD_NUMBER: _ClassVar[int]
DOWNLINK_FIELD_NUMBER: _ClassVar[int]
TX_RESULT_FIELD_NUMBER: _ClassVar[int]
UPLINK_FIELD_NUMBER: _ClassVar[int]
chunk: LoRaWANBridge.PayloadChunk
downlink: LoRaWANBridge.Downlink
tx_result: LoRaWANBridge.TxResult
uplink: LoRaWANBridge.Uplink
def __init__(self, uplink: _Optional[_Union[LoRaWANBridge.Uplink, _Mapping]] = ..., downlink: _Optional[_Union[LoRaWANBridge.Downlink, _Mapping]] = ..., tx_result: _Optional[_Union[LoRaWANBridge.TxResult, _Mapping]] = ..., chunk: _Optional[_Union[LoRaWANBridge.PayloadChunk, _Mapping]] = ...) -> None: ...
+28
View File
@@ -0,0 +1,28 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/protobuf/mesh_beacon.proto
"""Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
from meshtastic.protobuf import channel_pb2 as meshtastic_dot_protobuf_dot_channel__pb2
from meshtastic.protobuf import config_pb2 as meshtastic_dot_protobuf_dot_config__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n%meshtastic/protobuf/mesh_beacon.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/config.proto\"\xbf\x02\n\nMeshBeacon\x12\x0f\n\x07message\x18\x01 \x01(\t\x12;\n\roffer_channel\x18\x02 \x01(\x0b\x32$.meshtastic.protobuf.ChannelSettings\x12G\n\x0coffer_region\x18\x03 \x01(\x0e\x32\x31.meshtastic.protobuf.Config.LoRaConfig.RegionCode\x12M\n\x0coffer_preset\x18\x04 \x01(\x0e\x32\x32.meshtastic.protobuf.Config.LoRaConfig.ModemPresetH\x00\x88\x01\x01\x12!\n\x14offer_frequency_slot\x18\x05 \x01(\rH\x01\x88\x01\x01\x42\x0f\n\r_offer_presetB\x17\n\x15_offer_frequency_slotBf\n\x14org.meshtastic.protoB\x10MeshBeaconProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.mesh_beacon_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\020MeshBeaconProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_MESHBEACON._serialized_start=132
_MESHBEACON._serialized_end=451
# @@protoc_insertion_point(module_scope)
+21
View File
@@ -0,0 +1,21 @@
from meshtastic.protobuf import channel_pb2 as _channel_pb2
from meshtastic.protobuf import config_pb2 as _config_pb2
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from typing import ClassVar as _ClassVar, Mapping as _Mapping, Optional as _Optional, Union as _Union
DESCRIPTOR: _descriptor.FileDescriptor
class MeshBeacon(_message.Message):
__slots__ = ["message", "offer_channel", "offer_frequency_slot", "offer_preset", "offer_region"]
MESSAGE_FIELD_NUMBER: _ClassVar[int]
OFFER_CHANNEL_FIELD_NUMBER: _ClassVar[int]
OFFER_FREQUENCY_SLOT_FIELD_NUMBER: _ClassVar[int]
OFFER_PRESET_FIELD_NUMBER: _ClassVar[int]
OFFER_REGION_FIELD_NUMBER: _ClassVar[int]
message: str
offer_channel: _channel_pb2.ChannelSettings
offer_frequency_slot: int
offer_preset: _config_pb2.Config.LoRaConfig.ModemPreset
offer_region: _config_pb2.Config.LoRaConfig.RegionCode
def __init__(self, message: _Optional[str] = ..., offer_channel: _Optional[_Union[_channel_pb2.ChannelSettings, _Mapping]] = ..., offer_region: _Optional[_Union[_config_pb2.Config.LoRaConfig.RegionCode, str]] = ..., offer_preset: _Optional[_Union[_config_pb2.Config.LoRaConfig.ModemPreset, str]] = ..., offer_frequency_slot: _Optional[int] = ...) -> None: ...
+184
View File
@@ -0,0 +1,184 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/protobuf/mesh.proto
"""Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
from meshtastic.protobuf import channel_pb2 as meshtastic_dot_protobuf_dot_channel__pb2
from meshtastic.protobuf import config_pb2 as meshtastic_dot_protobuf_dot_config__pb2
from meshtastic.protobuf import device_ui_pb2 as meshtastic_dot_protobuf_dot_device__ui__pb2
from meshtastic.protobuf import field_metadata_pb2 as meshtastic_dot_protobuf_dot_field__metadata__pb2
from meshtastic.protobuf import module_config_pb2 as meshtastic_dot_protobuf_dot_module__config__pb2
from meshtastic.protobuf import portnums_pb2 as meshtastic_dot_protobuf_dot_portnums__pb2
from meshtastic.protobuf import telemetry_pb2 as meshtastic_dot_protobuf_dot_telemetry__pb2
from meshtastic.protobuf import xmodem_pb2 as meshtastic_dot_protobuf_dot_xmodem__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1emeshtastic/protobuf/mesh.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/config.proto\x1a#meshtastic/protobuf/device_ui.proto\x1a(meshtastic/protobuf/field_metadata.proto\x1a\'meshtastic/protobuf/module_config.proto\x1a\"meshtastic/protobuf/portnums.proto\x1a#meshtastic/protobuf/telemetry.proto\x1a meshtastic/protobuf/xmodem.proto\"\x99\x07\n\x08Position\x12\x17\n\nlatitude_i\x18\x01 \x01(\x0fH\x00\x88\x01\x01\x12\x18\n\x0blongitude_i\x18\x02 \x01(\x0fH\x01\x88\x01\x01\x12\x15\n\x08\x61ltitude\x18\x03 \x01(\x05H\x02\x88\x01\x01\x12\x0c\n\x04time\x18\x04 \x01(\x07\x12@\n\x0flocation_source\x18\x05 \x01(\x0e\x32\'.meshtastic.protobuf.Position.LocSource\x12@\n\x0f\x61ltitude_source\x18\x06 \x01(\x0e\x32\'.meshtastic.protobuf.Position.AltSource\x12\x11\n\ttimestamp\x18\x07 \x01(\x07\x12\x1f\n\x17timestamp_millis_adjust\x18\x08 \x01(\x05\x12\x19\n\x0c\x61ltitude_hae\x18\t \x01(\x11H\x03\x88\x01\x01\x12(\n\x1b\x61ltitude_geoidal_separation\x18\n \x01(\x11H\x04\x88\x01\x01\x12\x0c\n\x04PDOP\x18\x0b \x01(\r\x12\x0c\n\x04HDOP\x18\x0c \x01(\r\x12\x0c\n\x04VDOP\x18\r \x01(\r\x12\x14\n\x0cgps_accuracy\x18\x0e \x01(\r\x12\x19\n\x0cground_speed\x18\x0f \x01(\rH\x05\x88\x01\x01\x12\x19\n\x0cground_track\x18\x10 \x01(\rH\x06\x88\x01\x01\x12\x13\n\x0b\x66ix_quality\x18\x11 \x01(\r\x12\x10\n\x08\x66ix_type\x18\x12 \x01(\r\x12\x14\n\x0csats_in_view\x18\x13 \x01(\r\x12\x11\n\tsensor_id\x18\x14 \x01(\r\x12\x13\n\x0bnext_update\x18\x15 \x01(\r\x12\x12\n\nseq_number\x18\x16 \x01(\r\x12\x16\n\x0eprecision_bits\x18\x17 \x01(\r\"N\n\tLocSource\x12\r\n\tLOC_UNSET\x10\x00\x12\x0e\n\nLOC_MANUAL\x10\x01\x12\x10\n\x0cLOC_INTERNAL\x10\x02\x12\x10\n\x0cLOC_EXTERNAL\x10\x03\"b\n\tAltSource\x12\r\n\tALT_UNSET\x10\x00\x12\x0e\n\nALT_MANUAL\x10\x01\x12\x10\n\x0c\x41LT_INTERNAL\x10\x02\x12\x10\n\x0c\x41LT_EXTERNAL\x10\x03\x12\x12\n\x0e\x41LT_BAROMETRIC\x10\x04\x42\r\n\x0b_latitude_iB\x0e\n\x0c_longitude_iB\x0b\n\t_altitudeB\x0f\n\r_altitude_haeB\x1e\n\x1c_altitude_geoidal_separationB\x0f\n\r_ground_speedB\x0f\n\r_ground_track\"\x9c\x02\n\x04User\x12\n\n\x02id\x18\x01 \x01(\t\x12\x11\n\tlong_name\x18\x02 \x01(\t\x12\x12\n\nshort_name\x18\x03 \x01(\t\x12\x13\n\x07macaddr\x18\x04 \x01(\x0c\x42\x02\x18\x01\x12\x34\n\x08hw_model\x18\x05 \x01(\x0e\x32\".meshtastic.protobuf.HardwareModel\x12\x13\n\x0bis_licensed\x18\x06 \x01(\x08\x12;\n\x04role\x18\x07 \x01(\x0e\x32-.meshtastic.protobuf.Config.DeviceConfig.Role\x12\x12\n\npublic_key\x18\x08 \x01(\x0c\x12\x1c\n\x0fis_unmessagable\x18\t \x01(\x08H\x00\x88\x01\x01\x42\x12\n\x10_is_unmessagable\"Z\n\x0eRouteDiscovery\x12\r\n\x05route\x18\x01 \x03(\x07\x12\x13\n\x0bsnr_towards\x18\x02 \x03(\x05\x12\x12\n\nroute_back\x18\x03 \x03(\x07\x12\x10\n\x08snr_back\x18\x04 \x03(\x05\"\xc7\x04\n\x07Routing\x12<\n\rroute_request\x18\x01 \x01(\x0b\x32#.meshtastic.protobuf.RouteDiscoveryH\x00\x12:\n\x0broute_reply\x18\x02 \x01(\x0b\x32#.meshtastic.protobuf.RouteDiscoveryH\x00\x12:\n\x0c\x65rror_reason\x18\x03 \x01(\x0e\x32\".meshtastic.protobuf.Routing.ErrorH\x00\x12\x11\n\tack_proof\x18\x04 \x01(\x0c\"\xe7\x02\n\x05\x45rror\x12\x08\n\x04NONE\x10\x00\x12\x0c\n\x08NO_ROUTE\x10\x01\x12\x0b\n\x07GOT_NAK\x10\x02\x12\x0b\n\x07TIMEOUT\x10\x03\x12\x10\n\x0cNO_INTERFACE\x10\x04\x12\x12\n\x0eMAX_RETRANSMIT\x10\x05\x12\x0e\n\nNO_CHANNEL\x10\x06\x12\r\n\tTOO_LARGE\x10\x07\x12\x0f\n\x0bNO_RESPONSE\x10\x08\x12\x14\n\x10\x44UTY_CYCLE_LIMIT\x10\t\x12\x0f\n\x0b\x42\x41\x44_REQUEST\x10 \x12\x12\n\x0eNOT_AUTHORIZED\x10!\x12\x0e\n\nPKI_FAILED\x10\"\x12\x16\n\x12PKI_UNKNOWN_PUBKEY\x10#\x12\x19\n\x15\x41\x44MIN_BAD_SESSION_KEY\x10$\x12!\n\x1d\x41\x44MIN_PUBLIC_KEY_UNAUTHORIZED\x10%\x12\x17\n\x13RATE_LIMIT_EXCEEDED\x10&\x12\x1c\n\x18PKI_SEND_FAIL_PUBLIC_KEY\x10\'B\t\n\x07variant\"\xee\x01\n\x04\x44\x61ta\x12-\n\x07portnum\x18\x01 \x01(\x0e\x32\x1c.meshtastic.protobuf.PortNum\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\x12\x15\n\rwant_response\x18\x03 \x01(\x08\x12\x0c\n\x04\x64\x65st\x18\x04 \x01(\x07\x12\x0e\n\x06source\x18\x05 \x01(\x07\x12\x12\n\nrequest_id\x18\x06 \x01(\x07\x12\x10\n\x08reply_id\x18\x07 \x01(\x07\x12\r\n\x05\x65moji\x18\x08 \x01(\x07\x12\x15\n\x08\x62itfield\x18\t \x01(\rH\x00\x88\x01\x01\x12\x18\n\x10xeddsa_signature\x18\n \x01(\x0c\x42\x0b\n\t_bitfield\">\n\x0fKeyVerification\x12\r\n\x05nonce\x18\x01 \x01(\x04\x12\r\n\x05hash1\x18\x02 \x01(\x0c\x12\r\n\x05hash2\x18\x03 \x01(\x0c\"\xd4\x03\n\x14StoreForwardPlusPlus\x12V\n\x11sfpp_message_type\x18\x01 \x01(\x0e\x32;.meshtastic.protobuf.StoreForwardPlusPlus.SFPP_message_type\x12\x14\n\x0cmessage_hash\x18\x02 \x01(\x0c\x12\x13\n\x0b\x63ommit_hash\x18\x03 \x01(\x0c\x12\x11\n\troot_hash\x18\x04 \x01(\x0c\x12\x0f\n\x07message\x18\x05 \x01(\x0c\x12\x17\n\x0f\x65ncapsulated_id\x18\x06 \x01(\r\x12\x17\n\x0f\x65ncapsulated_to\x18\x07 \x01(\r\x12\x19\n\x11\x65ncapsulated_from\x18\x08 \x01(\r\x12\x1b\n\x13\x65ncapsulated_rxtime\x18\t \x01(\r\x12\x13\n\x0b\x63hain_count\x18\nLine truncated
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.mesh_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\nMeshProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_HARDWAREMODEL.values_by_name["TBEAM"]._options = None
_HARDWAREMODEL.values_by_name["TBEAM"]._serialized_options = b'\312\363\030\002`\001'
_HARDWAREMODEL.values_by_name["T_ECHO"]._options = None
_HARDWAREMODEL.values_by_name["T_ECHO"]._serialized_options = b'\312\363\030\002`\001'
_HARDWAREMODEL.values_by_name["LILYGO_TBEAM_S3_CORE"]._options = None
_HARDWAREMODEL.values_by_name["LILYGO_TBEAM_S3_CORE"]._serialized_options = b'\312\363\030\002`\001'
_HARDWAREMODEL.values_by_name["WIO_WM1110"]._options = None
_HARDWAREMODEL.values_by_name["WIO_WM1110"]._serialized_options = b'\312\363\030\002`\001'
_HARDWAREMODEL.values_by_name["CANARYONE"]._options = None
_HARDWAREMODEL.values_by_name["CANARYONE"]._serialized_options = b'\312\363\030\002`\001'
_HARDWAREMODEL.values_by_name["T_ECHO_PLUS"]._options = None
_HARDWAREMODEL.values_by_name["T_ECHO_PLUS"]._serialized_options = b'\312\363\030\002`\001'
_HARDWAREMODEL.values_by_name["HELTEC_WIRELESS_TRACKER"]._options = None
_HARDWAREMODEL.values_by_name["HELTEC_WIRELESS_TRACKER"]._serialized_options = b'\312\363\030\002`\001'
_HARDWAREMODEL.values_by_name["TRACKER_T1000_E"]._options = None
_HARDWAREMODEL.values_by_name["TRACKER_T1000_E"]._serialized_options = b'\312\363\030\002`\001'
_HARDWAREMODEL.values_by_name["THINKNODE_M1"]._options = None
_HARDWAREMODEL.values_by_name["THINKNODE_M1"]._serialized_options = b'\312\363\030\002`\001'
_HARDWAREMODEL.values_by_name["SEEED_WIO_TRACKER_L1"]._options = None
_HARDWAREMODEL.values_by_name["SEEED_WIO_TRACKER_L1"]._serialized_options = b'\312\363\030\002`\001'
_HARDWAREMODEL.values_by_name["SEEED_WIO_TRACKER_L1_EINK"]._options = None
_HARDWAREMODEL.values_by_name["SEEED_WIO_TRACKER_L1_EINK"]._serialized_options = b'\312\363\030\002`\001'
_HARDWAREMODEL.values_by_name["T_DECK_PRO"]._options = None
_HARDWAREMODEL.values_by_name["T_DECK_PRO"]._serialized_options = b'\312\363\030\002`\001'
_HARDWAREMODEL.values_by_name["T_LORA_PAGER"]._options = None
_HARDWAREMODEL.values_by_name["T_LORA_PAGER"]._serialized_options = b'\312\363\030\002`\001'
_HARDWAREMODEL.values_by_name["WISMESH_TAG"]._options = None
_HARDWAREMODEL.values_by_name["WISMESH_TAG"]._serialized_options = b'\312\363\030\002`\001'
_HARDWAREMODEL.values_by_name["HELTEC_WIRELESS_TRACKER_V2"]._options = None
_HARDWAREMODEL.values_by_name["HELTEC_WIRELESS_TRACKER_V2"]._serialized_options = b'\312\363\030\002`\001'
_HARDWAREMODEL.values_by_name["TBEAM_1_WATT"]._options = None
_HARDWAREMODEL.values_by_name["TBEAM_1_WATT"]._serialized_options = b'\312\363\030\002`\001'
_HARDWAREMODEL.values_by_name["TBEAM_BPF"]._options = None
_HARDWAREMODEL.values_by_name["TBEAM_BPF"]._serialized_options = b'\312\363\030\002`\001'
_HARDWAREMODEL.values_by_name["MESH_TRACKER_X1"]._options = None
_HARDWAREMODEL.values_by_name["MESH_TRACKER_X1"]._serialized_options = b'\312\363\030\002`\001'
_USER.fields_by_name['macaddr']._options = None
_USER.fields_by_name['macaddr']._serialized_options = b'\030\001'
_MESHPACKET.fields_by_name['delayed']._options = None
_MESHPACKET.fields_by_name['delayed']._serialized_options = b'\030\001'
_HARDWAREMODEL._serialized_start=10490
_HARDWAREMODEL._serialized_end=13636
_CONSTANTS._serialized_start=13638
_CONSTANTS._serialized_end=13682
_CRITICALERRORCODE._serialized_start=13685
_CRITICALERRORCODE._serialized_end=13993
_FIRMWAREEDITION._serialized_start=13996
_FIRMWAREEDITION._serialized_end=14157
_EXCLUDEDMODULES._serialized_start=14160
_EXCLUDEDMODULES._serialized_end=14647
_POSITION._serialized_start=352
_POSITION._serialized_end=1273
_POSITION_LOCSOURCE._serialized_start=968
_POSITION_LOCSOURCE._serialized_end=1046
_POSITION_ALTSOURCE._serialized_start=1048
_POSITION_ALTSOURCE._serialized_end=1146
_USER._serialized_start=1276
_USER._serialized_end=1560
_ROUTEDISCOVERY._serialized_start=1562
_ROUTEDISCOVERY._serialized_end=1652
_ROUTING._serialized_start=1655
_ROUTING._serialized_end=2238
_ROUTING_ERROR._serialized_start=1868
_ROUTING_ERROR._serialized_end=2227
_DATA._serialized_start=2241
_DATA._serialized_end=2479
_KEYVERIFICATION._serialized_start=2481
_KEYVERIFICATION._serialized_end=2543
_STOREFORWARDPLUSPLUS._serialized_start=2546
_STOREFORWARDPLUSPLUS._serialized_end=3014
_STOREFORWARDPLUSPLUS_SFPP_MESSAGE_TYPE._serialized_start=2865
_STOREFORWARDPLUSPLUS_SFPP_MESSAGE_TYPE._serialized_end=3014
_REMOTESHELL._serialized_start=3017
_REMOTESHELL._serialized_end=3381
_REMOTESHELL_OPCODE._serialized_start=3238
_REMOTESHELL_OPCODE._serialized_end=3381
_BOUNDINGBOX._serialized_start=3383
_BOUNDINGBOX._serialized_end=3500
_WAYPOINT._serialized_start=3503
_WAYPOINT._serialized_end=3874
_STATUSMESSAGE._serialized_start=3876
_STATUSMESSAGE._serialized_end=3907
_MQTTCLIENTPROXYMESSAGE._serialized_start=3909
_MQTTCLIENTPROXYMESSAGE._serialized_end=4017
_MESHPACKET._serialized_start=4020
_MESHPACKET._serialized_end=5414
_MESHPACKET_PRIORITY._serialized_start=4754
_MESHPACKET_PRIORITY._serialized_end=4880
_MESHPACKET_DELAYED._serialized_start=4882
_MESHPACKET_DELAYED._serialized_end=4948
_MESHPACKET_TRANSPORTMECHANISM._serialized_start=4951
_MESHPACKET_TRANSPORTMECHANISM._serialized_end=5185
_MESHPACKET_ACKPROOFSTATUS._serialized_start=5187
_MESHPACKET_ACKPROOFSTATUS._serialized_end=5291
_MESHPACKET_SLOTPARITY._serialized_start=5293
_MESHPACKET_SLOTPARITY._serialized_end=5371
_NODEINFO._serialized_start=5417
_NODEINFO._serialized_end=5847
_MYNODEINFO._serialized_start=5850
_MYNODEINFO._serialized_end=6052
_LOGRECORD._serialized_start=6055
_LOGRECORD._serialized_end=6256
_LOGRECORD_LEVEL._serialized_start=6168
_LOGRECORD_LEVEL._serialized_end=6256
_QUEUESTATUS._serialized_start=6258
_QUEUESTATUS._serialized_end=6338
_FROMRADIO._serialized_start=6341
_FROMRADIO._serialized_end=7360
_LOCKDOWNSTATUS._serialized_start=7363
_LOCKDOWNSTATUS._serialized_end=7647
_LOCKDOWNSTATUS_STATE._serialized_start=7537
_LOCKDOWNSTATUS_STATE._serialized_end=7647
_CLIENTNOTIFICATION._serialized_start=7650
_CLIENTNOTIFICATION._serialized_end=8210
_KEYVERIFICATIONNUMBERINFORM._serialized_start=8212
_KEYVERIFICATIONNUMBERINFORM._serialized_end=8306
_KEYVERIFICATIONNUMBERREQUEST._serialized_start=8308
_KEYVERIFICATIONNUMBERREQUEST._serialized_end=8378
_KEYVERIFICATIONFINAL._serialized_start=8380
_KEYVERIFICATIONFINAL._serialized_end=8493
_DUPLICATEDPUBLICKEY._serialized_start=8495
_DUPLICATEDPUBLICKEY._serialized_end=8516
_LOWENTROPYKEY._serialized_start=8518
_LOWENTROPYKEY._serialized_end=8533
_FILEINFO._serialized_start=8535
_FILEINFO._serialized_end=8584
_TORADIO._serialized_start=8587
_TORADIO._serialized_end=8899
_COMPRESSED._serialized_start=8901
_COMPRESSED._serialized_end=8974
_NEIGHBORINFO._serialized_start=8977
_NEIGHBORINFO._serialized_end=9121
_NEIGHBOR._serialized_start=9123
_NEIGHBOR._serialized_end=9223
_DEVICEMETADATA._serialized_start=9226
_DEVICEMETADATA._serialized_end=9607
_LORAPRESETGROUP._serialized_start=9610
_LORAPRESETGROUP._serialized_end=9795
_LORAREGIONPRESETS._serialized_start=9797
_LORAREGIONPRESETS._serialized_end=9904
_LORAREGIONPRESETMAP._serialized_start=9907
_LORAREGIONPRESETMAP._serialized_end=10045
_HEARTBEAT._serialized_start=10047
_HEARTBEAT._serialized_end=10073
_NODEREMOTEHARDWAREPIN._serialized_start=10075
_NODEREMOTEHARDWAREPIN._serialized_end=10169
_CHUNKEDPAYLOAD._serialized_start=10171
_CHUNKEDPAYLOAD._serialized_end=10272
_RESEND_CHUNKS._serialized_start=10274
_RESEND_CHUNKS._serialized_end=10305
_CHUNKEDPAYLOADRESPONSE._serialized_start=10308
_CHUNKEDPAYLOADRESPONSE._serialized_end=10487
# @@protoc_insertion_point(module_scope)
+978
View File
@@ -0,0 +1,978 @@
from meshtastic.protobuf import channel_pb2 as _channel_pb2
from meshtastic.protobuf import config_pb2 as _config_pb2
from meshtastic.protobuf import device_ui_pb2 as _device_ui_pb2
from meshtastic.protobuf import field_metadata_pb2 as _field_metadata_pb2
from meshtastic.protobuf import module_config_pb2 as _module_config_pb2
from meshtastic.protobuf import portnums_pb2 as _portnums_pb2
from meshtastic.protobuf import telemetry_pb2 as _telemetry_pb2
from meshtastic.protobuf import xmodem_pb2 as _xmodem_pb2
from google.protobuf.internal import containers as _containers
from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Mapping, Optional as _Optional, Union as _Union
AMBIENTLIGHTING_CONFIG: ExcludedModules
ANDROID_SIM: HardwareModel
AUDIO_CONFIG: ExcludedModules
AXIOMETA_GENESIS_MINI: HardwareModel
BETAFPV_2400_TX: HardwareModel
BETAFPV_900_NANO_TX: HardwareModel
BLUETOOTH_CONFIG: ExcludedModules
BROWNOUT: CriticalErrorCode
BURNING_MAN: FirmwareEdition
CANARYONE: HardwareModel
CANNEDMSG_CONFIG: ExcludedModules
CCC: FirmwareEdition
CDEBYTE_EORA_S3: HardwareModel
CHATTER_2: HardwareModel
CROWPANEL: HardwareModel
CROWPANEL_P4: HardwareModel
DATA_PAYLOAD_LEN: Constants
DEFCON: FirmwareEdition
DESCRIPTOR: _descriptor.FileDescriptor
DETECTIONSENSOR_CONFIG: ExcludedModules
DIY_EDITION: FirmwareEdition
DIY_V1: HardwareModel
DRAGON_CON: FirmwareEdition
DR_DEV: HardwareModel
EBYTE_ESP32_S3: HardwareModel
ESP32_S3_PICO: HardwareModel
EXCLUDED_NONE: ExcludedModules
EXTNOTIF_CONFIG: ExcludedModules
FAB: FirmwareEdition
FLASH_CORRUPTION_RECOVERABLE: CriticalErrorCode
FLASH_CORRUPTION_UNRECOVERABLE: CriticalErrorCode
GENIEBLOCKS: HardwareModel
HAMVENTION: FirmwareEdition
HELTEC_CAPSULE_SENSOR_V3: HardwareModel
HELTEC_HRU_3601: HardwareModel
HELTEC_HT62: HardwareModel
HELTEC_MESH_NODE_T096: HardwareModel
HELTEC_MESH_NODE_T1: HardwareModel
HELTEC_MESH_NODE_T114: HardwareModel
HELTEC_MESH_POCKET: HardwareModel
HELTEC_MESH_POCKET_V2: HardwareModel
HELTEC_MESH_SOLAR: HardwareModel
HELTEC_MESH_TOWER_V2: HardwareModel
HELTEC_RC32: HardwareModel
HELTEC_RC52: HardwareModel
HELTEC_RCC6: HardwareModel
HELTEC_SENSOR_HUB: HardwareModel
HELTEC_V1: HardwareModel
HELTEC_V2_0: HardwareModel
HELTEC_V2_1: HardwareModel
HELTEC_V3: HardwareModel
HELTEC_V4: HardwareModel
HELTEC_V4_R8: HardwareModel
HELTEC_VISION_MASTER_E213: HardwareModel
HELTEC_VISION_MASTER_E290: HardwareModel
HELTEC_VISION_MASTER_T190: HardwareModel
HELTEC_WIRELESS_BRIDGE: HardwareModel
HELTEC_WIRELESS_PAPER: HardwareModel
HELTEC_WIRELESS_PAPER_V1_0: HardwareModel
HELTEC_WIRELESS_TRACKER: HardwareModel
HELTEC_WIRELESS_TRACKER_V1_0: HardwareModel
HELTEC_WIRELESS_TRACKER_V2: HardwareModel
HELTEC_WSL_V3: HardwareModel
INVALID_RADIO_SETTING: CriticalErrorCode
LILYGO_TBEAM_S3_CORE: HardwareModel
LINK_32: HardwareModel
LORA_RELAY_V1: HardwareModel
LORA_TYPE: HardwareModel
M5STACK: HardwareModel
M5STACK_C6L: HardwareModel
M5STACK_CARDPUTER_ADV: HardwareModel
M5STACK_CORE2: HardwareModel
M5STACK_COREBASIC: HardwareModel
M5STACK_CORES3: HardwareModel
M5STACK_RESERVED: HardwareModel
MAKERFABS_NOMAD_TERMINAL: HardwareModel
MAKERFABS_RESERVED: HardwareModel
MAKERFABS_TRACKER: HardwareModel
ME25LS01_4Y10TD: HardwareModel
MESHBEACON_CONFIG: ExcludedModules
MESHLINK: HardwareModel
MESHNOLOGY_W10: HardwareModel
MESHNOLOGY_W12: HardwareModel
MESHPAGER_X2: HardwareModel
MESHSTICK_1262: HardwareModel
MESH_TAB: HardwareModel
MESH_TRACKER_X1: HardwareModel
MINI_EPAPER_S3: HardwareModel
MQTT_CONFIG: ExcludedModules
MS24SF1: HardwareModel
MUZI_BASE: HardwareModel
MUZI_R1_NEO: HardwareModel
NANO_G1: HardwareModel
NANO_G1_EXPLORER: HardwareModel
NANO_G2_ULTRA: HardwareModel
NEIGHBORINFO_CONFIG: ExcludedModules
NETWORK_CONFIG: ExcludedModules
NODARA: HardwareModel
NOMADSTAR_METEOR_PRO: HardwareModel
NONE: CriticalErrorCode
NO_AXP192: CriticalErrorCode
NO_RADIO: CriticalErrorCode
NRF52840_PCA10059: HardwareModel
NRF52_PROMICRO_DIY: HardwareModel
NRF52_UNKNOWN: HardwareModel
OPEN_SAUCE: FirmwareEdition
PAXCOUNTER_CONFIG: ExcludedModules
PICOMPUTER_S3: HardwareModel
PORTDUINO: HardwareModel
PPR: HardwareModel
PRIVATE_HW: HardwareModel
RADIOMASTER_900_BANDIT: HardwareModel
RADIOMASTER_900_BANDIT_NANO: HardwareModel
RADIO_SPI_BUG: CriticalErrorCode
RAK11200: HardwareModel
RAK11310: HardwareModel
RAK2560: HardwareModel
RAK3172: HardwareModel
RAK3312: HardwareModel
RAK3401: HardwareModel
RAK4631: HardwareModel
RAK6421: HardwareModel
RANGETEST_CONFIG: ExcludedModules
REMOTEHARDWARE_CONFIG: ExcludedModules
ROUTASTIC: HardwareModel
RP2040_FEATHER_RFM95: HardwareModel
RP2040_LORA: HardwareModel
RPI_PICO: HardwareModel
RPI_PICO2: HardwareModel
SEEED_SOLAR_NODE: HardwareModel
SEEED_WIO_TRACKER_L1: HardwareModel
SEEED_WIO_TRACKER_L1_EINK: HardwareModel
SEEED_WIO_TRACKER_L1_PRO_1W: HardwareModel
SEEED_WIO_TRACKER_L2: HardwareModel
SEEED_XIAO_S3: HardwareModel
SENSECAP_INDICATOR: HardwareModel
SERIAL_CONFIG: ExcludedModules
SLEEP_ENTER_WAIT: CriticalErrorCode
SMART_CITIZEN: FirmwareEdition
STATION_G1: HardwareModel
STATION_G2: HardwareModel
STATION_G3: HardwareModel
STATUSMESSAGE_CONFIG: ExcludedModules
STOREFORWARD_CONFIG: ExcludedModules
SX1262_FAILURE: CriticalErrorCode
T5_S3_EPAPER_PRO: HardwareModel
TAK_CONFIG: ExcludedModules
TBEAM: HardwareModel
TBEAM_1_WATT: HardwareModel
TBEAM_BPF: HardwareModel
TBEAM_V0P7: HardwareModel
TDISPLAY_S3_PRO: HardwareModel
TD_LORAC: HardwareModel
TELEMETRY_CONFIG: ExcludedModules
THINKNODE_M1: HardwareModel
THINKNODE_M2: HardwareModel
THINKNODE_M3: HardwareModel
THINKNODE_M4: HardwareModel
THINKNODE_M5: HardwareModel
THINKNODE_M6: HardwareModel
THINKNODE_M7: HardwareModel
THINKNODE_M8: HardwareModel
THINKNODE_M9: HardwareModel
THINKNODE_MX: HardwareModel
TLORA_C6: HardwareModel
TLORA_T3_S3: HardwareModel
TLORA_V1: HardwareModel
TLORA_V1_1P3: HardwareModel
TLORA_V2: HardwareModel
TLORA_V2_1_1P6: HardwareModel
TLORA_V2_1_1P8: HardwareModel
TRACKER_T1000_E: HardwareModel
TRAFFICMANAGEMENT_CONFIG: ExcludedModules
TRANSMIT_FAILED: CriticalErrorCode
TWC_MESH_V4: HardwareModel
TX_WATCHDOG: CriticalErrorCode
T_CONNECT_PRO: HardwareModel
T_DECK: HardwareModel
T_DECK_PRO: HardwareModel
T_ECHO: HardwareModel
T_ECHO_CARD: HardwareModel
T_ECHO_LITE: HardwareModel
T_ECHO_PLUS: HardwareModel
T_ETH_ELITE: HardwareModel
T_IMPULSE_PLUS: HardwareModel
T_LORA_PAGER: HardwareModel
T_WATCH_S3: HardwareModel
T_WATCH_ULTRA: HardwareModel
UBLOX_UNIT_FAILED: CriticalErrorCode
UNPHONE: HardwareModel
UNSET: HardwareModel
UNSPECIFIED: CriticalErrorCode
VANILLA: FirmwareEdition
WIO_E5: HardwareModel
WIO_WM1110: HardwareModel
WIPHONE: HardwareModel
WISMESH_TAG: HardwareModel
WISMESH_TAP: HardwareModel
WISMESH_TAP_V2: HardwareModel
XIAO_NRF52_KIT: HardwareModel
ZERO: Constants
class BoundingBox(_message.Message):
__slots__ = ["latitude_north_i", "latitude_south_i", "longitude_east_i", "longitude_west_i"]
LATITUDE_NORTH_I_FIELD_NUMBER: _ClassVar[int]
LATITUDE_SOUTH_I_FIELD_NUMBER: _ClassVar[int]
LONGITUDE_EAST_I_FIELD_NUMBER: _ClassVar[int]
LONGITUDE_WEST_I_FIELD_NUMBER: _ClassVar[int]
latitude_north_i: int
latitude_south_i: int
longitude_east_i: int
longitude_west_i: int
def __init__(self, longitude_west_i: _Optional[int] = ..., latitude_south_i: _Optional[int] = ..., longitude_east_i: _Optional[int] = ..., latitude_north_i: _Optional[int] = ...) -> None: ...
class ChunkedPayload(_message.Message):
__slots__ = ["chunk_count", "chunk_index", "payload_chunk", "payload_id"]
CHUNK_COUNT_FIELD_NUMBER: _ClassVar[int]
CHUNK_INDEX_FIELD_NUMBER: _ClassVar[int]
PAYLOAD_CHUNK_FIELD_NUMBER: _ClassVar[int]
PAYLOAD_ID_FIELD_NUMBER: _ClassVar[int]
chunk_count: int
chunk_index: int
payload_chunk: bytes
payload_id: int
def __init__(self, payload_id: _Optional[int] = ..., chunk_count: _Optional[int] = ..., chunk_index: _Optional[int] = ..., payload_chunk: _Optional[bytes] = ...) -> None: ...
class ChunkedPayloadResponse(_message.Message):
__slots__ = ["accept_transfer", "payload_id", "request_transfer", "resend_chunks"]
ACCEPT_TRANSFER_FIELD_NUMBER: _ClassVar[int]
PAYLOAD_ID_FIELD_NUMBER: _ClassVar[int]
REQUEST_TRANSFER_FIELD_NUMBER: _ClassVar[int]
RESEND_CHUNKS_FIELD_NUMBER: _ClassVar[int]
accept_transfer: bool
payload_id: int
request_transfer: bool
resend_chunks: resend_chunks
def __init__(self, payload_id: _Optional[int] = ..., request_transfer: bool = ..., accept_transfer: bool = ..., resend_chunks: _Optional[_Union[resend_chunks, _Mapping]] = ...) -> None: ...
class ClientNotification(_message.Message):
__slots__ = ["duplicated_public_key", "key_verification_final", "key_verification_number_inform", "key_verification_number_request", "level", "low_entropy_key", "message", "reply_id", "time"]
DUPLICATED_PUBLIC_KEY_FIELD_NUMBER: _ClassVar[int]
KEY_VERIFICATION_FINAL_FIELD_NUMBER: _ClassVar[int]
KEY_VERIFICATION_NUMBER_INFORM_FIELD_NUMBER: _ClassVar[int]
KEY_VERIFICATION_NUMBER_REQUEST_FIELD_NUMBER: _ClassVar[int]
LEVEL_FIELD_NUMBER: _ClassVar[int]
LOW_ENTROPY_KEY_FIELD_NUMBER: _ClassVar[int]
MESSAGE_FIELD_NUMBER: _ClassVar[int]
REPLY_ID_FIELD_NUMBER: _ClassVar[int]
TIME_FIELD_NUMBER: _ClassVar[int]
duplicated_public_key: DuplicatedPublicKey
key_verification_final: KeyVerificationFinal
key_verification_number_inform: KeyVerificationNumberInform
key_verification_number_request: KeyVerificationNumberRequest
level: LogRecord.Level
low_entropy_key: LowEntropyKey
message: str
reply_id: int
time: int
def __init__(self, reply_id: _Optional[int] = ..., time: _Optional[int] = ..., level: _Optional[_Union[LogRecord.Level, str]] = ..., message: _Optional[str] = ..., key_verification_number_inform: _Optional[_Union[KeyVerificationNumberInform, _Mapping]] = ..., key_verification_number_request: _Optional[_Union[KeyVerificationNumberRequest, _Mapping]] = ..., key_verification_final: _Optional[_Union[KeyVerificationFinal, _Mapping]] = ..., duplicated_public_key: _Optional[_Union[DuplicatedPublicKey, _Mapping]] = ..., low_entropy_key: _Optional[_Union[LowEntropyKey, _Mapping]] = ...) -> None: ...
class Compressed(_message.Message):
__slots__ = ["data", "portnum"]
DATA_FIELD_NUMBER: _ClassVar[int]
PORTNUM_FIELD_NUMBER: _ClassVar[int]
data: bytes
portnum: _portnums_pb2.PortNum
def __init__(self, portnum: _Optional[_Union[_portnums_pb2.PortNum, str]] = ..., data: _Optional[bytes] = ...) -> None: ...
class Data(_message.Message):
__slots__ = ["bitfield", "dest", "emoji", "payload", "portnum", "reply_id", "request_id", "source", "want_response", "xeddsa_signature"]
BITFIELD_FIELD_NUMBER: _ClassVar[int]
DEST_FIELD_NUMBER: _ClassVar[int]
EMOJI_FIELD_NUMBER: _ClassVar[int]
PAYLOAD_FIELD_NUMBER: _ClassVar[int]
PORTNUM_FIELD_NUMBER: _ClassVar[int]
REPLY_ID_FIELD_NUMBER: _ClassVar[int]
REQUEST_ID_FIELD_NUMBER: _ClassVar[int]
SOURCE_FIELD_NUMBER: _ClassVar[int]
WANT_RESPONSE_FIELD_NUMBER: _ClassVar[int]
XEDDSA_SIGNATURE_FIELD_NUMBER: _ClassVar[int]
bitfield: int
dest: int
emoji: int
payload: bytes
portnum: _portnums_pb2.PortNum
reply_id: int
request_id: int
source: int
want_response: bool
xeddsa_signature: bytes
def __init__(self, portnum: _Optional[_Union[_portnums_pb2.PortNum, str]] = ..., payload: _Optional[bytes] = ..., want_response: bool = ..., dest: _Optional[int] = ..., source: _Optional[int] = ..., request_id: _Optional[int] = ..., reply_id: _Optional[int] = ..., emoji: _Optional[int] = ..., bitfield: _Optional[int] = ..., xeddsa_signature: _Optional[bytes] = ...) -> None: ...
class DeviceMetadata(_message.Message):
__slots__ = ["canShutdown", "device_state_version", "excluded_modules", "firmware_version", "hasBluetooth", "hasEthernet", "hasPKC", "hasRemoteHardware", "hasWifi", "has_xeddsa", "hw_model", "position_flags", "role"]
CANSHUTDOWN_FIELD_NUMBER: _ClassVar[int]
DEVICE_STATE_VERSION_FIELD_NUMBER: _ClassVar[int]
EXCLUDED_MODULES_FIELD_NUMBER: _ClassVar[int]
FIRMWARE_VERSION_FIELD_NUMBER: _ClassVar[int]
HASBLUETOOTH_FIELD_NUMBER: _ClassVar[int]
HASETHERNET_FIELD_NUMBER: _ClassVar[int]
HASPKC_FIELD_NUMBER: _ClassVar[int]
HASREMOTEHARDWARE_FIELD_NUMBER: _ClassVar[int]
HASWIFI_FIELD_NUMBER: _ClassVar[int]
HAS_XEDDSA_FIELD_NUMBER: _ClassVar[int]
HW_MODEL_FIELD_NUMBER: _ClassVar[int]
POSITION_FLAGS_FIELD_NUMBER: _ClassVar[int]
ROLE_FIELD_NUMBER: _ClassVar[int]
canShutdown: bool
device_state_version: int
excluded_modules: int
firmware_version: str
hasBluetooth: bool
hasEthernet: bool
hasPKC: bool
hasRemoteHardware: bool
hasWifi: bool
has_xeddsa: bool
hw_model: HardwareModel
position_flags: int
role: _config_pb2.Config.DeviceConfig.Role
def __init__(self, firmware_version: _Optional[str] = ..., device_state_version: _Optional[int] = ..., canShutdown: bool = ..., hasWifi: bool = ..., hasBluetooth: bool = ..., hasEthernet: bool = ..., role: _Optional[_Union[_config_pb2.Config.DeviceConfig.Role, str]] = ..., position_flags: _Optional[int] = ..., hw_model: _Optional[_Union[HardwareModel, str]] = ..., hasRemoteHardware: bool = ..., hasPKC: bool = ..., excluded_modules: _Optional[int] = ..., has_xeddsa: bool = ...) -> None: ...
class DuplicatedPublicKey(_message.Message):
__slots__ = []
def __init__(self) -> None: ...
class FileInfo(_message.Message):
__slots__ = ["file_name", "size_bytes"]
FILE_NAME_FIELD_NUMBER: _ClassVar[int]
SIZE_BYTES_FIELD_NUMBER: _ClassVar[int]
file_name: str
size_bytes: int
def __init__(self, file_name: _Optional[str] = ..., size_bytes: _Optional[int] = ...) -> None: ...
class FromRadio(_message.Message):
__slots__ = ["channel", "clientNotification", "config", "config_complete_id", "deviceuiConfig", "fileInfo", "id", "lockdown_status", "log_record", "metadata", "moduleConfig", "mqttClientProxyMessage", "my_info", "node_info", "packet", "queueStatus", "rebooted", "region_presets", "xmodemPacket"]
CHANNEL_FIELD_NUMBER: _ClassVar[int]
CLIENTNOTIFICATION_FIELD_NUMBER: _ClassVar[int]
CONFIG_COMPLETE_ID_FIELD_NUMBER: _ClassVar[int]
CONFIG_FIELD_NUMBER: _ClassVar[int]
DEVICEUICONFIG_FIELD_NUMBER: _ClassVar[int]
FILEINFO_FIELD_NUMBER: _ClassVar[int]
ID_FIELD_NUMBER: _ClassVar[int]
LOCKDOWN_STATUS_FIELD_NUMBER: _ClassVar[int]
LOG_RECORD_FIELD_NUMBER: _ClassVar[int]
METADATA_FIELD_NUMBER: _ClassVar[int]
MODULECONFIG_FIELD_NUMBER: _ClassVar[int]
MQTTCLIENTPROXYMESSAGE_FIELD_NUMBER: _ClassVar[int]
MY_INFO_FIELD_NUMBER: _ClassVar[int]
NODE_INFO_FIELD_NUMBER: _ClassVar[int]
PACKET_FIELD_NUMBER: _ClassVar[int]
QUEUESTATUS_FIELD_NUMBER: _ClassVar[int]
REBOOTED_FIELD_NUMBER: _ClassVar[int]
REGION_PRESETS_FIELD_NUMBER: _ClassVar[int]
XMODEMPACKET_FIELD_NUMBER: _ClassVar[int]
channel: _channel_pb2.Channel
clientNotification: ClientNotification
config: _config_pb2.Config
config_complete_id: int
deviceuiConfig: _device_ui_pb2.DeviceUIConfig
fileInfo: FileInfo
id: int
lockdown_status: LockdownStatus
log_record: LogRecord
metadata: DeviceMetadata
moduleConfig: _module_config_pb2.ModuleConfig
mqttClientProxyMessage: MqttClientProxyMessage
my_info: MyNodeInfo
node_info: NodeInfo
packet: MeshPacket
queueStatus: QueueStatus
rebooted: bool
region_presets: LoRaRegionPresetMap
xmodemPacket: _xmodem_pb2.XModem
def __init__(self, id: _Optional[int] = ..., packet: _Optional[_Union[MeshPacket, _Mapping]] = ..., my_info: _Optional[_Union[MyNodeInfo, _Mapping]] = ..., node_info: _Optional[_Union[NodeInfo, _Mapping]] = ..., config: _Optional[_Union[_config_pb2.Config, _Mapping]] = ..., log_record: _Optional[_Union[LogRecord, _Mapping]] = ..., config_complete_id: _Optional[int] = ..., rebooted: bool = ..., moduleConfig: _Optional[_Union[_module_config_pb2.ModuleConfig, _Mapping]] = ..., channel: _Optional[_Union[_channel_pb2.Channel, _Mapping]] = ..., queueStatus: _Optional[_Union[QueueStatus, _Mapping]] = ..., xmodemPacket: _Optional[_Union[_xmodem_pb2.XModem, _Mapping]] = ..., metadata: _Optional[_Union[DeviceMetadata, _Mapping]] = ..., mqttClientProxyMessage: _Optional[_Union[MqttClientProxyMessage, _Mapping]] = ..., fileInfo: _Optional[_Union[FileInfo, _Mapping]] = ..., clientNotification: _Optional[_Union[ClientNotification, _Mapping]] = ..., deviceuiConfig: _Optional[_Union[_device_ui_pb2.DeviceUIConfig, _Mapping]] = ..., lockdown_status: _Optional[_Union[LockdownStatus, _Mapping]] = ..., region_presets: _Optional[_Union[LoRaRegionPresetMap, _Mapping]] = ...) -> None: ...
class Heartbeat(_message.Message):
__slots__ = ["nonce"]
NONCE_FIELD_NUMBER: _ClassVar[int]
nonce: int
def __init__(self, nonce: _Optional[int] = ...) -> None: ...
class KeyVerification(_message.Message):
__slots__ = ["hash1", "hash2", "nonce"]
HASH1_FIELD_NUMBER: _ClassVar[int]
HASH2_FIELD_NUMBER: _ClassVar[int]
NONCE_FIELD_NUMBER: _ClassVar[int]
hash1: bytes
hash2: bytes
nonce: int
def __init__(self, nonce: _Optional[int] = ..., hash1: _Optional[bytes] = ..., hash2: _Optional[bytes] = ...) -> None: ...
class KeyVerificationFinal(_message.Message):
__slots__ = ["isSender", "nonce", "remote_longname", "verification_characters"]
ISSENDER_FIELD_NUMBER: _ClassVar[int]
NONCE_FIELD_NUMBER: _ClassVar[int]
REMOTE_LONGNAME_FIELD_NUMBER: _ClassVar[int]
VERIFICATION_CHARACTERS_FIELD_NUMBER: _ClassVar[int]
isSender: bool
nonce: int
remote_longname: str
verification_characters: str
def __init__(self, nonce: _Optional[int] = ..., remote_longname: _Optional[str] = ..., isSender: bool = ..., verification_characters: _Optional[str] = ...) -> None: ...
class KeyVerificationNumberInform(_message.Message):
__slots__ = ["nonce", "remote_longname", "security_number"]
NONCE_FIELD_NUMBER: _ClassVar[int]
REMOTE_LONGNAME_FIELD_NUMBER: _ClassVar[int]
SECURITY_NUMBER_FIELD_NUMBER: _ClassVar[int]
nonce: int
remote_longname: str
security_number: int
def __init__(self, nonce: _Optional[int] = ..., remote_longname: _Optional[str] = ..., security_number: _Optional[int] = ...) -> None: ...
class KeyVerificationNumberRequest(_message.Message):
__slots__ = ["nonce", "remote_longname"]
NONCE_FIELD_NUMBER: _ClassVar[int]
REMOTE_LONGNAME_FIELD_NUMBER: _ClassVar[int]
nonce: int
remote_longname: str
def __init__(self, nonce: _Optional[int] = ..., remote_longname: _Optional[str] = ...) -> None: ...
class LoRaPresetGroup(_message.Message):
__slots__ = ["default_preset", "licensed_only", "presets"]
DEFAULT_PRESET_FIELD_NUMBER: _ClassVar[int]
LICENSED_ONLY_FIELD_NUMBER: _ClassVar[int]
PRESETS_FIELD_NUMBER: _ClassVar[int]
default_preset: _config_pb2.Config.LoRaConfig.ModemPreset
licensed_only: bool
presets: _containers.RepeatedScalarFieldContainer[_config_pb2.Config.LoRaConfig.ModemPreset]
def __init__(self, presets: _Optional[_Iterable[_Union[_config_pb2.Config.LoRaConfig.ModemPreset, str]]] = ..., default_preset: _Optional[_Union[_config_pb2.Config.LoRaConfig.ModemPreset, str]] = ..., licensed_only: bool = ...) -> None: ...
class LoRaRegionPresetMap(_message.Message):
__slots__ = ["groups", "region_groups"]
GROUPS_FIELD_NUMBER: _ClassVar[int]
REGION_GROUPS_FIELD_NUMBER: _ClassVar[int]
groups: _containers.RepeatedCompositeFieldContainer[LoRaPresetGroup]
region_groups: _containers.RepeatedCompositeFieldContainer[LoRaRegionPresets]
def __init__(self, groups: _Optional[_Iterable[_Union[LoRaPresetGroup, _Mapping]]] = ..., region_groups: _Optional[_Iterable[_Union[LoRaRegionPresets, _Mapping]]] = ...) -> None: ...
class LoRaRegionPresets(_message.Message):
__slots__ = ["group_index", "region"]
GROUP_INDEX_FIELD_NUMBER: _ClassVar[int]
REGION_FIELD_NUMBER: _ClassVar[int]
group_index: int
region: _config_pb2.Config.LoRaConfig.RegionCode
def __init__(self, region: _Optional[_Union[_config_pb2.Config.LoRaConfig.RegionCode, str]] = ..., group_index: _Optional[int] = ...) -> None: ...
class LockdownStatus(_message.Message):
__slots__ = ["backoff_seconds", "boots_remaining", "lock_reason", "state", "valid_until_epoch"]
class State(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
BACKOFF_SECONDS_FIELD_NUMBER: _ClassVar[int]
BOOTS_REMAINING_FIELD_NUMBER: _ClassVar[int]
DISABLED: LockdownStatus.State
LOCKED: LockdownStatus.State
LOCK_REASON_FIELD_NUMBER: _ClassVar[int]
NEEDS_PROVISION: LockdownStatus.State
STATE_FIELD_NUMBER: _ClassVar[int]
STATE_UNSPECIFIED: LockdownStatus.State
UNLOCKED: LockdownStatus.State
UNLOCK_FAILED: LockdownStatus.State
VALID_UNTIL_EPOCH_FIELD_NUMBER: _ClassVar[int]
backoff_seconds: int
boots_remaining: int
lock_reason: str
state: LockdownStatus.State
valid_until_epoch: int
def __init__(self, state: _Optional[_Union[LockdownStatus.State, str]] = ..., lock_reason: _Optional[str] = ..., boots_remaining: _Optional[int] = ..., valid_until_epoch: _Optional[int] = ..., backoff_seconds: _Optional[int] = ...) -> None: ...
class LogRecord(_message.Message):
__slots__ = ["level", "message", "source", "time"]
class Level(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
CRITICAL: LogRecord.Level
DEBUG: LogRecord.Level
ERROR: LogRecord.Level
INFO: LogRecord.Level
LEVEL_FIELD_NUMBER: _ClassVar[int]
MESSAGE_FIELD_NUMBER: _ClassVar[int]
SOURCE_FIELD_NUMBER: _ClassVar[int]
TIME_FIELD_NUMBER: _ClassVar[int]
TRACE: LogRecord.Level
UNSET: LogRecord.Level
WARNING: LogRecord.Level
level: LogRecord.Level
message: str
source: str
time: int
def __init__(self, message: _Optional[str] = ..., time: _Optional[int] = ..., source: _Optional[str] = ..., level: _Optional[_Union[LogRecord.Level, str]] = ...) -> None: ...
class LowEntropyKey(_message.Message):
__slots__ = []
def __init__(self) -> None: ...
class MeshPacket(_message.Message):
__slots__ = ["ack_proof_status", "channel", "decoded", "delayed", "encrypted", "hop_limit", "hop_start", "id", "next_hop", "pki_encrypted", "priority", "public_key", "relay_node", "rx_rssi", "rx_snr", "rx_time", "slot_parity", "to", "transport_mechanism", "tx_after", "via_mqtt", "want_ack", "xeddsa_signed"]
class AckProofStatus(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class Delayed(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class Priority(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class SlotParity(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class TransportMechanism(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
ACK: MeshPacket.Priority
ACK_PROOF_ABSENT: MeshPacket.AckProofStatus
ACK_PROOF_INVALID: MeshPacket.AckProofStatus
ACK_PROOF_NO_KEY: MeshPacket.AckProofStatus
ACK_PROOF_STATUS_FIELD_NUMBER: _ClassVar[int]
ACK_PROOF_VALID: MeshPacket.AckProofStatus
ALERT: MeshPacket.Priority
BACKGROUND: MeshPacket.Priority
CHANNEL_FIELD_NUMBER: _ClassVar[int]
DECODED_FIELD_NUMBER: _ClassVar[int]
DEFAULT: MeshPacket.Priority
DELAYED_BROADCAST: MeshPacket.Delayed
DELAYED_DIRECT: MeshPacket.Delayed
DELAYED_FIELD_NUMBER: _ClassVar[int]
ENCRYPTED_FIELD_NUMBER: _ClassVar[int]
FROM_FIELD_NUMBER: _ClassVar[int]
HIGH: MeshPacket.Priority
HOP_LIMIT_FIELD_NUMBER: _ClassVar[int]
HOP_START_FIELD_NUMBER: _ClassVar[int]
ID_FIELD_NUMBER: _ClassVar[int]
MAX: MeshPacket.Priority
MIN: MeshPacket.Priority
NEXT_HOP_FIELD_NUMBER: _ClassVar[int]
NO_DELAY: MeshPacket.Delayed
PKI_ENCRYPTED_FIELD_NUMBER: _ClassVar[int]
PRIORITY_FIELD_NUMBER: _ClassVar[int]
PUBLIC_KEY_FIELD_NUMBER: _ClassVar[int]
RELAY_NODE_FIELD_NUMBER: _ClassVar[int]
RELIABLE: MeshPacket.Priority
RESPONSE: MeshPacket.Priority
RX_RSSI_FIELD_NUMBER: _ClassVar[int]
RX_SNR_FIELD_NUMBER: _ClassVar[int]
RX_TIME_FIELD_NUMBER: _ClassVar[int]
SLOT_PARITY_EVEN: MeshPacket.SlotParity
SLOT_PARITY_FIELD_NUMBER: _ClassVar[int]
SLOT_PARITY_ODD: MeshPacket.SlotParity
SLOT_PARITY_UNSET: MeshPacket.SlotParity
TO_FIELD_NUMBER: _ClassVar[int]
TRANSPORT_API: MeshPacket.TransportMechanism
TRANSPORT_INTERNAL: MeshPacket.TransportMechanism
TRANSPORT_LORA: MeshPacket.TransportMechanism
TRANSPORT_LORA_ALT1: MeshPacket.TransportMechanism
TRANSPORT_LORA_ALT2: MeshPacket.TransportMechanism
TRANSPORT_LORA_ALT3: MeshPacket.TransportMechanism
TRANSPORT_MECHANISM_FIELD_NUMBER: _ClassVar[int]
TRANSPORT_MQTT: MeshPacket.TransportMechanism
TRANSPORT_MULTICAST_UDP: MeshPacket.TransportMechanism
TRANSPORT_UNICAST_UDP: MeshPacket.TransportMechanism
TX_AFTER_FIELD_NUMBER: _ClassVar[int]
UNSET: MeshPacket.Priority
VIA_MQTT_FIELD_NUMBER: _ClassVar[int]
WANT_ACK_FIELD_NUMBER: _ClassVar[int]
XEDDSA_SIGNED_FIELD_NUMBER: _ClassVar[int]
ack_proof_status: MeshPacket.AckProofStatus
channel: int
decoded: Data
delayed: MeshPacket.Delayed
encrypted: bytes
hop_limit: int
hop_start: int
id: int
next_hop: int
pki_encrypted: bool
priority: MeshPacket.Priority
public_key: bytes
relay_node: int
rx_rssi: int
rx_snr: float
rx_time: int
slot_parity: MeshPacket.SlotParity
to: int
transport_mechanism: MeshPacket.TransportMechanism
tx_after: int
via_mqtt: bool
want_ack: bool
xeddsa_signed: bool
def __init__(self, to: _Optional[int] = ..., channel: _Optional[int] = ..., decoded: _Optional[_Union[Data, _Mapping]] = ..., encrypted: _Optional[bytes] = ..., id: _Optional[int] = ..., rx_time: _Optional[int] = ..., rx_snr: _Optional[float] = ..., hop_limit: _Optional[int] = ..., want_ack: bool = ..., priority: _Optional[_Union[MeshPacket.Priority, str]] = ..., rx_rssi: _Optional[int] = ..., delayed: _Optional[_Union[MeshPacket.Delayed, str]] = ..., via_mqtt: bool = ..., hop_start: _Optional[int] = ..., public_key: _Optional[bytes] = ..., pki_encrypted: bool = ..., next_hop: _Optional[int] = ..., relay_node: _Optional[int] = ..., tx_after: _Optional[int] = ..., transport_mechanism: _Optional[_Union[MeshPacket.TransportMechanism, str]] = ..., xeddsa_signed: bool = ..., ack_proof_status: _Optional[_Union[MeshPacket.AckProofStatus, str]] = ..., slot_parity: _Optional[_Union[MeshPacket.SlotParity, str]] = ..., **kwargs) -> None: ...
class MqttClientProxyMessage(_message.Message):
__slots__ = ["data", "retained", "text", "topic"]
DATA_FIELD_NUMBER: _ClassVar[int]
RETAINED_FIELD_NUMBER: _ClassVar[int]
TEXT_FIELD_NUMBER: _ClassVar[int]
TOPIC_FIELD_NUMBER: _ClassVar[int]
data: bytes
retained: bool
text: str
topic: str
def __init__(self, topic: _Optional[str] = ..., data: _Optional[bytes] = ..., text: _Optional[str] = ..., retained: bool = ...) -> None: ...
class MyNodeInfo(_message.Message):
__slots__ = ["device_id", "firmware_edition", "min_app_version", "my_node_num", "nodedb_count", "pio_env", "reboot_count"]
DEVICE_ID_FIELD_NUMBER: _ClassVar[int]
FIRMWARE_EDITION_FIELD_NUMBER: _ClassVar[int]
MIN_APP_VERSION_FIELD_NUMBER: _ClassVar[int]
MY_NODE_NUM_FIELD_NUMBER: _ClassVar[int]
NODEDB_COUNT_FIELD_NUMBER: _ClassVar[int]
PIO_ENV_FIELD_NUMBER: _ClassVar[int]
REBOOT_COUNT_FIELD_NUMBER: _ClassVar[int]
device_id: bytes
firmware_edition: FirmwareEdition
min_app_version: int
my_node_num: int
nodedb_count: int
pio_env: str
reboot_count: int
def __init__(self, my_node_num: _Optional[int] = ..., reboot_count: _Optional[int] = ..., min_app_version: _Optional[int] = ..., device_id: _Optional[bytes] = ..., pio_env: _Optional[str] = ..., firmware_edition: _Optional[_Union[FirmwareEdition, str]] = ..., nodedb_count: _Optional[int] = ...) -> None: ...
class Neighbor(_message.Message):
__slots__ = ["last_rx_time", "node_broadcast_interval_secs", "node_id", "snr"]
LAST_RX_TIME_FIELD_NUMBER: _ClassVar[int]
NODE_BROADCAST_INTERVAL_SECS_FIELD_NUMBER: _ClassVar[int]
NODE_ID_FIELD_NUMBER: _ClassVar[int]
SNR_FIELD_NUMBER: _ClassVar[int]
last_rx_time: int
node_broadcast_interval_secs: int
node_id: int
snr: float
def __init__(self, node_id: _Optional[int] = ..., snr: _Optional[float] = ..., last_rx_time: _Optional[int] = ..., node_broadcast_interval_secs: _Optional[int] = ...) -> None: ...
class NeighborInfo(_message.Message):
__slots__ = ["last_sent_by_id", "neighbors", "node_broadcast_interval_secs", "node_id"]
LAST_SENT_BY_ID_FIELD_NUMBER: _ClassVar[int]
NEIGHBORS_FIELD_NUMBER: _ClassVar[int]
NODE_BROADCAST_INTERVAL_SECS_FIELD_NUMBER: _ClassVar[int]
NODE_ID_FIELD_NUMBER: _ClassVar[int]
last_sent_by_id: int
neighbors: _containers.RepeatedCompositeFieldContainer[Neighbor]
node_broadcast_interval_secs: int
node_id: int
def __init__(self, node_id: _Optional[int] = ..., last_sent_by_id: _Optional[int] = ..., node_broadcast_interval_secs: _Optional[int] = ..., neighbors: _Optional[_Iterable[_Union[Neighbor, _Mapping]]] = ...) -> None: ...
class NodeInfo(_message.Message):
__slots__ = ["channel", "device_metrics", "has_xeddsa_signed", "heard_on_current_lora", "hops_away", "is_favorite", "is_ignored", "is_key_manually_verified", "is_muted", "last_heard", "num", "position", "snr", "user", "via_mqtt"]
CHANNEL_FIELD_NUMBER: _ClassVar[int]
DEVICE_METRICS_FIELD_NUMBER: _ClassVar[int]
HAS_XEDDSA_SIGNED_FIELD_NUMBER: _ClassVar[int]
HEARD_ON_CURRENT_LORA_FIELD_NUMBER: _ClassVar[int]
HOPS_AWAY_FIELD_NUMBER: _ClassVar[int]
IS_FAVORITE_FIELD_NUMBER: _ClassVar[int]
IS_IGNORED_FIELD_NUMBER: _ClassVar[int]
IS_KEY_MANUALLY_VERIFIED_FIELD_NUMBER: _ClassVar[int]
IS_MUTED_FIELD_NUMBER: _ClassVar[int]
LAST_HEARD_FIELD_NUMBER: _ClassVar[int]
NUM_FIELD_NUMBER: _ClassVar[int]
POSITION_FIELD_NUMBER: _ClassVar[int]
SNR_FIELD_NUMBER: _ClassVar[int]
USER_FIELD_NUMBER: _ClassVar[int]
VIA_MQTT_FIELD_NUMBER: _ClassVar[int]
channel: int
device_metrics: _telemetry_pb2.DeviceMetrics
has_xeddsa_signed: bool
heard_on_current_lora: bool
hops_away: int
is_favorite: bool
is_ignored: bool
is_key_manually_verified: bool
is_muted: bool
last_heard: int
num: int
position: Position
snr: float
user: User
via_mqtt: bool
def __init__(self, num: _Optional[int] = ..., user: _Optional[_Union[User, _Mapping]] = ..., position: _Optional[_Union[Position, _Mapping]] = ..., snr: _Optional[float] = ..., last_heard: _Optional[int] = ..., device_metrics: _Optional[_Union[_telemetry_pb2.DeviceMetrics, _Mapping]] = ..., channel: _Optional[int] = ..., via_mqtt: bool = ..., hops_away: _Optional[int] = ..., is_favorite: bool = ..., is_ignored: bool = ..., is_key_manually_verified: bool = ..., is_muted: bool = ..., has_xeddsa_signed: bool = ..., heard_on_current_lora: bool = ...) -> None: ...
class NodeRemoteHardwarePin(_message.Message):
__slots__ = ["node_num", "pin"]
NODE_NUM_FIELD_NUMBER: _ClassVar[int]
PIN_FIELD_NUMBER: _ClassVar[int]
node_num: int
pin: _module_config_pb2.RemoteHardwarePin
def __init__(self, node_num: _Optional[int] = ..., pin: _Optional[_Union[_module_config_pb2.RemoteHardwarePin, _Mapping]] = ...) -> None: ...
class Position(_message.Message):
__slots__ = ["HDOP", "PDOP", "VDOP", "altitude", "altitude_geoidal_separation", "altitude_hae", "altitude_source", "fix_quality", "fix_type", "gps_accuracy", "ground_speed", "ground_track", "latitude_i", "location_source", "longitude_i", "next_update", "precision_bits", "sats_in_view", "sensor_id", "seq_number", "time", "timestamp", "timestamp_millis_adjust"]
class AltSource(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class LocSource(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
ALTITUDE_FIELD_NUMBER: _ClassVar[int]
ALTITUDE_GEOIDAL_SEPARATION_FIELD_NUMBER: _ClassVar[int]
ALTITUDE_HAE_FIELD_NUMBER: _ClassVar[int]
ALTITUDE_SOURCE_FIELD_NUMBER: _ClassVar[int]
ALT_BAROMETRIC: Position.AltSource
ALT_EXTERNAL: Position.AltSource
ALT_INTERNAL: Position.AltSource
ALT_MANUAL: Position.AltSource
ALT_UNSET: Position.AltSource
FIX_QUALITY_FIELD_NUMBER: _ClassVar[int]
FIX_TYPE_FIELD_NUMBER: _ClassVar[int]
GPS_ACCURACY_FIELD_NUMBER: _ClassVar[int]
GROUND_SPEED_FIELD_NUMBER: _ClassVar[int]
GROUND_TRACK_FIELD_NUMBER: _ClassVar[int]
HDOP: int
HDOP_FIELD_NUMBER: _ClassVar[int]
LATITUDE_I_FIELD_NUMBER: _ClassVar[int]
LOCATION_SOURCE_FIELD_NUMBER: _ClassVar[int]
LOC_EXTERNAL: Position.LocSource
LOC_INTERNAL: Position.LocSource
LOC_MANUAL: Position.LocSource
LOC_UNSET: Position.LocSource
LONGITUDE_I_FIELD_NUMBER: _ClassVar[int]
NEXT_UPDATE_FIELD_NUMBER: _ClassVar[int]
PDOP: int
PDOP_FIELD_NUMBER: _ClassVar[int]
PRECISION_BITS_FIELD_NUMBER: _ClassVar[int]
SATS_IN_VIEW_FIELD_NUMBER: _ClassVar[int]
SENSOR_ID_FIELD_NUMBER: _ClassVar[int]
SEQ_NUMBER_FIELD_NUMBER: _ClassVar[int]
TIMESTAMP_FIELD_NUMBER: _ClassVar[int]
TIMESTAMP_MILLIS_ADJUST_FIELD_NUMBER: _ClassVar[int]
TIME_FIELD_NUMBER: _ClassVar[int]
VDOP: int
VDOP_FIELD_NUMBER: _ClassVar[int]
altitude: int
altitude_geoidal_separation: int
altitude_hae: int
altitude_source: Position.AltSource
fix_quality: int
fix_type: int
gps_accuracy: int
ground_speed: int
ground_track: int
latitude_i: int
location_source: Position.LocSource
longitude_i: int
next_update: int
precision_bits: int
sats_in_view: int
sensor_id: int
seq_number: int
time: int
timestamp: int
timestamp_millis_adjust: int
def __init__(self, latitude_i: _Optional[int] = ..., longitude_i: _Optional[int] = ..., altitude: _Optional[int] = ..., time: _Optional[int] = ..., location_source: _Optional[_Union[Position.LocSource, str]] = ..., altitude_source: _Optional[_Union[Position.AltSource, str]] = ..., timestamp: _Optional[int] = ..., timestamp_millis_adjust: _Optional[int] = ..., altitude_hae: _Optional[int] = ..., altitude_geoidal_separation: _Optional[int] = ..., PDOP: _Optional[int] = ..., HDOP: _Optional[int] = ..., VDOP: _Optional[int] = ..., gps_accuracy: _Optional[int] = ..., ground_speed: _Optional[int] = ..., ground_track: _Optional[int] = ..., fix_quality: _Optional[int] = ..., fix_type: _Optional[int] = ..., sats_in_view: _Optional[int] = ..., sensor_id: _Optional[int] = ..., next_update: _Optional[int] = ..., seq_number: _Optional[int] = ..., precision_bits: _Optional[int] = ...) -> None: ...
class QueueStatus(_message.Message):
__slots__ = ["free", "maxlen", "mesh_packet_id", "res"]
FREE_FIELD_NUMBER: _ClassVar[int]
MAXLEN_FIELD_NUMBER: _ClassVar[int]
MESH_PACKET_ID_FIELD_NUMBER: _ClassVar[int]
RES_FIELD_NUMBER: _ClassVar[int]
free: int
maxlen: int
mesh_packet_id: int
res: int
def __init__(self, res: _Optional[int] = ..., free: _Optional[int] = ..., maxlen: _Optional[int] = ..., mesh_packet_id: _Optional[int] = ...) -> None: ...
class RemoteShell(_message.Message):
__slots__ = ["ack_seq", "cols", "flags", "last_rx_seq", "last_tx_seq", "op", "payload", "rows", "seq", "session_id"]
class OpCode(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
ACK: RemoteShell.OpCode
ACK_SEQ_FIELD_NUMBER: _ClassVar[int]
CLOSE: RemoteShell.OpCode
CLOSED: RemoteShell.OpCode
COLS_FIELD_NUMBER: _ClassVar[int]
ERROR: RemoteShell.OpCode
FLAGS_FIELD_NUMBER: _ClassVar[int]
INPUT: RemoteShell.OpCode
LAST_RX_SEQ_FIELD_NUMBER: _ClassVar[int]
LAST_TX_SEQ_FIELD_NUMBER: _ClassVar[int]
OPEN: RemoteShell.OpCode
OPEN_OK: RemoteShell.OpCode
OP_FIELD_NUMBER: _ClassVar[int]
OP_UNSET: RemoteShell.OpCode
OUTPUT: RemoteShell.OpCode
PAYLOAD_FIELD_NUMBER: _ClassVar[int]
PING: RemoteShell.OpCode
PONG: RemoteShell.OpCode
RESIZE: RemoteShell.OpCode
ROWS_FIELD_NUMBER: _ClassVar[int]
SEQ_FIELD_NUMBER: _ClassVar[int]
SESSION_ID_FIELD_NUMBER: _ClassVar[int]
ack_seq: int
cols: int
flags: int
last_rx_seq: int
last_tx_seq: int
op: RemoteShell.OpCode
payload: bytes
rows: int
seq: int
session_id: int
def __init__(self, op: _Optional[_Union[RemoteShell.OpCode, str]] = ..., session_id: _Optional[int] = ..., seq: _Optional[int] = ..., ack_seq: _Optional[int] = ..., payload: _Optional[bytes] = ..., cols: _Optional[int] = ..., rows: _Optional[int] = ..., flags: _Optional[int] = ..., last_tx_seq: _Optional[int] = ..., last_rx_seq: _Optional[int] = ...) -> None: ...
class RouteDiscovery(_message.Message):
__slots__ = ["route", "route_back", "snr_back", "snr_towards"]
ROUTE_BACK_FIELD_NUMBER: _ClassVar[int]
ROUTE_FIELD_NUMBER: _ClassVar[int]
SNR_BACK_FIELD_NUMBER: _ClassVar[int]
SNR_TOWARDS_FIELD_NUMBER: _ClassVar[int]
route: _containers.RepeatedScalarFieldContainer[int]
route_back: _containers.RepeatedScalarFieldContainer[int]
snr_back: _containers.RepeatedScalarFieldContainer[int]
snr_towards: _containers.RepeatedScalarFieldContainer[int]
def __init__(self, route: _Optional[_Iterable[int]] = ..., snr_towards: _Optional[_Iterable[int]] = ..., route_back: _Optional[_Iterable[int]] = ..., snr_back: _Optional[_Iterable[int]] = ...) -> None: ...
class Routing(_message.Message):
__slots__ = ["ack_proof", "error_reason", "route_reply", "route_request"]
class Error(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
ACK_PROOF_FIELD_NUMBER: _ClassVar[int]
ADMIN_BAD_SESSION_KEY: Routing.Error
ADMIN_PUBLIC_KEY_UNAUTHORIZED: Routing.Error
BAD_REQUEST: Routing.Error
DUTY_CYCLE_LIMIT: Routing.Error
ERROR_REASON_FIELD_NUMBER: _ClassVar[int]
GOT_NAK: Routing.Error
MAX_RETRANSMIT: Routing.Error
NONE: Routing.Error
NOT_AUTHORIZED: Routing.Error
NO_CHANNEL: Routing.Error
NO_INTERFACE: Routing.Error
NO_RESPONSE: Routing.Error
NO_ROUTE: Routing.Error
PKI_FAILED: Routing.Error
PKI_SEND_FAIL_PUBLIC_KEY: Routing.Error
PKI_UNKNOWN_PUBKEY: Routing.Error
RATE_LIMIT_EXCEEDED: Routing.Error
ROUTE_REPLY_FIELD_NUMBER: _ClassVar[int]
ROUTE_REQUEST_FIELD_NUMBER: _ClassVar[int]
TIMEOUT: Routing.Error
TOO_LARGE: Routing.Error
ack_proof: bytes
error_reason: Routing.Error
route_reply: RouteDiscovery
route_request: RouteDiscovery
def __init__(self, route_request: _Optional[_Union[RouteDiscovery, _Mapping]] = ..., route_reply: _Optional[_Union[RouteDiscovery, _Mapping]] = ..., error_reason: _Optional[_Union[Routing.Error, str]] = ..., ack_proof: _Optional[bytes] = ...) -> None: ...
class StatusMessage(_message.Message):
__slots__ = ["status"]
STATUS_FIELD_NUMBER: _ClassVar[int]
status: str
def __init__(self, status: _Optional[str] = ...) -> None: ...
class StoreForwardPlusPlus(_message.Message):
__slots__ = ["chain_count", "commit_hash", "encapsulated_from", "encapsulated_id", "encapsulated_rxtime", "encapsulated_to", "message", "message_hash", "root_hash", "sfpp_message_type"]
class SFPP_message_type(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
CANON_ANNOUNCE: StoreForwardPlusPlus.SFPP_message_type
CHAIN_COUNT_FIELD_NUMBER: _ClassVar[int]
CHAIN_QUERY: StoreForwardPlusPlus.SFPP_message_type
COMMIT_HASH_FIELD_NUMBER: _ClassVar[int]
ENCAPSULATED_FROM_FIELD_NUMBER: _ClassVar[int]
ENCAPSULATED_ID_FIELD_NUMBER: _ClassVar[int]
ENCAPSULATED_RXTIME_FIELD_NUMBER: _ClassVar[int]
ENCAPSULATED_TO_FIELD_NUMBER: _ClassVar[int]
LINK_PROVIDE: StoreForwardPlusPlus.SFPP_message_type
LINK_PROVIDE_FIRSTHALF: StoreForwardPlusPlus.SFPP_message_type
LINK_PROVIDE_SECONDHALF: StoreForwardPlusPlus.SFPP_message_type
LINK_REQUEST: StoreForwardPlusPlus.SFPP_message_type
MESSAGE_FIELD_NUMBER: _ClassVar[int]
MESSAGE_HASH_FIELD_NUMBER: _ClassVar[int]
ROOT_HASH_FIELD_NUMBER: _ClassVar[int]
SFPP_MESSAGE_TYPE_FIELD_NUMBER: _ClassVar[int]
chain_count: int
commit_hash: bytes
encapsulated_from: int
encapsulated_id: int
encapsulated_rxtime: int
encapsulated_to: int
message: bytes
message_hash: bytes
root_hash: bytes
sfpp_message_type: StoreForwardPlusPlus.SFPP_message_type
def __init__(self, sfpp_message_type: _Optional[_Union[StoreForwardPlusPlus.SFPP_message_type, str]] = ..., message_hash: _Optional[bytes] = ..., commit_hash: _Optional[bytes] = ..., root_hash: _Optional[bytes] = ..., message: _Optional[bytes] = ..., encapsulated_id: _Optional[int] = ..., encapsulated_to: _Optional[int] = ..., encapsulated_from: _Optional[int] = ..., encapsulated_rxtime: _Optional[int] = ..., chain_count: _Optional[int] = ...) -> None: ...
class ToRadio(_message.Message):
__slots__ = ["disconnect", "heartbeat", "mqttClientProxyMessage", "packet", "want_config_id", "xmodemPacket"]
DISCONNECT_FIELD_NUMBER: _ClassVar[int]
HEARTBEAT_FIELD_NUMBER: _ClassVar[int]
MQTTCLIENTPROXYMESSAGE_FIELD_NUMBER: _ClassVar[int]
PACKET_FIELD_NUMBER: _ClassVar[int]
WANT_CONFIG_ID_FIELD_NUMBER: _ClassVar[int]
XMODEMPACKET_FIELD_NUMBER: _ClassVar[int]
disconnect: bool
heartbeat: Heartbeat
mqttClientProxyMessage: MqttClientProxyMessage
packet: MeshPacket
want_config_id: int
xmodemPacket: _xmodem_pb2.XModem
def __init__(self, packet: _Optional[_Union[MeshPacket, _Mapping]] = ..., want_config_id: _Optional[int] = ..., disconnect: bool = ..., xmodemPacket: _Optional[_Union[_xmodem_pb2.XModem, _Mapping]] = ..., mqttClientProxyMessage: _Optional[_Union[MqttClientProxyMessage, _Mapping]] = ..., heartbeat: _Optional[_Union[Heartbeat, _Mapping]] = ...) -> None: ...
class User(_message.Message):
__slots__ = ["hw_model", "id", "is_licensed", "is_unmessagable", "long_name", "macaddr", "public_key", "role", "short_name"]
HW_MODEL_FIELD_NUMBER: _ClassVar[int]
ID_FIELD_NUMBER: _ClassVar[int]
IS_LICENSED_FIELD_NUMBER: _ClassVar[int]
IS_UNMESSAGABLE_FIELD_NUMBER: _ClassVar[int]
LONG_NAME_FIELD_NUMBER: _ClassVar[int]
MACADDR_FIELD_NUMBER: _ClassVar[int]
PUBLIC_KEY_FIELD_NUMBER: _ClassVar[int]
ROLE_FIELD_NUMBER: _ClassVar[int]
SHORT_NAME_FIELD_NUMBER: _ClassVar[int]
hw_model: HardwareModel
id: str
is_licensed: bool
is_unmessagable: bool
long_name: str
macaddr: bytes
public_key: bytes
role: _config_pb2.Config.DeviceConfig.Role
short_name: str
def __init__(self, id: _Optional[str] = ..., long_name: _Optional[str] = ..., short_name: _Optional[str] = ..., macaddr: _Optional[bytes] = ..., hw_model: _Optional[_Union[HardwareModel, str]] = ..., is_licensed: bool = ..., role: _Optional[_Union[_config_pb2.Config.DeviceConfig.Role, str]] = ..., public_key: _Optional[bytes] = ..., is_unmessagable: bool = ...) -> None: ...
class Waypoint(_message.Message):
__slots__ = ["bounding_box", "description", "expire", "geofence_radius", "icon", "id", "latitude_i", "locked_to", "longitude_i", "name", "notify_favorites_only", "notify_on_enter", "notify_on_exit"]
BOUNDING_BOX_FIELD_NUMBER: _ClassVar[int]
DESCRIPTION_FIELD_NUMBER: _ClassVar[int]
EXPIRE_FIELD_NUMBER: _ClassVar[int]
GEOFENCE_RADIUS_FIELD_NUMBER: _ClassVar[int]
ICON_FIELD_NUMBER: _ClassVar[int]
ID_FIELD_NUMBER: _ClassVar[int]
LATITUDE_I_FIELD_NUMBER: _ClassVar[int]
LOCKED_TO_FIELD_NUMBER: _ClassVar[int]
LONGITUDE_I_FIELD_NUMBER: _ClassVar[int]
NAME_FIELD_NUMBER: _ClassVar[int]
NOTIFY_FAVORITES_ONLY_FIELD_NUMBER: _ClassVar[int]
NOTIFY_ON_ENTER_FIELD_NUMBER: _ClassVar[int]
NOTIFY_ON_EXIT_FIELD_NUMBER: _ClassVar[int]
bounding_box: BoundingBox
description: str
expire: int
geofence_radius: int
icon: int
id: int
latitude_i: int
locked_to: int
longitude_i: int
name: str
notify_favorites_only: bool
notify_on_enter: bool
notify_on_exit: bool
def __init__(self, id: _Optional[int] = ..., latitude_i: _Optional[int] = ..., longitude_i: _Optional[int] = ..., expire: _Optional[int] = ..., locked_to: _Optional[int] = ..., name: _Optional[str] = ..., description: _Optional[str] = ..., icon: _Optional[int] = ..., geofence_radius: _Optional[int] = ..., bounding_box: _Optional[_Union[BoundingBox, _Mapping]] = ..., notify_on_enter: bool = ..., notify_on_exit: bool = ..., notify_favorites_only: bool = ...) -> None: ...
class resend_chunks(_message.Message):
__slots__ = ["chunks"]
CHUNKS_FIELD_NUMBER: _ClassVar[int]
chunks: _containers.RepeatedScalarFieldContainer[int]
def __init__(self, chunks: _Optional[_Iterable[int]] = ...) -> None: ...
class HardwareModel(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class Constants(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class CriticalErrorCode(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class FirmwareEdition(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class ExcludedModules(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
+392
View File
@@ -0,0 +1,392 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/protobuf/module_config.proto
"""Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
from meshtastic.protobuf import atak_pb2 as meshtastic_dot_protobuf_dot_atak__pb2
from meshtastic.protobuf import channel_pb2 as meshtastic_dot_protobuf_dot_channel__pb2
from meshtastic.protobuf import config_pb2 as meshtastic_dot_protobuf_dot_config__pb2
from meshtastic.protobuf import field_metadata_pb2 as meshtastic_dot_protobuf_dot_field__metadata__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\'meshtastic/protobuf/module_config.proto\x12\x13meshtastic.protobuf\x1a\x1emeshtastic/protobuf/atak.proto\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/config.proto\x1a(meshtastic/protobuf/field_metadata.proto\"\xfd~\n\x0cModuleConfig\x12<\n\x04mqtt\x18\x01 \x01(\x0b\x32,.meshtastic.protobuf.ModuleConfig.MQTTConfigH\x00\x12@\n\x06serial\x18\x02 \x01(\x0b\x32..meshtastic.protobuf.ModuleConfig.SerialConfigH\x00\x12]\n\x15\x65xternal_notification\x18\x03 \x01(\x0b\x32<.meshtastic.protobuf.ModuleConfig.ExternalNotificationConfigH\x00\x12M\n\rstore_forward\x18\x04 \x01(\x0b\x32\x34.meshtastic.protobuf.ModuleConfig.StoreForwardConfigH\x00\x12G\n\nrange_test\x18\x05 \x01(\x0b\x32\x31.meshtastic.protobuf.ModuleConfig.RangeTestConfigH\x00\x12\x46\n\ttelemetry\x18\x06 \x01(\x0b\x32\x31.meshtastic.protobuf.ModuleConfig.TelemetryConfigH\x00\x12O\n\x0e\x63\x61nned_message\x18\x07 \x01(\x0b\x32\x35.meshtastic.protobuf.ModuleConfig.CannedMessageConfigH\x00\x12>\n\x05\x61udio\x18\x08 \x01(\x0b\x32-.meshtastic.protobuf.ModuleConfig.AudioConfigH\x00\x12Q\n\x0fremote_hardware\x18\t \x01(\x0b\x32\x36.meshtastic.protobuf.ModuleConfig.RemoteHardwareConfigH\x00\x12M\n\rneighbor_info\x18\n \x01(\x0b\x32\x34.meshtastic.protobuf.ModuleConfig.NeighborInfoConfigH\x00\x12S\n\x10\x61mbient_lighting\x18\x0b \x01(\x0b\x32\x37.meshtastic.protobuf.ModuleConfig.AmbientLightingConfigH\x00\x12S\n\x10\x64\x65tection_sensor\x18\x0c \x01(\x0b\x32\x37.meshtastic.protobuf.ModuleConfig.DetectionSensorConfigH\x00\x12H\n\npaxcounter\x18\r \x01(\x0b\x32\x32.meshtastic.protobuf.ModuleConfig.PaxcounterConfigH\x00\x12\\\n\rstatusmessage\x18\x0e \x01(\x0b\x32\x35.meshtastic.protobuf.ModuleConfig.StatusMessageConfigB\x0c\xca\xf3\x18\x08R\x06\x32.7.20H\x00\x12\x64\n\x12traffic_management\x18\x0f \x01(\x0b\x32\x39.meshtastic.protobuf.ModuleConfig.TrafficManagementConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x12G\n\x03tak\x18\x10 \x01(\x0b\x32+.meshtastic.protobuf.ModuleConfig.TAKConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x12V\n\x0bmesh_beacon\x18\x11 \x01(\x0b\x32\x32.meshtastic.protobuf.ModuleConfig.MeshBeaconConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x1a\xd9\x07\n\nMQTTConfig\x12\x38\n\x07\x65nabled\x18\x01 \x01(\x08\x42\'\xca\xf3\x18#:\x0cMQTT EnabledB\x13\x45nable MQTT gateway\x12\x33\n\x07\x61\x64\x64ress\x18\x02 \x01(\tB\"\xca\xf3\x18\x1e:\x07\x41\x64\x64ressB\x13MQTT server address\x12/\n\x08username\x18\x03 \x01(\tB\x1d\xca\xf3\x18\x19:\x08UsernameB\rMQTT username\x12/\n\x08password\x18\x04 \x01(\tB\x1d\xca\xf3\x18\x19:\x08PasswordB\rMQTT password\x12T\n\x12\x65ncryption_enabled\x18\x05 \x01(\x08\x42\x38\xca\xf3\x18\x34:\x12\x45ncryption EnabledB\x1eSend encrypted packets to MQTT\x12#\n\x0cjson_enabled\x18\x06 \x01(\x08\x42\r\x18\x01\xca\xf3\x18\x07Z\x05\x32.8.0\x12L\n\x0btls_enabled\x18\x07 \x01(\x08\x42\x37\xca\xf3\x18\x33:\x0bTLS EnabledB$Connect to the MQTT server over TLS.\x12/\n\x04root\x18\x08 \x01(\tB!\xca\xf3\x18\x1d:\nRoot TopicB\x0fMQTT root topic\x12{\n\x17proxy_to_client_enabled\x18\t \x01(\x08\x42Z\xca\xf3\x18V:\x11MQTT Client ProxyBAUtilizes the network connection on your phone to connect to MQTT.\x12\xb0\x02\n\x15map_reporting_enabled\x18\n \x01(\x08\x42\x90\x02\xca\xf3\x18\x8b\x02:\rMap ReportingB\xf9\x01Your node will periodically send an unencrypted map report packet to the configured MQTT server, this includes id, short and long name, approximate location, hardware model, role, firmware version, LoRa region, modem preset and primary channel name.\x12P\n\x13map_report_settings\x18\x0b \x01(\x0b\x32\x33.meshtastic.protobuf.ModuleConfig.MapReportSettings\x1a\xea\x02\n\x11MapReportSettings\x12{\n\x15publish_interval_secs\x18\x01 \x01(\rB\\\xca\xf3\x18X\x19\x00\x00\x00\x00\x00 \xac@*\x01s:\x14Map Publish IntervalB4How often a map report is published. Minimum 1 hour.\x12\x1a\n\x12position_precision\x18\x02 \x01(\r\x12\xbb\x01\n\x16should_report_location\x18\x03 \x01(\x08\x42\x9a\x01\xca\xf3\x18\x95\x01:\x0cShare on MapB~Consent to publish this node\'s details and approximate location unencrypted to the MQTT map. No map report is sent without it.R\x05\x32.6.8\x1a\x8b\x01\n\x14RemoteHardwareConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\"\n\x1a\x61llow_undefined_pin_access\x18\x02 \x01(\x08\x12>\n\x0e\x61vailable_pins\x18\x03 \x03(\x0b\x32&.meshtastic.protobuf.RemoteHardwarePin\x1a\x84\x04\n\x12NeighborInfoConfig\x12\xb2\x01\n\x07\x65nabled\x18\x01 \x01(\x08\x42\xa0\x01\xca\xf3\x18\x9b\x01:\x15Neighbor Info EnabledB\x81\x01\x45nable neighbor info broadcasting. Periodically sends information about directly-heard neighbors to help visualize mesh topology.\x12r\n\x0fupdate_interval\x18\x02 \x01(\rBY\xca\xf3\x18U\x19\x00\x00\x00\x00\x00 \xcc@*\x01s:\x0fUpdate IntervalB6How often to broadcast neighbor info. Minimum 4 hours.\x12\xc4\x01\n\x12transmit_over_lora\x18\x03 \x01(\x08\x42\xa7\x01\xca\xf3\x18\xa2\x01:\x12Transmit over LoRaB\x8b\x01Whether to traLine truncated
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.module_config_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\022ModuleConfigProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_MODULECONFIG_MQTTCONFIG.fields_by_name['enabled']._options = None
_MODULECONFIG_MQTTCONFIG.fields_by_name['enabled']._serialized_options = b'\312\363\030#:\014MQTT EnabledB\023Enable MQTT gateway'
_MODULECONFIG_MQTTCONFIG.fields_by_name['address']._options = None
_MODULECONFIG_MQTTCONFIG.fields_by_name['address']._serialized_options = b'\312\363\030\036:\007AddressB\023MQTT server address'
_MODULECONFIG_MQTTCONFIG.fields_by_name['username']._options = None
_MODULECONFIG_MQTTCONFIG.fields_by_name['username']._serialized_options = b'\312\363\030\031:\010UsernameB\rMQTT username'
_MODULECONFIG_MQTTCONFIG.fields_by_name['password']._options = None
_MODULECONFIG_MQTTCONFIG.fields_by_name['password']._serialized_options = b'\312\363\030\031:\010PasswordB\rMQTT password'
_MODULECONFIG_MQTTCONFIG.fields_by_name['encryption_enabled']._options = None
_MODULECONFIG_MQTTCONFIG.fields_by_name['encryption_enabled']._serialized_options = b'\312\363\0304:\022Encryption EnabledB\036Send encrypted packets to MQTT'
_MODULECONFIG_MQTTCONFIG.fields_by_name['json_enabled']._options = None
_MODULECONFIG_MQTTCONFIG.fields_by_name['json_enabled']._serialized_options = b'\030\001\312\363\030\007Z\0052.8.0'
_MODULECONFIG_MQTTCONFIG.fields_by_name['tls_enabled']._options = None
_MODULECONFIG_MQTTCONFIG.fields_by_name['tls_enabled']._serialized_options = b'\312\363\0303:\013TLS EnabledB$Connect to the MQTT server over TLS.'
_MODULECONFIG_MQTTCONFIG.fields_by_name['root']._options = None
_MODULECONFIG_MQTTCONFIG.fields_by_name['root']._serialized_options = b'\312\363\030\035:\nRoot TopicB\017MQTT root topic'
_MODULECONFIG_MQTTCONFIG.fields_by_name['proxy_to_client_enabled']._options = None
_MODULECONFIG_MQTTCONFIG.fields_by_name['proxy_to_client_enabled']._serialized_options = b'\312\363\030V:\021MQTT Client ProxyBAUtilizes the network connection on your phone to connect to MQTT.'
_MODULECONFIG_MQTTCONFIG.fields_by_name['map_reporting_enabled']._options = None
_MODULECONFIG_MQTTCONFIG.fields_by_name['map_reporting_enabled']._serialized_options = b'\312\363\030\213\002:\rMap ReportingB\371\001Your node will periodically send an unencrypted map report packet to the configured MQTT server, this includes id, short and long name, approximate location, hardware model, role, firmware version, LoRa region, modem preset and primary channel name.'
_MODULECONFIG_MAPREPORTSETTINGS.fields_by_name['publish_interval_secs']._options = None
_MODULECONFIG_MAPREPORTSETTINGS.fields_by_name['publish_interval_secs']._serialized_options = b'\312\363\030X\031\000\000\000\000\000 \254@*\001s:\024Map Publish IntervalB4How often a map report is published. Minimum 1 hour.'
_MODULECONFIG_MAPREPORTSETTINGS.fields_by_name['should_report_location']._options = None
_MODULECONFIG_MAPREPORTSETTINGS.fields_by_name['should_report_location']._serialized_options = b'\312\363\030\225\001:\014Share on MapB~Consent to publish this node\'s details and approximate location unencrypted to the MQTT map. No map report is sent without it.R\0052.6.8'
_MODULECONFIG_NEIGHBORINFOCONFIG.fields_by_name['enabled']._options = None
_MODULECONFIG_NEIGHBORINFOCONFIG.fields_by_name['enabled']._serialized_options = b'\312\363\030\233\001:\025Neighbor Info EnabledB\201\001Enable neighbor info broadcasting. Periodically sends information about directly-heard neighbors to help visualize mesh topology.'
_MODULECONFIG_NEIGHBORINFOCONFIG.fields_by_name['update_interval']._options = None
_MODULECONFIG_NEIGHBORINFOCONFIG.fields_by_name['update_interval']._serialized_options = b'\312\363\030U\031\000\000\000\000\000 \314@*\001s:\017Update IntervalB6How often to broadcast neighbor info. Minimum 4 hours.'
_MODULECONFIG_NEIGHBORINFOCONFIG.fields_by_name['transmit_over_lora']._options = None
_MODULECONFIG_NEIGHBORINFOCONFIG.fields_by_name['transmit_over_lora']._serialized_options = b'\312\363\030\242\001:\022Transmit over LoRaB\213\001Whether to transmit neighbor info over LoRa in addition to MQTT and the connected app. Not available on channels with default key and name.'
_MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE.values_by_name["LOGIC_LOW"]._options = None
_MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE.values_by_name["LOGIC_LOW"]._serialized_options = b'\312\363\030\005:\003Low'
_MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE.values_by_name["LOGIC_HIGH"]._options = None
_MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE.values_by_name["LOGIC_HIGH"]._serialized_options = b'\312\363\030\006:\004High'
_MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE.values_by_name["FALLING_EDGE"]._options = None
_MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE.values_by_name["FALLING_EDGE"]._serialized_options = b'\312\363\030\016:\014Falling Edge'
_MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE.values_by_name["RISING_EDGE"]._options = None
_MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE.values_by_name["RISING_EDGE"]._serialized_options = b'\312\363\030\r:\013Rising Edge'
_MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE.values_by_name["EITHER_EDGE_ACTIVE_LOW"]._options = None
_MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE.values_by_name["EITHER_EDGE_ACTIVE_LOW"]._serialized_options = b'\312\363\030\021:\017Either Edge Low'
_MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE.values_by_name["EITHER_EDGE_ACTIVE_HIGH"]._options = None
_MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE.values_by_name["EITHER_EDGE_ACTIVE_HIGH"]._serialized_options = b'\312\363\030\022:\020Either Edge High'
_MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['enabled']._options = None
_MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['enabled']._serialized_options = b'\312\363\030\354\001:\030Detection Sensor EnabledB\317\001Enables the detection sensor module, it needs to be enabled on both the node with the sensor, and any nodes that you want to receive detection sensor text messages or view the detection sensor log and chart.'
_MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['minimum_broadcast_secs']._options = None
_MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['minimum_broadcast_secs']._serialized_options = b'\312\363\030Z*\001s:)Minimum time between detection broadcastsB*Minimum time between detection broadcasts.'
_MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['state_broadcast_secs']._options = None
_MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['state_broadcast_secs']._serialized_options = b'\312\363\030\231\001*\001s:\030State Broadcast IntervalBzHow often to send the detection sensor state to the mesh, whether or not anything was detected. 0 sends only on detection.'
_MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['send_bell']._options = None
_MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['send_bell']._serialized_options = b'\312\363\030e:\tSend BellBXSend ASCII bell with alert message. Useful for triggering external notification on bell.'
_MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['name']._options = None
_MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['name']._serialized_options = b'\312\363\030%:\004NameB\035Sensor name for mesh messages'
_MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['monitor_pin']._options = None
_MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['monitor_pin']._serialized_options = b'\312\363\030Q:\023GPIO Pin to monitorB:GPIO pin watched for state changes. 0 disables the module.'
_MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['detection_trigger_type']._options = None
_MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['detection_trigger_type']._serialized_options = b'\312\363\030%:\014Trigger TypeB\025Type of trigger event'
_MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['use_pullup']._options = None
_MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['use_pullup']._serialized_options = b'\312\363\030P:\024Use Internal Pull-upB8Enable the internal pull-up resistor on the monitor pin.'
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_DEFAULT"]._options = None
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_DEFAULT"]._serialized_options = b'\312\363\030\t:\007Default'
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_3200"]._options = None
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_3200"]._serialized_options = b'\312\363\030\n:\0103200 bps'
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_2400"]._options = None
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_2400"]._serialized_options = b'\312\363\030\n:\0102400 bps'
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_1600"]._options = None
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_1600"]._serialized_options = b'\312\363\030\n:\0101600 bps'
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_1400"]._options = None
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_1400"]._serialized_options = b'\312\363\030\n:\0101400 bps'
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_1300"]._options = None
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_1300"]._serialized_options = b'\312\363\030\n:\0101300 bps'
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_1200"]._options = None
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_1200"]._serialized_options = b'\312\363\030\n:\0101200 bps'
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_700"]._options = None
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_700"]._serialized_options = b'\010\001'
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_700B"]._options = None
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_700B"]._serialized_options = b'\010\001'
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_700C"]._options = None
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_700C"]._serialized_options = b'\312\363\030\020:\016700 bps (700C)'
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_450"]._options = None
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_450"]._serialized_options = b'\312\363\030\t:\007450 bps'
_MODULECONFIG_AUDIOCONFIG.fields_by_name['codec2_enabled']._options = None
_MODULECONFIG_AUDIOCONFIG.fields_by_name['codec2_enabled']._serialized_options = b'\312\363\030^:\016Codec2 EnabledBLEnable Codec2 audio encoding/decoding for voice communication over the mesh.'
_MODULECONFIG_AUDIOCONFIG.fields_by_name['ptt_pin']._options = None
_MODULECONFIG_AUDIOCONFIG.fields_by_name['ptt_pin']._serialized_options = b'\312\363\0308:\007PTT PinB-Push-to-talk GPIO pin number. 0 uses GPIO 39.'
_MODULECONFIG_AUDIOCONFIG.fields_by_name['bitrate']._options = None
_MODULECONFIG_AUDIOCONFIG.fields_by_name['bitrate']._serialized_options = b'\312\363\030\202\001:\007BitrateBwThe Codec2 bitrate to use. The sample rate is always 8 kHz. Lower bitrates use less bandwidth but reduce audio quality.'
_MODULECONFIG_AUDIOCONFIG.fields_by_name['i2s_ws']._options = None
_MODULECONFIG_AUDIOCONFIG.fields_by_name['i2s_ws']._serialized_options = b'\312\363\030\025:\023I2S Word Select Pin'
_MODULECONFIG_AUDIOCONFIG.fields_by_name['i2s_sd']._options = None
_MODULECONFIG_AUDIOCONFIG.fields_by_name['i2s_sd']._serialized_options = b'\312\363\030\021:\017I2S Data In Pin'
_MODULECONFIG_AUDIOCONFIG.fields_by_name['i2s_din']._options = None
_MODULECONFIG_AUDIOCONFIG.fields_by_name['i2s_din']._serialized_options = b'\312\363\030\022:\020I2S Data Out Pin'
_MODULECONFIG_AUDIOCONFIG.fields_by_name['i2s_sck']._options = None
_MODULECONFIG_AUDIOCONFIG.fields_by_name['i2s_sck']._serialized_options = b'\312\363\030\017:\rI2S Clock Pin'
_MODULECONFIG_PAXCOUNTERCONFIG.fields_by_name['enabled']._options = None
_MODULECONFIG_PAXCOUNTERCONFIG.fields_by_name['enabled']._serialized_options = b'\312\363\030\250\001:\023PAX Counter EnabledB\220\001When enabled, the PAX Counter module counts nearby WiFi and Bluetooth devices. Both WiFi and Bluetooth must be disabled for PAX counter to work.'
_MODULECONFIG_PAXCOUNTERCONFIG.fields_by_name['paxcounter_update_interval']._options = None
_MODULECONFIG_PAXCOUNTERCONFIG.fields_by_name['paxcounter_update_interval']._serialized_options = b'\312\363\030F*\001s:\017Update IntervalB0How often to send the device counts to the mesh.'
_MODULECONFIG_PAXCOUNTERCONFIG.fields_by_name['wifi_threshold']._options = None
_MODULECONFIG_PAXCOUNTERCONFIG.fields_by_name['wifi_threshold']._serialized_options = b'\312\363\030@*\003dBm:\016WiFi ThresholdB)RSSI threshold for counting WiFi devices.'
_MODULECONFIG_PAXCOUNTERCONFIG.fields_by_name['ble_threshold']._options = None
_MODULECONFIG_PAXCOUNTERCONFIG.fields_by_name['ble_threshold']._serialized_options = b'\312\363\030>*\003dBm:\rBLE ThresholdB(RSSI threshold for counting BLE devices.'
_MODULECONFIG_TRAFFICMANAGEMENTCONFIG.fields_by_name['position_min_interval_secs']._options = None
_MODULECONFIG_TRAFFICMANAGEMENTCONFIG.fields_by_name['position_min_interval_secs']._serialized_options = b'\312\363\030c*\001s:\031Minimum Position IntervalBCPositions from the same node arriving sooner than this are dropped.'
_MODULECONFIG_TRAFFICMANAGEMENTCONFIG.fields_by_name['nodeinfo_direct_response_max_hops']._options = None
_MODULECONFIG_TRAFFICMANAGEMENTCONFIG.fields_by_name['nodeinfo_direct_response_max_hops']._serialized_options = b'\312\363\030\261\001!\000\000\000\000\000\000\010@:\030Direct NodeInfo Max HopsB\213\001Answer NodeInfo requests from cache for requestors within this many hops. Capped at 3 on routers; other roles answer direct neighbors only.'
_MODULECONFIG_TRAFFICMANAGEMENTCONFIG.fields_by_name['rate_limit_window_secs']._options = None
_MODULECONFIG_TRAFFICMANAGEMENTCONFIG.fields_by_name['rate_limit_window_secs']._serialized_options = b'\312\363\030A*\001s:\021Rate Limit WindowB)The time window packets are counted over.'
_MODULECONFIG_TRAFFICMANAGEMENTCONFIG.fields_by_name['rate_limit_max_packets']._options = None
_MODULECONFIG_TRAFFICMANAGEMENTCONFIG.fields_by_name['rate_limit_max_packets']._serialized_options = b'\312\363\030Q!\000\000\000\000\000\000N@:\026Rate Limit Max PacketsB.The most packets one node may send per window.'
_MODULECONFIG_TRAFFICMANAGEMENTCONFIG.fields_by_name['unknown_packet_threshold']._options = None
_MODULECONFIG_TRAFFICMANAGEMENTCONFIG.fields_by_name['unknown_packet_threshold']._serialized_options = b'\312\363\030o!\000\000\000\000\000\000N@:\030Unknown Packet ThresholdBJUndecryptable packets one node may send in 5 minutes before it is dropped.'
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_DEFAULT"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_DEFAULT"]._serialized_options = b'\312\363\030\t:\007Default'
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_110"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_110"]._serialized_options = b'\312\363\030\n:\010110 Baud'
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_300"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_300"]._serialized_options = b'\312\363\030\n:\010300 Baud'
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_600"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_600"]._serialized_options = b'\312\363\030\n:\010600 Baud'
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_1200"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_1200"]._serialized_options = b'\312\363\030\013:\t1200 Baud'
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_2400"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_2400"]._serialized_options = b'\312\363\030\013:\t2400 Baud'
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_4800"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_4800"]._serialized_options = b'\312\363\030\013:\t4800 Baud'
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_9600"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_9600"]._serialized_options = b'\312\363\030\013:\t9600 Baud'
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_19200"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_19200"]._serialized_options = b'\312\363\030\014:\n19200 Baud'
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_38400"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_38400"]._serialized_options = b'\312\363\030\014:\n38400 Baud'
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_57600"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_57600"]._serialized_options = b'\312\363\030\014:\n57600 Baud'
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_115200"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_115200"]._serialized_options = b'\312\363\030\r:\013115200 Baud'
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_230400"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_230400"]._serialized_options = b'\312\363\030\r:\013230400 Baud'
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_460800"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_460800"]._serialized_options = b'\312\363\030\r:\013460800 Baud'
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_576000"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_576000"]._serialized_options = b'\312\363\030\r:\013576000 Baud'
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_921600"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_921600"]._serialized_options = b'\312\363\030\r:\013921600 Baud'
_MODULECONFIG_SERIALCONFIG_SERIAL_MODE.values_by_name["DEFAULT"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_MODE.values_by_name["DEFAULT"]._serialized_options = b'\312\363\030\t:\007Default'
_MODULECONFIG_SERIALCONFIG_SERIAL_MODE.values_by_name["SIMPLE"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_MODE.values_by_name["SIMPLE"]._serialized_options = b'\312\363\030\010:\006Simple'
_MODULECONFIG_SERIALCONFIG_SERIAL_MODE.values_by_name["PROTO"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_MODE.values_by_name["PROTO"]._serialized_options = b'\312\363\030\013:\tProtobufs'
_MODULECONFIG_SERIALCONFIG_SERIAL_MODE.values_by_name["TEXTMSG"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_MODE.values_by_name["TEXTMSG"]._serialized_options = b'\312\363\030\016:\014Text Message'
_MODULECONFIG_SERIALCONFIG_SERIAL_MODE.values_by_name["NMEA"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_MODE.values_by_name["NMEA"]._serialized_options = b'\312\363\030\020:\016NMEA Positions'
_MODULECONFIG_SERIALCONFIG_SERIAL_MODE.values_by_name["CALTOPO"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_MODE.values_by_name["CALTOPO"]._serialized_options = b'\312\363\030\t:\007CalTopo'
_MODULECONFIG_SERIALCONFIG.fields_by_name['enabled']._options = None
_MODULECONFIG_SERIALCONFIG.fields_by_name['enabled']._serialized_options = b'\312\363\030&:\016Serial EnabledB\024Enable serial module'
_MODULECONFIG_SERIALCONFIG.fields_by_name['echo']._options = None
_MODULECONFIG_SERIALCONFIG.fields_by_name['echo']._serialized_options = b'\312\363\030N:\004EchoBFIf set, any packets you send will be echoed back over the serial port.'
_MODULECONFIG_SERIALCONFIG.fields_by_name['rxd']._options = None
_MODULECONFIG_SERIALCONFIG.fields_by_name['rxd']._serialized_options = b'\312\363\030,:\033Receive data (rxd) GPIO pinB\rRX pin number'
_MODULECONFIG_SERIALCONFIG.fields_by_name['txd']._options = None
_MODULECONFIG_SERIALCONFIG.fields_by_name['txd']._serialized_options = b'\312\363\030-:\034Transmit data (txd) GPIO pinB\rTX pin number'
_MODULECONFIG_SERIALCONFIG.fields_by_name['baud']._options = None
_MODULECONFIG_SERIALCONFIG.fields_by_name['baud']._serialized_options = b'\312\363\030\030:\004BaudB\020Serial baud rate'
_MODULECONFIG_SERIALCONFIG.fields_by_name['timeout']._options = None
_MODULECONFIG_SERIALCONFIG.fields_by_name['timeout']._serialized_options = b'\312\363\030i*\002ms:\007TimeoutBZHow long to wait before treating received serial data as a complete packet. 0 uses 250 ms.'
_MODULECONFIG_SERIALCONFIG.fields_by_name['mode']._options = None
_MODULECONFIG_SERIALCONFIG.fields_by_name['mode']._serialized_options = b'\312\363\030$:\004ModeB\034Serial module operation mode'
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['enabled']._options = None
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['enabled']._serialized_options = b'\312\363\030>:\035External Notification EnabledB\035Enable external notifications'
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['output_ms']._options = None
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['output_ms']._serialized_options = b'\312\363\030I*\002ms:\024GPIO Output DurationB-In GPIO mode, how long to keep the output on.'
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['output']._options = None
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['output']._serialized_options = b'\312\363\030_:\017Output pin GPIOBLGPIO pin driven on notification. Defaults to the board\'s EXT_NOTIFY_OUT pin.'
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['output_vibra']._options = None
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['output_vibra']._serialized_options = b'\312\363\0303:\025Output pin vibra GPIOB\032Vibration motor output pin'
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['output_buzzer']._options = None
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['output_buzzer']._serialized_options = b'\312\363\030+:\026Output pin buzzer GPIOB\021Buzzer output pin'
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['active']._options = None
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['active']._serialized_options = b'\312\363\030]:\006ActiveBSIf enabled, the \'output\' Pin will be pulled active high, disabled means active low.'
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['alert_message']._options = None
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['alert_message']._serialized_options = b'\312\363\030;:\036Alert when receiving a messageB\031Alert on incoming message'
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['alert_message_vibra']._options = None
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['alert_message_vibra']._serialized_options = b'\312\363\030D:\021Vibra Motor AlertB/Alert GPIO vibra motor when receiving a message'
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['alert_message_buzzer']._options = None
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['alert_message_buzzer']._serialized_options = b'\312\363\030F:*Alert GPIO buzzer when receiving a messageB\030Buzz on incoming message'
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['alert_bell']._options = None
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['alert_bell']._serialized_options = b'\312\363\0306:\033Alert when receiving a bellB\027Alert on bell character'
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['alert_bell_vibra']._options = None
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['alert_bell_vibra']._serialized_options = b'\312\363\030I:,Alert GPIO vibra motor when receiving a bellB\031Vibrate on bell character'
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['alert_bell_buzzer']._options = None
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['alert_bell_buzzer']._serialized_options = b'\312\363\030A:\'Alert GPIO buzzer when receiving a bellB\026Buzz on bell character'
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['use_pwm']._options = None
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['use_pwm']._serialized_options = b'\312\363\030\327\001:\016Use PWM BuzzerB\304\001Use a PWM output (like the RAK Buzzer) for tunes instead of an on/off output. This will ignore the output, output duration and active settings and use the device config buzzer GPIO option instead.'
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['nag_timeout']._options = None
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['nag_timeout']._serialized_options = b'\312\363\0302*\001s:\013Nag TimeoutB How long the notification lasts.'
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['use_i2s_as_buzzer']._options = None
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['use_i2s_as_buzzer']._serialized_options = b'\312\363\030\247\001:\021Use I2S As BuzzerB\221\001Enables devices with native I2S audio output to use the RTTTL over speaker like a buzzer. T-Watch S3 and T-Deck for example have this capability.'
_MODULECONFIG_STOREFORWARDCONFIG.fields_by_name['enabled']._options = None
_MODULECONFIG_STOREFORWARDCONFIG.fields_by_name['enabled']._serialized_options = b'\312\363\030B:\031Store and Forward EnabledB%Enables the store and forward module.'
_MODULECONFIG_STOREFORWARDCONFIG.fields_by_name['heartbeat']._options = None
_MODULECONFIG_STOREFORWARDCONFIG.fields_by_name['heartbeat']._serialized_options = b'\312\363\030F:\016Send HeartbeatB4Send a heartbeat to advertise the server\'s presence.'
_MODULECONFIG_STOREFORWARDCONFIG.fields_by_name['records']._options = None
_MODULECONFIG_STOREFORWARDCONFIG.fields_by_name['records']._serialized_options = b'\312\363\030^:\021Number of recordsBIMaximum number of messages to store. 0 uses three quarters of free PSRAM.'
_MODULECONFIG_STOREFORWARDCONFIG.fields_by_name['history_return_max']._options = None
_MODULECONFIG_STOREFORWARDCONFIG.fields_by_name['history_return_max']._serialized_options = b'\312\363\030X:\022History Return MaxBBMaximum number of stored messages returned per request. 0 uses 25.'
_MODULECONFIG_STOREFORWARDCONFIG.fields_by_name['history_return_window']._options = None
_MODULECONFIG_STOREFORWARDCONFIG.fields_by_name['history_return_window']._serialized_options = b'\312\363\030\\:\025History Return WindowBCHow far back, in minutes, stored messages are returned. 0 uses 240.'
_MODULECONFIG_STOREFORWARDCONFIG.fields_by_name['is_server']._options = None
_MODULECONFIG_STOREFORWARDCONFIG.fields_by_name['is_server']._serialized_options = b'\312\363\030`:\006ServerBVEnable this device as a Store and Forward server. Requires an ESP32 device with PSRAM.'
_MODULECONFIG_RANGETESTCONFIG.fields_by_name['enabled']._options = None
_MODULECONFIG_RANGETESTCONFIG.fields_by_name['enabled']._serialized_options = b'\312\363\030.:\022Range Test EnabledB\030Enable range test module'
_MODULECONFIG_RANGETESTCONFIG.fields_by_name['sender']._options = None
_MODULECONFIG_RANGETESTCONFIG.fields_by_name['sender']._serialized_options = b'\312\363\030q*\001s:\017Sender IntervalB[This device will send out range test messages on the selected interval. 0 disables sending.'
_MODULECONFIG_RANGETESTCONFIG.fields_by_name['save']._options = None
_MODULECONFIG_RANGETESTCONFIG.fields_by_name['save']._serialized_options = b'\312\363\030u:\004SaveBmSaves a CSV with the range test message details, currently only available on ESP32 devices with a web server.'
_MODULECONFIG_RANGETESTCONFIG.fields_by_name['clear_on_reboot']._options = None
_MODULECONFIG_RANGETESTCONFIG.fields_by_name['clear_on_reboot']._serialized_options = b'\312\363\030\010R\0062.7.11'
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['device_update_interval']._options = None
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['device_update_interval']._serialized_options = b'\312\363\030N*\001s:\027Device Metrics IntervalB0How often device metrics are sent over the mesh.'
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['environment_update_interval']._options = None
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['environment_update_interval']._serialized_options = b'\312\363\030X*\001s:\034Environment Metrics IntervalB5How often environment metrics are sent over the mesh.'
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['environment_measurement_enabled']._options = None
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['environment_measurement_enabled']._serialized_options = b'\312\363\030?:\033Environment Metrics EnabledB Collect environment measurements'
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['environment_screen_enabled']._options = None
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['environment_screen_enabled']._serialized_options = b'\312\363\030C:\025Show on device screenB*Display environment measurements on device'
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['environment_display_fahrenheit']._options = None
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['environment_display_fahrenheit']._serialized_options = b'\312\363\0307:\022Display FahrenheitB!Display environment in Fahrenheit'
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['air_quality_enabled']._options = None
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['air_quality_enabled']._serialized_options = b'\312\363\030::\033Air Quality Metrics EnabledB\033Collect air quality metrics'
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['air_quality_interval']._options = None
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['air_quality_interval']._serialized_options = b'\312\363\030X*\001s:\034Air Quality Metrics IntervalB5How often air quality metrics are sent over the mesh.'
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['power_measurement_enabled']._options = None
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['power_measurement_enabled']._serialized_options = b'\312\363\0302:\031Power Measurement EnabledB\025Collect power metrics'
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['power_update_interval']._options = None
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['power_update_interval']._serialized_options = b'\312\363\030L*\001s:\026Power Metrics IntervalB/How often power metrics are sent over the mesh.'
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['power_screen_enabled']._options = None
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['power_screen_enabled']._serialized_options = b'\312\363\030/:\014Power ScreenB\037Display power metrics on device'
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['device_telemetry_enabled']._options = None
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['device_telemetry_enabled']._serialized_options = b'\312\363\030\226\001:\030Broadcast Device MetricsBrEnable broadcasting device metrics to the mesh network. When disabled, metrics are only sent to connected clients.R\0062.7.13'
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['air_quality_screen_enabled']._options = None
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['air_quality_screen_enabled']._serialized_options = b'\312\363\030\010R\0062.7.18'
_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["NONE"]._options = None
_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["NONE"]._serialized_options = b'\312\363\030\006:\004None'
_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["UP"]._options = None
_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["UP"]._serialized_options = b'\312\363\030\004:\002Up'
_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["DOWN"]._options = None
_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["DOWN"]._serialized_options = b'\312\363\030\006:\004Down'
_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["LEFT"]._options = None
_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["LEFT"]._serialized_options = b'\312\363\030\006:\004Left'
_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["RIGHT"]._options = None
_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["RIGHT"]._serialized_options = b'\312\363\030\007:\005Right'
_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["SELECT"]._options = None
_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["SELECT"]._serialized_options = b'\312\363\030\010:\006Select'
_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["BACK"]._options = None
_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["BACK"]._serialized_options = b'\312\363\030\006:\004Back'
_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["CANCEL"]._options = None
_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["CANCEL"]._serialized_options = b'\312\363\030\010:\006Cancel'
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['rotary1_enabled']._options = None
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['rotary1_enabled']._serialized_options = b'\312\363\030\':\016Rotary EncoderB\025Enable rotary encoder'
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['inputbroker_pin_a']._options = None
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['inputbroker_pin_a']._serialized_options = b'\312\363\030,:\005Pin AB#GPIO pin for rotary encoder A port.'
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['inputbroker_pin_b']._options = None
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['inputbroker_pin_b']._serialized_options = b'\312\363\030,:\005Pin BB#GPIO pin for rotary encoder B port.'
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['inputbroker_pin_press']._options = None
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['inputbroker_pin_press']._serialized_options = b'\312\363\0303:\tPress PinB&GPIO pin for the encoder press button.'
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['inputbroker_event_cw']._options = None
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['inputbroker_event_cw']._serialized_options = b'\312\363\030<:\026Clockwise Rotary EventB\"Input event for clockwise rotation'
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['inputbroker_event_ccw']._options = None
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['inputbroker_event_ccw']._serialized_options = b'\312\363\030K:\035Counterclockwise Rotary EventB*Input event for counter-clockwise rotation'
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['inputbroker_event_press']._options = None
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['inputbroker_event_press']._serialized_options = b'\312\363\0304:\023Encoder Press EventB\035Input event for encoder press'
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['updown1_enabled']._options = None
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['updown1_enabled']._serialized_options = b'\312\363\0303:\024Up/Down/Select InputB\033Enable up/down/select input'
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['enabled']._options = None
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['enabled']._serialized_options = b'\030\001\312\363\030\007Z\0052.7.0'
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['allow_input_source']._options = None
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['allow_input_source']._serialized_options = b'\030\001\312\363\030\007Z\0052.7.0'
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['send_bell']._options = None
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['send_bell']._serialized_options = b'\312\363\030.:\tSend BellB!Send bell character with messages'
_MODULECONFIG_AMBIENTLIGHTINGCONFIG.fields_by_name['led_state']._options = None
_MODULECONFIG_AMBIENTLIGHTINGCONFIG.fields_by_name['led_state']._serialized_options = b'\312\363\030*:\tLED StateB\035The state of the LED (on/off)'
_MODULECONFIG_AMBIENTLIGHTINGCONFIG.fields_by_name['current']._options = None
_MODULECONFIG_AMBIENTLIGHTINGCONFIG.fields_by_name['current']._serialized_options = b'\312\363\030_\031\000\000\000\000\000\000\000\000!\000\000\000\000\000\000?@:\007CurrentB!Drive current for the LED output.J\037led|brightness|ambient|lighting'
_MODULECONFIG_AMBIENTLIGHTINGCONFIG.fields_by_name['red']._options = None
_MODULECONFIG_AMBIENTLIGHTINGCONFIG.fields_by_name['red']._serialized_options = b'\312\363\030j\031\000\000\000\000\000\000\000\000!\000\000\000\000\000\340o@:\003RedB*The red level of the ambient lighting LED.J%color|colour|rgb|led|ambient|lighting'
_MODULECONFIG_AMBIENTLIGHTINGCONFIG.fields_by_name['green']._options = None
_MODULECONFIG_AMBIENTLIGHTINGCONFIG.fields_by_name['green']._serialized_options = b'\312\363\030n\031\000\000\000\000\000\000\000\000!\000\000\000\000\000\340o@:\005GreenB,The green level of the ambient lighting LED.J%color|colour|rgb|led|ambient|lighting'
_MODULECONFIG_AMBIENTLIGHTINGCONFIG.fields_by_name['blue']._options = None
_MODULECONFIG_AMBIENTLIGHTINGCONFIG.fields_by_name['blue']._serialized_options = b'\312\363\030l\031\000\000\000\000\000\000\000\000!\000\000\000\000\000\340o@:\004BlueB+The blue level of the ambient lighting LED.J%color|colour|rgb|led|ambient|lighting'
_MODULECONFIG_MESHBEACONCONFIG.fields_by_name['broadcast_message']._options = None
_MODULECONFIG_MESHBEACONCONFIG.fields_by_name['broadcast_message']._serialized_options = b'\312\363\0309:\007MessageB.Message for beacon broadcasts, up to 60 bytes.'
_MODULECONFIG_MESHBEACONCONFIG.fields_by_name['broadcast_interval_secs']._options = None
_MODULECONFIG_MESHBEACONCONFIG.fields_by_name['broadcast_interval_secs']._serialized_options = b'\312\363\030H\031\000\000\000\000\000 \254@*\001s:\010IntervalB0How often a beacon is broadcast. Minimum 1 hour.'
_MODULECONFIG_TAKCONFIG.fields_by_name['team']._options = None
_MODULECONFIG_TAKCONFIG.fields_by_name['team']._serialized_options = b'\312\363\030\026:\004TeamB\016TAK team color'
_MODULECONFIG_TAKCONFIG.fields_by_name['role']._options = None
_MODULECONFIG_TAKCONFIG.fields_by_name['role']._serialized_options = b'\312\363\030\027:\004RoleB\017TAK member role'
_MODULECONFIG.fields_by_name['statusmessage']._options = None
_MODULECONFIG.fields_by_name['statusmessage']._serialized_options = b'\312\363\030\010R\0062.7.20'
_MODULECONFIG.fields_by_name['traffic_management']._options = None
_MODULECONFIG.fields_by_name['traffic_management']._serialized_options = b'\312\363\030\007R\0052.8.0'
_MODULECONFIG.fields_by_name['tak']._options = None
_MODULECONFIG.fields_by_name['tak']._serialized_options = b'\312\363\030\007R\0052.8.0'
_MODULECONFIG.fields_by_name['mesh_beacon']._options = None
_MODULECONFIG.fields_by_name['mesh_beacon']._serialized_options = b'\312\363\030\007R\0052.8.0'
_REMOTEHARDWAREPINTYPE._serialized_start=16574
_REMOTEHARDWAREPINTYPE._serialized_end=16647
_MODULECONFIG._serialized_start=208
_MODULECONFIG._serialized_end=16461
_MODULECONFIG_MQTTCONFIG._serialized_start=1580
_MODULECONFIG_MQTTCONFIG._serialized_end=2565
_MODULECONFIG_MAPREPORTSETTINGS._serialized_start=2568
_MODULECONFIG_MAPREPORTSETTINGS._serialized_end=2930
_MODULECONFIG_REMOTEHARDWARECONFIG._serialized_start=2933
_MODULECONFIG_REMOTEHARDWARECONFIG._serialized_end=3072
_MODULECONFIG_NEIGHBORINFOCONFIG._serialized_start=3075
_MODULECONFIG_NEIGHBORINFOCONFIG._serialized_end=3591
_MODULECONFIG_DETECTIONSENSORCONFIG._serialized_start=3594
_MODULECONFIG_DETECTIONSENSORCONFIG._serialized_end=4989
_MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE._serialized_start=4744
_MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE._serialized_end=4989
_MODULECONFIG_AUDIOCONFIG._serialized_start=4992
_MODULECONFIG_AUDIOCONFIG._serialized_end=5942
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD._serialized_start=5586
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD._serialized_end=5942
_MODULECONFIG_PAXCOUNTERCONFIG._serialized_start=5945
_MODULECONFIG_PAXCOUNTERCONFIG._serialized_end=6454
_MODULECONFIG_TRAFFICMANAGEMENTCONFIG._serialized_start=6457
_MODULECONFIG_TRAFFICMANAGEMENTCONFIG._serialized_end=7474
_MODULECONFIG_SERIALCONFIG._serialized_start=7477
_MODULECONFIG_SERIALCONFIG._serialized_end=8977
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD._serialized_start=8166
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD._serialized_end=8712
_MODULECONFIG_SERIALCONFIG_SERIAL_MODE._serialized_start=8715
_MODULECONFIG_SERIALCONFIG_SERIAL_MODE._serialized_end=8977
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG._serialized_start=8980
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG._serialized_end=10675
_MODULECONFIG_STOREFORWARDCONFIG._serialized_start=10678
_MODULECONFIG_STOREFORWARDCONFIG._serialized_end=11371
_MODULECONFIG_RANGETESTCONFIG._serialized_start=11374
_MODULECONFIG_RANGETESTCONFIG._serialized_end=11773
_MODULECONFIG_TELEMETRYCONFIG._serialized_start=11776
_MODULECONFIG_TELEMETRYCONFIG._serialized_end=13207
_MODULECONFIG_CANNEDMESSAGECONFIG._serialized_start=13210
_MODULECONFIG_CANNEDMESSAGECONFIG._serialized_end=14484
_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR._serialized_start=14286
_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR._serialized_end=14484
_MODULECONFIG_AMBIENTLIGHTINGCONFIG._serialized_start=14487
_MODULECONFIG_AMBIENTLIGHTINGCONFIG._serialized_end=15080
_MODULECONFIG_STATUSMESSAGECONFIG._serialized_start=15082
_MODULECONFIG_STATUSMESSAGECONFIG._serialized_end=15124
_MODULECONFIG_MESHBEACONCONFIG._serialized_start=15127
_MODULECONFIG_MESHBEACONCONFIG._serialized_end=16283
_MODULECONFIG_MESHBEACONCONFIG_BROADCASTTARGET._serialized_start=15747
_MODULECONFIG_MESHBEACONCONFIG_BROADCASTTARGET._serialized_end=16009
_MODULECONFIG_MESHBEACONCONFIG_FLAGS._serialized_start=16011
_MODULECONFIG_MESHBEACONCONFIG_FLAGS._serialized_end=16109
_MODULECONFIG_TAKCONFIG._serialized_start=16286
_MODULECONFIG_TAKCONFIG._serialized_end=16442
_REMOTEHARDWAREPIN._serialized_start=16463
_REMOTEHARDWAREPIN._serialized_end=16572
# @@protoc_insertion_point(module_scope)
+437
View File
@@ -0,0 +1,437 @@
from meshtastic.protobuf import atak_pb2 as _atak_pb2
from meshtastic.protobuf import channel_pb2 as _channel_pb2
from meshtastic.protobuf import config_pb2 as _config_pb2
from meshtastic.protobuf import field_metadata_pb2 as _field_metadata_pb2
from google.protobuf.internal import containers as _containers
from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Mapping, Optional as _Optional, Union as _Union
DESCRIPTOR: _descriptor.FileDescriptor
DIGITAL_READ: RemoteHardwarePinType
DIGITAL_WRITE: RemoteHardwarePinType
UNKNOWN: RemoteHardwarePinType
class ModuleConfig(_message.Message):
__slots__ = ["ambient_lighting", "audio", "canned_message", "detection_sensor", "external_notification", "mesh_beacon", "mqtt", "neighbor_info", "paxcounter", "range_test", "remote_hardware", "serial", "statusmessage", "store_forward", "tak", "telemetry", "traffic_management"]
class AmbientLightingConfig(_message.Message):
__slots__ = ["blue", "current", "green", "led_state", "red"]
BLUE_FIELD_NUMBER: _ClassVar[int]
CURRENT_FIELD_NUMBER: _ClassVar[int]
GREEN_FIELD_NUMBER: _ClassVar[int]
LED_STATE_FIELD_NUMBER: _ClassVar[int]
RED_FIELD_NUMBER: _ClassVar[int]
blue: int
current: int
green: int
led_state: bool
red: int
def __init__(self, led_state: bool = ..., current: _Optional[int] = ..., red: _Optional[int] = ..., green: _Optional[int] = ..., blue: _Optional[int] = ...) -> None: ...
class AudioConfig(_message.Message):
__slots__ = ["bitrate", "codec2_enabled", "i2s_din", "i2s_sck", "i2s_sd", "i2s_ws", "ptt_pin"]
class Audio_Baud(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
BITRATE_FIELD_NUMBER: _ClassVar[int]
CODEC2_1200: ModuleConfig.AudioConfig.Audio_Baud
CODEC2_1300: ModuleConfig.AudioConfig.Audio_Baud
CODEC2_1400: ModuleConfig.AudioConfig.Audio_Baud
CODEC2_1600: ModuleConfig.AudioConfig.Audio_Baud
CODEC2_2400: ModuleConfig.AudioConfig.Audio_Baud
CODEC2_3200: ModuleConfig.AudioConfig.Audio_Baud
CODEC2_450: ModuleConfig.AudioConfig.Audio_Baud
CODEC2_700: ModuleConfig.AudioConfig.Audio_Baud
CODEC2_700B: ModuleConfig.AudioConfig.Audio_Baud
CODEC2_700C: ModuleConfig.AudioConfig.Audio_Baud
CODEC2_DEFAULT: ModuleConfig.AudioConfig.Audio_Baud
CODEC2_ENABLED_FIELD_NUMBER: _ClassVar[int]
I2S_DIN_FIELD_NUMBER: _ClassVar[int]
I2S_SCK_FIELD_NUMBER: _ClassVar[int]
I2S_SD_FIELD_NUMBER: _ClassVar[int]
I2S_WS_FIELD_NUMBER: _ClassVar[int]
PTT_PIN_FIELD_NUMBER: _ClassVar[int]
bitrate: ModuleConfig.AudioConfig.Audio_Baud
codec2_enabled: bool
i2s_din: int
i2s_sck: int
i2s_sd: int
i2s_ws: int
ptt_pin: int
def __init__(self, codec2_enabled: bool = ..., ptt_pin: _Optional[int] = ..., bitrate: _Optional[_Union[ModuleConfig.AudioConfig.Audio_Baud, str]] = ..., i2s_ws: _Optional[int] = ..., i2s_sd: _Optional[int] = ..., i2s_din: _Optional[int] = ..., i2s_sck: _Optional[int] = ...) -> None: ...
class CannedMessageConfig(_message.Message):
__slots__ = ["allow_input_source", "enabled", "inputbroker_event_ccw", "inputbroker_event_cw", "inputbroker_event_press", "inputbroker_pin_a", "inputbroker_pin_b", "inputbroker_pin_press", "rotary1_enabled", "send_bell", "updown1_enabled"]
class InputEventChar(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
ALLOW_INPUT_SOURCE_FIELD_NUMBER: _ClassVar[int]
BACK: ModuleConfig.CannedMessageConfig.InputEventChar
CANCEL: ModuleConfig.CannedMessageConfig.InputEventChar
DOWN: ModuleConfig.CannedMessageConfig.InputEventChar
ENABLED_FIELD_NUMBER: _ClassVar[int]
INPUTBROKER_EVENT_CCW_FIELD_NUMBER: _ClassVar[int]
INPUTBROKER_EVENT_CW_FIELD_NUMBER: _ClassVar[int]
INPUTBROKER_EVENT_PRESS_FIELD_NUMBER: _ClassVar[int]
INPUTBROKER_PIN_A_FIELD_NUMBER: _ClassVar[int]
INPUTBROKER_PIN_B_FIELD_NUMBER: _ClassVar[int]
INPUTBROKER_PIN_PRESS_FIELD_NUMBER: _ClassVar[int]
LEFT: ModuleConfig.CannedMessageConfig.InputEventChar
NONE: ModuleConfig.CannedMessageConfig.InputEventChar
RIGHT: ModuleConfig.CannedMessageConfig.InputEventChar
ROTARY1_ENABLED_FIELD_NUMBER: _ClassVar[int]
SELECT: ModuleConfig.CannedMessageConfig.InputEventChar
SEND_BELL_FIELD_NUMBER: _ClassVar[int]
UP: ModuleConfig.CannedMessageConfig.InputEventChar
UPDOWN1_ENABLED_FIELD_NUMBER: _ClassVar[int]
allow_input_source: str
enabled: bool
inputbroker_event_ccw: ModuleConfig.CannedMessageConfig.InputEventChar
inputbroker_event_cw: ModuleConfig.CannedMessageConfig.InputEventChar
inputbroker_event_press: ModuleConfig.CannedMessageConfig.InputEventChar
inputbroker_pin_a: int
inputbroker_pin_b: int
inputbroker_pin_press: int
rotary1_enabled: bool
send_bell: bool
updown1_enabled: bool
def __init__(self, rotary1_enabled: bool = ..., inputbroker_pin_a: _Optional[int] = ..., inputbroker_pin_b: _Optional[int] = ..., inputbroker_pin_press: _Optional[int] = ..., inputbroker_event_cw: _Optional[_Union[ModuleConfig.CannedMessageConfig.InputEventChar, str]] = ..., inputbroker_event_ccw: _Optional[_Union[ModuleConfig.CannedMessageConfig.InputEventChar, str]] = ..., inputbroker_event_press: _Optional[_Union[ModuleConfig.CannedMessageConfig.InputEventChar, str]] = ..., updown1_enabled: bool = ..., enabled: bool = ..., allow_input_source: _Optional[str] = ..., send_bell: bool = ...) -> None: ...
class DetectionSensorConfig(_message.Message):
__slots__ = ["detection_trigger_type", "enabled", "minimum_broadcast_secs", "monitor_pin", "name", "send_bell", "state_broadcast_secs", "use_pullup"]
class TriggerType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
DETECTION_TRIGGER_TYPE_FIELD_NUMBER: _ClassVar[int]
EITHER_EDGE_ACTIVE_HIGH: ModuleConfig.DetectionSensorConfig.TriggerType
EITHER_EDGE_ACTIVE_LOW: ModuleConfig.DetectionSensorConfig.TriggerType
ENABLED_FIELD_NUMBER: _ClassVar[int]
FALLING_EDGE: ModuleConfig.DetectionSensorConfig.TriggerType
LOGIC_HIGH: ModuleConfig.DetectionSensorConfig.TriggerType
LOGIC_LOW: ModuleConfig.DetectionSensorConfig.TriggerType
MINIMUM_BROADCAST_SECS_FIELD_NUMBER: _ClassVar[int]
MONITOR_PIN_FIELD_NUMBER: _ClassVar[int]
NAME_FIELD_NUMBER: _ClassVar[int]
RISING_EDGE: ModuleConfig.DetectionSensorConfig.TriggerType
SEND_BELL_FIELD_NUMBER: _ClassVar[int]
STATE_BROADCAST_SECS_FIELD_NUMBER: _ClassVar[int]
USE_PULLUP_FIELD_NUMBER: _ClassVar[int]
detection_trigger_type: ModuleConfig.DetectionSensorConfig.TriggerType
enabled: bool
minimum_broadcast_secs: int
monitor_pin: int
name: str
send_bell: bool
state_broadcast_secs: int
use_pullup: bool
def __init__(self, enabled: bool = ..., minimum_broadcast_secs: _Optional[int] = ..., state_broadcast_secs: _Optional[int] = ..., send_bell: bool = ..., name: _Optional[str] = ..., monitor_pin: _Optional[int] = ..., detection_trigger_type: _Optional[_Union[ModuleConfig.DetectionSensorConfig.TriggerType, str]] = ..., use_pullup: bool = ...) -> None: ...
class ExternalNotificationConfig(_message.Message):
__slots__ = ["active", "alert_bell", "alert_bell_buzzer", "alert_bell_vibra", "alert_message", "alert_message_buzzer", "alert_message_vibra", "enabled", "nag_timeout", "output", "output_buzzer", "output_ms", "output_vibra", "use_i2s_as_buzzer", "use_pwm"]
ACTIVE_FIELD_NUMBER: _ClassVar[int]
ALERT_BELL_BUZZER_FIELD_NUMBER: _ClassVar[int]
ALERT_BELL_FIELD_NUMBER: _ClassVar[int]
ALERT_BELL_VIBRA_FIELD_NUMBER: _ClassVar[int]
ALERT_MESSAGE_BUZZER_FIELD_NUMBER: _ClassVar[int]
ALERT_MESSAGE_FIELD_NUMBER: _ClassVar[int]
ALERT_MESSAGE_VIBRA_FIELD_NUMBER: _ClassVar[int]
ENABLED_FIELD_NUMBER: _ClassVar[int]
NAG_TIMEOUT_FIELD_NUMBER: _ClassVar[int]
OUTPUT_BUZZER_FIELD_NUMBER: _ClassVar[int]
OUTPUT_FIELD_NUMBER: _ClassVar[int]
OUTPUT_MS_FIELD_NUMBER: _ClassVar[int]
OUTPUT_VIBRA_FIELD_NUMBER: _ClassVar[int]
USE_I2S_AS_BUZZER_FIELD_NUMBER: _ClassVar[int]
USE_PWM_FIELD_NUMBER: _ClassVar[int]
active: bool
alert_bell: bool
alert_bell_buzzer: bool
alert_bell_vibra: bool
alert_message: bool
alert_message_buzzer: bool
alert_message_vibra: bool
enabled: bool
nag_timeout: int
output: int
output_buzzer: int
output_ms: int
output_vibra: int
use_i2s_as_buzzer: bool
use_pwm: bool
def __init__(self, enabled: bool = ..., output_ms: _Optional[int] = ..., output: _Optional[int] = ..., output_vibra: _Optional[int] = ..., output_buzzer: _Optional[int] = ..., active: bool = ..., alert_message: bool = ..., alert_message_vibra: bool = ..., alert_message_buzzer: bool = ..., alert_bell: bool = ..., alert_bell_vibra: bool = ..., alert_bell_buzzer: bool = ..., use_pwm: bool = ..., nag_timeout: _Optional[int] = ..., use_i2s_as_buzzer: bool = ...) -> None: ...
class MQTTConfig(_message.Message):
__slots__ = ["address", "enabled", "encryption_enabled", "json_enabled", "map_report_settings", "map_reporting_enabled", "password", "proxy_to_client_enabled", "root", "tls_enabled", "username"]
ADDRESS_FIELD_NUMBER: _ClassVar[int]
ENABLED_FIELD_NUMBER: _ClassVar[int]
ENCRYPTION_ENABLED_FIELD_NUMBER: _ClassVar[int]
JSON_ENABLED_FIELD_NUMBER: _ClassVar[int]
MAP_REPORTING_ENABLED_FIELD_NUMBER: _ClassVar[int]
MAP_REPORT_SETTINGS_FIELD_NUMBER: _ClassVar[int]
PASSWORD_FIELD_NUMBER: _ClassVar[int]
PROXY_TO_CLIENT_ENABLED_FIELD_NUMBER: _ClassVar[int]
ROOT_FIELD_NUMBER: _ClassVar[int]
TLS_ENABLED_FIELD_NUMBER: _ClassVar[int]
USERNAME_FIELD_NUMBER: _ClassVar[int]
address: str
enabled: bool
encryption_enabled: bool
json_enabled: bool
map_report_settings: ModuleConfig.MapReportSettings
map_reporting_enabled: bool
password: str
proxy_to_client_enabled: bool
root: str
tls_enabled: bool
username: str
def __init__(self, enabled: bool = ..., address: _Optional[str] = ..., username: _Optional[str] = ..., password: _Optional[str] = ..., encryption_enabled: bool = ..., json_enabled: bool = ..., tls_enabled: bool = ..., root: _Optional[str] = ..., proxy_to_client_enabled: bool = ..., map_reporting_enabled: bool = ..., map_report_settings: _Optional[_Union[ModuleConfig.MapReportSettings, _Mapping]] = ...) -> None: ...
class MapReportSettings(_message.Message):
__slots__ = ["position_precision", "publish_interval_secs", "should_report_location"]
POSITION_PRECISION_FIELD_NUMBER: _ClassVar[int]
PUBLISH_INTERVAL_SECS_FIELD_NUMBER: _ClassVar[int]
SHOULD_REPORT_LOCATION_FIELD_NUMBER: _ClassVar[int]
position_precision: int
publish_interval_secs: int
should_report_location: bool
def __init__(self, publish_interval_secs: _Optional[int] = ..., position_precision: _Optional[int] = ..., should_report_location: bool = ...) -> None: ...
class MeshBeaconConfig(_message.Message):
__slots__ = ["broadcast_interval_secs", "broadcast_message", "broadcast_offer_channel", "broadcast_offer_frequency_slot", "broadcast_offer_preset", "broadcast_offer_region", "broadcast_targets", "flags"]
class Flags(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class BroadcastTarget(_message.Message):
__slots__ = ["channel_index", "frequency_slot", "preset", "region"]
CHANNEL_INDEX_FIELD_NUMBER: _ClassVar[int]
FREQUENCY_SLOT_FIELD_NUMBER: _ClassVar[int]
PRESET_FIELD_NUMBER: _ClassVar[int]
REGION_FIELD_NUMBER: _ClassVar[int]
channel_index: int
frequency_slot: int
preset: _config_pb2.Config.LoRaConfig.ModemPreset
region: _config_pb2.Config.LoRaConfig.RegionCode
def __init__(self, preset: _Optional[_Union[_config_pb2.Config.LoRaConfig.ModemPreset, str]] = ..., region: _Optional[_Union[_config_pb2.Config.LoRaConfig.RegionCode, str]] = ..., channel_index: _Optional[int] = ..., frequency_slot: _Optional[int] = ...) -> None: ...
BROADCAST_INTERVAL_SECS_FIELD_NUMBER: _ClassVar[int]
BROADCAST_MESSAGE_FIELD_NUMBER: _ClassVar[int]
BROADCAST_OFFER_CHANNEL_FIELD_NUMBER: _ClassVar[int]
BROADCAST_OFFER_FREQUENCY_SLOT_FIELD_NUMBER: _ClassVar[int]
BROADCAST_OFFER_PRESET_FIELD_NUMBER: _ClassVar[int]
BROADCAST_OFFER_REGION_FIELD_NUMBER: _ClassVar[int]
BROADCAST_TARGETS_FIELD_NUMBER: _ClassVar[int]
FLAGS_FIELD_NUMBER: _ClassVar[int]
FLAG_BROADCAST_ENABLED: ModuleConfig.MeshBeaconConfig.Flags
FLAG_LEGACY_SPLIT: ModuleConfig.MeshBeaconConfig.Flags
FLAG_LISTEN_ENABLED: ModuleConfig.MeshBeaconConfig.Flags
FLAG_NONE: ModuleConfig.MeshBeaconConfig.Flags
broadcast_interval_secs: int
broadcast_message: str
broadcast_offer_channel: _channel_pb2.ChannelSettings
broadcast_offer_frequency_slot: int
broadcast_offer_preset: _config_pb2.Config.LoRaConfig.ModemPreset
broadcast_offer_region: _config_pb2.Config.LoRaConfig.RegionCode
broadcast_targets: _containers.RepeatedCompositeFieldContainer[ModuleConfig.MeshBeaconConfig.BroadcastTarget]
flags: int
def __init__(self, flags: _Optional[int] = ..., broadcast_offer_frequency_slot: _Optional[int] = ..., broadcast_message: _Optional[str] = ..., broadcast_offer_channel: _Optional[_Union[_channel_pb2.ChannelSettings, _Mapping]] = ..., broadcast_offer_region: _Optional[_Union[_config_pb2.Config.LoRaConfig.RegionCode, str]] = ..., broadcast_offer_preset: _Optional[_Union[_config_pb2.Config.LoRaConfig.ModemPreset, str]] = ..., broadcast_interval_secs: _Optional[int] = ..., broadcast_targets: _Optional[_Iterable[_Union[ModuleConfig.MeshBeaconConfig.BroadcastTarget, _Mapping]]] = ...) -> None: ...
class NeighborInfoConfig(_message.Message):
__slots__ = ["enabled", "transmit_over_lora", "update_interval"]
ENABLED_FIELD_NUMBER: _ClassVar[int]
TRANSMIT_OVER_LORA_FIELD_NUMBER: _ClassVar[int]
UPDATE_INTERVAL_FIELD_NUMBER: _ClassVar[int]
enabled: bool
transmit_over_lora: bool
update_interval: int
def __init__(self, enabled: bool = ..., update_interval: _Optional[int] = ..., transmit_over_lora: bool = ...) -> None: ...
class PaxcounterConfig(_message.Message):
__slots__ = ["ble_threshold", "enabled", "paxcounter_update_interval", "wifi_threshold"]
BLE_THRESHOLD_FIELD_NUMBER: _ClassVar[int]
ENABLED_FIELD_NUMBER: _ClassVar[int]
PAXCOUNTER_UPDATE_INTERVAL_FIELD_NUMBER: _ClassVar[int]
WIFI_THRESHOLD_FIELD_NUMBER: _ClassVar[int]
ble_threshold: int
enabled: bool
paxcounter_update_interval: int
wifi_threshold: int
def __init__(self, enabled: bool = ..., paxcounter_update_interval: _Optional[int] = ..., wifi_threshold: _Optional[int] = ..., ble_threshold: _Optional[int] = ...) -> None: ...
class RangeTestConfig(_message.Message):
__slots__ = ["clear_on_reboot", "enabled", "save", "sender"]
CLEAR_ON_REBOOT_FIELD_NUMBER: _ClassVar[int]
ENABLED_FIELD_NUMBER: _ClassVar[int]
SAVE_FIELD_NUMBER: _ClassVar[int]
SENDER_FIELD_NUMBER: _ClassVar[int]
clear_on_reboot: bool
enabled: bool
save: bool
sender: int
def __init__(self, enabled: bool = ..., sender: _Optional[int] = ..., save: bool = ..., clear_on_reboot: bool = ...) -> None: ...
class RemoteHardwareConfig(_message.Message):
__slots__ = ["allow_undefined_pin_access", "available_pins", "enabled"]
ALLOW_UNDEFINED_PIN_ACCESS_FIELD_NUMBER: _ClassVar[int]
AVAILABLE_PINS_FIELD_NUMBER: _ClassVar[int]
ENABLED_FIELD_NUMBER: _ClassVar[int]
allow_undefined_pin_access: bool
available_pins: _containers.RepeatedCompositeFieldContainer[RemoteHardwarePin]
enabled: bool
def __init__(self, enabled: bool = ..., allow_undefined_pin_access: bool = ..., available_pins: _Optional[_Iterable[_Union[RemoteHardwarePin, _Mapping]]] = ...) -> None: ...
class SerialConfig(_message.Message):
__slots__ = ["baud", "echo", "enabled", "mode", "override_console_serial_port", "rxd", "timeout", "txd"]
class Serial_Baud(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class Serial_Mode(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
BAUD_110: ModuleConfig.SerialConfig.Serial_Baud
BAUD_115200: ModuleConfig.SerialConfig.Serial_Baud
BAUD_1200: ModuleConfig.SerialConfig.Serial_Baud
BAUD_19200: ModuleConfig.SerialConfig.Serial_Baud
BAUD_230400: ModuleConfig.SerialConfig.Serial_Baud
BAUD_2400: ModuleConfig.SerialConfig.Serial_Baud
BAUD_300: ModuleConfig.SerialConfig.Serial_Baud
BAUD_38400: ModuleConfig.SerialConfig.Serial_Baud
BAUD_460800: ModuleConfig.SerialConfig.Serial_Baud
BAUD_4800: ModuleConfig.SerialConfig.Serial_Baud
BAUD_57600: ModuleConfig.SerialConfig.Serial_Baud
BAUD_576000: ModuleConfig.SerialConfig.Serial_Baud
BAUD_600: ModuleConfig.SerialConfig.Serial_Baud
BAUD_921600: ModuleConfig.SerialConfig.Serial_Baud
BAUD_9600: ModuleConfig.SerialConfig.Serial_Baud
BAUD_DEFAULT: ModuleConfig.SerialConfig.Serial_Baud
BAUD_FIELD_NUMBER: _ClassVar[int]
CALTOPO: ModuleConfig.SerialConfig.Serial_Mode
DEFAULT: ModuleConfig.SerialConfig.Serial_Mode
ECHO_FIELD_NUMBER: _ClassVar[int]
ENABLED_FIELD_NUMBER: _ClassVar[int]
LOG: ModuleConfig.SerialConfig.Serial_Mode
LOGTEXT: ModuleConfig.SerialConfig.Serial_Mode
MODBUS: ModuleConfig.SerialConfig.Serial_Mode
MODE_FIELD_NUMBER: _ClassVar[int]
MS_CONFIG: ModuleConfig.SerialConfig.Serial_Mode
NMEA: ModuleConfig.SerialConfig.Serial_Mode
OVERRIDE_CONSOLE_SERIAL_PORT_FIELD_NUMBER: _ClassVar[int]
PROTO: ModuleConfig.SerialConfig.Serial_Mode
RXD_FIELD_NUMBER: _ClassVar[int]
SIMPLE: ModuleConfig.SerialConfig.Serial_Mode
TEXTMSG: ModuleConfig.SerialConfig.Serial_Mode
TIMEOUT_FIELD_NUMBER: _ClassVar[int]
TXD_FIELD_NUMBER: _ClassVar[int]
VE_DIRECT: ModuleConfig.SerialConfig.Serial_Mode
WS85: ModuleConfig.SerialConfig.Serial_Mode
baud: ModuleConfig.SerialConfig.Serial_Baud
echo: bool
enabled: bool
mode: ModuleConfig.SerialConfig.Serial_Mode
override_console_serial_port: bool
rxd: int
timeout: int
txd: int
def __init__(self, enabled: bool = ..., echo: bool = ..., rxd: _Optional[int] = ..., txd: _Optional[int] = ..., baud: _Optional[_Union[ModuleConfig.SerialConfig.Serial_Baud, str]] = ..., timeout: _Optional[int] = ..., mode: _Optional[_Union[ModuleConfig.SerialConfig.Serial_Mode, str]] = ..., override_console_serial_port: bool = ...) -> None: ...
class StatusMessageConfig(_message.Message):
__slots__ = ["node_status"]
NODE_STATUS_FIELD_NUMBER: _ClassVar[int]
node_status: str
def __init__(self, node_status: _Optional[str] = ...) -> None: ...
class StoreForwardConfig(_message.Message):
__slots__ = ["enabled", "heartbeat", "history_return_max", "history_return_window", "is_server", "records"]
ENABLED_FIELD_NUMBER: _ClassVar[int]
HEARTBEAT_FIELD_NUMBER: _ClassVar[int]
HISTORY_RETURN_MAX_FIELD_NUMBER: _ClassVar[int]
HISTORY_RETURN_WINDOW_FIELD_NUMBER: _ClassVar[int]
IS_SERVER_FIELD_NUMBER: _ClassVar[int]
RECORDS_FIELD_NUMBER: _ClassVar[int]
enabled: bool
heartbeat: bool
history_return_max: int
history_return_window: int
is_server: bool
records: int
def __init__(self, enabled: bool = ..., heartbeat: bool = ..., records: _Optional[int] = ..., history_return_max: _Optional[int] = ..., history_return_window: _Optional[int] = ..., is_server: bool = ...) -> None: ...
class TAKConfig(_message.Message):
__slots__ = ["role", "team"]
ROLE_FIELD_NUMBER: _ClassVar[int]
TEAM_FIELD_NUMBER: _ClassVar[int]
role: _atak_pb2.MemberRole
team: _atak_pb2.Team
def __init__(self, team: _Optional[_Union[_atak_pb2.Team, str]] = ..., role: _Optional[_Union[_atak_pb2.MemberRole, str]] = ...) -> None: ...
class TelemetryConfig(_message.Message):
__slots__ = ["air_quality_enabled", "air_quality_interval", "air_quality_screen_enabled", "device_telemetry_enabled", "device_update_interval", "environment_display_fahrenheit", "environment_measurement_enabled", "environment_screen_enabled", "environment_update_interval", "health_measurement_enabled", "health_screen_enabled", "health_update_interval", "power_measurement_enabled", "power_screen_enabled", "power_update_interval"]
AIR_QUALITY_ENABLED_FIELD_NUMBER: _ClassVar[int]
AIR_QUALITY_INTERVAL_FIELD_NUMBER: _ClassVar[int]
AIR_QUALITY_SCREEN_ENABLED_FIELD_NUMBER: _ClassVar[int]
DEVICE_TELEMETRY_ENABLED_FIELD_NUMBER: _ClassVar[int]
DEVICE_UPDATE_INTERVAL_FIELD_NUMBER: _ClassVar[int]
ENVIRONMENT_DISPLAY_FAHRENHEIT_FIELD_NUMBER: _ClassVar[int]
ENVIRONMENT_MEASUREMENT_ENABLED_FIELD_NUMBER: _ClassVar[int]
ENVIRONMENT_SCREEN_ENABLED_FIELD_NUMBER: _ClassVar[int]
ENVIRONMENT_UPDATE_INTERVAL_FIELD_NUMBER: _ClassVar[int]
HEALTH_MEASUREMENT_ENABLED_FIELD_NUMBER: _ClassVar[int]
HEALTH_SCREEN_ENABLED_FIELD_NUMBER: _ClassVar[int]
HEALTH_UPDATE_INTERVAL_FIELD_NUMBER: _ClassVar[int]
POWER_MEASUREMENT_ENABLED_FIELD_NUMBER: _ClassVar[int]
POWER_SCREEN_ENABLED_FIELD_NUMBER: _ClassVar[int]
POWER_UPDATE_INTERVAL_FIELD_NUMBER: _ClassVar[int]
air_quality_enabled: bool
air_quality_interval: int
air_quality_screen_enabled: bool
device_telemetry_enabled: bool
device_update_interval: int
environment_display_fahrenheit: bool
environment_measurement_enabled: bool
environment_screen_enabled: bool
environment_update_interval: int
health_measurement_enabled: bool
health_screen_enabled: bool
health_update_interval: int
power_measurement_enabled: bool
power_screen_enabled: bool
power_update_interval: int
def __init__(self, device_update_interval: _Optional[int] = ..., environment_update_interval: _Optional[int] = ..., environment_measurement_enabled: bool = ..., environment_screen_enabled: bool = ..., environment_display_fahrenheit: bool = ..., air_quality_enabled: bool = ..., air_quality_interval: _Optional[int] = ..., power_measurement_enabled: bool = ..., power_update_interval: _Optional[int] = ..., power_screen_enabled: bool = ..., health_measurement_enabled: bool = ..., health_update_interval: _Optional[int] = ..., health_screen_enabled: bool = ..., device_telemetry_enabled: bool = ..., air_quality_screen_enabled: bool = ...) -> None: ...
class TrafficManagementConfig(_message.Message):
__slots__ = ["nodeinfo_direct_response_max_hops", "position_min_interval_secs", "rate_limit_max_packets", "rate_limit_window_secs", "unknown_packet_threshold"]
NODEINFO_DIRECT_RESPONSE_MAX_HOPS_FIELD_NUMBER: _ClassVar[int]
POSITION_MIN_INTERVAL_SECS_FIELD_NUMBER: _ClassVar[int]
RATE_LIMIT_MAX_PACKETS_FIELD_NUMBER: _ClassVar[int]
RATE_LIMIT_WINDOW_SECS_FIELD_NUMBER: _ClassVar[int]
UNKNOWN_PACKET_THRESHOLD_FIELD_NUMBER: _ClassVar[int]
nodeinfo_direct_response_max_hops: int
position_min_interval_secs: int
rate_limit_max_packets: int
rate_limit_window_secs: int
unknown_packet_threshold: int
def __init__(self, position_min_interval_secs: _Optional[int] = ..., nodeinfo_direct_response_max_hops: _Optional[int] = ..., rate_limit_window_secs: _Optional[int] = ..., rate_limit_max_packets: _Optional[int] = ..., unknown_packet_threshold: _Optional[int] = ...) -> None: ...
AMBIENT_LIGHTING_FIELD_NUMBER: _ClassVar[int]
AUDIO_FIELD_NUMBER: _ClassVar[int]
CANNED_MESSAGE_FIELD_NUMBER: _ClassVar[int]
DETECTION_SENSOR_FIELD_NUMBER: _ClassVar[int]
EXTERNAL_NOTIFICATION_FIELD_NUMBER: _ClassVar[int]
MESH_BEACON_FIELD_NUMBER: _ClassVar[int]
MQTT_FIELD_NUMBER: _ClassVar[int]
NEIGHBOR_INFO_FIELD_NUMBER: _ClassVar[int]
PAXCOUNTER_FIELD_NUMBER: _ClassVar[int]
RANGE_TEST_FIELD_NUMBER: _ClassVar[int]
REMOTE_HARDWARE_FIELD_NUMBER: _ClassVar[int]
SERIAL_FIELD_NUMBER: _ClassVar[int]
STATUSMESSAGE_FIELD_NUMBER: _ClassVar[int]
STORE_FORWARD_FIELD_NUMBER: _ClassVar[int]
TAK_FIELD_NUMBER: _ClassVar[int]
TELEMETRY_FIELD_NUMBER: _ClassVar[int]
TRAFFIC_MANAGEMENT_FIELD_NUMBER: _ClassVar[int]
ambient_lighting: ModuleConfig.AmbientLightingConfig
audio: ModuleConfig.AudioConfig
canned_message: ModuleConfig.CannedMessageConfig
detection_sensor: ModuleConfig.DetectionSensorConfig
external_notification: ModuleConfig.ExternalNotificationConfig
mesh_beacon: ModuleConfig.MeshBeaconConfig
mqtt: ModuleConfig.MQTTConfig
neighbor_info: ModuleConfig.NeighborInfoConfig
paxcounter: ModuleConfig.PaxcounterConfig
range_test: ModuleConfig.RangeTestConfig
remote_hardware: ModuleConfig.RemoteHardwareConfig
serial: ModuleConfig.SerialConfig
statusmessage: ModuleConfig.StatusMessageConfig
store_forward: ModuleConfig.StoreForwardConfig
tak: ModuleConfig.TAKConfig
telemetry: ModuleConfig.TelemetryConfig
traffic_management: ModuleConfig.TrafficManagementConfig
def __init__(self, mqtt: _Optional[_Union[ModuleConfig.MQTTConfig, _Mapping]] = ..., serial: _Optional[_Union[ModuleConfig.SerialConfig, _Mapping]] = ..., external_notification: _Optional[_Union[ModuleConfig.ExternalNotificationConfig, _Mapping]] = ..., store_forward: _Optional[_Union[ModuleConfig.StoreForwardConfig, _Mapping]] = ..., range_test: _Optional[_Union[ModuleConfig.RangeTestConfig, _Mapping]] = ..., telemetry: _Optional[_Union[ModuleConfig.TelemetryConfig, _Mapping]] = ..., canned_message: _Optional[_Union[ModuleConfig.CannedMessageConfig, _Mapping]] = ..., audio: _Optional[_Union[ModuleConfig.AudioConfig, _Mapping]] = ..., remote_hardware: _Optional[_Union[ModuleConfig.RemoteHardwareConfig, _Mapping]] = ..., neighbor_info: _Optional[_Union[ModuleConfig.NeighborInfoConfig, _Mapping]] = ..., ambient_lighting: _Optional[_Union[ModuleConfig.AmbientLightingConfig, _Mapping]] = ..., detection_sensor: _Optional[_Union[ModuleConfig.DetectionSensorConfig, _Mapping]] = ..., paxcounter: _Optional[_Union[ModuleConfig.PaxcounterConfig, _Mapping]] = ..., statusmessage: _Optional[_Union[ModuleConfig.StatusMessageConfig, _Mapping]] = ..., traffic_management: _Optional[_Union[ModuleConfig.TrafficManagementConfig, _Mapping]] = ..., tak: _Optional[_Union[ModuleConfig.TAKConfig, _Mapping]] = ..., mesh_beacon: _Optional[_Union[ModuleConfig.MeshBeaconConfig, _Mapping]] = ...) -> None: ...
class RemoteHardwarePin(_message.Message):
__slots__ = ["gpio_pin", "name", "type"]
GPIO_PIN_FIELD_NUMBER: _ClassVar[int]
NAME_FIELD_NUMBER: _ClassVar[int]
TYPE_FIELD_NUMBER: _ClassVar[int]
gpio_pin: int
name: str
type: RemoteHardwarePinType
def __init__(self, gpio_pin: _Optional[int] = ..., name: _Optional[str] = ..., type: _Optional[_Union[RemoteHardwarePinType, str]] = ...) -> None: ...
class RemoteHardwarePinType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
+30
View File
@@ -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.internal import builder as _builder
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
from meshtastic.protobuf import config_pb2 as meshtastic_dot_protobuf_dot_config__pb2
from meshtastic.protobuf import mesh_pb2 as meshtastic_dot_protobuf_dot_mesh__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1emeshtastic/protobuf/mqtt.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/config.proto\x1a\x1emeshtastic/protobuf/mesh.proto\"j\n\x0fServiceEnvelope\x12/\n\x06packet\x18\x01 \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacket\x12\x12\n\nchannel_id\x18\x02 \x01(\t\x12\x12\n\ngateway_id\x18\x03 \x01(\t\"\x83\x04\n\tMapReport\x12\x11\n\tlong_name\x18\x01 \x01(\t\x12\x12\n\nshort_name\x18\x02 \x01(\t\x12;\n\x04role\x18\x03 \x01(\x0e\x32-.meshtastic.protobuf.Config.DeviceConfig.Role\x12\x34\n\x08hw_model\x18\x04 \x01(\x0e\x32\".meshtastic.protobuf.HardwareModel\x12\x18\n\x10\x66irmware_version\x18\x05 \x01(\t\x12\x41\n\x06region\x18\x06 \x01(\x0e\x32\x31.meshtastic.protobuf.Config.LoRaConfig.RegionCode\x12H\n\x0cmodem_preset\x18\x07 \x01(\x0e\x32\x32.meshtastic.protobuf.Config.LoRaConfig.ModemPreset\x12\x1b\n\x13has_default_channel\x18\x08 \x01(\x08\x12\x12\n\nlatitude_i\x18\t \x01(\x0f\x12\x13\n\x0blongitude_i\x18\n \x01(\x0f\x12\x10\n\x08\x61ltitude\x18\x0b \x01(\x05\x12\x1a\n\x12position_precision\x18\x0c \x01(\r\x12\x1e\n\x16num_online_local_nodes\x18\r \x01(\r\x12!\n\x19has_opted_report_location\x18\x0e \x01(\x08\x42`\n\x14org.meshtastic.protoB\nMQTTProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.mqtt_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\nMQTTProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_SERVICEENVELOPE._serialized_start=121
_SERVICEENVELOPE._serialized_end=227
_MAPREPORT._serialized_start=230
_MAPREPORT._serialized_end=745
# @@protoc_insertion_point(module_scope)
+49
View File
@@ -0,0 +1,49 @@
from meshtastic.protobuf import config_pb2 as _config_pb2
from meshtastic.protobuf import mesh_pb2 as _mesh_pb2
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from typing import ClassVar as _ClassVar, Mapping as _Mapping, Optional as _Optional, Union as _Union
DESCRIPTOR: _descriptor.FileDescriptor
class MapReport(_message.Message):
__slots__ = ["altitude", "firmware_version", "has_default_channel", "has_opted_report_location", "hw_model", "latitude_i", "long_name", "longitude_i", "modem_preset", "num_online_local_nodes", "position_precision", "region", "role", "short_name"]
ALTITUDE_FIELD_NUMBER: _ClassVar[int]
FIRMWARE_VERSION_FIELD_NUMBER: _ClassVar[int]
HAS_DEFAULT_CHANNEL_FIELD_NUMBER: _ClassVar[int]
HAS_OPTED_REPORT_LOCATION_FIELD_NUMBER: _ClassVar[int]
HW_MODEL_FIELD_NUMBER: _ClassVar[int]
LATITUDE_I_FIELD_NUMBER: _ClassVar[int]
LONGITUDE_I_FIELD_NUMBER: _ClassVar[int]
LONG_NAME_FIELD_NUMBER: _ClassVar[int]
MODEM_PRESET_FIELD_NUMBER: _ClassVar[int]
NUM_ONLINE_LOCAL_NODES_FIELD_NUMBER: _ClassVar[int]
POSITION_PRECISION_FIELD_NUMBER: _ClassVar[int]
REGION_FIELD_NUMBER: _ClassVar[int]
ROLE_FIELD_NUMBER: _ClassVar[int]
SHORT_NAME_FIELD_NUMBER: _ClassVar[int]
altitude: int
firmware_version: str
has_default_channel: bool
has_opted_report_location: bool
hw_model: _mesh_pb2.HardwareModel
latitude_i: int
long_name: str
longitude_i: int
modem_preset: _config_pb2.Config.LoRaConfig.ModemPreset
num_online_local_nodes: int
position_precision: int
region: _config_pb2.Config.LoRaConfig.RegionCode
role: _config_pb2.Config.DeviceConfig.Role
short_name: str
def __init__(self, long_name: _Optional[str] = ..., short_name: _Optional[str] = ..., role: _Optional[_Union[_config_pb2.Config.DeviceConfig.Role, str]] = ..., hw_model: _Optional[_Union[_mesh_pb2.HardwareModel, str]] = ..., firmware_version: _Optional[str] = ..., region: _Optional[_Union[_config_pb2.Config.LoRaConfig.RegionCode, str]] = ..., modem_preset: _Optional[_Union[_config_pb2.Config.LoRaConfig.ModemPreset, str]] = ..., has_default_channel: bool = ..., latitude_i: _Optional[int] = ..., longitude_i: _Optional[int] = ..., altitude: _Optional[int] = ..., position_precision: _Optional[int] = ..., num_online_local_nodes: _Optional[int] = ..., has_opted_report_location: bool = ...) -> None: ...
class ServiceEnvelope(_message.Message):
__slots__ = ["channel_id", "gateway_id", "packet"]
CHANNEL_ID_FIELD_NUMBER: _ClassVar[int]
GATEWAY_ID_FIELD_NUMBER: _ClassVar[int]
PACKET_FIELD_NUMBER: _ClassVar[int]
channel_id: str
gateway_id: str
packet: _mesh_pb2.MeshPacket
def __init__(self, packet: _Optional[_Union[_mesh_pb2.MeshPacket, _Mapping]] = ..., channel_id: _Optional[str] = ..., gateway_id: _Optional[str] = ...) -> None: ...
+39
View File
@@ -0,0 +1,39 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/protobuf/nanopb.proto
"""Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
from google.protobuf import descriptor_pb2 as google_dot_protobuf_dot_descriptor__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n meshtastic/protobuf/nanopb.proto\x1a google/protobuf/descriptor.proto\"\xa4\x07\n\rNanoPBOptions\x12\x10\n\x08max_size\x18\x01 \x01(\x05\x12\x12\n\nmax_length\x18\x0e \x01(\x05\x12\x11\n\tmax_count\x18\x02 \x01(\x05\x12&\n\x08int_size\x18\x07 \x01(\x0e\x32\x08.IntSize:\nIS_DEFAULT\x12$\n\x04type\x18\x03 \x01(\x0e\x32\n.FieldType:\nFT_DEFAULT\x12\x18\n\nlong_names\x18\x04 \x01(\x08:\x04true\x12\x1c\n\rpacked_struct\x18\x05 \x01(\x08:\x05\x66\x61lse\x12\x1a\n\x0bpacked_enum\x18\n \x01(\x08:\x05\x66\x61lse\x12\x1b\n\x0cskip_message\x18\x06 \x01(\x08:\x05\x66\x61lse\x12\x18\n\tno_unions\x18\x08 \x01(\x08:\x05\x66\x61lse\x12\r\n\x05msgid\x18\t \x01(\r\x12\x1e\n\x0f\x61nonymous_oneof\x18\x0b \x01(\x08:\x05\x66\x61lse\x12\x15\n\x06proto3\x18\x0c \x01(\x08:\x05\x66\x61lse\x12#\n\x14proto3_singular_msgs\x18\x15 \x01(\x08:\x05\x66\x61lse\x12\x1d\n\x0e\x65num_to_string\x18\r \x01(\x08:\x05\x66\x61lse\x12\x1b\n\x0c\x66ixed_length\x18\x0f \x01(\x08:\x05\x66\x61lse\x12\x1a\n\x0b\x66ixed_count\x18\x10 \x01(\x08:\x05\x66\x61lse\x12\x1e\n\x0fsubmsg_callback\x18\x16 \x01(\x08:\x05\x66\x61lse\x12/\n\x0cmangle_names\x18\x11 \x01(\x0e\x32\x11.TypenameMangling:\x06M_NONE\x12(\n\x11\x63\x61llback_datatype\x18\x12 \x01(\t:\rpb_callback_t\x12\x34\n\x11\x63\x61llback_function\x18\x13 \x01(\t:\x19pb_default_field_callback\x12\x30\n\x0e\x64\x65scriptorsize\x18\x14 \x01(\x0e\x32\x0f.DescriptorSize:\x07\x44S_AUTO\x12\x1a\n\x0b\x64\x65\x66\x61ult_has\x18\x17 \x01(\x08:\x05\x66\x61lse\x12\x0f\n\x07include\x18\x18 \x03(\t\x12\x0f\n\x07\x65xclude\x18\x1a \x03(\t\x12\x0f\n\x07package\x18\x19 \x01(\t\x12\x41\n\rtype_override\x18\x1b \x01(\x0e\x32*.google.protobuf.FieldDescriptorProto.Type\x12\x19\n\x0bsort_by_tag\x18\x1c \x01(\x08:\x04true\x12.\n\rfallback_type\x18\x1d \x01(\x0e\x32\n.FieldType:\x0b\x46T_CALLBACK*i\n\tFieldType\x12\x0e\n\nFT_DEFAULT\x10\x00\x12\x0f\n\x0b\x46T_CALLBACK\x10\x01\x12\x0e\n\nFT_POINTER\x10\x04\x12\r\n\tFT_STATIC\x10\x02\x12\r\n\tFT_IGNORE\x10\x03\x12\r\n\tFT_INLINE\x10\x05*D\n\x07IntSize\x12\x0e\n\nIS_DEFAULT\x10\x00\x12\x08\n\x04IS_8\x10\x08\x12\t\n\x05IS_16\x10\x10\x12\t\n\x05IS_32\x10 \x12\t\n\x05IS_64\x10@*Z\n\x10TypenameMangling\x12\n\n\x06M_NONE\x10\x00\x12\x13\n\x0fM_STRIP_PACKAGE\x10\x01\x12\r\n\tM_FLATTEN\x10\x02\x12\x16\n\x12M_PACKAGE_INITIALS\x10\x03*E\n\x0e\x44\x65scriptorSize\x12\x0b\n\x07\x44S_AUTO\x10\x00\x12\x08\n\x04\x44S_1\x10\x01\x12\x08\n\x04\x44S_2\x10\x02\x12\x08\n\x04\x44S_4\x10\x04\x12\x08\n\x04\x44S_8\x10\x08:E\n\x0enanopb_fileopt\x12\x1c.google.protobuf.FileOptions\x18\xf2\x07 \x01(\x0b\x32\x0e.NanoPBOptions:G\n\rnanopb_msgopt\x12\x1f.google.protobuf.MessageOptions\x18\xf2\x07 \x01(\x0b\x32\x0e.NanoPBOptions:E\n\x0enanopb_enumopt\x12\x1c.google.protobuf.EnumOptions\x18\xf2\x07 \x01(\x0b\x32\x0e.NanoPBOptions:>\n\x06nanopb\x12\x1d.google.protobuf.FieldOptions\x18\xf2\x07 \x01(\x0b\x32\x0e.NanoPBOptionsB>\n\x18\x66i.kapsi.koti.jpa.nanopbZ\"github.com/meshtastic/go/generated')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.nanopb_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
google_dot_protobuf_dot_descriptor__pb2.FileOptions.RegisterExtension(nanopb_fileopt)
google_dot_protobuf_dot_descriptor__pb2.MessageOptions.RegisterExtension(nanopb_msgopt)
google_dot_protobuf_dot_descriptor__pb2.EnumOptions.RegisterExtension(nanopb_enumopt)
google_dot_protobuf_dot_descriptor__pb2.FieldOptions.RegisterExtension(nanopb)
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\030fi.kapsi.koti.jpa.nanopbZ\"github.com/meshtastic/go/generated'
_FIELDTYPE._serialized_start=1005
_FIELDTYPE._serialized_end=1110
_INTSIZE._serialized_start=1112
_INTSIZE._serialized_end=1180
_TYPENAMEMANGLING._serialized_start=1182
_TYPENAMEMANGLING._serialized_end=1272
_DESCRIPTORSIZE._serialized_start=1274
_DESCRIPTORSIZE._serialized_end=1343
_NANOPBOPTIONS._serialized_start=71
_NANOPBOPTIONS._serialized_end=1003
# @@protoc_insertion_point(module_scope)
+110
View File
@@ -0,0 +1,110 @@
from google.protobuf import descriptor_pb2 as _descriptor_pb2
from google.protobuf.internal import containers as _containers
from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from typing import ClassVar as _ClassVar, Iterable as _Iterable, Optional as _Optional, Union as _Union
DESCRIPTOR: _descriptor.FileDescriptor
DS_1: DescriptorSize
DS_2: DescriptorSize
DS_4: DescriptorSize
DS_8: DescriptorSize
DS_AUTO: DescriptorSize
FT_CALLBACK: FieldType
FT_DEFAULT: FieldType
FT_IGNORE: FieldType
FT_INLINE: FieldType
FT_POINTER: FieldType
FT_STATIC: FieldType
IS_16: IntSize
IS_32: IntSize
IS_64: IntSize
IS_8: IntSize
IS_DEFAULT: IntSize
M_FLATTEN: TypenameMangling
M_NONE: TypenameMangling
M_PACKAGE_INITIALS: TypenameMangling
M_STRIP_PACKAGE: TypenameMangling
NANOPB_ENUMOPT_FIELD_NUMBER: _ClassVar[int]
NANOPB_FIELD_NUMBER: _ClassVar[int]
NANOPB_FILEOPT_FIELD_NUMBER: _ClassVar[int]
NANOPB_MSGOPT_FIELD_NUMBER: _ClassVar[int]
nanopb: _descriptor.FieldDescriptor
nanopb_enumopt: _descriptor.FieldDescriptor
nanopb_fileopt: _descriptor.FieldDescriptor
nanopb_msgopt: _descriptor.FieldDescriptor
class NanoPBOptions(_message.Message):
__slots__ = ["anonymous_oneof", "callback_datatype", "callback_function", "default_has", "descriptorsize", "enum_to_string", "exclude", "fallback_type", "fixed_count", "fixed_length", "include", "int_size", "long_names", "mangle_names", "max_count", "max_length", "max_size", "msgid", "no_unions", "package", "packed_enum", "packed_struct", "proto3", "proto3_singular_msgs", "skip_message", "sort_by_tag", "submsg_callback", "type", "type_override"]
ANONYMOUS_ONEOF_FIELD_NUMBER: _ClassVar[int]
CALLBACK_DATATYPE_FIELD_NUMBER: _ClassVar[int]
CALLBACK_FUNCTION_FIELD_NUMBER: _ClassVar[int]
DEFAULT_HAS_FIELD_NUMBER: _ClassVar[int]
DESCRIPTORSIZE_FIELD_NUMBER: _ClassVar[int]
ENUM_TO_STRING_FIELD_NUMBER: _ClassVar[int]
EXCLUDE_FIELD_NUMBER: _ClassVar[int]
FALLBACK_TYPE_FIELD_NUMBER: _ClassVar[int]
FIXED_COUNT_FIELD_NUMBER: _ClassVar[int]
FIXED_LENGTH_FIELD_NUMBER: _ClassVar[int]
INCLUDE_FIELD_NUMBER: _ClassVar[int]
INT_SIZE_FIELD_NUMBER: _ClassVar[int]
LONG_NAMES_FIELD_NUMBER: _ClassVar[int]
MANGLE_NAMES_FIELD_NUMBER: _ClassVar[int]
MAX_COUNT_FIELD_NUMBER: _ClassVar[int]
MAX_LENGTH_FIELD_NUMBER: _ClassVar[int]
MAX_SIZE_FIELD_NUMBER: _ClassVar[int]
MSGID_FIELD_NUMBER: _ClassVar[int]
NO_UNIONS_FIELD_NUMBER: _ClassVar[int]
PACKAGE_FIELD_NUMBER: _ClassVar[int]
PACKED_ENUM_FIELD_NUMBER: _ClassVar[int]
PACKED_STRUCT_FIELD_NUMBER: _ClassVar[int]
PROTO3_FIELD_NUMBER: _ClassVar[int]
PROTO3_SINGULAR_MSGS_FIELD_NUMBER: _ClassVar[int]
SKIP_MESSAGE_FIELD_NUMBER: _ClassVar[int]
SORT_BY_TAG_FIELD_NUMBER: _ClassVar[int]
SUBMSG_CALLBACK_FIELD_NUMBER: _ClassVar[int]
TYPE_FIELD_NUMBER: _ClassVar[int]
TYPE_OVERRIDE_FIELD_NUMBER: _ClassVar[int]
anonymous_oneof: bool
callback_datatype: str
callback_function: str
default_has: bool
descriptorsize: DescriptorSize
enum_to_string: bool
exclude: _containers.RepeatedScalarFieldContainer[str]
fallback_type: FieldType
fixed_count: bool
fixed_length: bool
include: _containers.RepeatedScalarFieldContainer[str]
int_size: IntSize
long_names: bool
mangle_names: TypenameMangling
max_count: int
max_length: int
max_size: int
msgid: int
no_unions: bool
package: str
packed_enum: bool
packed_struct: bool
proto3: bool
proto3_singular_msgs: bool
skip_message: bool
sort_by_tag: bool
submsg_callback: bool
type: FieldType
type_override: _descriptor_pb2.FieldDescriptorProto.Type
def __init__(self, max_size: _Optional[int] = ..., max_length: _Optional[int] = ..., max_count: _Optional[int] = ..., int_size: _Optional[_Union[IntSize, str]] = ..., type: _Optional[_Union[FieldType, str]] = ..., long_names: bool = ..., packed_struct: bool = ..., packed_enum: bool = ..., skip_message: bool = ..., no_unions: bool = ..., msgid: _Optional[int] = ..., anonymous_oneof: bool = ..., proto3: bool = ..., proto3_singular_msgs: bool = ..., enum_to_string: bool = ..., fixed_length: bool = ..., fixed_count: bool = ..., submsg_callback: bool = ..., mangle_names: _Optional[_Union[TypenameMangling, str]] = ..., callback_datatype: _Optional[str] = ..., callback_function: _Optional[str] = ..., descriptorsize: _Optional[_Union[DescriptorSize, str]] = ..., default_has: bool = ..., include: _Optional[_Iterable[str]] = ..., exclude: _Optional[_Iterable[str]] = ..., package: _Optional[str] = ..., type_override: _Optional[_Union[_descriptor_pb2.FieldDescriptorProto.Type, str]] = ..., sort_by_tag: bool = ..., fallback_type: _Optional[_Union[FieldType, str]] = ...) -> None: ...
class FieldType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class IntSize(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class TypenameMangling(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class DescriptorSize(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
Loaded 100 of 276 files, more files were not shown because too many files have changed in this diff. Show more