diff --git a/.eslintrc b/.eslintrc
deleted file mode 100644
index 2ae6c930..00000000
--- a/.eslintrc
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "plugins": ["@docusaurus"],
- "extends": ["plugin:@docusaurus/recommended"]
-}
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 00000000..5dc46e6b
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,3 @@
+* text=auto eol=lf
+*.{cmd,[cC][mM][dD]} text eol=crlf
+*.{bat,[bB][aA][tT]} text eol=crlf
\ No newline at end of file
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 7f96bd8f..34c6e9e8 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -1,38 +1,28 @@
name: CI
+
on:
push:
- branches:
- - 'master'
- workflow_run:
- workflows:
- - 'Update protobufs'
+ pull_request:
jobs:
- deploy-website:
- environment: Production
+ build:
runs-on: ubuntu-latest
-
steps:
- - name: Checkout code
+ - name: Checkout code & submodules
uses: actions/checkout@v3
with:
submodules: true
- #- name: Install Go
- # uses: actions/setup-go@v3
- # with:
- # go-version: 1.19
- #- name: Install Protoc
- # uses: arduino/setup-protoc@v1
- # with:
- # version: '3.x'
- #- name: Install protoc-gen-doc
- # run: go install github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc@latest
- #- name: Generate protobuf docs
- # run: protoc --doc_out="docs/developers/Protobufs" --doc_opt="./protobuf.tmpl,api.mdx" --proto_path="protobufs" protobufs/*.proto
- - uses: amondnet/vercel-action@v20
+
+ - name: Setup pnpm
+ uses: pnpm/action-setup@v2.2.1
with:
- vercel-token: ${{ secrets.VERCEL_TOKEN }}
- vercel-args: '--prod'
- vercel-org-id: ${{ secrets.ORG_ID}}
- vercel-project-id: ${{ secrets.PROJECT_ID}}
- scope: ${{ secrets.ORG_ID}}
+ version: latest
+
+ - name: Install Dependencies
+ run: pnpm install
+
+ - name: Trunk Check
+ uses: trunk-io/trunk-action@v1
+
+ - name: Build Site
+ run: pnpm build
diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml
new file mode 100644
index 00000000..cf8f1bcc
--- /dev/null
+++ b/.github/workflows/nightly.yml
@@ -0,0 +1,27 @@
+name: Nightly
+on:
+ schedule:
+ - cron: 0 8 * * 1-5
+ workflow_dispatch: {}
+
+jobs:
+ trunk_check:
+ name: Trunk Check Upload
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v3
+
+ - name: Setup pnpm
+ uses: pnpm/action-setup@v2.2.1
+ with:
+ version: latest
+
+ - name: Install Dependencies
+ run: pnpm install
+
+ - name: Trunk Check
+ uses: trunk-io/trunk-action@v1
+ with:
+ trunk-token: ${{ secrets.TRUNK_TOKEN }}
diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml
deleted file mode 100644
index ee9d1836..00000000
--- a/.github/workflows/pr.yml
+++ /dev/null
@@ -1,31 +0,0 @@
-name: Pull Request
-
-on: pull_request
-
-jobs:
- build:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout code & submodules
- uses: actions/checkout@v3
- with:
- submodules: true
-
- - name: Setup pnpm
- uses: pnpm/action-setup@v2.2.1
- with:
- version: latest
-
- - name: Setup NodeJS
- uses: actions/setup-node@v3
- with:
- node-version: 17
-
- - name: Install Dependencies
- run: pnpm install
-
- - name: Lint & Format
- run: pnpm format
-
- - name: Build Site
- run: pnpm build
diff --git a/.github/workflows/update_protobufs.yml b/.github/workflows/update_protobufs.yml
deleted file mode 100644
index 09e8f5c0..00000000
--- a/.github/workflows/update_protobufs.yml
+++ /dev/null
@@ -1,26 +0,0 @@
-name: "Update protobufs"
-on: workflow_dispatch
-
-jobs:
- update-protobufs:
- environment: Production
- runs-on: ubuntu-latest
-
- steps:
- - name: Checkout code
- uses: actions/checkout@v3
- with:
- submodules: true
-
- - name: Update Submodule
- run: |
- git pull --recurse-submodules
- git submodule update --remote --recursive
-
- - name: Commit update
- run: |
- git config --global user.name 'github-actions'
- git config --global user.email 'bot@noreply.github.com'
- git remote set-url origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}
- git add protobufs
- git commit -m "Update protobuf submodule" && git push || echo "No changes to commit"
diff --git a/.gitmodules b/.gitmodules
index 2426e744..7ea48dc6 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,6 +1,3 @@
-[submodule "protobufs"]
- path = protobufs
- url = https://github.com/meshtastic/protobufs/
[submodule "static/design"]
path = static/design
url = https://github.com/meshtastic/design/
diff --git a/.prettierrc b/.prettierrc
deleted file mode 100644
index 2169b424..00000000
--- a/.prettierrc
+++ /dev/null
@@ -1 +0,0 @@
-"@meshtastic/eslint-config/prettier"
diff --git a/.trunk/.gitignore b/.trunk/.gitignore
new file mode 100644
index 00000000..cf2f2547
--- /dev/null
+++ b/.trunk/.gitignore
@@ -0,0 +1,7 @@
+*out
+*logs
+*actions
+*notifications
+plugins
+user_trunk.yaml
+user.yaml
diff --git a/.trunk/configs/.eslintrc b/.trunk/configs/.eslintrc
new file mode 100644
index 00000000..e8d9313c
--- /dev/null
+++ b/.trunk/configs/.eslintrc
@@ -0,0 +1,9 @@
+
+
+
+{
+ "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended", "plugin:@docusaurus/recommended"],
+ "parser": "@typescript-eslint/parser",
+ "plugins": ["@docusaurus", "@typescript-eslint"],
+ "root": true
+}
\ No newline at end of file
diff --git a/.trunk/configs/.markdownlint.yaml b/.trunk/configs/.markdownlint.yaml
new file mode 100644
index 00000000..fb940393
--- /dev/null
+++ b/.trunk/configs/.markdownlint.yaml
@@ -0,0 +1,10 @@
+# Autoformatter friendly markdownlint config (all formatting rules disabled)
+default: true
+blank_lines: false
+bullet: false
+html: false
+indentation: false
+line_length: false
+spaces: false
+url: false
+whitespace: false
diff --git a/.trunk/configs/.prettierrc b/.trunk/configs/.prettierrc
new file mode 100644
index 00000000..36b35631
--- /dev/null
+++ b/.trunk/configs/.prettierrc
@@ -0,0 +1,3 @@
+{
+ "trailingComma": "none"
+}
diff --git a/.trunk/configs/.shellcheckrc b/.trunk/configs/.shellcheckrc
new file mode 100644
index 00000000..8c7b1ada
--- /dev/null
+++ b/.trunk/configs/.shellcheckrc
@@ -0,0 +1,7 @@
+enable=all
+source-path=SCRIPTDIR
+disable=SC2154
+
+# If you're having issues with shellcheck following source, disable the errors via:
+# disable=SC1090
+# disable=SC1091
diff --git a/.trunk/configs/svgo.config.js b/.trunk/configs/svgo.config.js
new file mode 100644
index 00000000..277f5f2e
--- /dev/null
+++ b/.trunk/configs/svgo.config.js
@@ -0,0 +1,14 @@
+module.exports = {
+ plugins: [
+ {
+ name: "preset-default",
+ params: {
+ overrides: {
+ removeViewBox: false, // https://github.com/svg/svgo/issues/1128
+ sortAttrs: true,
+ removeOffCanvasPaths: true
+ }
+ }
+ }
+ ]
+};
diff --git a/.trunk/trunk.yaml b/.trunk/trunk.yaml
new file mode 100644
index 00000000..3226de3f
--- /dev/null
+++ b/.trunk/trunk.yaml
@@ -0,0 +1,23 @@
+version: 0.1
+cli:
+ version: 1.3.1
+plugins:
+ sources:
+ - id: trunk
+ ref: v0.0.8
+ uri: https://github.com/trunk-io/plugins
+lint:
+ enabled:
+ - markdownlint@0.33.0
+ - actionlint@1.6.22
+ - gitleaks@8.15.2
+ - git-diff-check
+ - shellcheck@0.9.0
+ - prettier@2.8.2
+ - shfmt@3.5.0
+ - eslint@8.31.0
+ - svgo@3.0.2
+runtimes:
+ enabled:
+ - go@1.18.3
+ - node@18.12.1
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
new file mode 100644
index 00000000..29d43383
--- /dev/null
+++ b/.vscode/extensions.json
@@ -0,0 +1,3 @@
+{
+ "recommendations": ["trunk.io"]
+}
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 00000000..b3568f7e
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,7 @@
+{
+ "editor.formatOnSave": true,
+ "editor.defaultFormatter": "trunk.io",
+ "files.associations": {
+ "*.mdx": "markdown"
+ }
+}
diff --git a/README.md b/README.md
index bed397ee..1a8fe78f 100644
--- a/README.md
+++ b/README.md
@@ -11,7 +11,7 @@ Website and documentation source for the Meshtastic project.
## Stats
-
+
## Development & Building
diff --git a/docs/about/_category_.yml b/docs/about/_category_.yml
index 7042440b..e6e137f5 100644
--- a/docs/about/_category_.yml
+++ b/docs/about/_category_.yml
@@ -4,4 +4,4 @@ collapsible: true # make the category collapsible
link:
type: generated-index
title: About Meshtastic
- slug: /about
\ No newline at end of file
+ slug: /about
diff --git a/docs/about/contributing.mdx b/docs/about/contributing.mdx
index 044ce2bf..cdd1c279 100644
--- a/docs/about/contributing.mdx
+++ b/docs/about/contributing.mdx
@@ -23,7 +23,7 @@ There are many technologies (and repositories) used in creating the Meshtastic e
### Protocol Buffers
-Most communication and interactions happen with protocol buffers. The [Meshtastic Protobuf Definitions](https://github.com/meshtastic/protobufs) repo is where all of the protocol buffer changes happen. See the [Protobuf API Reference](/docs/developers/protobufs/api) for more details.
+Most communication and interactions happen with protocol buffers. The [Meshtastic Protobuf Definitions](https://github.com/meshtastic/protobufs) repo is where all of the protocol buffer changes happen. See the [Protobuf API Reference](https://buf.build/meshtastic/protobufs/) for more details.
### Device Firmware
@@ -44,10 +44,10 @@ The [firmware](https://github.com/meshtastic/firmware) is where all of the firmw
@sachaw has been making tons of progress on the web app and would love help with:
-* Saving of preferences
-* Better loading state indicators
-* Chat scroll lock
-* Various module support
+- Saving of preferences
+- Better loading state indicators
+- Chat scroll lock
+- Various module support
### Mobile Apps (Device Interface)
@@ -59,4 +59,3 @@ There are two phone apps that interact with the Meshtastic devices:
### Documentation
This website is in the [Meshtastic](https://github.com/meshtastic/meshtastic) repository.
-
diff --git a/docs/about/faq.mdx b/docs/about/faq.mdx
index b29d79a6..18cb598d 100644
--- a/docs/about/faq.mdx
+++ b/docs/about/faq.mdx
@@ -21,13 +21,13 @@ Everyone contributes in a different way. Join the [Meshtastic Discord](https://d
### What versions of Android does the Meshtastic Android App require?
-Minimum requirement is Android 5 (Lollipop 2014, first BLE support), however at least Android 6 (Marshmallow 2015) is recommended as Bluetooth is more stable. While Android 5/6 are officially supported by Meshtastic, it is *not* recommended that you purchase devices with these versions due to their limited OS support and limited battery life due to age. Many newer models exist that are very affordable. A good resource to use when researching affordable devices is the [LineageOS Supported Devices List](https://wiki.lineageos.org/devices/).
+Minimum requirement is Android 5 (Lollipop 2014, first BLE support), however at least Android 6 (Marshmallow 2015) is recommended as Bluetooth is more stable. While Android 5/6 are officially supported by Meshtastic, it is _not_ recommended that you purchase devices with these versions due to their limited OS support and limited battery life due to age. Many newer models exist that are very affordable. A good resource to use when researching affordable devices is the [LineageOS Supported Devices List](https://wiki.lineageos.org/devices/).
### What does the icon next to the message mean?
- Cloud with an up arrow - Queued on the app to be sent to your device.
- Cloud only - Queued on the device to be sent over the mesh.
-- Cloud with a check mark - At least one other node on the mesh acknowledged the message.
+- Cloud with a check mark - At least one other node on the mesh acknowledged the message.
- Person with a check mark - The intended recipient of your direct message acknowledged the message.
- Cloud crossed out - Not acknowledged or message error.
@@ -91,7 +91,7 @@ Hold down the left PWR button for about 10 seconds and the display should turn o
Push the left PWR button for about 1 second.
-### Functionality of the T-Beam Buttons ###
+### Functionality of the T-Beam Buttons
[T-Beam Buttons](/docs/hardware/devices/tbeam/buttons) explained here
@@ -120,9 +120,9 @@ Once the node wakes up from sleep, your phone will relay any delayed messages th
- Android instructions see: [Android Usage](/docs/software/android/usage#configuration-options)
- Python CLI instructions see: [Python Usage](/docs/software/python/cli/usage#changing-settings)
-### I am in Europe and my device seems to stop transmitting after a while, what is going on?
+### I am in Europe and my device seems to stop transmitting after a while, what is going on?
-Europe has an hourly duty cycle limit of 10% in the frequency band that Meshtastic uses. It might be that you hit this limit if you are sending a lot. You can confirm this by checking whether you see duty cycle limit errors in the serial log, Mesh Log (Apple apps) or Debug Panel (Android).
+Europe has an hourly duty cycle limit of 10% in the frequency band that Meshtastic uses. It might be that you hit this limit if you are sending a lot. You can confirm this by checking whether you see duty cycle limit errors in the serial log, Mesh Log (Apple apps) or Debug Panel (Android).
To limit traffic, you can consider setting the device metrics and position update intervals higher. Alternatively, the device can be configured to override the duty cycle limit, but then you will violate the regulations.
### Why does only one RAK Meshtastic Starter kit show up in my node list?
@@ -133,23 +133,24 @@ There was a bug where Meshtastic Starter kits were sent out with the same MAC ad
## Amateur Radio (HAM)
-Meshtastic can be used by both unlicensed people and licensed HAM operators.
+Meshtastic can be used by both unlicensed people and licensed HAM operators.
### What is the benefit of using a HAM license with Meshtastic?
If you use your HAM radio license with Meshtastic, consider both the privileges and restrictions:
#### Privileges
+
- Increased Transmit Power
- - Up to 1500W transmit power! [FCC Part 97.313](https://www.ecfr.gov/current/title-47/chapter-I/subchapter-D/part-97/subpart-D/section-97.313)
+ - Up to 1500W transmit power! [FCC Part 97.313](https://www.ecfr.gov/current/title-47/chapter-I/subchapter-D/part-97/subpart-D/section-97.313)
- Higher Gain Antennas
#### Restrictions
-- Plain-Text Only
- - On amateur radio bands, encryption is illegal. [FCC Part 97.113.C](https://www.ecfr.gov/current/title-47/chapter-I/subchapter-D/part-97/subpart-B/section-97.113)
-- Lack of Privacy
- - As a HAM operator, it is a requirement that you identify yourself by your call sign periodically when transmitting. Your call sign will be publicly transmitted at least once every 10 minutes at minimum. [FCC Part 97.119.A](https://www.ecfr.gov/current/title-47/chapter-I/subchapter-D/part-97/subpart-B/section-97.119)
+- Plain-Text Only
+ - On amateur radio bands, encryption is illegal. [FCC Part 97.113.C](https://www.ecfr.gov/current/title-47/chapter-I/subchapter-D/part-97/subpart-B/section-97.113)
+- Lack of Privacy
+ - As a HAM operator, it is a requirement that you identify yourself by your call sign periodically when transmitting. Your call sign will be publicly transmitted at least once every 10 minutes at minimum. [FCC Part 97.119.A](https://www.ecfr.gov/current/title-47/chapter-I/subchapter-D/part-97/subpart-B/section-97.119)
### How do I set my HAM call sign?
diff --git a/docs/about/introduction.mdx b/docs/about/introduction.mdx
index ec0441b0..c5290b2e 100644
--- a/docs/about/introduction.mdx
+++ b/docs/about/introduction.mdx
@@ -5,7 +5,7 @@ slug: /introduction
sidebar_position: 1
---
-import Link from '@docusaurus/Link';
+import Link from "@docusaurus/Link";
Meshtastic® is a project that enables you to use inexpensive LoRa radios as a long range off-grid communication platform in areas without existing or reliable communications infrastructure. This project is 100% community driven and open source!
@@ -32,8 +32,8 @@ If you are interested in a more technical overview of how Meshtastic works, visi
Technical Overview
@@ -45,8 +45,8 @@ Meshtastic is an open source project available on GitHub. Our generous volunteer
Contribute!
@@ -54,16 +54,16 @@ Meshtastic is an open source project available on GitHub. Our generous volunteer
-## Start using Meshtastic!
+## Start using Meshtastic
-Hopefully your "Getting Started" experience is straight forward and headache free. If you encounter any issues, please consider updating our documentation to improve future user experiences or reach out on the forum or Discord.
+Hopefully your "Getting Started" experience is straight forward and headache free. If you encounter any issues, please consider updating our documentation to improve future user experiences or reach out on the forum or Discord.
Our support is 100% volunteer based. We are passionate about the project and hope to help newcomers become Meshtastic experts!
Getting Started
diff --git a/docs/about/overview/encryption.mdx b/docs/about/overview/encryption.mdx
index 24429e43..fd1f1085 100644
--- a/docs/about/overview/encryption.mdx
+++ b/docs/about/overview/encryption.mdx
@@ -55,62 +55,59 @@ I'm assuming that meshtastic is being used to hike in places where someone capab
I'm guessing that the network behaves somewhat like a store-and-forward network - or, at least, that the goal is to avoid establishing a two-way connection to transmit data. I'm afraid I haven't worked with mesh networks much, but remember studying them briefly in school about ten years ago.
-
## Phased Proposal for the Meshtastic Security Framework
### Phase 1 - Fixed network encryption with AES-CTR
The current implementation provides optional confidentiality to members of a configured network:
- * Encryption is implemented in devices/nodes with network-wide encryption keys.
- * Encryption is optional and is turned off when devices are in 'Ham mode'.
- * There is no encryption supported in the clients (iOS, Android) to facilitate distribution as mass market software.
- * Pairing from client-to-device is by:
- * direct USB cable
- * BT pairing
- * Devices are 'promiscuous' and will pair with any near-by client. Network confidentiality requires physical protextion of all nodes.
+
+- Encryption is implemented in devices/nodes with network-wide encryption keys.
+- Encryption is optional and is turned off when devices are in 'Ham mode'.
+- There is no encryption supported in the clients (iOS, Android) to facilitate distribution as mass market software.
+- Pairing from client-to-device is by:
+ - direct USB cable
+ - BT pairing
+- Devices are 'promiscuous' and will pair with any near-by client. Network confidentiality requires physical protextion of all nodes.
### Phase 2 - Strong device and client identity
**Phase 2 security goals:**
- * Know who sent a message (strong binding of messages to a particular node and/or terminal device)
- * This would be an optional feature for a message
- * Optionaly enforce identity based restrictions on some actions performed at nodes and/or clients
- * Optional support of strong pairing of a client to a device/node and restrict ability to manage and receive messages based on the pairing.
- * The BT paring and the cryptographic paring are separate (to simplify pahse 1 deployment and testing)
- * Above features should be architected to be ‘cryptographically strong’ and algorithm agile.
+
+- Know who sent a message (strong binding of messages to a particular node and/or terminal device)
+ - This would be an optional feature for a message
+- Optionaly enforce identity based restrictions on some actions performed at nodes and/or clients
+- Optional support of strong pairing of a client to a device/node and restrict ability to manage and receive messages based on the pairing.
+ - The BT paring and the cryptographic paring are separate (to simplify pahse 1 deployment and testing)
+- Above features should be architected to be ‘cryptographically strong’ and algorithm agile.
**Phase 2 Proposed mechanisms:**
- * Proposed initial algorithms
- - Ed25519 for signatures based on NaCl libraries and iOS support for Ed25519
- * Clients and nodes to generate local identity Ed25519 keys
- * Devices maintain knowledge of owner public key
- * Devices maintain knowledge of some peers public keys and associated information (name, etc.)
- * Experimental protobuf message type with
- * cipher suite indicator (csi)
- * wrapped data using a cipher suite identifier to indicate use of Ed25519 wrapping identified algorithms.
- Wrapped data to contain any of the existing message types.
- * initial ‘cipher suite’ **only** signs a message
- * new signed/authenticated messages to:
- * device->client: provide ownership status of device (owner is identifed by a public key)
- * client->device: set owner key (must be existing device owner or owner null)
- * any->all. Broadcast public key and associated info (crude initial key distribution)
-
+
+- Proposed initial algorithms
+ - Ed25519 for signatures based on NaCl libraries and iOS support for Ed25519
+- Clients and nodes to generate local identity Ed25519 keys
+- Devices maintain knowledge of owner public key
+- Devices maintain knowledge of some peers public keys and associated information (name, etc.)
+- Experimental protobuf message type with
+ - cipher suite indicator (csi)
+ - wrapped data using a cipher suite identifier to indicate use of Ed25519 wrapping identified algorithms.
+ Wrapped data to contain any of the existing message types.
+ - initial ‘cipher suite’ **only** signs a message
+ - new signed/authenticated messages to:
+ - device->client: provide ownership status of device (owner is identifed by a public key)
+ - client->device: set owner key (must be existing device owner or owner null)
+ - any->all. Broadcast public key and associated info (crude initial key distribution)
+
### Phase 3 and 3+:
- * Device/node e2e message confidentiality (1-to-1)
- * NO client side encryption
- * All encryption turned off for a network in 'Ham mode'
- * Protect messages sent over LoRa from eavesdroppers outside of a well identified group
- - multicast group key distribution / discovery (1-to-n)
- * Privacy
- * BT MAC layer address privatization
- * Node address privatization (Use use if based on device public key and schedule based aliasing)
- * Private peer discovery
- * Private service announcement and discovery
- * Device/node security (hardening key storage, tamper resistance, side channel protection, etc.)
- * Public key pairing process for client-to-device also sets up BT (no BT pin)
-
-
-
-
-
+- Device/node e2e message confidentiality (1-to-1)
+ - NO client side encryption
+ - All encryption turned off for a network in 'Ham mode'
+- Protect messages sent over LoRa from eavesdroppers outside of a well identified group
+ - multicast group key distribution / discovery (1-to-n)
+- Privacy
+ - BT MAC layer address privatization
+ - Node address privatization (Use use if based on device public key and schedule based aliasing)
+ - Private peer discovery
+- Private service announcement and discovery
+- Device/node security (hardening key storage, tamper resistance, side channel protection, etc.)
+- Public key pairing process for client-to-device also sets up BT (no BT pin)
diff --git a/docs/about/overview/index.mdx b/docs/about/overview/index.mdx
index b69ddf3f..8432fa9c 100644
--- a/docs/about/overview/index.mdx
+++ b/docs/about/overview/index.mdx
@@ -11,4 +11,4 @@ When you send a message on your Meshtastic companion app, it is relayed to the r
When a receiving radio captures a packet, it checks to see if it has heard that message before. If it has it ignores the message. If it hasn't heard the message, it will rebroadcast it.
-For each message a radio rebroadcasts, it marks the "hop limit" down by one. When a radio receives a packet with a hop limit of zero, it will not rebroadcast the message.
\ No newline at end of file
+For each message a radio rebroadcasts, it marks the "hop limit" down by one. When a radio receives a packet with a hop limit of zero, it will not rebroadcast the message.
diff --git a/docs/about/overview/mesh-alg.mdx b/docs/about/overview/mesh-alg.mdx
index 5a9336c2..ade2d43d 100644
--- a/docs/about/overview/mesh-alg.mdx
+++ b/docs/about/overview/mesh-alg.mdx
@@ -25,23 +25,23 @@ This preamble allows receiving radios to synchronize clocks and start framing. W
This layer is conventional non-reliable LoRa packet transmission. The transmitted packet has the following representation before encoding for transmission:
-| Offset | Length | Type | Usage |
-|:------------:|:-----------------------------:|:-------:|:---------------------------------------------------------------------------------------- |
-| 0x00 | 1 byte | Integer | syncWord, always `0x2B`. |
-| 0x01 | 4 bytes | Integer | Packet header: Destination. The destination's unique NodeID. `0xFFFFFFFF` for broadcast. |
-| 0x05 | 4 bytes | Integer | Packet Header: Sender. The sender's unique NodeID. |
-| 0x09 | 4 bytes | Integer | Packet Header: The sending node's unique packet ID for this packet. |
-| 0x0D | 32 bits | Bits | Packet Header: Flags. See the [header flags](#packet-header-flags) for usage. |
-| 0x11 .. 0xFD | Varies, maximum of 237 bytes. | Bytes | Actual packet data. Unused bytes are not transmitted. |
-| 0xFE .. 0xFF | 2 Bytes | Bytes | Unused. |
+| Offset | Length | Type | Usage |
+| :----------: | :---------------------------: | :-----: | :--------------------------------------------------------------------------------------- |
+| 0x00 | 1 byte | Integer | syncWord, always `0x2B`. |
+| 0x01 | 4 bytes | Integer | Packet header: Destination. The destination's unique NodeID. `0xFFFFFFFF` for broadcast. |
+| 0x05 | 4 bytes | Integer | Packet Header: Sender. The sender's unique NodeID. |
+| 0x09 | 4 bytes | Integer | Packet Header: The sending node's unique packet ID for this packet. |
+| 0x0D | 32 bits | Bits | Packet Header: Flags. See the [header flags](#packet-header-flags) for usage. |
+| 0x11 .. 0xFD | Varies, maximum of 237 bytes. | Bytes | Actual packet data. Unused bytes are not transmitted. |
+| 0xFE .. 0xFF | 2 Bytes | Bytes | Unused. |
#### Packet Header Flags
-| Index | # of Bits | Usage |
-|:-------:|:---------:|:------------------------------|
-| 0 | 3 | HopLimit (see note in Layer 3) |
-| 3 | 1 | WantAck |
-| 4 .. 32 | 28 | Currently unused |
+| Index | # of Bits | Usage |
+| :-----: | :-------: | :----------------------------- |
+| 0 | 3 | HopLimit (see note in Layer 3) |
+| 3 | 1 | WantAck |
+| 4 .. 32 | 28 | Currently unused |
#### Usage Details
@@ -51,7 +51,7 @@ This layer is conventional non-reliable LoRa packet transmission. The transmitte
- **Packet Header - Unique ID:** The ID is a large, 32 bit ID to ensure there is enough unique state to protect an encrypted payload from attack.
-- **Payload:** An encrypted and packed protobuf encoding of the SubPacket protobuf. Only the SubPacket is encrypted, while headers are not. This allows the option of eventually allowing nodes to route packets without knowing anything about the encrypted payload. For more information, see the [encryption](/docs/overview/encryption) and [protobufs](/docs/developers/protobufs/api) documentation. Any data past the maximum length is truncated.
+- **Payload:** An encrypted and packed protobuf encoding of the SubPacket protobuf. Only the SubPacket is encrypted, while headers are not. This allows the option of eventually allowing nodes to route packets without knowing anything about the encrypted payload. For more information, see the [encryption](/docs/overview/encryption) and [Protobuf API Reference](https://buf.build/meshtastic/protobufs/). Any data past the maximum length is truncated.
#### Carrier-Sense Multiple Access with Collision Avoidance (CSMA/CA)
diff --git a/docs/about/overview/radio-settings.mdx b/docs/about/overview/radio-settings.mdx
index bf3f645f..233cb887 100644
--- a/docs/about/overview/radio-settings.mdx
+++ b/docs/about/overview/radio-settings.mdx
@@ -46,7 +46,7 @@ There are 104 channels defined with the standard radio preset `LongFast`. After
### Considerations
-Various data-rate options are available when configuring a channel and are inversely proportional to the theoretical range of the devices.
+Various data-rate options are available when configuring a channel and are inversely proportional to the theoretical range of the devices.
- **Spreading Factor** - How much we "spread" our data over time.
- Each step up in Spreading Factor doubles the airtime to transmit.
@@ -65,16 +65,16 @@ Various data-rate options are available when configuring a channel and are inver
We have six predefined channels. These are the most common settings and have been proven to work well:
-| Channel setting | Alt Channel Name | Data-Rate | SF / Symbols | Coding Rate | Bandwidth | Link Budget |
-| :------------------: | :---------------: | :------------------: | :-----------: | :----------: | :--------:| :---------- :|
-| Short Range / Fast | Short Fast | 6.8 kbps | 7 / 128 | 4/8 | 250 | 137dB |
-| Short Range / Slow | Short Slow | 3.9 kbps | 8 / 256 | 4/8 | 250 | 140dB |
-| Medium Range / Fast | Medium Fast | 2.2 kbps | 9 / 512 | 4/8 | 250 | 143dB |
-| Medium Range / Slow | Medium Slow | 1.2 kbps | 10 / 1024 | 4/8 | 250 | 146dB |
-| Long Range / Fast | Long Fast | 0.67 kbps (default) | 11 / 2048 | 4/8 | 250 | 148.5dB |
-| Long Range / Slow | Long Slow | 0.18 kbps | 12 / 4096 | 4/8 | 125 | 154dB |
-| Very Long Range - Slow | Very Long Slow | 0.05 kbps | 12 / 4096 | 4/8 | 31.25 | 160.1dB |
-
+| Channel setting | Alt Channel Name | Data-Rate | SF / Symbols | Coding Rate | Bandwidth | Link Budget |
+| :--------------------: | :--------------: | :-----------------: | :----------: | :---------: | :-------: | :---------: |
+| Short Range / Fast | Short Fast | 6.8 kbps | 7 / 128 | 4/8 | 250 | 137dB |
+| Short Range / Slow | Short Slow | 3.9 kbps | 8 / 256 | 4/8 | 250 | 140dB |
+| Medium Range / Fast | Medium Fast | 2.2 kbps | 9 / 512 | 4/8 | 250 | 143dB |
+| Medium Range / Slow | Medium Slow | 1.2 kbps | 10 / 1024 | 4/8 | 250 | 146dB |
+| Long Range / Fast | Long Fast | 0.67 kbps (default) | 11 / 2048 | 4/8 | 250 | 148.5dB |
+| Long Range / Moderate | Long Moderate | 0.335 kbps | 11 / 2048 | 4/8 | 125 | 151dB |
+| Long Range / Slow | Long Slow | 0.18 kbps | 12 / 4096 | 4/8 | 125 | 154dB |
+| Very Long Range / Slow | Very Long Slow | 0.09 kbps | 12 / 4096 | 4/8 | 62.5 | 157dB |
:::note
The link budget used by these calculations assumes a transmit power of 17dBm and an antenna with 0dB gain. Adjust your link budget assumptions based on your actual devices. Data-rate in this table is actual measured but doesn't count mesh overhead, hops and re-transmissions.
@@ -93,18 +93,17 @@ After applying the settings, you will need to restart the device. After your dev
Some example settings:
| Data-rate | SF / Symbols | Coding Rate | Bandwidth | Link Budget | Note |
-| :---------:| :-----------:| :----------:| :--------:| :----------:| :----------------------------------------------------------------------- |
-| 37.50 kbps | 6 / 64 | 4/5 | 500 | 129dB | Fastest possible speed |
-| 3.125 kbps | 8 / 256 | 4/5 | 125 | 143dB | |
-| 1.953 kbps | 8 / 256 | 4/8 | 125 | 143dB | |
-| 1.343 kbps | 11 / 2048 | 4/8 | 500 | 145dB | |
-| 1.099 kbps | 9 / 512 | 4/8 | 125 | 146dB | |
-| 0.814 kbps | 10 / 1024 | 4/6 | 125 | 149dB | |
-| 0.610 kbps | 10 / 1024 | 4/8 | 125 | 149dB | |
-| 0.488 kbps | 11 / 2048 | 4/6 | 125 | 152dB | |
-| 0.336 kbps | 11 / 2048 | 4/8 | 125 | 152dB | |
-| 0.073 kbps | 12 / 4096 | 4/5 | 31 | 160dB | Twice the range and/or coverage of "Long Slow", low resilience to noise |
-| 0.046 kbps | 12 / 4096 | 4/8 | 31 | 160dB | Twice the range and/or coverage of "Long Slow", high resilience to noise |
+| :--------: | :----------: | :---------: | :-------: | :---------: | :----------------------------------------------------------------------- |
+| 37.50 kbps | 6 / 64 | 4/5 | 500 | 129dB | Fastest possible speed |
+| 3.125 kbps | 8 / 256 | 4/5 | 125 | 143dB | |
+| 1.953 kbps | 8 / 256 | 4/8 | 125 | 143dB | |
+| 1.343 kbps | 11 / 2048 | 4/8 | 500 | 145dB | |
+| 1.099 kbps | 9 / 512 | 4/8 | 125 | 146dB | |
+| 0.814 kbps | 10 / 1024 | 4/6 | 125 | 149dB | |
+| 0.610 kbps | 10 / 1024 | 4/8 | 125 | 149dB | |
+| 0.488 kbps | 11 / 2048 | 4/6 | 125 | 152dB | |
+| 0.073 kbps | 12 / 4096 | 4/5 | 31 | 160dB | Twice the range and/or coverage of "Long Slow", low resilience to noise |
+| 0.046 kbps | 12 / 4096 | 4/8 | 31 | 160dB | Twice the range and/or coverage of "Long Slow", high resilience to noise |
The link budget used by these calculations assumes a transmit power of 17dBm and an antenna with 0dB gain. Adjust your link budget assumptions based on your actual devices.
diff --git a/docs/about/overview/range-test.mdx b/docs/about/overview/range-test.mdx
index 327d6fb2..6b84d5af 100644
--- a/docs/about/overview/range-test.mdx
+++ b/docs/about/overview/range-test.mdx
@@ -12,18 +12,21 @@ sidebar_position: 4
- **Record Holder:** _PuzzledPancake_
- **Source:** [Meshtastic Discourse](https://meshtastic.discourse.group/t/practical-range-test-results/692/44)
-**Modem Settings**
+### Modem Settings
+
- **Frequency:** 868MHz
- **Bandwidth:** 125
- **Spread Factor:** 12
- **Coding Rate:** 4/8
-**Node A**
+### Node A
+
- **Device:** [LILYGO TTGO T-Beam w/ SX1262](/docs/hardware/devices/tbeam)
- **Firmware Version:** 1.2
- **Antenna:** [868MHz 5dBi Antenna](https://ivent.co.nz/product/category/1000/868mhz%205dbi%20antenna%20193mm%20black%20sma%20%28m%29/38646)
-**Node B**
+### Node B
+
- **Device:** [LILYGO TTGO T-Beam w/ SX1262](/docs/hardware/devices/tbeam)
- **Firmware Version:** 1.2
- **Antenna:** [868MHz Vertical 6dBi](https://ivent.co.nz/product/category/1000/868mhz%20vertical%206dbi%20antenna/38606)
@@ -34,5 +37,6 @@ sidebar_position: 4

-**Resources Used**
- - http://www.heywhatsthat.com
\ No newline at end of file
+### Resources Used
+
+- http://www.heywhatsthat.com
diff --git a/docs/blocks/_lora-regions.mdx b/docs/blocks/_lora-regions.mdx
index b3ae715a..62734e72 100644
--- a/docs/blocks/_lora-regions.mdx
+++ b/docs/blocks/_lora-regions.mdx
@@ -1,21 +1,22 @@
-
-| Region Code | Description |
-| :-------: | :--------: |
-| `UNSET` | Unset |
-| `US` | United States |
-| `EU_433` | European Union 433MHz |
-| `EU_868` | European Union 868MHz |
-| `CN` | China |
-| `JP` | Japan |
-| `ANZ` | Australia & New Zealand |
-| `KR` | Korea |
-| `TW` | Taiwan |
-| `RU` | Russia |
-| `IN` | India |
-| `NZ_865` | New Zealand 865MHz |
-| `TH` | Thailand |
-| `LORA_24` | 2.4 GHz band worldwide |
+| Region Code | Description |
+| :---------: | :---------------------: |
+| `UNSET` | Unset |
+| `US` | United States |
+| `EU_433` | European Union 433MHz |
+| `EU_868` | European Union 868MHz |
+| `CN` | China |
+| `JP` | Japan |
+| `ANZ` | Australia & New Zealand |
+| `KR` | Korea |
+| `TW` | Taiwan |
+| `RU` | Russia |
+| `IN` | India |
+| `NZ_865` | New Zealand 865MHz |
+| `UA_433` | Ukraine 433MHz |
+| `UA_868` | Ukraine 868MHz |
+| `TH` | Thailand |
+| `LORA_24` | 2.4 GHz band worldwide |
:::info
EU_433 and EU_868 have to adhere to an hourly duty cycle limitation of 10%. Your device will stop transmitting if you reach it, until it is allowed again.
-:::
\ No newline at end of file
+:::
diff --git a/docs/configuration/_category_.yml b/docs/configuration/_category_.yml
index d86396a5..49411e73 100644
--- a/docs/configuration/_category_.yml
+++ b/docs/configuration/_category_.yml
@@ -4,4 +4,4 @@ position: 4
link:
type: generated-index
title: Configuration
- slug: /settings
\ No newline at end of file
+ slug: /settings
diff --git a/docs/configuration/device-config/bluetooth.mdx b/docs/configuration/device-config/bluetooth.mdx
index b97bfbf9..bc1aafad 100644
--- a/docs/configuration/device-config/bluetooth.mdx
+++ b/docs/configuration/device-config/bluetooth.mdx
@@ -5,10 +5,10 @@ slug: /settings/config/bluetooth
sidebar_label: Bluetooth
---
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
-The Bluetooth config options are: Enabled, Pairing Mode and Fixed PIN Value. Bluetooth config uses an admin message sending a `Config.Bluetooth` protobuf.
+The Bluetooth config options are: Enabled, Pairing Mode and Fixed PIN Value. Bluetooth config uses an admin message sending a `Config.Bluetooth` protobuf.
:::info
ESP32 Devices: Bluetooth will be disabled if WiFi is enabled. The WiFi setting takes precedence.
@@ -82,11 +82,11 @@ All Bluetooth module config options are available in the python CLI. Example com
:::
-| Setting | Acceptable Values | Default |
-| :-----------------------: | :-----------------: | :-----: |
-| `bluetooth.enabled` | `true`, `false` | `true` |
-| `bluetooth.mode` | `RANDOM_PIN`, `FIXED_PIN`, `NO_PIN` | `RANDOM_PIN` |
-| `bluetooth.fixedPin` | `integer` (6 digits) | `123456` |
+| Setting | Acceptable Values | Default |
+| :------------------: | :---------------------------------: | :----------: |
+| `bluetooth.enabled` | `true`, `false` | `true` |
+| `bluetooth.mode` | `RANDOM_PIN`, `FIXED_PIN`, `NO_PIN` | `RANDOM_PIN` |
+| `bluetooth.fixedPin` | `integer` (6 digits) | `123456` |
:::tip
@@ -107,6 +107,7 @@ meshtastic --set bluetooth.enabled false
meshtastic --set bluetooth.mode FIXED_PIN
meshtastic --set bluetooth.fixed_pin 111111
```
+
@@ -120,4 +121,4 @@ All Bluetooth module config options are available for the Web UI.
:::
-
\ No newline at end of file
+
diff --git a/docs/configuration/device-config/channels.mdx b/docs/configuration/device-config/channels.mdx
index 5485f5d2..f18b0c5a 100644
--- a/docs/configuration/device-config/channels.mdx
+++ b/docs/configuration/device-config/channels.mdx
@@ -5,8 +5,8 @@ slug: /settings/config/channels
sidebar_label: Channels
---
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
The Channels config options are: Index, Roles, and Settings. Channel config uses an admin message sending a `Channel` protobuf which also consists of a `ChannelSettings` protobuf.
@@ -26,16 +26,16 @@ The channel index begins at 0 and ends at 7.
_Indexing_ can not be modified.
-| Index | Channel | Default Role | Purpose |
-| :--------------------: | :----------------: | :----------------: | :----------------: |
-| 0 | 1 | `PRIMARY` | Used as `default` channel |
-| 1 | 2 | `DISABLED` | User defined |
-| 2 | 3 | `DISABLED` | User defined |
-| 3 | 4 | `DISABLED` | User defined |
-| 4 | 5 | `DISABLED` | User defined |
-| 5 | 6 | `DISABLED` | User defined |
-| 6 | 7 | `DISABLED` | User defined |
-| 7 | 8 | `DISABLED` | User defined |
+| Index | Channel | Default Role | Purpose |
+| :---: | :-----: | :----------: | :-----------------------: |
+| 0 | 1 | `PRIMARY` | Used as `default` channel |
+| 1 | 2 | `DISABLED` | User defined |
+| 2 | 3 | `DISABLED` | User defined |
+| 3 | 4 | `DISABLED` | User defined |
+| 4 | 5 | `DISABLED` | User defined |
+| 5 | 6 | `DISABLED` | User defined |
+| 6 | 7 | `DISABLED` | User defined |
+| 7 | 8 | `DISABLED` | User defined |
:::note
You can **not** have `DISABLED` channels in-between active channels such as `PRIMARY` and `SECONDARY`. Active channels must be consecutive.
@@ -45,15 +45,20 @@ You can **not** have `DISABLED` channels in-between active channels such as `PRI
Each channel is assigned one of 3 roles:
-1. `PRIMARY` or `1`
- - This is the first channel that is created for you on initial setup.
- - Only one primary channel can exist and can not be disabled.
- - Direct messages are only available on this channel.
+1. `PRIMARY` or `1`
+ - This is the first channel that is created for you on initial setup.
+ - Only one primary channel can exist and can not be disabled.
+ - Direct messages are only available on this channel.
2. `SECONDARY` or `2`
- - Can modify the encryption key (PSK).
-3. `DISABLED` or `0`
- - The channel is no longer available for use.
- - The channel settings are set to default.
+ - Can modify the encryption key (PSK).
+3. `DISABLED` or `0`
+ - The channel is no longer available for use.
+ - The channel settings are set to default.
+
+:::note
+While you can have a different PRIMARY channel and communicate over SECONDARY channels with the same PSK, a hash of the PRIMARY channel's name sets the LoRa channel number, which determines the actual frequency you are transmitting on in the band.
+To ensure devices with different PRIMARY channel name transmit on the same frequency, you must explicitly set the LoRa channel number.
+:::
## Channel Settings Values
@@ -71,12 +76,12 @@ Set to `0` by default.
### Name
-A short identifier for the channel. _(< 12 bytes)_
+A short identifier for the channel. _(< 12 bytes)_
-| Reserved Name | Purpose |
-| :--------------------: | :----------------: |
-| `""` (default) | If left empty on the Primary channel, this designates the `default` channel. |
-| `admin` | On Secondary channels, the name `admin` (case sensitive) designates the `admin` channel used to administer nodes over the mesh |
+| Reserved Name | Purpose |
+| :------------: | :----------------------------------------------------------------------------------------------------------------------------: |
+| `""` (default) | If left empty on the Primary channel, this designates the `default` channel. |
+| `admin` | On Secondary channels, the name `admin` (case sensitive) designates the `admin` channel used to administer nodes over the mesh |
### PSK
@@ -140,13 +145,13 @@ meshtastic --ch-set name "My Channel" --ch-set psk random --ch-set uplink_enable
:::
-**Id**
+### Id
```shell title="Set the PRIMARY channel ID"
meshtastic --ch-set id 1234 --ch-index 0
```
-**Name**
+### Name
```shell title="Set channel name for the PRIMARY channel"
# without spaces
@@ -155,7 +160,7 @@ meshtastic --ch-set name MyChannel --ch-index 0
meshtastic --ch-set name "My Channel" --ch-index 0
```
-**PSK**
+### PSK
If you use Meshtastic for exchanging messages you don't want other people to see, `random` is the setting you should use. Selecting `default` or any of the `simple` values from the following table will use publicly known encryption keys. They're shipped with Meshtastic source code and thus, anyone can listen to messages encrypted by them. They're great for testing and public channels.
@@ -186,7 +191,7 @@ meshtastic --ch-set psk 0x1a1a1a1a2b2b2b2b1a1a1a1a2b2b2b2b1a1a1a1a2b2b2b2b1a1a1a
meshtastic --ch-set psk none --ch-index 0
```
-**Uplink / Downlink**
+### Uplink / Downlink
For configuring gateways, please see [MQTT](/docs/settings/moduleconfig/mqtt)
@@ -209,4 +214,4 @@ All Channel config options are available in the Web UI.
:::
-
\ No newline at end of file
+
diff --git a/docs/configuration/device-config/device.mdx b/docs/configuration/device-config/device.mdx
index 8f90ccaf..630f7e9f 100644
--- a/docs/configuration/device-config/device.mdx
+++ b/docs/configuration/device-config/device.mdx
@@ -5,36 +5,66 @@ slug: /settings/config/device
sidebar_label: Device
---
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
-The device config options are: Role, Serial Output, and Debug Log. Device config uses an admin message sending a `Config.Device` protobuf.
+The device config options are: Role, Serial Output, and Debug Log. Device config uses an admin message sending a `Config.Device` protobuf.
## Device Config Values
### Role
-Sets the role of node.
+
+Sets the role of the node.
Acceptable values:
-| Value | Description |
-| :-------: | :---------------------------------------------------------------------------------------: |
-| `CLIENT` | Client (default) - App connected client. |
-| `CLIENT_MUTE` | Client Mute - Same as a client except packets will not hop over this node, does not contribute to routing packets for mesh. |
-| `ROUTER` | Router - Mesh packets will prefer to be routed over this node. This node will not be used by client apps. The WiFi/BLE radios and the OLED screen will be put to sleep. |
-| `ROUTER_CLIENT` | Router Client - Mesh packets will prefer to be routed over this node. The Router Client can be used as both a Router and an app connected Client. |
+| Value | Description |
+| :-------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
+| `CLIENT` | Client (default) - This role will follow the standard routing rules while also allowing the device to interact with client applications via BLE/Wi-Fi (Android/Apple/Web). |
+| `CLIENT_MUTE` | Client Mute - Same as a client except packets will not hop over this node, does not contribute to routing packets for mesh. |
+| `ROUTER` | Router - Mesh packets will prefer to be routed over this node. The assumption is that Router-type devices will be placed in locations with a height/range/antenna advantage, and therefore have better overall coverage. This node will not be used by client apps. The BLE/Wi-Fi radios and the OLED screen will be put to sleep. Please note: Due to the preferred routing, this role may cause higher power usage due to more frequent transmission. |
+| `ROUTER_CLIENT` | Router Client - Hybrid of the Client and Router roles. Similar to Router, except the Router Client can be used as both a Router and an app connected Client. BLE/Wi-Fi and OLED screen will not be put to sleep. |
+| `REPEATER`[^1] | Repeater - Mesh packets will prefer to be routed over this node. This role eliminates unnecessary overhead such as NodeInfo, DeviceTelemetry, and any other mesh packet, resulting in the device not appearing as part of the network. As such, direct messaging this node is not available, as it will not appear in your nodes list which results in a cleaner mesh network. Channel and modem settings of the mesh packets being repeated must be identical to the repeater's configuration. Please see Rebroadcast Mode for additional settings specific to this role.[^1] |
+| `TRACKER`[^1] | Tracker - For use with devices intended as a GPS tracker. Position packets sent from this device will be higher priority, with position broadcasting every two minutes. Smart Position Broadcast will default to off.[^1] |
+[^1]: These roles are new as of the 2.0.15 alpha release. They are still a work in progress and as such features and functionality may not work as described and can evolve or change as development continues.
+
+### Rebroadcast Mode
+
+This setting defines the device's behavior for how messages are rebroadcasted. [^2]
+
+[^2]: This setting is new as of the 2.0.16 alpha release. It is still a work in progress and as such features and functionality may not work as described and can evolve or change as development continues.
+
+| Value | Description |
+| :-----------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
+| `ALL` | ALL (Default) - This setting will rebroadcast ALL messages from its primary mesh as well as other meshes with the same modem settings, including when encryption settings differ. |
+| `All_SKIP_DECODING` | ALL_SKIP_DECODING - Same as behavior as ALL, but skips packet decoding and simply rebroadcasts them. **Only available with Repeater role.** |
+| `LOCAL_ONLY` | LOCAL_ONLY - Ignores observed messages from foreign meshes that are open or those which it cannot decrypt. Only rebroadcasts message on the nodes local primary / secondary channels. |
+
+### Serial Console
-### Serial Console
Acceptable values: `true` or `false`
Disabling this will disable the SerialConsole by not initializing the StreamAPI.
### Debug Log
+
Acceptable values: `true` or `false`
By default we turn off logging as soon as an API client connects. Set this to true to leave the debug log outputting even when API is active.
+### GPIO for user button
+
+This is the GPIO pin number that will be used for the user button, if your device does not come with a predefined user button.
+
+### GPIO for PWM Buzzer
+
+This is the GPIO pin number that will be used for the PWM buzzer, if your device does not come with a predefined buzzer.
+
+### Node Info Broadcast Seconds
+
+This is the number of seconds between NodeInfo message broadcasts from the device. The device will still respond ad-hoc to NodeInfo messages when a response is wanted.
+
## Device Config Client Availability
diff --git a/docs/configuration/device-config/display.mdx b/docs/configuration/device-config/display.mdx
index a2e4a89a..5bdfa7e4 100644
--- a/docs/configuration/device-config/display.mdx
+++ b/docs/configuration/device-config/display.mdx
@@ -5,52 +5,68 @@ slug: /settings/config/display
sidebar_label: Display
---
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
-The display config options are: Screen On Duration, Auto Carousel Interval, Always Point North and GPS Format. Display config uses an admin message sending a `Config.Display` protobuf.
+The display config options are: Screen On Duration, Auto Carousel Interval, Always Point North and GPS Format. Display config uses an admin message sending a `Config.Display` protobuf.
## Device Config Values
### Screen On Duration
+
How long the screen remains on after the user button is pressed or messages are received.
### Auto Carousel Interval
+
Automatically toggles to the next page on the screen like a carousel, based the specified interval.
### Always Point North
+
If this is set, the compass heading on the screen outside of the circle will always point north. This feature is off by default and the top of display represents your heading direction, the North indicator will move around the circle.
### GPS Format
+
The format used to display GPS coordinates on the device screen.
Acceptable values:
-| Value | Description |
-| :-------: | :--------------------------: |
-| `DEC` | Decimal Degrees |
-| `DMS` | Degrees Minutes Seconds |
-| `UTM` | Universal Transverse Mercator |
-| `MGRS` | Military Grid Reference System |
-| `OLC` | Open Location Code (Plus Codes) |
-| `OSGR` | Ordnance Survey Grid Reference |
+| Value | Description |
+| :----: | :-----------------------------: |
+| `DEC` | Decimal Degrees |
+| `DMS` | Degrees Minutes Seconds |
+| `UTM` | Universal Transverse Mercator |
+| `MGRS` | Military Grid Reference System |
+| `OLC` | Open Location Code (Plus Codes) |
+| `OSGR` | Ordnance Survey Grid Reference |
### Prefered display units
+
switch between `METRIC` (default) and `IMPERIAL` units
### Flip Screen
+
If enabled, the screen will be rotated 180 degrees, for cases that mount the screen upside down
### OLED Defintion
-The type of OLED Controller is auto-detected by default, but can be defined with this setting if the auto-detection fails.
+
+The type of OLED Controller is auto-detected by default, but can be defined with this setting if the auto-detection fails. For the SH1107, we assume a square display with 128x128 Pixels like the GME128128-1.
Acceptable values:
-| Value | Description |
-| :-------: | :--------------------------: |
-| `OLED_AUTO` | Auto detect display controller |
-| `OLED_SSD1306` | Always use SSD1306 driver |
-| `OLED_SH1106` | Always use SH1106 driver |
+| Value | Description |
+| :------------: | :-----------------------------------------: |
+| `OLED_AUTO` | Auto detect display controller |
+| `OLED_SSD1306` | Always use SSD1306 driver |
+| `OLED_SH1106` | Always use SH1106 driver |
+| `OLED_SH1107` | Always use SH1107 driver (Geometry 128x128) |
+
+### Display Mode
+
+The display mode can be set to `NORMAL` (default), `TWOCOLOR` or `INVERTED`. The `TWOCOLOR` mode is intended for OLED displays with the first line of output being a different color than the rest of the display. The `INVERTED` mode will invert that bicolor area, resulting in a white background headline on monochrome displays.
+
+### Heading Bold
+
+The heading can be hard to read when 'INVERTED' or 'TWOCOLOR' display mode is used. This setting will make the heading bold, so it is easier to read.
## Device Config Client Availability
@@ -90,15 +106,17 @@ All display config options are available in the python CLI. Example commands are
:::
-| Setting | Acceptable Values | Default |
-|-----------------------------------|--------------------------------------------|------------------------------|
-| display.auto_screen_carousel_secs | `integer` | Default of `0` is 10 minutes |
-| display.compass_north_top | `false`, `true` | `false` |
-| display.flip_screen | `fasle`, `true` | `false` |
-| display.gps_format | `DEC`, `DMS`, `UTM`, `MGRS`, `OLC`, `OSGR` | `DEC` |
-| display.oled | `OLED_AUTO`, `OLED_SSD1306`, `OLED_SH1106` | `OLED_AUTO` |
-| display.screen_on_secs | `integer` | Default of `0` is off. |
-| display.units | `METRIC`, `IMPERIAL` | `METRIC` |
+| Setting | Acceptable Values | Default |
+| --------------------------------- | --------------------------------------------------------- | ----------------------------- |
+| display.auto_screen_carousel_secs | `integer` | Default of `0` is off. |
+| display.compass_north_top | `false`, `true` | `false` |
+| display.flip_screen | `fasle`, `true` | `false` |
+| display.gps_format | `DEC`, `DMS`, `UTM`, `MGRS`, `OLC`, `OSGR` | `DEC` |
+| display.oled | `OLED_AUTO`, `OLED_SSD1306`, `OLED_SH1106`, `OLED_SH1107` | `OLED_AUTO` |
+| display.screen_on_secs | `integer` | Default of `0` is 10 minutes. |
+| display.units | `METRIC`, `IMPERIAL` | `METRIC` |
+| display.displaymode | `NORMAL`, `TWOCOLOR`, `INVERTED` | `NORMAL` |
+| display.heading_bold | `false`, `true` | `false` |
:::tip
@@ -131,6 +149,6 @@ meshtastic --set display.gps_format UTM
:::info
All display config options are available in the Web UI.
:::
-
+
diff --git a/docs/configuration/device-config/index.mdx b/docs/configuration/device-config/index.mdx
index 44c19e32..eb6f2a2c 100644
--- a/docs/configuration/device-config/index.mdx
+++ b/docs/configuration/device-config/index.mdx
@@ -8,14 +8,14 @@ sidebar_position: 1
There are several config sections in the Meshtastic firmware, these are broken out so they can be sent as small admin messages over the mesh.
-| Name | Description |
-|:----:|:-----------:|
-| [Bluetooth](/docs/settings/config/bluetooth) | Bluetooth config options are: Enabled, Pairing Mode and Fixed PIN. |
-| [Channels](/docs/settings/config/channels) | Channels config options are: Index, Role and Settings. |
-| [Device](/docs/settings/config/device) | Device config options are: Device Role, Serial Output, Debug Log and Factory Reset. |
-| [Display](/docs/settings/config/display) | Display config options are: Screen On Duration, Auto Carousel Interval, Always Point North, and GPS Format. |
-| [LoRa](/docs/settings/config/lora) | The LoRa config options are: Region, Modem Preset, Max Hops, Transmit Power, Bandwidth, Spread Factor, Coding Rate, Frequency Offset, Transmit Disabled and Ignore Incoming Array. |
-| [Network](/docs/settings/config/network) | Network config options are: WiFi Enabled, WiFi SSID, WiFi PSK, WiFi Mode and NTP Server. |
-| [Position](/docs/settings/config/position) | Position config options are: GPS Enabled, GPS Update Interval, GPS Attempt Time, Fixed Position, Smart Broadcast, Broadcast Interval and Position Packet Flags. |
-| [Power](/docs/settings/config/power) | Power config options are: Charge Current, Power Saving, Shutdown after losing power, ADC Multiplier Override Wait Bluetooth Interval, Mesh Super Deep Sleep Timeout, Super Deep Sleep Interval, Light Sleep Interval and Minimum Wake Interval. |
-| [User](/docs/settings/config/user) | The user config options are: Long Name, Short Name, and Is Licensed |
\ No newline at end of file
+| Name | Description |
+| :------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
+| [Bluetooth](/docs/settings/config/bluetooth) | Bluetooth config options are: Enabled, Pairing Mode and Fixed PIN. |
+| [Channels](/docs/settings/config/channels) | Channels config options are: Index, Role and Settings. |
+| [Device](/docs/settings/config/device) | Device config options are: Device Role, Serial Output, Debug Log and Factory Reset. |
+| [Display](/docs/settings/config/display) | Display config options are: Screen On Duration, Auto Carousel Interval, Always Point North, and GPS Format. |
+| [LoRa](/docs/settings/config/lora) | The LoRa config options are: Region, Modem Preset, Max Hops, Transmit Power, Bandwidth, Spread Factor, Coding Rate, Frequency Offset, Transmit Disabled and Ignore Incoming Array. |
+| [Network](/docs/settings/config/network) | Network config options are: WiFi Enabled, WiFi SSID, WiFi PSK, WiFi Mode and NTP Server. |
+| [Position](/docs/settings/config/position) | Position config options are: GPS Enabled, GPS Update Interval, GPS Attempt Time, Fixed Position, Smart Broadcast, Broadcast Interval and Position Packet Flags. |
+| [Power](/docs/settings/config/power) | Power config options are: Charge Current, Power Saving, Shutdown after losing power, ADC Multiplier Override Wait Bluetooth Interval, Mesh Super Deep Sleep Timeout, Super Deep Sleep Interval, Light Sleep Interval and Minimum Wake Interval. |
+| [User](/docs/settings/config/user) | The user config options are: Long Name, Short Name, and Is Licensed |
diff --git a/docs/configuration/device-config/lora.mdx b/docs/configuration/device-config/lora.mdx
index 8848bc41..011dfc12 100644
--- a/docs/configuration/device-config/lora.mdx
+++ b/docs/configuration/device-config/lora.mdx
@@ -5,11 +5,15 @@ slug: /settings/config/lora
sidebar_label: LoRa
---
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
-import LoRaRegions from '../../blocks/_lora-regions.mdx';
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
+import LoRaRegions from "../../blocks/_lora-regions.mdx";
-The LoRa config options are: Region, Modem Preset, Max Hops, Transmit Power, Bandwidth, Spread Factor, Coding Rate, Frequency Offset, Transmit Enabled, Channel Number and Ignore Incoming Array. LoRa config uses an admin message sending a `Config.LoRa` protobuf.
+The LoRa config options are: Region, Modem Preset, Max Hops, Transmit Power, Bandwidth, Spread Factor, Coding Rate, Frequency Offset, Transmit Enabled, Channel Number and Ignore Incoming Array. LoRa config uses an admin message sending a `Config.LoRa` protobuf.
+
+:::note
+In order to communicate fully, devices within a mesh must have identical settings for Region and Modem Preset, or identical custom Modem settings.
+:::
## LoRa Config Values
@@ -18,14 +22,40 @@ You must set your device's `lora.region` setting. This will ensure that you are
:::
### Region
+
Sets the region for your node. Default is `unset`. As long as this is not set, the node screen will display a message and not transmit any packets.
### Modem Preset
-Use a sensible default for the modem. Default is `unset` which equates to `LONG_FAST`. Also 'Use Presets' has to be defined, which is the default. If 'Use Presets' is not defined, the modem will be configured manually with Bandwidth, Spread Factor, and Coding Rate.
+
+Default is `unset` which equates to `LONG_FAST`. Presets are pre-defined modem settings (Bandwidth, Spread Factor, and Coding Rate) which influence both message speed and range. The default will provide a strong mixture of speed and range, for most users.
+
+The presets are designed to provide further options for optimizing either speed (and reduced network congestion) or range, which can be useful for two real world scenarios:
+
+1. A high number of devices exist in the mesh, or messages are sent very frequently. Faster speeds (and therefore lower radio time per device) can help with mesh network congestion.
+2. Maximum range is desired, for long range scenarios where a several second delay in message receipt is acceptable (for instance, attempting to send messages from a town to a distant mountain top).
+
+The Presets available are as follows, and follow a linear pattern of Fastest <--> Slowest, and Shortest <--> Longest range:
+
+1. `SHORT_FAST` (Fastest, highest bandwidth, lowest airtime, shortest range)
+
+2. `SHORT_SLOW`
+
+3. `MEDIUM_FAST`
+
+4. `MEDIUM_SLOW`
+
+5. `LONG_FAST` (Default)
+
+6. `LONG_MODERATE`
+
+7. `LONG_SLOW`
+
+8. `VERY_LONG_SLOW` (Slowest, lowest bandwidth, highest airtime, longest range)
### Max Hops
+
Maximum number of hops. This can't be greater than 7. Default is 3 which should be fine for most applications. _**Really, 3 is fine.**_
### Transmit Power
@@ -61,6 +91,7 @@ Allows you to enable and disable transmit (TX) from the LoRa radio. Useful for h
Defaults to true
### Channel Number
+
This is controlling the actual hardware frequency the radio is transmitting on. A channel number between 1 and NUM_CHANNELS (whatever the max is in the current region). If this is ZERO/UNSET then the rule is "use the old channel name hash based algorithm to derive the channel number".
### Ignore Incoming Array
@@ -110,18 +141,27 @@ LoRa config commands are available in the python CLI. Example commands are below
:::
-| Setting | Acceptable Values | Default |
-| :----------: | :---------------------------------------------------------------------------: | :---------------: |
-| lora.modem_preset | `LONG_FAST`, `LONG_SLOW`, `VERY_LONG_SLOW`, `MEDIUM_SLOW`, `MEDIUM_FAST`, `SHORT_SLOW`, `SHORT_FAST` | `LONG_FAST` |
-| lora.region | `UNSET`, `US`, `EU_433`, `EU_868`, `CN`, `JP`, `ANZ`, `KR`, `TW`, `RU` ,`IN`, `NZ_865`, `TH`, `LORA_24` | `UNSET` |
-| lora.hop_limit | `1`,`2`,`3`,`4`,`5`,`6`,`7` | `3` |
-| lora.override_duty_cycle | `false`, `true` | `false` |
+| Setting | Acceptable Values | Default |
+| :-------------------------: | :-------------------------------------------------------------------------------------------------------------------------: | :---------: |
+| lora.modem_preset | `LONG_FAST`, `LONG_SLOW`, `VERY_LONG_SLOW`, `MEDIUM_SLOW`, `MEDIUM_FAST`, `SHORT_SLOW`, `SHORT_FAST` | `LONG_FAST` |
+| lora.use_preset | `false`, `true` | `false` |
+| lora.region | `UNSET`, `US`, `EU_433`, `EU_868`, `CN`, `JP`, `ANZ`, `KR`, `TW`, `RU` ,`IN`, `NZ_865`, `TH`, `LORA_24`, `UA_433`, `UA_868` | `UNSET` |
+| lora.bandwidth | `31`, `62`, `125`, `250`, `500` | `250` |
+| lora.spread_factor | `7`, `8`, `9`, `10`, `11`, `12` | `12` |
+| lora.coding_rate | `5`, `6`, `7`, `8` | `8` |
+| lora.frequency_offset | `0` to `1000000` | `0` |
+| lora.hop_limit | `1`,`2`,`3`,`4`,`5`,`6`,`7` | `3` |
+| lora.tx_power | `0` to `30` | `0` |
+| lora.tx_enabled | `false`, `false` | `true` |
+| lora.channel_num | `0`, `1` to `NUM_CHANNELS` | `0` |
+| lora.override_duty_cycle | `false`, `true` | `false` |
+| lora.sx126x_rx_boosted_gain | `false`, `true` | `false` |
+| lora.override_frequency | Any supported frequency the LoRA radio is capable of. Please respect local rules and regulations | `0` |
:::tip
Because the device will reboot after each command is sent via CLI, it is recommended when setting multiple values in a config section that commands be chained together as one.
-
```shell title="Example:"
meshtastic --set lora.region US --set lora.modem_preset LONG_FAST
```
diff --git a/docs/configuration/device-config/network.mdx b/docs/configuration/device-config/network.mdx
index 1d6b0562..aaea49ab 100644
--- a/docs/configuration/device-config/network.mdx
+++ b/docs/configuration/device-config/network.mdx
@@ -5,8 +5,8 @@ slug: /settings/config/network
sidebar_label: Network
---
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
The Network config options are: WiFi Enabled, WiFi SSID, WiFi PSK, Ethernet Enabled, IPv4 Networking Mode, Static Address and NTP Server. Network config uses an admin message sending a `Config.Network` protobuf.
@@ -56,7 +56,6 @@ Set to `DHCP` by default. Change to `STATIC` to use a static IP address. Applies
contains ip, gateway, subnet and dns server in case you want a static configuration.
-
:::tip
The first time your device restarts after enabling WiFi or Ethernet, it will take an additional 20-30 seconds to boot. This is to generate self-signed SSL keys. The keys will be saved for future reuse.
:::
@@ -103,12 +102,12 @@ All Network config options are available in the python CLI.
:::
-| Setting | Acceptable Values | Default |
-| :-----------: | :---------------: | :-----: |
-| network.ntp_server | string | `0.pool.ntp.org` |
-| network.wifi_enabled | `true`, `false` | `false` |
-| network.wifi_psk | string | `""` |
-| network.wifi_ssid | string | `""` |
+| Setting | Acceptable Values | Default |
+| :------------------: | :---------------: | :--------------: |
+| network.ntp_server | string | `0.pool.ntp.org` |
+| network.wifi_enabled | `true`, `false` | `false` |
+| network.wifi_psk | string | `""` |
+| network.wifi_ssid | string | `""` |
:::tip
@@ -149,7 +148,7 @@ meshtastic --set network.wifi_psk "my password"
:::info
All Network config options are available in the Web UI.
:::
-
+
@@ -160,18 +159,6 @@ All Network config options are available in the Web UI.
With `network.wifi_ssid` & `network.wifi_psk` populated, the device will know to connect to your network. Make sure you are in range of your WiFi. If you have a single Meshtastic device on your local network it's easy to connect to your device with DNS `http://meshtastic.local`. If you have multiple Meshtastic devices you will need to connect using their respective IP addresses.
-If you have a screen attached to your device, the final page will display something similar to the following:
-
-```
-WiFi: Software AP (Admin)
-IP: 192.168.42.1 (0/4)
-SSID: myNetwork
-http://meshtastic.local
- * * * * *
-```
-
-You should then be able to connect to the node using either the displayed IP address or the HTTP link.
-
### Disable WiFi
-To disable WiFi completely, set `network.wifi_enabled` to `false`.
\ No newline at end of file
+To disable WiFi completely, set `network.wifi_enabled` to `false`.
diff --git a/docs/configuration/device-config/position.mdx b/docs/configuration/device-config/position.mdx
index fc1e0465..bce48a09 100644
--- a/docs/configuration/device-config/position.mdx
+++ b/docs/configuration/device-config/position.mdx
@@ -5,17 +5,18 @@ slug: /settings/config/position
sidebar_label: Position
---
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
-The position config options are: GPS Enabled, GPS Update Interval, GPS Attempt Time, Fixed Position, Smart Broadcast, Broadcast Interval and Position Packet Flags. Position config uses an admin message sending a `Config.Position` protobuf.
+The position config options are: GPS Enabled, GPS Update Interval, GPS Attempt Time, Fixed Position, Smart Broadcast, Broadcast Interval and Position Packet Flags. Position config uses an admin message sending a `Config.Position` protobuf.
Position data from GPS is provided by either the radio or your paired phone. Position data is not required to use Meshtastic but time calculations require at least one device on the mesh have either a GPS or internet connection for time.
## Position Config Values
### GPS Disabled
-Acceptable values: `true` or `false`
+
+Acceptable values: `true` or `false`
Defaults to false. Should the device GPS be disabled for this node?
@@ -25,18 +26,19 @@ How often should we try to get GPS position (in seconds), or zero for the defaul
### GPS Attempt Time
-How long should we try to get our position during each GPS update interval attempt? (in seconds) Or if zero, use the default of 30 seconds.
+How long should we try to get our position during each GPS update interval attempt? (in seconds) Or if zero, use the default of 30 seconds.
### Fixed Position
-Acceptable values: `true` or `false`
+Acceptable values: `true` or `false`
Off by default
If set, this node is at a fixed position. The device will generate GPS updates at the regular GPS update interval, but use whatever the last lat/lon/alt it saved for the node. The lat/lon/alt can be set by an internal GPS or with the help of the mobile device's GPS.
### Smart Broadcast
-Acceptable values: `true` or `false`
+
+Acceptable values: `true` or `false`
On by default
@@ -54,27 +56,29 @@ If smart broadcast is of we should send our position this often (but only if it
The GPS updates will be sent out every Broadcast Interval, with either the actual GPS location, or an empty location if no GPS fix was achieved. This defaults to broadcast every 15 minutes.
- ### Position Flags
+### Position Flags
- Bit field of boolean configuration options for POSITION messages (bitwise OR of PositionFlags)
+Bit field of boolean configuration options for POSITION messages (bitwise OR of PositionFlags)
-| Value | Description |
-| :-----------: | :---------------------------------------------------------: |
-| UNSET | Required for compilation |
-| ALTITUDE | Include an altitude value (if available) |
-| ALTITUDE_MSL | Altitude value is MSL |
-| GEOIDAL_SEPARATION | Include geoidal separation |
-| DOP | Include the DOP value ; PDOP used by default, see below |
-| HVDOP | If POS_DOP set, send separate HDOP / VDOP values instead of PDOP |
-| SATINVIEW | Include number of "satellites in view" |
-| SEQ_NO | Include a sequence number incremented per packet |
-| TIMESTAMP | Include positional timestamp (from GPS solution) |
-| HEADING | Include positional heading (from GPS solution) |
-| SPEED | Include positional speed (from GPS solution) |
+| Value | Description |
+| :----------------: | :--------------------------------------------------------------: |
+| UNSET | Required for compilation |
+| ALTITUDE | Include an altitude value (if available) |
+| ALTITUDE_MSL | Altitude value is MSL |
+| GEOIDAL_SEPARATION | Include geoidal separation |
+| DOP | Include the DOP value ; PDOP used by default, see below |
+| HVDOP | If POS_DOP set, send separate HDOP / VDOP values instead of PDOP |
+| SATINVIEW | Include number of "satellites in view" |
+| SEQ_NO | Include a sequence number incremented per packet |
+| TIMESTAMP | Include positional timestamp (from GPS solution) |
+| HEADING | Include positional heading (from GPS solution) |
+| SPEED | Include positional speed (from GPS solution) |
+### GPIO RX/TX for GPS Module
+If your device does not have a fixed GPS chip, you can define the GPIO pins for the RX and TX pins of a GPS module.
- ## Position Config Client Availability
+## Position Config Client Availability
-:::info
+:::info
All Position config commands are available in the python CLI. Example commands are below:
:::
-| Setting | Acceptable Values | Default |
-| :----------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------: |
-| position.gps_enabled | `true`, `false` | `true` |
-| position.gps_update_interval | `integer` (seconds) | Default `0` is 30 Seconds |
-| position.gps_attempt_time | `integer` (seconds) | Default of `0` is 30 Seconds |
-| position.fixed_position | `true`, `false` | `false` |
-| position.position_broadcast_smart_enabled | `true`, `false` | `true` |
-| position.position_broadcast_secs | `integer` (seconds) | Default of `0` is 15 Minutes |
-| position.flags | `UNSET`, `ALTITUDE`, `ALTITUDE_MSL`, `GEOIDAL_SEPARATION`, `DOP`, `HVDOP`, `PDOP`, `SATINVIEW`, `SEQ_NO`, `TIMESTAMP`, `HEADING`, `SPEED` | `UNSET` |
+| Setting | Acceptable Values | Default |
+| :---------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------: |
+| position.gps_enabled | `true`, `false` | `true` |
+| position.gps_update_interval | `integer` (seconds) | Default `0` is 30 Seconds |
+| position.gps_attempt_time | `integer` (seconds) | Default of `0` is 30 Seconds |
+| position.fixed_position | `true`, `false` | `false` |
+| position.position_broadcast_smart_enabled | `true`, `false` | `true` |
+| position.position_broadcast_secs | `integer` (seconds) | Default of `0` is 15 Minutes |
+| position.flags | `UNSET`, `ALTITUDE`, `ALTITUDE_MSL`, `GEOIDAL_SEPARATION`, `DOP`, `HVDOP`, `PDOP`, `SATINVIEW`, `SEQ_NO`, `TIMESTAMP`, `HEADING`, `SPEED` | `UNSET` |
+| position.rx_gpio | `integer` (0-39) | `UNSET` |
+| position.tx_gpio | `integer` (0-34) | `UNSET` |
:::tip
@@ -183,7 +189,7 @@ meshtastic --pos-fields UNSET
:::info
All position config options are available in the Web UI.
:::
-
+
diff --git a/docs/configuration/device-config/power.mdx b/docs/configuration/device-config/power.mdx
index 8d36d5fb..ecd33888 100644
--- a/docs/configuration/device-config/power.mdx
+++ b/docs/configuration/device-config/power.mdx
@@ -5,10 +5,10 @@ slug: /settings/config/power
sidebar_label: Power
---
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
-The power config options are: Power Saving, Shutdown after losing power, ADC Multiplier Override Wait Bluetooth Interval, Mesh Super Deep Sleep Timeout, Super Deep Sleep Interval, Light Sleep Interval and Minimum Wake Interval. Power config uses an admin message sending a `Config.Power` protobuf.
+The power config options are: Power Saving, Shutdown after losing power, ADC Multiplier Override Wait Bluetooth Interval, Mesh Super Deep Sleep Timeout, Super Deep Sleep Interval, Light Sleep Interval and Minimum Wake Interval. Power config uses an admin message sending a `Config.Power` protobuf.
Power settings are advanced configuration, most users should choose a role under Device Config to manage power for their device and should never need to touch any of these settings.
@@ -16,14 +16,13 @@ Power settings are advanced configuration, most users should choose a role under
### Power Saving
-If set, we are powered from a low-current source (i.e. solar), so even if it looks like we have power flowing in we should try to minimize power consumption as much as possible.
+If set, Bluetooth, Wifi, and screen (if applicable) are turned off. When using the Router device role, this setting is on by default. The assumption for a Router is that the device will be used in a standalone manner where these features are not needed, and will be shut off to conserve power. This is especially useful when a device is powered from a low-current source (i.e. solar).
### Shutdown after losing power
Automatically shut down a device after a defined time period if power is lost.
-### ADC Multiplier Override
-**Fixes issues on Heltec v2**
+### ADC Multiplier Override `Fixes issues on Heltec v2`
Ratio of voltage divider for battery pin e.g. 3.20 (R1=100k, R2=220k)
@@ -39,21 +38,19 @@ How long wait before turning off BLE in no Bluetooth states
### Mesh Super Deep Sleep Timeout
-While in Light Sleep if this value is exceeded we will lower into super deep sleep
+While in Light Sleep if this value is exceeded we will lower into super deep sleep
or Super Deep Sleep Interval (default 1 year) or a button press
`0` for default of two hours, MAXUINT for disabled
-### Super Deep Sleep Interval
+### Super Deep Sleep Interval
While in Light Sleep if Mesh Super Deep Sleep Timeout Seconds is exceeded we will lower into super deep sleep or this value (default 1 year) or a button press
`0` for default of one year
-### Light Sleep Interval
-
-**ESP32 Only Setting**
+### Light Sleep Interval `ESP32 Only Setting`
In light sleep the CPU is suspended, LoRa radio is on, BLE is off an GPS is on
@@ -98,22 +95,22 @@ Power config is not available on Apple OS's.
-:::info
+:::info
All Power config options are available in the python CLI.
:::
-| Setting | Acceptable Values | Default |
-| :----------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------: |
-| power.is_power_saving | `true`, `false` | `false` |
-| power.on_battery_shutdown_after_secs | `integer` (seconds) | Default of `0` is off |
-| power.adc_multiplier_override | `2-4` (floating point value) | Default of `0` uses firmware values |
-| power.wait_bluetooth_secs | `integer` (seconds) | Default of `0` is 1 minute |
-| power.mesh_sds_timeout_secs | `integer` (seconds) | Default of `0` is 2 hours |
-| power.sds_secs | `integer` (seconds) | Default of `0` is 1 year |
-| power.ls_secs | `integer` (seconds) | Default of `0` is 1 hour |
-| power.min_wake_secs | `integer` (seconds) | Default of `0` is 10 seconds |
+| Setting | Acceptable Values | Default |
+| :----------------------------------: | :--------------------------: | :---------------------------------: |
+| power.is_power_saving | `true`, `false` | `false` |
+| power.on_battery_shutdown_after_secs | `integer` (seconds) | Default of `0` is off |
+| power.adc_multiplier_override | `2-4` (floating point value) | Default of `0` uses firmware values |
+| power.wait_bluetooth_secs | `integer` (seconds) | Default of `0` is 1 minute |
+| power.mesh_sds_timeout_secs | `integer` (seconds) | Default of `0` is 2 hours |
+| power.sds_secs | `integer` (seconds) | Default of `0` is 1 year |
+| power.ls_secs | `integer` (seconds) | Default of `0` is 1 hour |
+| power.min_wake_secs | `integer` (seconds) | Default of `0` is 10 seconds |
:::tip
@@ -161,12 +158,13 @@ meshtastic --set power.ls_secs 120
meshtastic --set power.min_wake_secs 0
meshtastic --set power.min_wake_secs 120
```
+
:::info
All power config options are available in the Web UI.
:::
-
+
-
\ No newline at end of file
+
diff --git a/docs/configuration/device-config/user.mdx b/docs/configuration/device-config/user.mdx
index 4b6a770a..e7fe8bb2 100644
--- a/docs/configuration/device-config/user.mdx
+++ b/docs/configuration/device-config/user.mdx
@@ -5,8 +5,8 @@ slug: /settings/config/user
sidebar_label: User
---
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
The user config options are: Long Name, Short Name, and Is Licensed. User config uses an admin message sending a `User` protobuf.
@@ -51,7 +51,7 @@ values={[
:::info
-User Config options are available for Android.
+User Config options are available for Android.
1. Open the Meshtastic App
2. Navigate to: **Vertical Ellipsis (3 dots top right) > Device Settings > User Config**
@@ -109,4 +109,4 @@ All User config options are available in the Web UI.
:::
-
\ No newline at end of file
+
diff --git a/docs/configuration/gpio-peripherals.mdx b/docs/configuration/gpio-peripherals.mdx
index 0169846d..2f07cb59 100644
--- a/docs/configuration/gpio-peripherals.mdx
+++ b/docs/configuration/gpio-peripherals.mdx
@@ -6,7 +6,6 @@ slug: /hardware/peripheral/
sidebar_position: 6
---
-
## Firmware Versions
:::warning
@@ -47,7 +46,7 @@ The procedure using the python command line tool is:
meshtastic --ch-add gpio
```
3. If doing local testing, you may also want to change the speed of the channel:
- ```sh
+ ```shell
meshtastic --ch-mediumfast
```
4. Check the channel has been created and copy the long "Complete URL" that contains all the channels on that device:
@@ -144,7 +143,6 @@ By default, the pin may be "off" or "on". (It will most likely "off".) See the s

-
## Using GPIOs from the Python CLI
### Writing a GPIO
@@ -178,4 +176,4 @@ meshtastic --port /dev/ttyUSB0 --gpio-watch 0x10 --dest 28979058
# Received RemoteHardware typ=GPIOS_CHANGED, gpio_value=0
# Received RemoteHardware typ=GPIOS_CHANGED, gpio_value=16
# < press ctrl-c to exit >
-```
\ No newline at end of file
+```
diff --git a/docs/configuration/module-config/audio.mdx b/docs/configuration/module-config/audio.mdx
index 7fda6ab7..ffe6e6b6 100644
--- a/docs/configuration/module-config/audio.mdx
+++ b/docs/configuration/module-config/audio.mdx
@@ -5,8 +5,8 @@ slug: /settings/moduleconfig/audio
sidebar_label: Audio
---
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
The audio module config options are: Codec2 Enabled, PTT GPIO, Audio Bitrate/Codec Mode, I2S Word Select, I2S Data IN, I2S Data OUT and I2S Clock. Audio Module config uses an admin message sending a `ConfigModule.Audio` protobuf.
@@ -26,15 +26,15 @@ The GPIO to use for the Push-To-Talk button. The default is GPIO 39 on the ESP32
The bitrate to use for audio. The default is `CODEC2_700B`. The available options are:
- * CODEC2_DEFAULT
- * CODEC2_3200
- * CODEC2_2400
- * CODEC2_1600
- * CODEC2_1400
- * CODEC2_1300
- * CODEC2_1200
- * CODEC2_700B
- * CODEC2_700
+- CODEC2_DEFAULT
+- CODEC2_3200
+- CODEC2_2400
+- CODEC2_1600
+- CODEC2_1400
+- CODEC2_1300
+- CODEC2_1200
+- CODEC2_700B
+- CODEC2_700
### I2S Word Select
@@ -53,7 +53,7 @@ The GPIO to use for the DIN signal in the I2S interface.
The GPIO to use for the SCK signal in the I2S interface.
:::info What is this?
-These Pins comprise an I2S digital audio interface. Meshtastic uses it in monoaural mode. The software will use the logical 'LEFT' Stereo channel for the microphone and the logical 'RIGHT' Stereo channel for the speaker, so configure your breakouts accordingly. Audio is Half-Duplex, so we can re-use part of the pins for a bi-directional configuration. There's __no__ default pin assigment, setting these is mandatory.
+These Pins comprise an I2S digital audio interface. Meshtastic uses it in monoaural mode. The software will use the logical 'LEFT' Stereo channel for the microphone and the logical 'RIGHT' Stereo channel for the speaker, so configure your breakouts accordingly. Audio is Half-Duplex, so we can re-use part of the pins for a bi-directional configuration. There's **no** default pin assigment, setting these is mandatory.
:::
## Audio Module Config Client Availability
@@ -88,21 +88,21 @@ Audio module config is not available on iOS, iPadOS and macOS.
-:::info
+:::info
All audio module config options are available in the python CLI. Example commands are below:
:::
-| Setting | Acceptable Values | Default |
-| :-------------------: | :-----------------: | :-----: |
-| audio.enabled | `true`, `false` | `false` |
-| audio.ptt_pin | GPIO Pin Number 1-39 | Default of `39` is Unset |
-| audio.bitrate | `CODEC2_DEFAULT` `CODEC2_3200` `CODEC2_2400` `CODEC2_1600` `CODEC2_1400` `CODEC2_1300` `CODEC2_1200` `CODEC2_700B` `CODEC2_700` | `CODEC2_DEFAULT` |
-| audio.i2s_ws | GPIO Pin Number 1-34 | no Default |
-| audio.i2s_sd | GPIO Pin Number 1-39 | no Default |
-| audio.i2s_din | GPIO Pin Number 1-34 | no Default |
-| audio.i2s_sck | GPIO Pin Number 1-34 | no Default |
+| Setting | Acceptable Values | Default |
+| :-----------: | :-----------------------------------------------------------------------------------------------------------------------------: | :----------------------: |
+| audio.enabled | `true`, `false` | `false` |
+| audio.ptt_pin | GPIO Pin Number 1-39 | Default of `39` is Unset |
+| audio.bitrate | `CODEC2_DEFAULT` `CODEC2_3200` `CODEC2_2400` `CODEC2_1600` `CODEC2_1400` `CODEC2_1300` `CODEC2_1200` `CODEC2_700B` `CODEC2_700` | `CODEC2_DEFAULT` |
+| audio.i2s_ws | GPIO Pin Number 1-34 | no Default |
+| audio.i2s_sd | GPIO Pin Number 1-39 | no Default |
+| audio.i2s_din | GPIO Pin Number 1-34 | no Default |
+| audio.i2s_sck | GPIO Pin Number 1-34 | no Default |
:::tip
@@ -142,7 +142,7 @@ meshtastic --set audio.bitrate CODEC2_1400
:::info
All audio module config options are available in the Web UI.
:::
-
+
diff --git a/docs/configuration/module-config/canned-message.mdx b/docs/configuration/module-config/canned-message.mdx
index 01322006..b2dce0db 100644
--- a/docs/configuration/module-config/canned-message.mdx
+++ b/docs/configuration/module-config/canned-message.mdx
@@ -5,12 +5,12 @@ slug: /settings/moduleconfig/canned-message
sidebar_label: Canned Message
---
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
The Canned Message Module will allow you to send messages to the mesh network from the device without using the phone app. You can predefine text messages to choose from.
-The canned message module config options are: Enabled, Save, and Sender. Range Test Module config uses an admin message sending a `ConfigModule.CannedMessage` protobuf.
+The canned message module config options are: Enabled, Save, and Sender. Range Test Module config uses an admin message sending a `ConfigModule.CannedMessage` protobuf.
## Canned Message Module Config Values
@@ -23,7 +23,7 @@ Enables the canned message module.
Sends a bell character with each message.
The [External Notification Module](external-notification) can be set up to beep when a new message arrives.
-This module can also be configured to beep only when message contains the bell character.
+This module can also be configured to beep only when message contains the bell character.
### Messages
@@ -33,12 +33,12 @@ The list of pre-set messages, up to 200 bytes.
Input event sources accepted by the canned message module.
-| Value | Description |
-| :----------: | :---------------------------------------------------------------------: |
-| `_any` | Default. Allows any peripheral input device connected to the device. |
-| `rotEnc1` | Basic Rotary Encoder |
-| `upDownEnc1` | Up Down Encoder (use this also for RAK14006 Rotary Encoder) |
-| `cardkb` | M5 Stack CardKB (this covers RAK14004 Keymatrix) |
+| Value | Description |
+| :----------: | :------------------------------------------------------------------: |
+| `_any` | Default. Allows any peripheral input device connected to the device. |
+| `rotEnc1` | Basic Rotary Encoder |
+| `upDownEnc1` | Up Down Encoder (use this also for RAK14006 Rotary Encoder) |
+| `cardkb` | M5 Stack CardKB (this covers RAK14004 Keymatrix) |
### Rotary Encoder Enabled
@@ -106,25 +106,25 @@ All canned message module config options are available on iOS, iPadOS and macOS
:::info
-All canned message module config options are available in the python CLI.
+All canned message module config options are available in the python CLI.
:::
Example commands are below:
-| Setting | Acceptable Values | Default |
-| :--------------------------------------: | :---------------: | :-----------: |
-| canned_message.enabled | `true`, `false` | `false` |
-| canned_message.send_bell | `true`, `false` | `false` |
-| canned_message.allow_input_source | `rotEnc1`, `_any`, `upDownEnc1`, `cardkb` | `_any` |
-| canned_message.messages | `string` | `""` |
-| (Messages)\* | `string` | `""` |
-| canned_message.inputbroker_event_cw | `InputEventChar` | (not defined) |
-| canned_message.inputbroker_event_ccw | `InputEventChar` | (not defined) |
-| canned_message.inputbroker_event_press | `InputEventChar` | (not defined) |
-| canned_message.inputbroker_pin_a | `integer` | (not defined) |
-| canned_message.inputbroker_pin_b | `integer` | (not defined) |
-| canned_message.inputbroker_pin_press | `integer` | (not defined) |
+| Setting | Acceptable Values | Default |
+| :------------------------------------: | :---------------------------------------: | :-----------: |
+| canned_message.enabled | `true`, `false` | `false` |
+| canned_message.send_bell | `true`, `false` | `false` |
+| canned_message.allow_input_source | `rotEnc1`, `_any`, `upDownEnc1`, `cardkb` | `_any` |
+| canned_message.messages | `string` | `""` |
+| (Messages)\* | `string` | `""` |
+| canned_message.inputbroker_event_cw | `InputEventChar` | (not defined) |
+| canned_message.inputbroker_event_ccw | `InputEventChar` | (not defined) |
+| canned_message.inputbroker_event_press | `InputEventChar` | (not defined) |
+| canned_message.inputbroker_pin_a | `integer` | (not defined) |
+| canned_message.inputbroker_pin_b | `integer` | (not defined) |
+| canned_message.inputbroker_pin_press | `integer` | (not defined) |
:::tip
@@ -188,13 +188,14 @@ meshtastic --set canned_message.inputbroker_event_ccw ""
meshtastic --set canned_message.inputbroker_event_press KEY_SELECT
meshtastic --set canned_message.inputbroker_event_press ""
```
+
:::info
All canned message module config options are available in the Web UI.
:::
-
+
@@ -227,7 +228,7 @@ Just use UP/DOWN/ENTER to select a predefined message and send it.
### Rotary encoder
-Meshtastic supports hardwired rotary encoders as input devices.
+Meshtastic supports hardwired rotary encoders as input devices.
You will need a generic rotary encoder. The types listed below has five legs where two is dedicated to a "press" action, but any other types will likely do the job. You can also use a three-legged version, where the "press" action should be wired from an independent switch.
@@ -241,7 +242,7 @@ You will need a generic rotary encoder. The types listed below has five legs whe
Connect your rotary encoder as follows. The rotary encoder has two rows of legs. One of the rows contains two legs, the other contains three legs. Bottom side view:
-```
+```text
B o --- o PRESS
GND o | |
A o --- o GND
@@ -251,7 +252,7 @@ The two legs is to sense the press action (or push). Connect one of the two to G
The three legs is to sense the rotation action. Connect the middle leg to GROUND and the ones on the side to GPIO pins. Let's call these ports 'A' and 'B', according to the scheme below.
-```
+```text
A --||
GND --||]========
B --||
@@ -267,7 +268,6 @@ Recommended GPIO pins for connecting a rotary encoder.
There is a reference case 3D-design utilizing the rotary encoder for TTGO LoRa V1:
[Case for TTGO-ESP32-LORA-OLED-v1.0 with rotary encoder](https://www.thingiverse.com/thing:5178495)
-
## Examples
- Attach a compatible peripheral device. Take note of the GPIO numbers you use, as they will be used in the following step.
@@ -286,6 +286,4 @@ meshtastic --set canned_message.inputbroker_event_press KEY_SELECT
meshtastic --set canned_message.rotary1_enabled True
```
-
That's it! With a functioning and enabled rotary encoder, you're ready to begin configuring the Canned Message Module.
-
diff --git a/docs/configuration/module-config/external-notification.mdx b/docs/configuration/module-config/external-notification.mdx
index e4be42ff..823dbdaa 100644
--- a/docs/configuration/module-config/external-notification.mdx
+++ b/docs/configuration/module-config/external-notification.mdx
@@ -5,32 +5,33 @@ slug: /settings/moduleconfig/external-notification
sidebar_label: External Notification
---
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
-The External Notification Module will allow you to connect a buzzer, speaker, LED, or other device to notify you when a message has been received from the mesh network.
+The External Notification Module will allow you to connect a buzzer, speaker, LED, or other device to notify you when a message has been received from the mesh network. You can enable up to 3 pins independently from each other.
- ## External Notification Module Config Values
+## External Notification Module Config Values
### Enabled
Enables the external notification module.
-### Alert when receiving a bell
+### Alert when receiving a bell (general / LED, Vibra and Buzzer)
Specifies if an alert should be triggered when receiving an incoming bell.
-### Alert when receiving a message
+### Alert when receiving a message (general / LED, Vibra and Buzzer)
Specifies if an alert should be triggered when receiving an incoming message.
-### Active
+### Active (general / LED only)
-Specifies whether the external circuit is triggered when the device's GPIO is low or high.
+Specifies whether the external circuit is active when the device's GPIO is low or high.
-### GPIO to monitor
+### GPIO Pins (general / LED, Vibra and Buzzer)
-Specifies the GPIO that your external circuit is attached to on the device. On devices that have a PWM buzzer, you can use the buzzer for notifications by setting this to the same pin the buzzer uses.
+Specifies the GPIO that your external circuit is attached to on the device. On devices that have a PWM buzzer, you can use the buzzer for notifications by setting the use_pwm property to TRUE. The Buzzer Pin will be ignored and the device.buzzer_gpio is used instead. If you enable PWM mode, the device will use
+so-called RTTTL ring tones for notification. You can find examples of RTTTL ring tones [here](https://www.laub-home.de/wiki/RTTTL_Songs) and upload them to the device via a client application.
:::info
On ESP32 based boards, GPIOs 34 to 39 are GPIs – input only pins. These pins do not have internal pull-up or pull-down resistors. They can not be used as outputs, so you can NOT use these pins as outputs.
@@ -38,10 +39,14 @@ On ESP32 based boards, GPIOs 34 to 39 are GPIs – input only pins. These pins d
### How long monitored GPIO is triggered
-Specifies how long in milliseconds you would like your external circuit to be triggered.
+Specifies how long in milliseconds you would like your GPIOs to be active. In case of the repeat option, this is the duration of every tone and pause.
Default of 0 is 1000ms
+### Repeat (Nag Timeout) (general / LED, Vibra and Buzzer)
+
+Specifies if the alert should be repeated. If set to a value greater than zero, the alert will be repeated until the user button is pressed or 'value' number of seconds have past.
+
## External Notification Module Config Client Availability
:::info
All External Notification module config is available for the Web UI.
:::
-
+
diff --git a/docs/configuration/module-config/index.mdx b/docs/configuration/module-config/index.mdx
index 54587c7f..24bc612e 100644
--- a/docs/configuration/module-config/index.mdx
+++ b/docs/configuration/module-config/index.mdx
@@ -8,13 +8,13 @@ sidebar_position: 3
Modules are included in the firmware and allow users to extend the functionality of their mesh or device.
-| Name | Description |
-|:----:|:-----------:|
-| [Audio](/docs/settings/moduleconfig/audio) | enable Support for Codec2 Voice Comms on certain devices |
-| [Canned Message](/docs/settings/moduleconfig/canned-message) | Set a number of predefined messages to send out directly from the device with the use of an input device like a rotary encoder. |
-| [External Notification](/docs/settings/moduleconfig/external-notification) | Incoming messages are able to alert you using circuits you attach to the device (LEDs, Buzzers, etc) |
-| [MQTT](/docs/settings/moduleconfig/mqtt) | Forward packets along to an MQTT server. This allows users on the local mesh to communicate with users on another mesh over the internet. |
-| [Range Test](/docs/settings/moduleconfig/range-test) | Send messages with GPS location at an interval to test the distance your devices can communicate. Requires (at least) one device set up as a sender and one as a receiver. The receiver(s) will log all incoming messages to a CSV. |
-| [Serial Module](/docs/settings/moduleconfig/serial) | Send messages across the mesh by sending strings over a serial port. |
-| [Telemetry](/docs/settings/moduleconfig/telemetry) | Attach sensors to the device and transmit readings on a regular interval to the mesh. |
-| [Traceroute](/docs/settings/moduleconfig/traceroute) | Track which nodes are used to hop a message to a certain destination. |
\ No newline at end of file
+| Name | Description |
+| :------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
+| [Audio](/docs/settings/moduleconfig/audio) | enable Support for Codec2 Voice Comms on certain devices |
+| [Canned Message](/docs/settings/moduleconfig/canned-message) | Set a number of predefined messages to send out directly from the device with the use of an input device like a rotary encoder. |
+| [External Notification](/docs/settings/moduleconfig/external-notification) | Incoming messages are able to alert you using circuits you attach to the device (LEDs, Buzzers, etc) |
+| [MQTT](/docs/settings/moduleconfig/mqtt) | Forward packets along to an MQTT server. This allows users on the local mesh to communicate with users on another mesh over the internet. |
+| [Range Test](/docs/settings/moduleconfig/range-test) | Send messages with GPS location at an interval to test the distance your devices can communicate. Requires (at least) one device set up as a sender and one as a receiver. The receiver(s) will log all incoming messages to a CSV. |
+| [Serial Module](/docs/settings/moduleconfig/serial) | Send messages across the mesh by sending strings over a serial port. |
+| [Telemetry](/docs/settings/moduleconfig/telemetry) | Attach sensors to the device and transmit readings on a regular interval to the mesh. |
+| [Traceroute](/docs/settings/moduleconfig/traceroute) | Track which nodes are used to hop a message to a certain destination. |
diff --git a/docs/configuration/module-config/mqtt.mdx b/docs/configuration/module-config/mqtt.mdx
index bf16ee79..66c00573 100644
--- a/docs/configuration/module-config/mqtt.mdx
+++ b/docs/configuration/module-config/mqtt.mdx
@@ -5,8 +5,8 @@ slug: /settings/moduleconfig/mqtt
sidebar_label: MQTT
---
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
If your device is connected to Internet via wifi or ethernet, you can enable it to forward packets along to an MQTT server. This allows users on the local mesh to communicate with users on the internet. One or more channels must be enabled as uplink and/or downlink for protobufs to be transmitted from and/or to the mesh (See [channels](/docs/settings/config/channels#downlink-enabled)). Without these settings the node will still connect to MQTT server and send status messages.
@@ -14,7 +14,7 @@ The MQTT module config options are: Enabled, Server Address, Username, Password,
## Settings
- ## MQTT Module Config Values
+## MQTT Module Config Values
### Enabled
@@ -78,14 +78,14 @@ All MQTT module config options are available in the python CLI. Example commands
:::
-| Setting | Acceptable Values | Default |
-| :--------------------------: | :----------------------: | :-----: |
-| mqtt.enabled | `true`, `false` | `false` |
-| mqtt.address | `string` | |
-| mqtt.username | `string` | |
-| mqtt.password | `string` | |
-| mqtt.encryption_enabled | `string` | |
-| mqtt.json_enabled | `true`, `false` | `false` |
+| Setting | Acceptable Values | Default |
+| :---------------------: | :---------------: | :-----: |
+| mqtt.enabled | `true`, `false` | `false` |
+| mqtt.address | `string` | |
+| mqtt.username | `string` | |
+| mqtt.password | `string` | |
+| mqtt.encryption_enabled | `string` | |
+| mqtt.json_enabled | `true`, `false` | `false` |
:::tip
@@ -113,6 +113,6 @@ meshtastic --set mqtt.json_enabled false
:::info
All MQTT module config options are available for the Web UI.
:::
-
+
diff --git a/docs/configuration/module-config/range-test.mdx b/docs/configuration/module-config/range-test.mdx
index ef2bdedf..6f1cacdb 100644
--- a/docs/configuration/module-config/range-test.mdx
+++ b/docs/configuration/module-config/range-test.mdx
@@ -5,12 +5,12 @@ slug: /settings/moduleconfig/range-test
sidebar_label: Range Test
---
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
This module allows you to test the range of your Meshtastic nodes. It requires at least two nodes, a sender and a receiver. The receiving node then saves the messages along with the GPS coordinates at which they were received into a .csv file. This .csv file can then be integrated into [Google Earth](https://earth.google.com), [Google Maps - My Maps](https://mymaps.google.com), or any other program capable of processing .csv files. This can enable you to visualize your mesh.
-The range test module config options are: Enabled, Save, and Sender. Range Test Module config uses an admin message sending a `ConfigModule.RangeTest` protobuf.
+The range test module config options are: Enabled, Save, and Sender. Range Test Module config uses an admin message sending a `ConfigModule.RangeTest` protobuf.
## Range Test Module Config Values
@@ -18,9 +18,7 @@ The range test module config options are: Enabled, Save, and Sender. Range Test
Enables the range test module.
-### Save CSV File
-
-**ESP32 Only Setting**
+### Save CSV File `ESP32 Only Setting`
If enabled, we will save a log of all received messages to a file named rangetest.csv which you can access from the web server Extensions > File Browser > rangetest.csv. The file will be created after receiving messages. The device will abort writing if there is less than 50k of space on the filesystem to prevent filling up the storage.
@@ -66,8 +64,8 @@ Range Test module config options are available in the python CLI. Example comman
:::
-| Setting | Acceptable Values | Default |
-| :-----------------------: | :-----------------: | :-----: |
+| Setting | Acceptable Values | Default |
+| :----------------: | :-----------------: | :-----: |
| range_test.enabled | `true`, `false` | `false` |
| range_test.save | `true`, `false` | `false` |
| range_test.sender | `integer` (Seconds) | `0` |
@@ -121,7 +119,7 @@ Be sure to turn off either the module configured as a sender or the device where
Also be mindful of your space usage on the file system. It has protections from filling up the space but it's best to delete old range test results.
:::note
-Leaving this module on can slow down your mesh. Currently, the messages are sent using the same `TEXT_MESSAGE_APP` [port that all other messages](/docs/developers/protobufs/api#portnumsproto) are sent on.
+Leaving this module on can slow down your mesh. Currently, the messages are sent using the same `TEXT_MESSAGE_APP` [port that all other messages](https://buf.build/meshtastic/protobufs/docs/main:meshtastic#meshtastic.PortNum) are sent on.
:::
### Accessing your CSV
@@ -137,12 +135,10 @@ http://198.168.0.15
| Radio Setting | `range_test.sender` |
| :-----------: | :-----------------: |
-| Long Slow | 60 |
-| Long Alt | 30 |
-| Medium | 15 |
-| Short Fast | 15 |
-
-
+| Long Slow | 60 |
+| Long Alt | 30 |
+| Medium | 15 |
+| Short Fast | 15 |
## Application Examples
diff --git a/docs/configuration/module-config/serial.mdx b/docs/configuration/module-config/serial.mdx
index e82773c5..ad724edb 100644
--- a/docs/configuration/module-config/serial.mdx
+++ b/docs/configuration/module-config/serial.mdx
@@ -5,16 +5,15 @@ slug: /settings/moduleconfig/serial
sidebar_label: Serial
---
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
-The serial module config options are: Enabled, Echo, Mode, Receive GPIO, Transmit GPIO and Sender. Serial Module config uses an admin message sending a `ConfigModule.Serial` protobuf.
+The serial module config options are: Enabled, Echo, Mode, Receive GPIO, Transmit GPIO and Sender. Serial Module config uses an admin message sending a `ConfigModule.Serial` protobuf.
This is a simple interface to send messages over the mesh network by sending strings over a serial port. Anything you send the node will be turned into a message sent out over the mesh, and anything received from the mesh will be sent to the serial port. Note that this module does not (yet) allow arbitrary protobuf commands to be sent over the serial connection.

-
## Serial Module Config Values
### Enabled
@@ -31,11 +30,11 @@ Defaults to 'Simple'.
Available Values:
-* `DEFAULT`
-* `SIMPLE` operate as an dumb UART tunnel. What goes in will come out, Requires a channel named 'serial'.
-* `PROTO` Exposes the Protobuf Client API on this serial port. You can use this to connect from another device. [API Reference](/docs/development/device/client-api)
-* `TEXTMSG` Will send the string received over the serial port as a Text Message for Display on the other devices.
-* `NMEA` Will output a NMEA 0183 Data stream containing the internal GPS or fixed position and other node locations as Waypoints (WPL).
+- `DEFAULT`
+- `SIMPLE` operate as an dumb UART tunnel. What goes in will come out, Requires a channel named 'serial'.
+- `PROTO` Exposes the Protobuf Client API on this serial port. You can use this to connect from another device. [API Reference](/docs/development/device/client-api)
+- `TEXTMSG` Will send the string received over the serial port as a Text Message for Display on the other devices.
+- `NMEA` Will output a NMEA 0183 Data stream containing the internal GPS or fixed position and other node locations as Waypoints (WPL).
### Receive GPIO Pin
@@ -93,21 +92,21 @@ All serial module config options are available on iOS, iPadOS and macOS at Setti
-:::info
+:::info
All serial module config options are available in the python CLI. Example commands are below:
:::
-| Setting | Acceptable Values | Default |
-| :-------------------: | :-----------------: | :-----: |
-| serial.enabled | `true`, `false` | `false` |
-| serial.echo | `true`, `false` | `false` |
-| serial.mode | `DEFAULT` `SIMPLE` `PROTO` `TEXTMSG`, `NMEA` | `DEFAULT` |
-| serial.rxd | GPIO Pin Number 1-39 | Default of `0` is Unset |
-| serial.txd | GPIO Pin Number 1-33 | Default of `0` is Unset |
-| serial.baud | `BAUD_DEFAULT` `BAUD_110` `BAUD_300` `BAUD_600` `BAUD_1200` `BAUD_2400` `BAUD_4800` `BAUD_9600` `BAUD_19200` `BAUD_38400` `BAUD_57600` `BAUD_115200` `BAUD_230400` `BAUD_460800` `BAUD_576000` `BAUD_921600` | `BAUD_DEFAULT` |
-| serial.timeout | `integer` (seconds) | `0` |
+| Setting | Acceptable Values | Default |
+| :------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------: |
+| serial.enabled | `true`, `false` | `false` |
+| serial.echo | `true`, `false` | `false` |
+| serial.mode | `DEFAULT` `SIMPLE` `PROTO` `TEXTMSG`, `NMEA` | `DEFAULT` |
+| serial.rxd | GPIO Pin Number 1-39 | Default of `0` is Unset |
+| serial.txd | GPIO Pin Number 1-33 | Default of `0` is Unset |
+| serial.baud | `BAUD_DEFAULT` `BAUD_110` `BAUD_300` `BAUD_600` `BAUD_1200` `BAUD_2400` `BAUD_4800` `BAUD_9600` `BAUD_19200` `BAUD_38400` `BAUD_57600` `BAUD_115200` `BAUD_230400` `BAUD_460800` `BAUD_576000` `BAUD_921600` | `BAUD_DEFAULT` |
+| serial.timeout | `integer` (milli seconds) | Default of `0` corresponds to 250 ms |
:::tip
@@ -132,7 +131,7 @@ meshtastic --set serial.echo false
```shell title="Set Mode"
meshtastic --set serial.mode DEFAULT
meshtastic --set serial.mode PROTO
-```
+```
```shell title="Set RXD to GPIO pin number 7"
meshtastic --set serial.rxd 7
@@ -147,7 +146,7 @@ meshtastic --set serial.baud BAUD_DEFAULT
meshtastic --set serial.baud BAUD_576000
```
-```shell title="Set Timeout to 15 seconds"
+```shell title="Set Timeout to 15 milli seconds"
meshtastic --set serial.timeout 15
```
@@ -157,7 +156,7 @@ meshtastic --set serial.timeout 15
:::info
All serial module config options are available in the Web UI.
:::
-
+
@@ -170,7 +169,8 @@ This module requires attaching a peripheral accessory to your device. It will no
## Examples
Default is to use RX GPIO 16 and TX GPIO 17.
-### Basic Usage:
+
+### Basic Usage
1. Enable the module by setting `serial.enabled` to `1`.
2. Set the pins (`serial.rxd` / `serial.txd`) for your preferred RX and TX GPIO pins. On tbeam boards it is recommended to use:
@@ -180,24 +180,28 @@ Default is to use RX GPIO 16 and TX GPIO 17.
4. (Optional) set serial.mode to TEXTMSG if you want to send messages to/from the general text message channel
5. Connect to your device over the serial interface at `38400 8N1`.
- With [tio](https://github.com/tio/tio) – `tio -e -b 38400 -f none /dev/myserialport`
-7. Send a packet up to 237 bytes in length. This will get relayed over the mesh network.
-8. (Optional) Set `serial.echo` to `1` and any message you send out will be echoed back to your device.
+ With [tio](https://github.com/tio/tio) – `tio -e -b 38400 -f none /dev/myserialport`
+
+6. Send a packet up to 237 bytes in length. This will get relayed over the mesh network.
+7. (Optional) Set `serial.echo` to `1` and any message you send out will be echoed back to your device.
### Interfacing PIR Sensor With External Microcontroller
-The following is an example of using a Raspberry Pi Pico connected to a PIR sensor to detect motion. When motion is detected, a message is sent via. serial to the T-Beam. The T-Beam transmits the message as text over the default channel by utilizing the serial module in TXTMSG mode.
+
+The following is an example of using a Raspberry Pi Pico connected to a PIR sensor to detect motion. When motion is detected, a message is sent via. serial to the T-Beam. The T-Beam transmits the message as text over the default channel by utilizing the serial module in TXTMSG mode.
#### BOM
+
- Raspberry Pi Pico running [CircuitPython](https://learn.adafruit.com/getting-started-with-raspberry-pi-pico-circuitpython)
- T-Beam V1.1 running Meshtastic
- PIR Sensor ([Adafruit Breadboard Model](https://www.adafruit.com/product/4871))
-#### Meshtastic Software Configuration:
+#### Meshtastic Software Configuration
+
- Serial module enabled, mode: TXTMSG
- GPIO Pins (For T-Beam) RX 13, TX 14
- 38400 Baud
-#### Wiring:
+#### Wiring

@@ -209,9 +213,10 @@ The following is an example of using a Raspberry Pi Pico connected to a PIR sens
- GND pin 38 on the Pico to breadboard ground rail
- 3V3 pin 36 on the Pico to the breadboard positive voltage rail
- Optional, to power the Pico off of the T-Beam instead of USB:
- - Connect 5V pin on T-Beam to Vbus pin 40 on the Pico
+ - Connect 5V pin on T-Beam to Vbus pin 40 on the Pico
#### Circuit Python Code
+
```python
import time
import board
diff --git a/docs/configuration/module-config/telemetry.mdx b/docs/configuration/module-config/telemetry.mdx
index 317aeb05..60ce0cb0 100644
--- a/docs/configuration/module-config/telemetry.mdx
+++ b/docs/configuration/module-config/telemetry.mdx
@@ -5,10 +5,10 @@ slug: /settings/moduleconfig/telemetry
sidebar_label: Telemetry
---
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
-The Telemetry Module provides two types of data over the mesh. Device metrics (Battery Level, Voltage, Channel Utilization and Airtime) from your meshtastic device and Environment Metrics from attached I2C sensors.
+The Telemetry Module provides two types of data over the mesh. Device metrics (Battery Level, Voltage, Channel Utilization and Airtime) from your meshtastic device and Environment Metrics from attached I2C sensors.
Supported sensors connected to the I2C bus of the device will be automatically detected at startup. Environment Telemetry must be enabled for them to be instrumented and their readings sent over the mesh.
@@ -16,19 +16,19 @@ The telemetry module config options are: Device Metrics Update Interval, Environ
### Currently Supported Sensor Types
-| Sensor | I2C Address | Data Points |
+| Sensor | I2C Address | Data Points |
| :-----: | :--------------------: | :-----------------------------------------------------------: |
-| BMP280 | 0x76, 0x77 | Temperature and barometric pressure |
-| BME280 | 0x76, 0x77 | Temperature, barometric pressure and humidity |
-| BME680 | 0x76, 0x77 | Temperature, barometric pressure, humidity and air resistance |
-| MCP9808 | 0x18 | Temperature |
-| INA260 | 0x40, 0x41 | Current and Voltage |
-| INA219 | 0x40, 0x41 | Current and Voltage |
-| LPS22 | 0x5D, 0x5c | Barometric pressure |
-| SHTC3 | 0x70 | Temperature and humidity |
-| SHT31 | 0x44 | Temperature and humidity |
+| BMP280 | 0x76, 0x77 | Temperature and barometric pressure |
+| BME280 | 0x76, 0x77 | Temperature, barometric pressure and humidity |
+| BME680 | 0x76, 0x77 | Temperature, barometric pressure, humidity and air resistance |
+| MCP9808 | 0x18 | Temperature |
+| INA260 | 0x40, 0x41 | Current and Voltage |
+| INA219 | 0x40, 0x41 | Current and Voltage |
+| LPS22 | 0x5D, 0x5c | Barometric pressure |
+| SHTC3 | 0x70 | Temperature and humidity |
+| SHT31 | 0x44 | Temperature and humidity |
-## Module Config Values
+## Module Config Values
### Update Intervals
@@ -101,13 +101,13 @@ All telemetry module config options are available in the python CLI. Example com
## Settings
-| Setting | Acceptable Values | Default |
-| :-----------------------------------------------------: | :-----------------: | :-----: |
-| telemetry.device_update_interval | `integer` (seconds) | Default `0` is 15 minutes(`900` seconds). |
-| telemetry.environment_display_fahrenheit | `true`, `false` | `false` |
-| telemetry.environment_measurement_enabled | `true`, `false` | `false` |
-| telemetry.environment_screen_enabled | `true`, `false` | `0` |
-| telemetry.environment_update_interval | `integer` (seconds) | Default `0` is 15 minutes(`900` seconds). |
+| Setting | Acceptable Values | Default |
+| :---------------------------------------: | :-----------------: | :---------------------------------------: |
+| telemetry.device_update_interval | `integer` (seconds) | Default `0` is 15 minutes(`900` seconds). |
+| telemetry.environment_display_fahrenheit | `true`, `false` | `false` |
+| telemetry.environment_measurement_enabled | `true`, `false` | `false` |
+| telemetry.environment_screen_enabled | `true`, `false` | `0` |
+| telemetry.environment_update_interval | `integer` (seconds) | Default `0` is 15 minutes(`900` seconds). |
:::tip
@@ -125,7 +125,7 @@ meshtastic --set telemetry.device_update_interval 0
meshtastic --set telemetry.device_update_interval 0
// Environment Metrics Two Minutes
meshtastic --set telemetry.environment_update_interval 120
-````
+```
```shell title="Enable/Disable Environment Module"
meshtastic --set telemetry.environment_measurement_enabled true
@@ -140,7 +140,7 @@ meshtastic --set telemetry.environment_screen_enabled false
```shell title="Enable / Disable Display Fahrenheit"
meshtastic --set telemetry.environment_display_fahrenheit true
meshtastic --set telemetry.environment_display_fahrenheit false
-````
+```
@@ -150,7 +150,7 @@ meshtastic --set telemetry.environment_display_fahrenheit false
All telemetry module config options are available in the Web UI.
:::
-
+
@@ -195,15 +195,15 @@ And examine the serial logs for Telemetry diagnostic information.
### Environment Metrics
-The environment metrics in the telemetry module supports a limited amount of fields as they are stored in memory on the device. Support for sensors that provide one or more of the following fields can potentially be added to the main firmware provided there is a GPL licensed library for us to include to support it, and the library size is not prohibitive.
+The environment metrics in the telemetry module supports a limited amount of fields as they are stored in memory on the device. Support for sensors that provide one or more of the following fields can potentially be added to the main firmware provided there is a GPL licensed library for us to include to support it, and the library size is not prohibitive.
-* Temperature
-* Relative Humidity
-* Barometric Pressure
-* Gas Resistance (AQI)
-* Voltage
-* Current
+- Temperature
+- Relative Humidity
+- Barometric Pressure
+- Gas Resistance (AQI)
+- Voltage
+- Current
### Supporting Other Sensor types
-For other interesting sensor types and use cases we need to add a portnum for more generic telemetry packets and a second MCU will be required to interact with the sensor and process the data to be sent over the mesh. This data will not be stored in the nodedb on the device.
+For other interesting sensor types and use cases we need to add a portnum for more generic telemetry packets and a second MCU will be required to interact with the sensor and process the data to be sent over the mesh. This data will not be stored in the nodedb on the device.
diff --git a/docs/configuration/module-config/traceroute.mdx b/docs/configuration/module-config/traceroute.mdx
index a6579595..17696554 100644
--- a/docs/configuration/module-config/traceroute.mdx
+++ b/docs/configuration/module-config/traceroute.mdx
@@ -5,14 +5,14 @@ slug: /settings/moduleconfig/traceroute
sidebar_label: Traceroute
---
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
Due to the limited bandwidth of LoRa, Meshtastic does not keep track of the nodes a message used to hop to the destination. However, from firmware 2.0.8 on, there is a Traceroute Module that can show you this.
Only nodes that know the encryption key of the channel you use can be tracked. Also note that a message may arrive via multiple routes due to duplication because of rebroadcasting. This module will only track the hops of the first packet containing the traceroute request that arrived at the destination.
-In order to use it, make sure your devices use firmware version 2.0.8 or higher.
+In order to use it, make sure your devices use firmware version 2.0.8 or higher.
## Traceroute Module Client Availability
@@ -32,7 +32,7 @@ Not yet implemented.
-Make sure the app is at least version 2.0.9.
+Make sure the app is at least version 2.0.9.
Under Contacts > Direct Messages, long hold a destination node and select 'Trace Route' to send the request. Depending on the amount of hops that is needed, this might take a while. The result will be shown in the Mesh Log.
@@ -61,6 +61,6 @@ The first ID shown is the device you are connected to with the CLI. As you can s
Not yet implemented.
-
+
-
\ No newline at end of file
+
diff --git a/docs/configuration/rak-gpio-mapping.mdx b/docs/configuration/rak-gpio-mapping.mdx
index 2a2ecac8..8cbc0337 100644
--- a/docs/configuration/rak-gpio-mapping.mdx
+++ b/docs/configuration/rak-gpio-mapping.mdx
@@ -9,28 +9,28 @@ sidebar_position: 5
The RAK4631 uses symbolic labels for its I/O Pins on the module and baseboard silk screens. The following table shows the mapping of the RAK4631 GPIO pins to the corresponding Arduino pins and the MCU Port numbers.
-| RAK Pin | nRF52840 Pin | Arduino GPIO | Remark |
-| ------- | ------------ | ------------ | ------ |
-| IO1 | P0.17 | 17 | used for GPS PPM signal if GPS module is connected |
-| IO2 | P1.02 | 34 | used to power all peripheral modules, not available for user application |
-| IO3 | P0.21 | 21 |
-| IO4 | P0.04 | 4 |
-| IO5 | P0.09 | 9 | The 'User Button' is mapped here. |
-| IO6 | P0.10 | 10 |
-| IO7 | P0.28 | 28 |
-| SW1 | P0.01 | 1 |
-| A0 | P0.04/AIN2 | A2 |
-| A1 | P0.31/AIN7 | A7 |
-| SPI_CS | P0.26 | 26 |
+| RAK Pin | nRF52840 Pin | Arduino GPIO | Remark |
+| ------- | ------------ | ------------ | ------------------------------------------------------------------------ |
+| IO1 | P0.17 | 17 | used for GPS PPM signal if GPS module is connected |
+| IO2 | P1.02 | 34 | used to power all peripheral modules, not available for user application |
+| IO3 | P0.21 | 21 |
+| IO4 | P0.04 | 4 |
+| IO5 | P0.09 | 9 | The 'User Button' is mapped here. |
+| IO6 | P0.10 | 10 |
+| IO7 | P0.28 | 28 |
+| SW1 | P0.01 | 1 |
+| A0 | P0.04/AIN2 | A2 |
+| A1 | P0.31/AIN7 | A7 |
+| SPI_CS | P0.26 | 26 |
When configuring GPIO pins in your device settings, the Arduino GPIO numbers should be used.
```shell title="Example"
meshtastic --set external_notification.output 10
```
+
This will use IO6 on a RAK4631
:::caution Note
There is no usable GPIO pin on any RAK base board except the 'big' baseboard RAK19001 without adding a RAK13002 IO module or a third party IO sensor breakout.
:::
-
diff --git a/docs/configuration/remote-admin.mdx b/docs/configuration/remote-admin.mdx
index 238c21c8..898f6c0e 100644
--- a/docs/configuration/remote-admin.mdx
+++ b/docs/configuration/remote-admin.mdx
@@ -151,7 +151,7 @@ Completed getting preferences
For further reading, I recommend starting out with [Meshtastic-python](/docs/software/python/cli/) if you haven't already gone through this (hopefully you have since you are reading this). But for a full reference to the settings you can change, please see:
[Settings Overview](/docs/settings) and
-[Complete list of user settings in Protobufs](/docs/developers/protobufs/api#radioconfiguserpreferences)
+[Complete list of user settings in Protobufs](https://buf.build/meshtastic/protobufs/docs/main:meshtastic#meshtastic.User)
## Areas for future development
diff --git a/docs/development/_category_.yml b/docs/development/_category_.yml
index ef7b07c9..17c866d1 100644
--- a/docs/development/_category_.yml
+++ b/docs/development/_category_.yml
@@ -4,4 +4,4 @@ position: 7
link:
type: generated-index
title: Developers
- slug: /developers
\ No newline at end of file
+ slug: /developers
diff --git a/docs/development/android.mdx b/docs/development/android.mdx
index 2a945d2a..a594cd8d 100644
--- a/docs/development/android.mdx
+++ b/docs/development/android.mdx
@@ -12,12 +12,12 @@ If you would like to develop this application we'd love your help! These build i
1. Use Android Studio to build/debug
2. Use `git submodule update --init --recursive` to pull in the various sub-modules we depend on.
3. There are a few config files which you'll need to copy from templates included in the project. Run the following commands to do so:
- ```sh
- rm ./app/google-services.json
- cp ./app/google-services-example.json ./app/google-services.json
- rm ./app/src/main/res/values/curfirmwareversion.xml
- cp ./app/special/curfirmwareversion.xml ./app/src/main/res/values/
- ```
+ ```shell
+ rm ./app/google-services.json
+ cp ./app/google-services-example.json ./app/google-services.json
+ rm ./app/src/main/res/values/curfirmwareversion.xml
+ cp ./app/special/curfirmwareversion.xml ./app/src/main/res/values/
+ ```
4. Now you should be able to select "Run / Run" in the IDE and it will happily start running on your phone or the emulator.
:::note
@@ -30,15 +30,16 @@ Analytics are included but can be disabled by the user on the settings screen.
1. Configure analytics for development device
- ```sh
- adb shell setprop debug.firebase.analytics.app com.geeksville.mesh
- adb shell setprop log.tag.FirebaseCrashlytics DEBUG
- ```
+ ```shell
+ adb shell setprop debug.firebase.analytics.app com.geeksville.mesh
+ adb shell setprop log.tag.FirebaseCrashlytics DEBUG
+ ```
+
2. Set verbose logging
- ```sh
- adb shell setprop log.tag.FA VERBOSE
- ```
+ ```shell
+ adb shell setprop log.tag.FA VERBOSE
+ ```
## Publish to Google Play
@@ -47,20 +48,19 @@ Only available for core developers that publish releases.
:::
1. Add repository secrets:
- - **KEYSTORE_FILENAME**
- - Name of the `.jks`
- - **KEYSTORE**
- - Convert the `.jks` to base64:
- ```sh
- openssl base64 < filename.jks | tr -d '\n' | tee filename.txt
- ```
- - **KEYSTORE_PROPERTIES**
- - `storePassword=nononononono`
- - `keyPassword=nononononono`
- - `keyAlias=upload`
- - `storeFile=nononononono.jks`
+ - **KEYSTORE_FILENAME**
+ - Name of the `.jks`
+ - **KEYSTORE**
+ - Convert the `.jks` to base64:
+ ```shell
+ openssl base64 < filename.jks | tr -d '\n' | tee filename.txt
+ ```
+ - **KEYSTORE_PROPERTIES**
+ - `storePassword=nononononono`
+ - `keyPassword=nononononono`
+ - `keyAlias=upload`
+ - `storeFile=nononononono.jks`
2. Update protobufs
3. Go to Actions / Make Release / Run Workflow
4. Pick the Releases branch
5. Enter the version found in `app/gradle.build`
-
diff --git a/docs/development/device/_category_.yml b/docs/development/device/_category_.yml
index d8de1354..f558b43c 100644
--- a/docs/development/device/_category_.yml
+++ b/docs/development/device/_category_.yml
@@ -4,4 +4,4 @@ position: 1
link:
slug: /development/device
type: generated-index
- title: Device
\ No newline at end of file
+ title: Device
diff --git a/docs/development/device/client-api.mdx b/docs/development/device/client-api.mdx
index 08ccf623..5dc992c0 100644
--- a/docs/development/device/client-api.mdx
+++ b/docs/development/device/client-api.mdx
@@ -27,7 +27,6 @@ The 4 byte header is constructed to both provide framing and to not look line 'n
The receiver will validate length and if >512 it will assume the packet is corrupted and return to looking for START1. While looking for START1 any other characters are printed as "debug output". For small example implementation of this reader see the python implementation.
-
## Bluetooth (MeshBluetoothService)
This is the main Bluetooth service for the device and provides the API your app should use to get information about the mesh, send packets, or provision the radio.
diff --git a/docs/development/device/error-codes.mdx b/docs/development/device/error-codes.mdx
index 0569edac..625609cd 100644
--- a/docs/development/device/error-codes.mdx
+++ b/docs/development/device/error-codes.mdx
@@ -8,19 +8,19 @@ sidebar_position: 4
The device might report these fault codes on the screen, but it will also be outputted on the device serial output. If you encounter a fault code, please post on the forum and we'll try to help.
:::note
-This table is derived from the [protobufs](/docs/developers/protobufs/api#criticalerrorcode)
+This table is derived from the [protobufs](https://buf.build/meshtastic/protobufs/docs/main:meshtastic#meshtastic.CriticalErrorCode)
:::
-| Name | Number | Description |
-|:------------------- :|:------:|:----------------------------------------------------------------------------------------------------------------------- |
-| TxWatchdog | 1 | A software bug was detected while trying to send LoRa |
-| SleepEnterWait | 2 | A software bug was detected on entry to sleep |
-| NoRadio | 3 | No LoRa radio hardware could be found |
-| Unspecified | 4 | Not normally used |
-| UBloxInitFailed | 5 | We failed while configuring a UBlox GPS |
-| NoAXP192 | 6 | This board was expected to have a power management chip and it is missing or broken |
-| InvalidRadioSetting | 7 | The channel tried to set a radio setting which is not supported by this chipset, radio comms settings are now undefined |
-| TransmitFailed | 8 | Radio transmit hardware failure. We sent data to the radio chip, but it did not reply with an interrupt |
-| Brownout | 9 | We detected that the main CPU voltage dropped below the minimum acceptable value |
-| SX1262Failure | 10 | Selftest of SX1262 radio chip failed |
-| RadioSpiBug | 11 | A (likely software but possibly hardware) failure was detected while trying to send packets. If this occurs on your board, please post in the forum so that we can ask you to collect some information to allow fixing this bug |
+| Name | Number | Description |
+| :-----------------: | :----: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| TxWatchdog | 1 | A software bug was detected while trying to send LoRa |
+| SleepEnterWait | 2 | A software bug was detected on entry to sleep |
+| NoRadio | 3 | No LoRa radio hardware could be found |
+| Unspecified | 4 | Not normally used |
+| UBloxInitFailed | 5 | We failed while configuring a UBlox GPS |
+| NoAXP192 | 6 | This board was expected to have a power management chip and it is missing or broken |
+| InvalidRadioSetting | 7 | The channel tried to set a radio setting which is not supported by this chipset, radio comms settings are now undefined |
+| TransmitFailed | 8 | Radio transmit hardware failure. We sent data to the radio chip, but it did not reply with an interrupt |
+| Brownout | 9 | We detected that the main CPU voltage dropped below the minimum acceptable value |
+| SX1262Failure | 10 | Selftest of SX1262 radio chip failed |
+| RadioSpiBug | 11 | A (likely software but possibly hardware) failure was detected while trying to send packets. If this occurs on your board, please post in the forum so that we can ask you to collect some information to allow fixing this bug |
diff --git a/docs/development/device/http-api.mdx b/docs/development/device/http-api.mdx
index 72ca9c42..833dfc13 100644
--- a/docs/development/device/http-api.mdx
+++ b/docs/development/device/http-api.mdx
@@ -36,15 +36,15 @@ Two endpoints are specified:
Allows `PUT` and `OPTION` requests.
-#### PUT
+#### PUT
-A `PUT` request to this endpoint will be expected to contain a series of ToRadio protobuf payloads.
+A `PUT` request to this endpoint will be expected to contain a series of ToRadio protobuf payloads.
The protobufs will be sent in binary as the body for the request.
For the initial implementation, only one ToRadio message per request is supported, but future optimizations to improve throughput might add support for multiple ToRadios in a single request.
-#### OPTIONS
+#### OPTIONS
An `OPTIONS`request to this endpoint will return a response status code `204` and headers only.
@@ -52,7 +52,7 @@ An `OPTIONS`request to this endpoint will return a response status code `204` an
Allows `GET` requests.
-#### GET
+#### GET
A `GET` request from this endpoint will return a series of FromRadio protobufs.
@@ -61,12 +61,14 @@ The protobufs will be sent in binary as the body for the request.
**Parameters**
##### **/api/v1/fromradio?all**
+
- `all=false` (unset default)
- - Only one protobuf is returned.
-- `all=true`
+ - Only one protobuf is returned.
+- `all=true`
- All available protobufs are returned.
##### **/api/v1/fromradio?chunked**
+
- `chunked=false` (unset default, not yet implemented)
- The request returns all protobufs that can be delivered for the client's session (this would allow the client to poll by doing a series of requests). This is the only option that is supported in the initial release.
- `chunked=true` (not yet implemented)
diff --git a/docs/development/device/module-api.mdx b/docs/development/device/module-api.mdx
index e7c93813..12c00a1b 100644
--- a/docs/development/device/module-api.mdx
+++ b/docs/development/device/module-api.mdx
@@ -27,7 +27,7 @@ The relevant bits of the class hierarchy are as follows:
### First Level: MeshModule
- [src/mesh/MeshModule.h](http://github.com/meshtastic/firmware/tree/master/src/mesh/MeshModule.h) - you probably don't want to use this base-class directly.
-
+
### Second Level: SinglePortModule
- [src/mesh/SinglePortModule.h](http://github.com/meshtastic/firmware/tree/master/src/mesh/SinglePortModule.h) - for modules that send/receive from a single port number (the normal case).
@@ -66,10 +66,10 @@ A number of [key services](http://github.com/meshtastic/firmware/tree/master/src
The easiest way to get started is:
1. [Build the firmware](/docs/development/firmware/build) codebase.
-2. Copy the [ReplyModule](http://github.com/meshtastic/firmware/tree/master/src/modules/ReplyModule.cpp) as a template into `src/modules/`.
- ```sh
- cp src/modules/ReplyModule.* src/modules/YourModule.*
- ```
+2. Copy the [ReplyModule](http://github.com/meshtastic/firmware/tree/master/src/modules/ReplyModule.cpp) as a template into `src/modules/`.
+ ```shell
+ cp src/modules/ReplyModule.* src/modules/YourModule.*
+ ```
3. Change the port number from `PortNum_REPLY_APP` to `PortNum_PRIVATE_APP`.
4. Edit the `setupModules()` function located at `modules/Moduless.cpp` to add a call to create an instance of your module (see comment at head of that function).
5. Rebuild with your new module and install on the device.
@@ -96,4 +96,3 @@ If you would like to use protocol buffers to define the structures you send over
1. Create a new `.proto` file in the protos directory.
2. Run `./bin/regen-protos.sh` to regenerate the C code for accessing the protocol buffers. If you don't have the required nanopb tool, follow the instructions printed by the script to get it.
3. Done! You can now use your new protobuf just like any of the existing protobufs in Meshtastic.
-
diff --git a/docs/development/documentation/index.mdx b/docs/development/documentation/index.mdx
index 6e7bc0ef..f00a565c 100644
--- a/docs/development/documentation/index.mdx
+++ b/docs/development/documentation/index.mdx
@@ -25,7 +25,7 @@ Another component that we use is [Vercel](https://vercel.com) — a platform for
| Getting Started | `docs/getting-started` | Instructions on how to get the Meshtastic firmware onto a users device. |
| Device Settings | `docs/software/settings` | Details each user setting and provides explanations for what the setting does and how to configure the device using the various clients available (Android, CLI, iOS, Web) |
| Hardware Details | `docs/hardware` | Any hardware related content. Any time a user is attaching a peripheral accessory to their device. That includes 3D printed cases, antennas, buttons, chimes, rotary encoders, and screens. |
-| Radio Mesh Details | `docs/mesh` | This section discusses everything relating to the Meshtastic mesh. Mesh health metrics will be discussed here as well as topics such as signal strength, range and anything else pertaining to "over the air". |
+| Radio Mesh Details | `docs/mesh` | This section discusses everything relating to the Meshtastic mesh. Mesh health metrics will be discussed here as well as topics such as signal strength, range and anything else pertaining to "over the air". |
| Contribute to Meshtastic | `docs/developers` | Details each of the projects and how they work together to give a developer an idea of how the Meshtastic ecosystem operates. |
| About the Documentation | `docs/maintaining-documentation` | This section explains how our documentation is organized, how to make edits to the documentation, view a local copy of your fork of the project. Style guides and tips will also be included here. |
| Legal | `docs/legal` | Any legal information. Most changes here will be handled by developers actually working on the projects that require any legal disclosures. Examples include: the Meshtastic trademark, terms of service, and privacy policy. |
@@ -34,31 +34,31 @@ Another component that we use is [Vercel](https://vercel.com) — a platform for
Assuming you have the [prerequisites installed](/docs/development/documentation/local-dev#prerequisites), running a local instance of Docusaurus takes three steps:
-1. Fork/Clone the [meshtastic/meshtastic](https://github.com/meshtastic/meshtastic) repository and navigate to the root directory of the project.
+1. Fork/Clone the [meshtastic/meshtastic](https://github.com/meshtastic/meshtastic) repository and navigate to the root directory of the project.
-```shell title="Clone the project"
-git clone https://github.com/meshtastic/meshtastic.git
-```
+ ```shell title="Clone the project"
+ git clone https://github.com/meshtastic/meshtastic.git
+ ```
-```shell title="Clone fork of the project"
-git clone https://github.com/[username]/meshtastic.git
-```
+ ```shell title="Clone fork of the project"
+ git clone https://github.com/[username]/meshtastic.git
+ ```
-```shell title="Change Directory"
-cd ~/Meshtastic
-```
+ ```shell title="Change Directory"
+ cd ~/Meshtastic
+ ```
-2. Install Dependencies
+2. Install Dependencies
-```shell title="Install dependencies using Yarn"
-yarn install
-```
+ ```shell title="Install dependencies using Yarn"
+ yarn install
+ ```
-3. Run Docusaurus
+3. Run Docusaurus
-```shell title="Run node.js server"
-yarn start
-```
+ ```shell title="Run node.js server"
+ yarn start
+ ```
:::tip
Before submitting a pull request, it's helpful to run the following command to ensure there are no broken links or errors:
diff --git a/docs/development/documentation/publish.mdx b/docs/development/documentation/publish.mdx
index f3471b2c..abfb203a 100644
--- a/docs/development/documentation/publish.mdx
+++ b/docs/development/documentation/publish.mdx
@@ -7,14 +7,18 @@ sidebar_label: Publish
## Publish Live
1. Generate protobuf docs
- ```shell
- cd meshtastic
- ./scripts/gen-proto-docs.sh
- ```
+
+ ```shell
+ cd meshtastic
+ ./scripts/gen-proto-docs.sh
+ ```
+
2. Build
- ```shell
- pnpm build
- ```
+
+ ```shell
+ pnpm build
+ ```
+
3. Submit Pull Request
## Publish to Vercel
@@ -48,4 +52,3 @@ There is a limited number of branch urls that you will be able to view. If you n
Branch urls are helpful in PRs because they will remain constant, and you won't need to resubmit a new url for review each new commit if changes are requested.
:::
-
diff --git a/docs/development/documentation/style-guides/_category_.yml b/docs/development/documentation/style-guides/_category_.yml
index fcda5668..207719ee 100644
--- a/docs/development/documentation/style-guides/_category_.yml
+++ b/docs/development/documentation/style-guides/_category_.yml
@@ -1,8 +1,7 @@
-
position: 1 # float position is supported
-label: 'Style Guides'
+label: "Style Guides"
collapsible: true # make the category collapsible
link:
slug: /development/docs/style-guide
type: generated-index
- title: Style Guides
\ No newline at end of file
+ title: Style Guides
diff --git a/docs/development/documentation/style-guides/markdown-features.mdx b/docs/development/documentation/style-guides/markdown-features.mdx
index c3ec3293..e4a5564a 100644
--- a/docs/development/documentation/style-guides/markdown-features.mdx
+++ b/docs/development/documentation/style-guides/markdown-features.mdx
@@ -4,7 +4,7 @@ title: Markdown Features
sidebar_label: Markdown Features
---
-import { Dark, Light } from '/src/components/ColorMode';
+import { Dark, Light } from "/src/components/ColorMode";
## Overview
@@ -14,7 +14,7 @@ We have developed several [React](https://reactjs.org/) components for assisting
### Light/Dark Mode Switch
-#### Usage:
+#### Usage
```jsx
import { Dark, Light } from '/src/components/ColorMode';
@@ -27,7 +27,7 @@ import { Dark, Light } from '/src/components/ColorMode';
```
-#### Demo:
+#### Demo
@@ -50,7 +50,7 @@ import { Dark, Light } from '/src/components/ColorMode';
### Code Blocks
-#### Usage:
+#### Usage
Always specify the language used directly after the start of the code block (```).
@@ -71,13 +71,13 @@ export const typedArrayToBuffer = (array: Uint8Array): ArrayBuffer => {
```
````
-#### Demo:
+#### Demo
```ts title="Demo"
export const typedArrayToBuffer = (array: Uint8Array): ArrayBuffer => {
return array.buffer.slice(
array.byteOffset,
- array.byteLength + array.byteOffset,
+ array.byteLength + array.byteOffset
);
};
```
diff --git a/docs/development/firmware/_category_.yml b/docs/development/firmware/_category_.yml
index 9eb90696..145012e4 100644
--- a/docs/development/firmware/_category_.yml
+++ b/docs/development/firmware/_category_.yml
@@ -4,4 +4,4 @@ position: 1
link:
type: generated-index
title: Firmware
- slug: /development/firmware
\ No newline at end of file
+ slug: /development/firmware
diff --git a/docs/development/firmware/building.mdx b/docs/development/firmware/building.mdx
index 500c0864..f5cd4113 100644
--- a/docs/development/firmware/building.mdx
+++ b/docs/development/firmware/building.mdx
@@ -10,7 +10,7 @@ Meshtastic uses [PlatformIO](https://platformio.org), a development environment
1. [Install PlatformIO](https://platformio.org/platformio-ide)
2. Clone the [Meshtastic Firmware](https://github.com/meshtastic/firmware) repository
- ```sh
+ ```shell
git clone https://github.com/meshtastic/firmware.git
```
3. Update the repository's [submodules](https://github.com/meshtastic/firmware/blob/master/.gitmodules)
diff --git a/docs/development/firmware/oled-guide.mdx b/docs/development/firmware/oled-guide.mdx
index 8ebc19ad..df26cd67 100644
--- a/docs/development/firmware/oled-guide.mdx
+++ b/docs/development/firmware/oled-guide.mdx
@@ -4,32 +4,35 @@ title: OLED Localization Guide
sidebar_label: OLED Localization
---
-1. Create an extended ASCII custom font. Use a glyph editor to create a new font file. The easiest way is to use the online [glyph editor](https://rawgit.com/ThingPulse/esp8266-oled-ssd1306/master/resources/glyphEditor.html) from the OLED library. ([glyph editor source code](https://github.com/ThingPulse/esp8266-oled-ssd1306/tree/master/resources))
- 1. Copy and paste the existing font.
- 2. Modify it according desired codepage and save the new font file in `graphics/font` folder.
- Please note that the used font file format differs from common Adafruit GFX.
+1. Create an extended ASCII custom font. Use a glyph editor to create a new font file. The easiest way is to use the online [glyph editor](https://rawgit.com/ThingPulse/esp8266-oled-ssd1306/master/resources/glyphEditor.html) from the OLED library. ([glyph editor source code](https://github.com/ThingPulse/esp8266-oled-ssd1306/tree/master/resources))
+ 1. Copy and paste the existing font.
+ 2. Modify it according desired codepage and save the new font file in `graphics/font` folder.
+ Please note that the used font file format differs from common Adafruit GFX.
2. Update the `customFontTableLookup` function in `Screen.h`
- 1. To map the double-byte UTF-8 code to the corresponding extended ASCII character of the desired codepage update the `customFontTableLookup` function in the `Screen.h` file.
- 2. Modify the `switch (last)` statement: use left byte from UTF-8 code in the `case` label to map charachter's right byte to its extended ASCII code by specifying an offset.
+ 1. To map the double-byte UTF-8 code to the corresponding extended ASCII character of the desired codepage update the `customFontTableLookup` function in the `Screen.h` file.
+ 2. Modify the `switch (last)` statement: use left byte from UTF-8 code in the `case` label to map charachter's right byte to its extended ASCII code by specifying an offset.
3. Define language and font in `Screen.cpp`
- ```c
- #ifdef OLED_{LANG_NAME}
- #include "fonts/OLEDDisplayFonts{LANG_NAME}.h"
- #endif
- ...
+ ```c
+ #ifdef OLED_{LANG_NAME}
+ #include "fonts/OLEDDisplayFonts{LANG_NAME}.h"
+ #endif
+
+ ...
+
+ #ifdef OLED_{LANG_NAME}
+ #define FONT_SMALL ArialMT_Plain_10_{LANG_NAME}
+ #else
+ #define FONT_SMALL ArialMT_Plain_10
+ #endif
+ ```
- #ifdef OLED_{LANG_NAME}
- #define FONT_SMALL ArialMT_Plain_10_{LANG_NAME}
- #else
- #define FONT_SMALL ArialMT_Plain_10
- #endif
- ```
4. Define language in `variant/*/platformio.ini`
- ```
- build_flags =
- ${esp32_base.build_flags}
- -D xxxxx
- -D OLED_{LANG_NAME}
- -I variants/xxxxx
- ```
\ No newline at end of file
+
+ ```text
+ build_flags =
+ ${esp32_base.build_flags}
+ -D xxxxx
+ -D OLED_{LANG_NAME}
+ -I variants/xxxxx
+ ```
diff --git a/docs/development/firmware/port-numbers.mdx b/docs/development/firmware/port-numbers.mdx
index a9cf4888..6afcb940 100644
--- a/docs/development/firmware/port-numbers.mdx
+++ b/docs/development/firmware/port-numbers.mdx
@@ -6,15 +6,15 @@ sidebar_label: Port Numbers
Any new app that runs on the device or via sister apps on phones/PCs should pick and use a unique "portnum" for their applications use.
-The current list of port numbers can be found listed in the [protobufs](/docs/developers/protobufs/api#portnumsproto)
+The current list of port numbers can be found listed in the [protobufs](https://buf.build/meshtastic/protobufs/docs/main:meshtastic#meshtastic.CriticalErrorCode)
## Assignment
PortNums should be assigned by the following ranges:
| Portnum | Usage |
-|:-------:|:---------------------------------------------------------------------------------------------------------------------- |
-| 0-63 | Core Meshtastic use, do not use for third party apps. |
+| :-----: | :--------------------------------------------------------------------------------------------------------------------- |
+| 0-63 | Core Meshtastic use, do not use for third party apps. |
| 64-127 | Registered 3rd party apps, send in a pull request that adds a new entry to portnums.proto to register your application |
| 256-511 | Use one of these portnums for your private applications that you do not want to register publicly |
@@ -22,4 +22,4 @@ All other values are reserved.
## Integration
-If you are making a new app using Meshtastic, please send a pull request to add your chosen "portnum" to this master table.
\ No newline at end of file
+If you are making a new app using Meshtastic, please send a pull request to add your chosen "portnum" to this master table.
diff --git a/docs/development/firmware/stacktraces.mdx b/docs/development/firmware/stacktraces.mdx
index 2dcf45a5..cd5cf2bd 100644
--- a/docs/development/firmware/stacktraces.mdx
+++ b/docs/development/firmware/stacktraces.mdx
@@ -14,19 +14,21 @@ You may encounter a situation where your device crashes and are left with a stac
This method uses the symbols of the `firmware.elf` file generated from your latest build, you may wish to rebuild to get up-to-date symbols.
:::
- 1. Save the backtrace string to a text file:
- ```text title="backtrace.txt"
- Backtrace: 0x....
- ```
+1. Save the backtrace string to a text file:
+
+ ```text title="backtrace.txt"
+ Backtrace: 0x....
+ ```
2. Run the exception decoder:
- ```shell
- bin/exception_decoder.py backtrace.txt
- ```
+ ```shell
+ bin/exception_decoder.py backtrace.txt
+ ```
### In Real-Time
In order to decode stack traces in real time, keep the following command (replacing `DEVICE_PORT` with your device's port) running in your terminal with the target device connected:
+
```shell
pio device monitor --port DEVICE_PORT -f esp32_exception_decoder
```
diff --git a/docs/development/js/connecting.mdx b/docs/development/js/connecting.mdx
index aafbd231..0a3e99dd 100644
--- a/docs/development/js/connecting.mdx
+++ b/docs/development/js/connecting.mdx
@@ -5,17 +5,17 @@ sidebar_label: Connecting
---
```tsx
-import type React from 'React';
+import type React from "React";
-import { IHTTPConnection } from '@meshtastic/meshtasticjs';
+import { IHTTPConnection } from "@meshtastic/meshtasticjs";
export const Connection = (): JSX.Element => {
const connection = new IHTTPConnection();
const connect = (): void => {
void connection.connect({
- address: '10.0.0.10',
- fetchInterval: 3000,
+ address: "10.0.0.10",
+ fetchInterval: 3000
});
};
diff --git a/docs/development/js/http-api.mdx b/docs/development/js/http-api.mdx
index 9fe2574a..d8584390 100644
--- a/docs/development/js/http-api.mdx
+++ b/docs/development/js/http-api.mdx
@@ -13,8 +13,8 @@ import {
Client,
Types,
Protobuf,
- SettingsManager,
-} from '@meshtastic/meshtasticjs';
+ SettingsManager
+} from "@meshtastic/meshtasticjs";
/**
* Connection method
@@ -24,7 +24,7 @@ const client = new Client();
SettingsManager.setDebugMode(Protobuf.LogLevelEnum.DEBUG);
const connection = client.createHTTPConnection();
-connection.connect('192.168.x.x');
+connection.connect("192.168.x.x");
const restartDevice: Promise = connection.restartDevice();
const getStatistics: Promise =
diff --git a/docs/development/python/building.mdx b/docs/development/python/building.mdx
index 7dd0da66..33bbdb78 100644
--- a/docs/development/python/building.mdx
+++ b/docs/development/python/building.mdx
@@ -12,7 +12,7 @@ No pre-requisites are needed locally to make a release. All builds are done via
To test/validate, you will need to run:
-```
+```shell
pip3 install -r requirements.txt
pip install .
```
@@ -25,7 +25,7 @@ pip install .
connect one device to the serial port and run:
-```
+```shell
pytest -m smoke1
```
@@ -41,8 +41,6 @@ pytest -m smoke1
You need permissions in the GitHub project to make a build
:::
-
-
### Meshtastic-flasher
A `meshtastic-flasher` release consists of publishing the release to PyPi https://pypi.org/project/meshtastic-flasher/ as well as producing single-executable files that are downloadable from Github https://github.com/meshtastic/Meshtastic-gui-installer/releases.
diff --git a/docs/development/python/index.mdx b/docs/development/python/index.mdx
index 7aac3b58..f774c13a 100644
--- a/docs/development/python/index.mdx
+++ b/docs/development/python/index.mdx
@@ -9,41 +9,35 @@ sidebar_label: Python
We use the Visual Studio Code (VScode) default python formatting conventions (autopep8). So if you use that IDE you should be able to use "Format Document" and not generate unrelated diffs. If you use some other editor, please do not change formatting on lines you have not changed yourself.
-
### Building
-**To build a new release**
-
-```sh
+```shell title="To build a new release"
apt install pandoc
sudo pip3 install markdown pdoc3 webencodings pyparsing twine autopep8 pylint pytest pytest-cov
```
-**For development**
-
-```sh
+```shell title="For development"
pip3 install -r requirements.txt
```
### Linting
-```sh
+```shell
pylint meshtastic
```
+
### Testing
-**Install and run pytest**
+#### Install and run pytest
-- For more verbosity, add `-v` or even `-vv`
+- For more verbosity, add `-v` or even `-vv`
-```sh
+```shell
pip3 install .
pytest -vv
```
-**Run just unit tests**
-
-```sh
+```shell title="Run just unit tests"
pytest
# or (more verbosely)
pytest -m unit
@@ -51,15 +45,11 @@ pytest -m unit
make
```
-**Run just integration tests**
-
-```sh
+```shell title="Run just integration tests"
pytest -m int
```
-**Run the smoke test with only one device connected serially (aka smoke1)**
-
-```sh
+```shell title="Run the smoke test with only one device connected serially (aka smoke1)"
pytest -m smoke1
```
@@ -68,21 +58,15 @@ Running `smoke1` will reset values on the device, including the region to 1 (US)
Be sure to hit the reset button on the device after the test is completed.
:::
-**Run the smoke test with only two device connected serially (aka smoke2)**
-
-```sh
+```shell title="Run the smoke test with only two device connected serially (aka smoke2)"
pytest -m smoke2
```
-**Run the wifi smoke test**
-
-```sh
+```shell title="Run the wifi smoke test"
pytest -m smokewifi
```
-**Run a specific test**
-
-```sh
+```shell title="Run a specific test"
pytest -msmoke1 meshtastic/tests/test_smoke1.py::test_smoke1_info
# or to run a specific smoke2 test
@@ -96,9 +80,7 @@ pytest -m smokewifi meshtastic/tests/test_smoke_wifi.py::test_smokewifi_info
See [pytest.ini](https://github.com/meshtastic/Meshtastic-python/blob/master/pytest.ini).
-**To see the unit test code coverage**
-
-```sh
+```shell title="To see the unit test code coverage"
pytest --cov=meshtastic
# or if want html coverage report
pytest --cov-report html --cov=meshtastic
@@ -106,9 +88,7 @@ pytest --cov-report html --cov=meshtastic
make cov
```
-**To see slowest unit tests, you can run**
-
-```sh
+```shell title="To see slowest unit tests, you can run"
pytest --durations=0
# or
make slow
@@ -118,7 +98,7 @@ make slow
Pre-generated: [API documentation](https://python.meshtastic.org)
-```sh
+```shell
bin/regen-docs.sh
```
diff --git a/docs/development/reference/_category_.yml b/docs/development/reference/_category_.yml
index cd55495b..e5d97a49 100644
--- a/docs/development/reference/_category_.yml
+++ b/docs/development/reference/_category_.yml
@@ -4,4 +4,4 @@ position: 20
link:
type: generated-index
slug: /development/reference
- title: Reference Material
\ No newline at end of file
+ title: Reference Material
diff --git a/docs/development/reference/github.mdx b/docs/development/reference/github.mdx
index def8c7d6..06db1853 100644
--- a/docs/development/reference/github.mdx
+++ b/docs/development/reference/github.mdx
@@ -24,6 +24,7 @@ Repobeats images can be generated at [repobeats.axiom.co](https://repobeats.axio
+
[](https://crowdin.meshtastic.org/)
[](https://github.com/meshtastic//actions/workflows/ci.yml)
[](https://cla-assistant.io/meshtastic/)
diff --git a/docs/development/reference/lora-design.mdx b/docs/development/reference/lora-design.mdx
index cd20d9e7..c6ed65eb 100644
--- a/docs/development/reference/lora-design.mdx
+++ b/docs/development/reference/lora-design.mdx
@@ -5,4 +5,4 @@ sidebar_label: LoRa Datasheet
sidebar_position: 1
---
-- [LoRa Design Guide Datasheet](/documents/LoRa_Design_Guide.pdf)
\ No newline at end of file
+- [LoRa Design Guide Datasheet](/documents/LoRa_Design_Guide.pdf)
diff --git a/docs/development/reference/protobuf-api.mdx b/docs/development/reference/protobuf-api.mdx
deleted file mode 100644
index d921b64f..00000000
--- a/docs/development/reference/protobuf-api.mdx
+++ /dev/null
@@ -1,1912 +0,0 @@
----
-id: protobuf-api
-title: Protobuf API Reference
-slug: /developers/protobufs/api
-sidebar_label: Protobufs
-sidebar_position: 20
----
-
-
-
-
-## admin.proto
-
-
-
-### AdminMessage
-
-:::note `message` description
-This message is handled by the Admin module and is responsible for all settings/channel read/write operations.
-This message is used to do settings operations to both remote AND local nodes.
-(Prior to 1.2 these operations were done via special ToRadio operations)
-:::
-
-
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.get_channel_request | uint32 | Send the specified channel in the response to this message NOTE: This field is sent with the channel index + 1 (to ensure we never try to send 'zero' - which protobufs treats as not present) |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.get_channel_response | [`Channel`](#channel) | TODO: REPLACE |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.get_owner_request | bool | Send the current owner data in the response to this message. |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.get_owner_response | [`User`](#user) | TODO: REPLACE |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.get_config_request | [`AdminMessage.ConfigType`](#adminmessageconfigtype) | Ask for the following config data to be sent |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.get_config_response | [`Config`](#config) | Send the current Config in the response to this message. |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.get_module_config_request | [`AdminMessage.ModuleConfigType`](#adminmessagemoduleconfigtype) | Ask for the following config data to be sent |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.get_module_config_response | [`ModuleConfig`](#moduleconfig) | Send the current Config in the response to this message. |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.get_canned_message_module_messages_request | bool | Get the Canned Message Module messages in the response to this message. |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.get_canned_message_module_messages_response | string | Get the Canned Message Module messages in the response to this message. |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.get_device_metadata_request | bool | Request the node to send device metadata (firmware, protobuf version, etc) |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.get_device_metadata_response | [`DeviceMetadata`](#devicemetadata) | Device metadata response |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.set_owner | [`User`](#user) | Set the owner for this node |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.set_channel | [`Channel`](#channel) | Set channels (using the new API). A special channel is the "primary channel". The other records are secondary channels. Note: only one channel can be marked as primary. If the client sets a particular channel to be primary, the previous channel will be set to SECONDARY automatically. |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.set_config | [`Config`](#config) | Set the current Config |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.set_module_config | [`ModuleConfig`](#moduleconfig) | Set the current Config |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.set_canned_message_module_messages | string | Set the Canned Message Module messages text. |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.confirm_set_config | bool | Sent immediatly after a config change has been sent to ensure comms, if this is not recieved, the config will be reverted after 10 mins |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.confirm_set_module_config | bool | Sent immediatly after a config change has been sent to ensure comms, if this is not recieved, the config will be reverted after 10 mins |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.confirm_set_channel | bool | Setting channels/radio config remotely carries the risk that you might send an invalid config and the radio never talks to your mesh again. Therefore if setting either of these properties remotely, you must send a confirm_xxx message within 10 minutes. If you fail to do so, the radio will assume loss of comms and revert your changes. These messages are optional when changing the local node. |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.confirm_set_radio | bool | TODO: REPLACE |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.reboot_ota_seconds | int32 | Tell the node to reboot into the OTA Firmware in this many seconds (or <0 to cancel reboot) Only Implemented for ESP32 Devices. This needs to be issued to send a new main firmware via bluetooth. |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.exit_simulator | bool | This message is only supported for the simulator porduino build. If received the simulator will exit successfully. |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.reboot_seconds | int32 | Tell the node to reboot in this many seconds (or <0 to cancel reboot) |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.shutdown_seconds | int32 | Tell the node to shutdown in this many seconds (or <0 to cancel shutdown) |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.factory_reset | int32 | Tell the node to factory reset, all device settings will be returned to factory defaults. |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.nodedb_reset | int32 | Tell the node to reset the nodedb. |
-
-
-
-
-
-
-
-
-### AdminMessage.ConfigType
-
-:::note `enum` description
-TODO: REPLACE
-:::
-
-
-| Name | Number | Description |
-| ---- | ------ | ----------- |
-| `DEVICE_CONFIG` | `0` | TODO: REPLACE |
-| `POSITION_CONFIG` | `1` | TODO: REPLACE |
-| `POWER_CONFIG` | `2` | TODO: REPLACE |
-| `NETWORK_CONFIG` | `3` | TODO: REPLACE |
-| `DISPLAY_CONFIG` | `4` | TODO: REPLACE |
-| `LORA_CONFIG` | `5` | TODO: REPLACE |
-| `BLUETOOTH_CONFIG` | `6` | TODO: REPLACE |
-
-
-
-
-### AdminMessage.ModuleConfigType
-
-:::note `enum` description
-TODO: REPLACE
-:::
-
-
-| Name | Number | Description |
-| ---- | ------ | ----------- |
-| `MQTT_CONFIG` | `0` | TODO: REPLACE |
-| `SERIAL_CONFIG` | `1` | TODO: REPLACE |
-| `EXTNOTIF_CONFIG` | `2` | TODO: REPLACE |
-| `STOREFORWARD_CONFIG` | `3` | TODO: REPLACE |
-| `RANGETEST_CONFIG` | `4` | TODO: REPLACE |
-| `TELEMETRY_CONFIG` | `5` | TODO: REPLACE |
-| `CANNEDMSG_CONFIG` | `6` | TODO: REPLACE |
-| `AUDIO_CONFIG` | `7` | TODO: REPLACE |
-
-
-
-
-
-## apponly.proto
-
-
-
-### ChannelSet
-
-:::note `message` description
-This is the most compact possible representation for a set of channels.
-It includes only one PRIMARY channel (which must be first) and
-any SECONDARY channels.
-No DISABLED channels are included.
-This abstraction is used only on the the 'app side' of the world (ie python, javascript and android etc) to show a group of Channels as a (long) URL
-:::
-
-
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| settings | [`ChannelSettings`](#channelsettings) | Channel list with settings |
-| lora_config | [`Config.LoRaConfig`](#configloraconfig) | LoRa config |
-
-
-
-
-
-
-
-## cannedmessages.proto
-
-
-
-### CannedMessageModuleConfig
-
-:::note `message` description
-Canned message module configuration.
-:::
-
-
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| messages | string | Predefined messages for canned message module separated by '|' characters. |
-
-
-
-
-
-
-
-## channel.proto
-
-
-
-### Channel
-
-:::note `message` description
-A pair of a channel number, mode and the (sharable) settings for that channel
-:::
-
-
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| index | int32 | The index of this channel in the channel table (from 0 to MAX_NUM_CHANNELS-1) (Someday - not currently implemented) An index of -1 could be used to mean "set by name", in which case the target node will find and set the channel by settings.name. |
-| settings | [`ChannelSettings`](#channelsettings) | The new settings, or NULL to disable that channel |
-| role | [`Channel.Role`](#channelrole) | TODO: REPLACE |
-
-
-
-
-### ChannelSettings
-
-:::note `message` description
-Full settings (center freq, spread factor, pre-shared secret key etc...)
-needed to configure a radio for speaking on a particular channel This
-information can be encoded as a QRcode/url so that other users can configure
-their radio to join the same channel.
-A note about how channel names are shown to users: channelname-Xy
-poundsymbol is a prefix used to indicate this is a channel name (idea from @professr).
-Where X is a letter from A-Z (base 26) representing a hash of the PSK for this
-channel - so that if the user changes anything about the channel (which does
-force a new PSK) this letter will also change. Thus preventing user confusion if
-two friends try to type in a channel name of "BobsChan" and then can't talk
-because their PSKs will be different.
-The PSK is hashed into this letter by "0x41 + [xor all bytes of the psk ] modulo 26"
-This also allows the option of someday if people have the PSK off (zero), the
-users COULD type in a channel name and be able to talk.
-Y is a lower case letter from a-z that represents the channel 'speed' settings
-(for some future definition of speed)
-FIXME: Add description of multi-channel support and how primary vs secondary channels are used.
-FIXME: explain how apps use channels for security.
-explain how remote settings and remote gpio are managed as an example
-:::
-
-
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| channel_num | uint32 | Deprecated in favor of LoraConfig.channel_num |
-| psk | bytes | A simple pre-shared key for now for crypto. Must be either 0 bytes (no crypto), 16 bytes (AES128), or 32 bytes (AES256). A special shorthand is used for 1 byte long psks. These psks should be treated as only minimally secure, because they are listed in this source code. Those bytes are mapped using the following scheme: `0` = No crypto `1` = The special "default" channel key: {0xd4, 0xf1, 0xbb, 0x3a, 0x20, 0x29, 0x07, 0x59, 0xf0, 0xbc, 0xff, 0xab, 0xcf, 0x4e, 0x69, 0xbf} `2` through 10 = The default channel key, except with 1 through 9 added to the last byte. Shown to user as simple1 through 10 |
-| name | string | A SHORT name that will be packed into the URL. Less than 12 bytes. Something for end users to call the channel If this is the empty string it is assumed that this channel is the special (minimally secure) "Default"channel. In user interfaces it should be rendered as a local language translation of "X". For channel_num hashing empty string will be treated as "X". Where "X" is selected based on the English words listed above for ModemPreset |
-| id | fixed32 | Used to construct a globally unique channel ID. The full globally unique ID will be: "name.id" where ID is shown as base36. Assuming that the number of meshtastic users is below 20K (true for a long time) the chance of this 64 bit random number colliding with anyone else is super low. And the penalty for collision is low as well, it just means that anyone trying to decrypt channel messages might need to try multiple candidate channels. Any time a non wire compatible change is made to a channel, this field should be regenerated. There are a small number of 'special' globally known (and fairly) insecure standard channels. Those channels do not have a numeric id included in the settings, but instead it is pulled from a table of well known IDs. (see Well Known Channels FIXME) |
-| uplink_enabled | bool | If true, messages on the mesh will be sent to the *public* internet by any gateway ndoe |
-| downlink_enabled | bool | If true, messages seen on the internet will be forwarded to the local mesh. |
-
-
-
-
-
-
-
-
-### Channel.Role
-
-:::note `enum` description
-How this channel is being used (or not).
-Note: this field is an enum to give us options for the future.
-In particular, someday we might make a 'SCANNING' option.
-SCANNING channels could have different frequencies and the radio would
-occasionally check that freq to see if anything is being transmitted.
-For devices that have multiple physical radios attached, we could keep multiple PRIMARY/SCANNING channels active at once to allow
-cross band routing as needed.
-If a device has only a single radio (the common case) only one channel can be PRIMARY at a time
-(but any number of SECONDARY channels can't be sent received on that common frequency)
-:::
-
-
-| Name | Number | Description |
-| ---- | ------ | ----------- |
-| `DISABLED` | `0` | This channel is not in use right now |
-| `PRIMARY` | `1` | This channel is used to set the frequency for the radio - all other enabled channels must be SECONDARY |
-| `SECONDARY` | `2` | Secondary channels are only used for encryption/decryption/authentication purposes. Their radio settings (freq etc) are ignored, only psk is used. |
-
-
-
-
-
-## config.proto
-
-
-
-### Config
-
-
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.device | [`Config.DeviceConfig`](#configdeviceconfig) | none |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.position | [`Config.PositionConfig`](#configpositionconfig) | none |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.power | [`Config.PowerConfig`](#configpowerconfig) | none |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.network | [`Config.NetworkConfig`](#confignetworkconfig) | none |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.display | [`Config.DisplayConfig`](#configdisplayconfig) | none |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.lora | [`Config.LoRaConfig`](#configloraconfig) | none |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.bluetooth | [`Config.BluetoothConfig`](#configbluetoothconfig) | none |
-
-
-
-
-### Config.BluetoothConfig
-
-
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| enabled | bool | Enable Bluetooth on the device |
-| mode | [`Config.BluetoothConfig.PairingMode`](#configbluetoothconfigpairingmode) | Determines the pairing strategy for the device |
-| fixed_pin | uint32 | Specified pin for PairingMode.FixedPin |
-
-
-
-
-### Config.DeviceConfig
-
-:::note `message` description
-Configuration
-:::
-
-
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| role | [`Config.DeviceConfig.Role`](#configdeviceconfigrole) | Sets the role of node |
-| serial_enabled | bool | Disabling this will disable the SerialConsole by not initilizing the StreamAPI |
-| debug_log_enabled | bool | By default we turn off logging as soon as an API client connects (to keep shared serial link quiet). Set this to true to leave the debug log outputting even when API is active. |
-
-
-
-
-### Config.DisplayConfig
-
-:::note `message` description
-Display Config
-:::
-
-
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| screen_on_secs | uint32 | Number of seconds the screen stays on after pressing the user button or receiving a message 0 for default of one minute MAXUINT for always on |
-| gps_format | [`Config.DisplayConfig.GpsCoordinateFormat`](#configdisplayconfiggpscoordinateformat) | How the GPS coordinates are formatted on the OLED screen. |
-| auto_screen_carousel_secs | uint32 | Automatically toggles to the next page on the screen like a carousel, based the specified interval in seconds. Potentially useful for devices without user buttons. |
-| compass_north_top | bool | If this is set, the displayed compass will always point north. if unset, the old behaviour (top of display is heading direction) is used. |
-| flip_screen | bool | Flip screen vertically, for cases that mount the screen upside down |
-| units | [`Config.DisplayConfig.DisplayUnits`](#configdisplayconfigdisplayunits) | Perferred display units |
-| oled | [`Config.DisplayConfig.OledType`](#configdisplayconfigoledtype) | Override auto-detect in screen |
-
-
-
-
-### Config.LoRaConfig
-
-:::note `message` description
-Lora Config
-:::
-
-
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| use_preset | bool | When enabled, the `modem_preset` fields will be adheared to, else the `bandwidth`/`spread_factor`/`coding_rate` will be taked from their respective manually defined fields |
-| modem_preset | [`Config.LoRaConfig.ModemPreset`](#configloraconfigmodempreset) | Either modem_config or bandwidth/spreading/coding will be specified - NOT BOTH. As a heuristic: If bandwidth is specified, do not use modem_config. Because protobufs take ZERO space when the value is zero this works out nicely. This value is replaced by bandwidth/spread_factor/coding_rate. If you'd like to experiment with other options add them to MeshRadio.cpp in the device code. |
-| bandwidth | uint32 | Bandwidth in MHz Certain bandwidth numbers are 'special' and will be converted to the appropriate floating point value: 31 -> 31.25MHz |
-| spread_factor | uint32 | A number from 7 to 12. Indicates number of chirps per symbol as 1<. Note: app developers are encouraged to also use the following standard node IDs "^all" (for broadcast), "^local" (for the locally connected node) |
-| long_name | string | A full name for this user, i.e. "Kevin Hester" |
-| short_name | string | A VERY short name, ideally two characters. Suitable for a tiny OLED screen |
-| macaddr | bytes | This is the addr of the radio. Not populated by the phone, but added by the esp32 when broadcasting |
-| hw_model | [`HardwareModel`](#hardwaremodel) | TBEAM, HELTEC, etc... Starting in 1.2.11 moved to hw_model enum in the NodeInfo object. Apps will still need the string here for older builds (so OTA update can find the right image), but if the enum is available it will be used instead. |
-| is_licensed | bool | In some regions Ham radio operators have different bandwidth limitations than others. If this user is a licensed operator, set this flag. Also, "long_name" should be their licence number. |
-
-
-
-
-### Waypoint
-
-:::note `message` description
-Waypoint message, used to share arbitrary locations across the mesh
-:::
-
-
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| id | uint32 | Id of the waypoint |
-| latitude_i | sfixed32 | latitude_i |
-| longitude_i | sfixed32 | longitude_i |
-| expire | uint32 | Time the waypoint is to expire (epoch) |
-| locked | bool | If true, only allow the original sender to update the waypoint. |
-| name | string | Name of the waypoint - max 30 chars |
-| description | string | Description of the waypoint - max 100 chars |
-
-
-
-
-
-
-
-
-### Constants
-
-:::note `enum` description
-Shared constants between device and phone
-:::
-
-
-| Name | Number | Description |
-| ---- | ------ | ----------- |
-| `ZERO` | `0` | First enum must be zero, and we are just using this enum to pass int constants between two very different environments |
-| `DATA_PAYLOAD_LEN` | `237` | From mesh.options note: this payload length is ONLY the bytes that are sent inside of the Data protobuf (excluding protobuf overhead). The 16 byte header is outside of this envelope |
-
-
-
-
-### CriticalErrorCode
-
-:::note `enum` description
-Error codes for critical errors
-The device might report these fault codes on the screen.
-If you encounter a fault code, please post on the meshtastic.discourse.group
-and we'll try to help.
-:::
-
-
-| Name | Number | Description |
-| ---- | ------ | ----------- |
-| `NONE` | `0` | TODO: REPLACE |
-| `TX_WATCHDOG` | `1` | A software bug was detected while trying to send lora |
-| `SLEEP_ENTER_WAIT` | `2` | A software bug was detected on entry to sleep |
-| `NO_RADIO` | `3` | No Lora radio hardware could be found |
-| `UNSPECIFIED` | `4` | Not normally used |
-| `UBLOX_UNIT_FAILED` | `5` | We failed while configuring a UBlox GPS |
-| `NO_AXP192` | `6` | This board was expected to have a power management chip and it is missing or broken |
-| `INVALID_RADIO_SETTING` | `7` | The channel tried to set a radio setting which is not supported by this chipset, radio comms settings are now undefined. |
-| `TRANSMIT_FAILED` | `8` | Radio transmit hardware failure. We sent data to the radio chip, but it didn't reply with an interrupt. |
-| `BROWNOUT` | `9` | We detected that the main CPU voltage dropped below the minumum acceptable value |
-| `SX1262_FAILURE` | `10` | Selftest of SX1262 radio chip failed |
-| `RADIO_SPI_BUG` | `11` | A (likely software but possibly hardware) failure was detected while trying to send packets. If this occurs on your board, please post in the forum so that we can ask you to collect some information to allow fixing this bug |
-
-
-
-
-### HardwareModel
-
-:::note `enum` description
-Note: these enum names must EXACTLY match the string used in the device
-bin/build-all.sh script.
-Because they will be used to find firmware filenames in the android app for OTA updates.
-To match the old style filenames, _ is converted to -, p is converted to .
-:::
-
-
-| Name | Number | Description |
-| ---- | ------ | ----------- |
-| `UNSET` | `0` | TODO: REPLACE |
-| `TLORA_V2` | `1` | TODO: REPLACE |
-| `TLORA_V1` | `2` | TODO: REPLACE |
-| `TLORA_V2_1_1P6` | `3` | TODO: REPLACE |
-| `TBEAM` | `4` | TODO: REPLACE |
-| `HELTEC_V2_0` | `5` | The original heltec WiFi_Lora_32_V2, which had battery voltage sensing hooked to GPIO 13 (see HELTEC_V2 for the new version). |
-| `TBEAM_V0P7` | `6` | TODO: REPLACE |
-| `T_ECHO` | `7` | TODO: REPLACE |
-| `TLORA_V1_1P3` | `8` | TODO: REPLACE |
-| `RAK4631` | `9` | TODO: REPLACE |
-| `HELTEC_V2_1` | `10` | The new version of the heltec WiFi_Lora_32_V2 board that has battery sensing hooked to GPIO 37. Sadly they did not update anything on the silkscreen to identify this board |
-| `HELTEC_V1` | `11` | Ancient heltec WiFi_Lora_32 board |
-| `LILYGO_TBEAM_S3_CORE` | `12` | New T-BEAM with ESP32-S3 CPU |
-| `RAK11200` | `13` | RAK WisBlock ESP32 core: https://docs.rakwireless.com/Product-Categories/WisBlock/RAK11200/Overview/ |
-| `NANO_G1` | `14` | B&Q Consulting Nano Edition G1: https://uniteng.com/wiki/doku.php?id=meshtastic:nano |
-| `TLORA_V2_1_1P8` | `15` | TODO: REPLACE |
-| `STATION_G1` | `25` | B&Q Consulting Station Edition G1: https://uniteng.com/wiki/doku.php?id=meshtastic:station |
-| `LORA_RELAY_V1` | `32` | Less common/prototype boards listed here (needs one more byte over the air) |
-| `NRF52840DK` | `33` | TODO: REPLACE |
-| `PPR` | `34` | TODO: REPLACE |
-| `GENIEBLOCKS` | `35` | TODO: REPLACE |
-| `NRF52_UNKNOWN` | `36` | TODO: REPLACE |
-| `PORTDUINO` | `37` | TODO: REPLACE |
-| `ANDROID_SIM` | `38` | The simulator built into the android app |
-| `DIY_V1` | `39` | Custom DIY device based on @NanoVHF schematics: https://github.com/NanoVHF/Meshtastic-DIY/tree/main/Schematics |
-| `NRF52840_PCA10059` | `40` | nRF52840 Dongle : https://www.nordicsemi.com/Products/Development-hardware/nrf52840-dongle/ |
-| `DR_DEV` | `41` | Custom Disaster Radio esp32 v3 device https://github.com/sudomesh/disaster-radio/tree/master/hardware/board_esp32_v3 |
-| `M5STACK` | `42` | M5 esp32 based MCU modules with enclosure, TFT and LORA Shields. All Variants (Basic, Core, Fire, Core2, Paper) https://m5stack.com/ |
-| `PRIVATE_HW` | `255` | Reserved ID For developing private Ports. These will show up in live traffic sparsely, so we can use a high number. Keep it within 8 bits. |
-
-
-
-
-### LogRecord.Level
-
-:::note `enum` description
-Log levels, chosen to match python logging conventions.
-:::
-
-
-| Name | Number | Description |
-| ---- | ------ | ----------- |
-| `UNSET` | `0` | Log levels, chosen to match python logging conventions. |
-| `CRITICAL` | `50` | Log levels, chosen to match python logging conventions. |
-| `ERROR` | `40` | Log levels, chosen to match python logging conventions. |
-| `WARNING` | `30` | Log levels, chosen to match python logging conventions. |
-| `INFO` | `20` | Log levels, chosen to match python logging conventions. |
-| `DEBUG` | `10` | Log levels, chosen to match python logging conventions. |
-| `TRACE` | `5` | Log levels, chosen to match python logging conventions. |
-
-
-
-
-### MeshPacket.Delayed
-
-:::note `enum` description
-Identify if this is a delayed packet
-:::
-
-
-| Name | Number | Description |
-| ---- | ------ | ----------- |
-| `NO_DELAY` | `0` | If unset, the message is being sent in real time. |
-| `DELAYED_BROADCAST` | `1` | The message is delayed and was originally a broadcast |
-| `DELAYED_DIRECT` | `2` | The message is delayed and was originally a direct message |
-
-
-
-
-### MeshPacket.Priority
-
-:::note `enum` description
-The priority of this message for sending.
-Higher priorities are sent first (when managing the transmit queue).
-This field is never sent over the air, it is only used internally inside of a local device node.
-API clients (either on the local node or connected directly to the node)
-can set this parameter if necessary.
-(values must be <= 127 to keep protobuf field to one byte in size.
-Detailed background on this field:
-I noticed a funny side effect of lora being so slow: Usually when making
-a protocol there isn’t much need to use message priority to change the order
-of transmission (because interfaces are fairly fast).
-But for lora where packets can take a few seconds each, it is very important
-to make sure that critical packets are sent ASAP.
-In the case of meshtastic that means we want to send protocol acks as soon as possible
-(to prevent unneeded retransmissions), we want routing messages to be sent next,
-then messages marked as reliable and finally ‘background’ packets like periodic position updates.
-So I bit the bullet and implemented a new (internal - not sent over the air)
-field in MeshPacket called ‘priority’.
-And the transmission queue in the router object is now a priority queue.
-:::
-
-
-| Name | Number | Description |
-| ---- | ------ | ----------- |
-| `UNSET` | `0` | Treated as Priority.DEFAULT |
-| `MIN` | `1` | TODO: REPLACE |
-| `BACKGROUND` | `10` | Background position updates are sent with very low priority - if the link is super congested they might not go out at all |
-| `DEFAULT` | `64` | This priority is used for most messages that don't have a priority set |
-| `RELIABLE` | `70` | If priority is unset but the message is marked as want_ack, assume it is important and use a slightly higher priority |
-| `ACK` | `120` | Ack/naks are sent with very high priority to ensure that retransmission stops as soon as possible |
-| `MAX` | `127` | TODO: REPLACE |
-
-
-
-
-### Position.AltSource
-
-:::note `enum` description
-How the altitude was acquired: manual, GPS int/ext, etc
-Default: same as location_source if present
-:::
-
-
-| Name | Number | Description |
-| ---- | ------ | ----------- |
-| `ALT_UNSET` | `0` | TODO: REPLACE |
-| `ALT_MANUAL` | `1` | TODO: REPLACE |
-| `ALT_INTERNAL` | `2` | TODO: REPLACE |
-| `ALT_EXTERNAL` | `3` | TODO: REPLACE |
-| `ALT_BAROMETRIC` | `4` | TODO: REPLACE |
-
-
-
-
-### Position.LocSource
-
-:::note `enum` description
-How the location was acquired: manual, onboard GPS, external (EUD) GPS
-:::
-
-
-| Name | Number | Description |
-| ---- | ------ | ----------- |
-| `LOC_UNSET` | `0` | TODO: REPLACE |
-| `LOC_MANUAL` | `1` | TODO: REPLACE |
-| `LOC_INTERNAL` | `2` | TODO: REPLACE |
-| `LOC_EXTERNAL` | `3` | TODO: REPLACE |
-
-
-
-
-### Routing.Error
-
-:::note `enum` description
-A failure in delivering a message (usually used for routing control messages, but might be provided in addition to ack.fail_id to provide
-details on the type of failure).
-:::
-
-
-| Name | Number | Description |
-| ---- | ------ | ----------- |
-| `NONE` | `0` | This message is not a failure |
-| `NO_ROUTE` | `1` | Our node doesn't have a route to the requested destination anymore. |
-| `GOT_NAK` | `2` | We received a nak while trying to forward on your behalf |
-| `TIMEOUT` | `3` | TODO: REPLACE |
-| `NO_INTERFACE` | `4` | No suitable interface could be found for delivering this packet |
-| `MAX_RETRANSMIT` | `5` | We reached the max retransmission count (typically for naive flood routing) |
-| `NO_CHANNEL` | `6` | No suitable channel was found for sending this packet (i.e. was requested channel index disabled?) |
-| `TOO_LARGE` | `7` | The packet was too big for sending (exceeds interface MTU after encoding) |
-| `NO_RESPONSE` | `8` | The request had want_response set, the request reached the destination node, but no service on that node wants to send a response (possibly due to bad channel permissions) |
-| `BAD_REQUEST` | `32` | The application layer service on the remote node received your request, but considered your request somehow invalid |
-| `NOT_AUTHORIZED` | `33` | The application layer service on the remote node received your request, but considered your request not authorized (i.e you did not send the request on the required bound channel) |
-
-
-
-
-
-## module_config.proto
-
-
-
-### ModuleConfig
-
-:::note `message` description
-Module Config
-:::
-
-
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.mqtt | [`ModuleConfig.MQTTConfig`](#moduleconfigmqttconfig) | TODO: REPLACE |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.serial | [`ModuleConfig.SerialConfig`](#moduleconfigserialconfig) | TODO: REPLACE |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.external_notification | [`ModuleConfig.ExternalNotificationConfig`](#moduleconfigexternalnotificationconfig) | TODO: REPLACE |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.store_forward | [`ModuleConfig.StoreForwardConfig`](#moduleconfigstoreforwardconfig) | TODO: REPLACE |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.range_test | [`ModuleConfig.RangeTestConfig`](#moduleconfigrangetestconfig) | TODO: REPLACE |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.telemetry | [`ModuleConfig.TelemetryConfig`](#moduleconfigtelemetryconfig) | TODO: REPLACE |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.canned_message | [`ModuleConfig.CannedMessageConfig`](#moduleconfigcannedmessageconfig) | TODO: REPLACE |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) payload_variant.audio | [`ModuleConfig.AudioConfig`](#moduleconfigaudioconfig) | TODO: REPLACE |
-
-
-
-
-### ModuleConfig.AudioConfig
-
-:::note `message` description
-Audio Config for codec2 voice
-:::
-
-
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| codec2_enabled | bool | Whether Audio is enabled |
-| mic_chan | uint32 | ADC where Microphone is connected |
-| amp_pin | uint32 | DAC where Speaker is connected |
-| ptt_pin | uint32 | PTT Pin |
-| bitrate | [`ModuleConfig.AudioConfig.Audio_Baud`](#moduleconfigaudioconfigaudio_baud) | The audio sample rate to use for codec2 |
-
-
-
-
-### ModuleConfig.CannedMessageConfig
-
-:::note `message` description
-TODO: REPLACE
-:::
-
-
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| rotary1_enabled | bool | Enable the rotary encoder #1. This is a 'dumb' encoder sending pulses on both A and B pins while rotating. |
-| inputbroker_pin_a | uint32 | GPIO pin for rotary encoder A port. |
-| inputbroker_pin_b | uint32 | GPIO pin for rotary encoder B port. |
-| inputbroker_pin_press | uint32 | GPIO pin for rotary encoder Press port. |
-| inputbroker_event_cw | [`ModuleConfig.CannedMessageConfig.InputEventChar`](#moduleconfigcannedmessageconfiginputeventchar) | Generate input event on CW of this kind. |
-| inputbroker_event_ccw | [`ModuleConfig.CannedMessageConfig.InputEventChar`](#moduleconfigcannedmessageconfiginputeventchar) | Generate input event on CCW of this kind. |
-| inputbroker_event_press | [`ModuleConfig.CannedMessageConfig.InputEventChar`](#moduleconfigcannedmessageconfiginputeventchar) | Generate input event on Press of this kind. |
-| updown1_enabled | bool | Enable the Up/Down/Select input device. Can be RAK rotary encoder or 3 buttons. Uses the a/b/press definitions from inputbroker. |
-| enabled | bool | Enable/disable CannedMessageModule. |
-| allow_input_source | string | Input event origin accepted by the canned message module. Can be e.g. "rotEnc1", "upDownEnc1" or keyword "_any" |
-| send_bell | bool | CannedMessageModule also sends a bell character with the messages. ExternalNotificationModule can benefit from this feature. |
-
-
-
-
-### ModuleConfig.ExternalNotificationConfig
-
-:::note `message` description
-External Notifications Config
-:::
-
-
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| enabled | bool | Preferences for the ExternalNotificationModule FIXME - Move this out of UserPreferences and into a section for module configuration. |
-| output_ms | uint32 | TODO: REPLACE |
-| output | uint32 | TODO: REPLACE |
-| active | bool | TODO: REPLACE |
-| alert_message | bool | TODO: REPLACE |
-| alert_bell | bool | TODO: REPLACE |
-
-
-
-
-### ModuleConfig.MQTTConfig
-
-:::note `message` description
-MQTT Client Config
-:::
-
-
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| enabled | bool | If a meshtastic node is able to reach the internet it will normally attempt to gateway any channels that are marked as is_uplink_enabled or is_downlink_enabled. |
-| address | string | The server to use for our MQTT global message gateway feature. If not set, the default server will be used |
-| username | string | MQTT username to use (most useful for a custom MQTT server). If using a custom server, this will be honoured even if empty. If using the default server, this will only be honoured if set, otherwise the device will use the default username |
-| password | string | MQTT password to use (most useful for a custom MQTT server). If using a custom server, this will be honoured even if empty. If using the default server, this will only be honoured if set, otherwise the device will use the default password |
-| encryption_enabled | bool | Whether to send encrypted or decrypted packets to MQTT. This parameter is only honoured if you also set server (the default official mqtt.meshtastic.org server can handle encrypted packets) Decrypted packets may be useful for external systems that want to consume meshtastic packets |
-| json_enabled | bool | Whether to send / consume json packets on MQTT |
-
-
-
-
-### ModuleConfig.RangeTestConfig
-
-:::note `message` description
-Preferences for the RangeTestModule
-:::
-
-
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| enabled | bool | Enable the Range Test Module |
-| sender | uint32 | Send out range test messages from this node |
-| save | bool | Bool value indicating that this node should save a RangeTest.csv file. ESP32 Only |
-
-
-
-
-### ModuleConfig.SerialConfig
-
-:::note `message` description
-Serial Config
-:::
-
-
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| enabled | bool | Preferences for the SerialModule FIXME - Move this out of UserPreferences and into a section for module configuration. |
-| echo | bool | TODO: REPLACE |
-| rxd | uint32 | TODO: REPLACE |
-| txd | uint32 | TODO: REPLACE |
-| baud | [`ModuleConfig.SerialConfig.Serial_Baud`](#moduleconfigserialconfigserial_baud) | TODO: REPLACE |
-| timeout | uint32 | TODO: REPLACE |
-| mode | [`ModuleConfig.SerialConfig.Serial_Mode`](#moduleconfigserialconfigserial_mode) | TODO: REPLACE |
-
-
-
-
-### ModuleConfig.StoreForwardConfig
-
-:::note `message` description
-Store and Forward Module Config
-:::
-
-
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| enabled | bool | Enable the Store and Forward Module |
-| heartbeat | bool | TODO: REPLACE |
-| records | uint32 | TODO: REPLACE |
-| history_return_max | uint32 | TODO: REPLACE |
-| history_return_window | uint32 | TODO: REPLACE |
-
-
-
-
-### ModuleConfig.TelemetryConfig
-
-:::note `message` description
-Configuration for both device and environment metrics
-:::
-
-
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| device_update_interval | uint32 | Interval in seconds of how often we should try to send our device metrics to the mesh |
-| environment_update_interval | uint32 | none |
-| environment_measurement_enabled | bool | Preferences for the Telemetry Module (Environment) Enable/Disable the telemetry measurement module measurement collection |
-| environment_screen_enabled | bool | Enable/Disable the telemetry measurement module on-device display |
-| environment_display_fahrenheit | bool | We'll always read the sensor in Celsius, but sometimes we might want to display the results in Fahrenheit as a "user preference". |
-
-
-
-
-
-
-
-
-### ModuleConfig.AudioConfig.Audio_Baud
-
-:::note `enum` description
-Baudrate for codec2 voice
-:::
-
-
-| Name | Number | Description |
-| ---- | ------ | ----------- |
-| `CODEC2_DEFAULT` | `0` | none |
-| `CODEC2_3200` | `1` | none |
-| `CODEC2_2400` | `2` | none |
-| `CODEC2_1600` | `3` | none |
-| `CODEC2_1400` | `4` | none |
-| `CODEC2_1300` | `5` | none |
-| `CODEC2_1200` | `6` | none |
-| `CODEC2_700` | `7` | none |
-| `CODEC2_700B` | `8` | none |
-
-
-
-
-### ModuleConfig.CannedMessageConfig.InputEventChar
-
-:::note `enum` description
-TODO: REPLACE
-:::
-
-
-| Name | Number | Description |
-| ---- | ------ | ----------- |
-| `NONE` | `0` | TODO: REPLACE |
-| `UP` | `17` | TODO: REPLACE |
-| `DOWN` | `18` | TODO: REPLACE |
-| `LEFT` | `19` | TODO: REPLACE |
-| `RIGHT` | `20` | TODO: REPLACE |
-| `SELECT` | `10` | '\n' |
-| `BACK` | `27` | TODO: REPLACE |
-| `CANCEL` | `24` | TODO: REPLACE |
-
-
-
-
-### ModuleConfig.SerialConfig.Serial_Baud
-
-:::note `enum` description
-TODO: REPLACE
-:::
-
-
-| Name | Number | Description |
-| ---- | ------ | ----------- |
-| `BAUD_DEFAULT` | `0` | none |
-| `BAUD_110` | `1` | none |
-| `BAUD_300` | `2` | none |
-| `BAUD_600` | `3` | none |
-| `BAUD_1200` | `4` | none |
-| `BAUD_2400` | `5` | none |
-| `BAUD_4800` | `6` | none |
-| `BAUD_9600` | `7` | none |
-| `BAUD_19200` | `8` | none |
-| `BAUD_38400` | `9` | none |
-| `BAUD_57600` | `10` | none |
-| `BAUD_115200` | `11` | none |
-| `BAUD_230400` | `12` | none |
-| `BAUD_460800` | `13` | none |
-| `BAUD_576000` | `14` | none |
-| `BAUD_921600` | `15` | none |
-
-
-
-
-### ModuleConfig.SerialConfig.Serial_Mode
-
-:::note `enum` description
-TODO: REPLACE
-:::
-
-
-| Name | Number | Description |
-| ---- | ------ | ----------- |
-| `DEFAULT` | `0` | none |
-| `SIMPLE` | `1` | none |
-| `PROTO` | `2` | none |
-| `TEXTMSG` | `3` | none |
-| `NMEA` | `4` | none |
-
-
-
-
-
-## mqtt.proto
-
-
-
-### ServiceEnvelope
-
-:::note `message` description
-This message wraps a MeshPacket with extra metadata about the sender and how it arrived.
-:::
-
-
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| packet | [`MeshPacket`](#meshpacket) | The (probably encrypted) packet |
-| channel_id | string | The global channel ID it was sent on |
-| gateway_id | string | The sending gateway node ID. Can we use this to authenticate/prevent fake nodeid impersonation for senders? - i.e. use gateway/mesh id (which is authenticated) + local node id as the globally trusted nodenum |
-
-
-
-
-
-
-
-## portnums.proto
-
-
-
-
-### PortNum
-
-:::note `enum` description
-For any new 'apps' that run on the device or via sister apps on phones/PCs they should pick and use a
-unique 'portnum' for their application.
-If you are making a new app using meshtastic, please send in a pull request to add your 'portnum' to this
-master table.
-PortNums should be assigned in the following range:
-0-63 Core Meshtastic use, do not use for third party apps
-64-127 Registered 3rd party apps, send in a pull request that adds a new entry to portnums.proto to register your application
-256-511 Use one of these portnums for your private applications that you don't want to register publically
-All other values are reserved.
-Note: This was formerly a Type enum named 'typ' with the same id #
-We have change to this 'portnum' based scheme for specifying app handlers for particular payloads.
-This change is backwards compatible by treating the legacy OPAQUE/CLEAR_TEXT values identically.
-:::
-
-
-| Name | Number | Description |
-| ---- | ------ | ----------- |
-| `UNKNOWN_APP` | `0` | Deprecated: do not use in new code (formerly called OPAQUE) A message sent from a device outside of the mesh, in a form the mesh does not understand NOTE: This must be 0, because it is documented in IMeshService.aidl to be so |
-| `TEXT_MESSAGE_APP` | `1` | A simple UTF-8 text message, which even the little micros in the mesh can understand and show on their screen eventually in some circumstances even signal might send messages in this form (see below) |
-| `REMOTE_HARDWARE_APP` | `2` | Reserved for built-in GPIO/example app. See remote_hardware.proto/HardwareMessage for details on the message sent/received to this port number |
-| `POSITION_APP` | `3` | The built-in position messaging app. Payload is a [Position](/docs/developers/protobufs/api#position) message |
-| `NODEINFO_APP` | `4` | The built-in user info app. Payload is a [User](/docs/developers/protobufs/api#user) message |
-| `ROUTING_APP` | `5` | Protocol control packets for mesh protocol use. Payload is a [Routing](/docs/developers/protobufs/api#routing) message |
-| `ADMIN_APP` | `6` | Admin control packets. Payload is a [AdminMessage](/docs/developers/protobufs/api#adminmessage) message |
-| `TEXT_MESSAGE_COMPRESSED_APP` | `7` | Compressed TEXT_MESSAGE payloads. |
-| `WAYPOINT_APP` | `8` | Waypoint payloads. Payload is a [Waypoint](/docs/developers/protobufs/api#waypoint) message |
-| `AUDIO_APP` | `9` | Audio Payloads. Encapsulated codec2 packets. On 2.4 GHZ Bandwidths only for now |
-| `REPLY_APP` | `32` | Provides a 'ping' service that replies to any packet it receives. Also serves as a small example module. |
-| `IP_TUNNEL_APP` | `33` | Used for the python IP tunnel feature |
-| `SERIAL_APP` | `64` | Provides a hardware serial interface to send and receive from the Meshtastic network. Connect to the RX/TX pins of a device with 38400 8N1. Packets received from the Meshtastic network is forwarded to the RX pin while sending a packet to TX will go out to the Mesh network. Maximum packet size of 240 bytes. Module is disabled by default can be turned on by setting SERIAL_MODULE_ENABLED = 1 in SerialPlugh.cpp. |
-| `STORE_FORWARD_APP` | `65` | STORE_FORWARD_APP (Work in Progress) Maintained by Jm Casler (MC Hamster) : jm@casler.org |
-| `RANGE_TEST_APP` | `66` | Optional port for messages for the range test module. |
-| `TELEMETRY_APP` | `67` | Provides a format to send and receive telemetry data from the Meshtastic network. Maintained by Charles Crossan (crossan007) : crossan007@gmail.com |
-| `ZPS_APP` | `68` | Experimental tools for estimating node position without a GPS Maintained by Github user a-f-G-U-C (a Meshtastic contributor) Project files at https://github.com/a-f-G-U-C/Meshtastic-ZPS |
-| `SIMULATOR_APP` | `69` | Used to let multiple instances of Linux native applications communicate as if they did using their LoRa chip. Maintained by GitHub user GUVWAF. Project files at https://github.com/GUVWAF/Meshtasticator |
-| `PRIVATE_APP` | `256` | Private applications should use portnums >= 256. To simplify initial development and testing you can use "PRIVATE_APP" in your code without needing to rebuild protobuf files (via [regen-protos.sh](https://github.com/meshtastic/firmware/blob/master/bin/regen-protos.sh)) |
-| `ATAK_FORWARDER` | `257` | ATAK Forwarder Module https://github.com/paulmandal/atak-forwarder |
-| `MAX` | `511` | Currently we limit port nums to no higher than this value |
-
-
-
-
-
-## remote_hardware.proto
-
-
-
-### HardwareMessage
-
-:::note `message` description
-An example app to show off the module system. This message is used for
-REMOTE_HARDWARE_APP PortNums.
-Also provides easy remote access to any GPIO.
-In the future other remote hardware operations can be added based on user interest
-(i.e. serial output, spi/i2c input/output).
-FIXME - currently this feature is turned on by default which is dangerous
-because no security yet (beyond the channel mechanism).
-It should be off by default and then protected based on some TBD mechanism
-(a special channel once multichannel support is included?)
-:::
-
-
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| type | [`HardwareMessage.Type`](#hardwaremessagetype) | What type of HardwareMessage is this? |
-| gpio_mask | uint64 | What gpios are we changing. Not used for all MessageTypes, see MessageType for details |
-| gpio_value | uint64 | For gpios that were listed in gpio_mask as valid, what are the signal levels for those gpios. Not used for all MessageTypes, see MessageType for details |
-
-
-
-
-
-
-
-
-### HardwareMessage.Type
-
-:::note `enum` description
-TODO: REPLACE
-:::
-
-
-| Name | Number | Description |
-| ---- | ------ | ----------- |
-| `UNSET` | `0` | Unset/unused |
-| `WRITE_GPIOS` | `1` | Set gpio gpios based on gpio_mask/gpio_value |
-| `WATCH_GPIOS` | `2` | We are now interested in watching the gpio_mask gpios. If the selected gpios change, please broadcast GPIOS_CHANGED. Will implicitly change the gpios requested to be INPUT gpios. |
-| `GPIOS_CHANGED` | `3` | The gpios listed in gpio_mask have changed, the new values are listed in gpio_value |
-| `READ_GPIOS` | `4` | Read the gpios specified in gpio_mask, send back a READ_GPIOS_REPLY reply with gpio_value populated |
-| `READ_GPIOS_REPLY` | `5` | A reply to READ_GPIOS. gpio_mask and gpio_value will be populated |
-
-
-
-
-
-## storeforward.proto
-
-
-
-### StoreAndForward
-
-:::note `message` description
-TODO: REPLACE
-:::
-
-
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| rr | [`StoreAndForward.RequestResponse`](#storeandforwardrequestresponse) | TODO: REPLACE |
-| stats | [`StoreAndForward.Statistics`](#storeandforwardstatistics) | TODO: REPLACE |
-| history | [`StoreAndForward.History`](#storeandforwardhistory) | TODO: REPLACE |
-| heartbeat | [`StoreAndForward.Heartbeat`](#storeandforwardheartbeat) | TODO: REPLACE |
-
-
-
-
-### StoreAndForward.Heartbeat
-
-:::note `message` description
-TODO: REPLACE
-:::
-
-
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| period | uint32 | Number of that will be sent to the client |
-| secondary | uint32 | If set, this is not the primary Store & Forward router on the mesh |
-
-
-
-
-### StoreAndForward.History
-
-:::note `message` description
-TODO: REPLACE
-:::
-
-
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| history_messages | uint32 | Number of that will be sent to the client |
-| window | uint32 | The window of messages that was used to filter the history client requested |
-| last_request | uint32 | The window of messages that was used to filter the history client requested |
-
-
-
-
-### StoreAndForward.Statistics
-
-:::note `message` description
-TODO: REPLACE
-:::
-
-
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| messages_total | uint32 | Number of messages we have ever seen |
-| messages_saved | uint32 | Number of messages we have currently saved our history. |
-| messages_max | uint32 | Maximum number of messages we will save |
-| up_time | uint32 | Router uptime in seconds |
-| requests | uint32 | Number of times any client sent a request to the S&F. |
-| requests_history | uint32 | Number of times the history was requested. |
-| heartbeat | bool | Is the heartbeat enabled on the server? |
-| return_max | uint32 | Is the heartbeat enabled on the server? |
-| return_window | uint32 | Is the heartbeat enabled on the server? |
-
-
-
-
-
-
-
-
-### StoreAndForward.RequestResponse
-
-:::note `enum` description
-1 - 99 = From Router
-101 - 199 = From Client
-:::
-
-
-| Name | Number | Description |
-| ---- | ------ | ----------- |
-| `UNSET` | `0` | Unset/unused |
-| `ROUTER_ERROR` | `1` | Router is an in error state. |
-| `ROUTER_HEARTBEAT` | `2` | Router heartbeat |
-| `ROUTER_PING` | `3` | Router has requested the client respond. This can work as a "are you there" message. |
-| `ROUTER_PONG` | `4` | The response to a "Ping" |
-| `ROUTER_BUSY` | `5` | Router is currently busy. Please try again later. |
-| `ROUTER_HISTORY` | `6` | Router is responding to a request for history. |
-| `CLIENT_ERROR` | `101` | Client is an in error state. |
-| `CLIENT_HISTORY` | `102` | Client has requested a replay from the router. |
-| `CLIENT_STATS` | `103` | Client has requested stats from the router. |
-| `CLIENT_PING` | `104` | Client has requested the router respond. This can work as a "are you there" message. |
-| `CLIENT_PONG` | `105` | The response to a "Ping" |
-| `CLIENT_ABORT` | `106` | Client has requested that the router abort processing the client's request |
-
-
-
-
-
-## telemetry.proto
-
-
-
-### DeviceMetrics
-
-:::note `message` description
-Key native device metrics such as battery level
-:::
-
-
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| battery_level | uint32 | 1-100 (0 means powered) |
-| voltage | float | Voltage measured |
-| channel_utilization | float | Utilization for the current channel, including well formed TX, RX and malformed RX (aka noise). |
-| air_util_tx | float | Percent of airtime for transmission used within the last hour. |
-
-
-
-
-### EnvironmentMetrics
-
-:::note `message` description
-Weather station or other environmental metrics
-:::
-
-
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| temperature | float | Temperature measured |
-| relative_humidity | float | Relative humidity percent measured |
-| barometric_pressure | float | Barometric pressure in hPA measured |
-| gas_resistance | float | Gas resistance in mOhm measured |
-| voltage | float | Voltage measured |
-| current | float | Current measured |
-
-
-
-
-### Telemetry
-
-:::note `message` description
-Types of Measurements the telemetry module is equipped to handle
-:::
-
-
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| time | fixed32 | This is usually not sent over the mesh (to save space), but it is sent from the phone so that the local device can set its RTC If it is sent over the mesh (because there are devices on the mesh without GPS), it will only be sent by devices which has a hardware GPS clock (IE Mobile Phone). seconds since 1970 |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) variant.device_metrics | [`DeviceMetrics`](#devicemetrics) | Key native device metrics such as battery level |
-| [**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) variant.environment_metrics | [`EnvironmentMetrics`](#environmentmetrics) | Weather station or other environmental metrics |
-
-
-
-
-
-
-
-
-### TelemetrySensorType
-
-:::note `enum` description
-TODO: REPLACE
-:::
-
-
-| Name | Number | Description |
-| ---- | ------ | ----------- |
-| `SENSOR_UNSET` | `0` | No external telemetry sensor explicitly set |
-| `BME280` | `1` | High accuracy temperature, pressure, humidity |
-| `BME680` | `2` | High accuracy temperature, pressure, humidity, and air resistance |
-| `MCP9808` | `3` | Very high accuracy temperature |
-| `INA260` | `4` | Moderate accuracy current and voltage |
-| `INA219` | `5` | Moderate accuracy current and voltage |
-| `BMP280` | `6` | High accuracy temperature and pressure |
-| `SHTC3` | `7` | High accuracy temperature and humidity |
-| `LPS22` | `8` | High accuracy pressure |
-| `QMC6310` | `9` | 3-Axis magnetic sensor |
-| `QMI8658` | `10` | 6-Axis inertial measurement sensor |
-
-
-
-
diff --git a/docs/development/reference/protobufs.mdx b/docs/development/reference/protobufs.mdx
new file mode 100644
index 00000000..c8b76931
--- /dev/null
+++ b/docs/development/reference/protobufs.mdx
@@ -0,0 +1,8 @@
+---
+id: protobufs
+title: Protobufs
+---
+
+Protobufs are used by Meshtastic software to send and receive data between App and Device and Device to Device.
+
+Documentation on the Meshtastic Protobuf messages can be fund on the [BSR(Buf Schema Registry)](https://buf.build/meshtastic/protobufs).
diff --git a/docs/development/web/building.mdx b/docs/development/web/building.mdx
index ca6ff64c..e44865f3 100644
--- a/docs/development/web/building.mdx
+++ b/docs/development/web/building.mdx
@@ -4,8 +4,7 @@ title: Building
sidebar_label: Building
---
-
Releases are automatically generated for every commit as per out [CI](https://github.com/meshtastic/web/blob/master/.github/workflows/main.yml). This performs two actions:
1. Generates a perpetually updated [GitHub release](https://github.com/meshtastic/web/releases/tag/latest) with an accompanying `build.tar` that a automatically get's pulled by the firmware CI at build time.
-2. A hosted version is deployed to [client.meshtastic.org](https://client.meshtastic.org).
\ No newline at end of file
+2. A hosted version is deployed to [client.meshtastic.org](https://client.meshtastic.org).
diff --git a/docs/getting-started/flashing-firmware/_category_.yml b/docs/getting-started/flashing-firmware/_category_.yml
index 5ec0512f..ceab6882 100644
--- a/docs/getting-started/flashing-firmware/_category_.yml
+++ b/docs/getting-started/flashing-firmware/_category_.yml
@@ -4,4 +4,4 @@ position: 2
link:
type: generated-index
title: Flashing Firmware
- slug: /getting-started/flashing-firmware
\ No newline at end of file
+ slug: /getting-started/flashing-firmware
diff --git a/docs/getting-started/flashing-firmware/esp32/cli-script.mdx b/docs/getting-started/flashing-firmware/esp32/cli-script.mdx
index 5688e7c7..85d0cece 100644
--- a/docs/getting-started/flashing-firmware/esp32/cli-script.mdx
+++ b/docs/getting-started/flashing-firmware/esp32/cli-script.mdx
@@ -1,12 +1,13 @@
---
id: cli-script
title: Flashing with the CLI
-sidebar_label: CLI Script
+sidebar_label: CLI Script (Advanced Users)
sidebar_position: 3
---
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
+import Link from "@docusaurus/Link";
:::caution
Make sure not to power the radio on without first attaching the antenna! You could damage the radio chip!
@@ -269,8 +270,15 @@ Be very careful to install the correct load for your board. In particular the po
Select `Flash ESP`. It may take a minute or two. Once complete, "Done! Flashing is complete!" will be shown.
-## Over the Air Update Instructions
+## Connect and Configure Device
-OTA updates are only currently available on Android.
+After flashing the Meshtastic firmware to the device, you can proceed with the initial configuration.
-
+
+
+ Connect and Configure Device
+
+
diff --git a/docs/getting-started/flashing-firmware/esp32/external-serial-adapter.mdx b/docs/getting-started/flashing-firmware/esp32/external-serial-adapter.mdx
index 896192e8..590985e5 100644
--- a/docs/getting-started/flashing-firmware/esp32/external-serial-adapter.mdx
+++ b/docs/getting-started/flashing-firmware/esp32/external-serial-adapter.mdx
@@ -1,12 +1,13 @@
---
id: external-serial-adapter
title: Flashing with an External Serial Adapter
-sidebar_label: External Serial Adapter
+sidebar_label: External Serial Adapter (Advanced Users)
sidebar_position: 4
---
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
+import Link from "@docusaurus/Link";
:::info
This information will likely only be helpful if you've already attempted to go through the prerequisites and processes outlined in [meshtastic flasher](/docs/software/python/flasher) or [manually flashing](/docs/getting-started/flashing-firmware/esp32/cli-script)
@@ -19,9 +20,10 @@ Make sure not to power the radio on without first attaching the antenna! You cou
## Background
Situations that may require usage an external USB to Serial Adapter:
-* Due to the chip shortage, recently purchased devices such as the TTGO T-Beam may come with legacy or non-standard USB to Serial adapter chips that are unreliable in some cases.
-* Certain devices might have defective USB to Serial chip.
-* Certain devices, such as the [Hydra](https://github.com/Hydra-Designs/project-hydra-meshtastic-pcb) (Meshtastic-DIY target).
+
+- Due to the chip shortage, recently purchased devices such as the TTGO T-Beam may come with legacy or non-standard USB to Serial adapter chips that are unreliable in some cases.
+- Certain devices might have defective USB to Serial chip.
+- Certain devices, such as the [Hydra](https://github.com/Hydra-Designs/project-hydra-meshtastic-pcb) (Meshtastic-DIY target).
### USB Serial Adapters
@@ -38,18 +40,18 @@ Plug the adapter into your computer without connecting it to any devices yet. En
:::info
There are multiple ways to connect the pins of the adapter to the target device: pressing jumpers against contacts, using pogo pin jigs, etc. This tutorial features offset dupont headers soldered onto the operative GPIO pins and connected via jumpers.
:::
-Disconnect your USB to Serial Adapter from the computer before starting this process.
+Disconnect your USB to Serial Adapter from the computer before starting this process.
1. Connect the RX pin of the adapter to the TX pin of the devices
2. Connect the TX pin of the adapter to the RX pin of the device
3. Connect a GND pin of the adapter to the GND pin of the device
4. Connect either the 5V pin of the adapter to the 5V pin of the device (illustrated) or the 3.3V pin of the adapter to the 3.3V pin of device.
5. Bridge GPIO 0 to GND on the device with a jumper. (This places the device into flash mode when the device is powered up)
- Example wiring featuring a T-Beam
- 
+ Example wiring featuring a T-Beam
+ 
6. Connect the device to a USB port on the computer
7. Remove the jumper bridging GPIO 0 to GND
- 
+ 
### Flashing
@@ -62,14 +64,26 @@ After flashing the device is complete, reset your device (via the RST button if
If you have the Meshtastic Python CLI installed, you can run `meshtastic --noproto` to connect the device again over the adapter and view the serial output to confirm Meshtastic installed correctly.

-
### Troubleshooting
In the Meshtastic Flasher, device detection may not work when using the external USB to Serial adapter. You might need to manually select the correct device type from the drop-down.

-Sometimes you might receive an error for COM port permission in the Meshtastic Flasher or the manual device install scripts, this can be caused by a number of different issues.
+Sometimes you might receive an error for COM port permission in the Meshtastic Flasher or the manual device install scripts, this can be caused by a number of different issues.
-You might need to run the process as an administrator, check to ensure software like Cura isn't monopolizing COM ports, or reboot.
+You might need to run the process as an administrator, check to ensure software like Cura isn't monopolizing COM ports, or reboot.

+
+## Connect and Configure Device
+
+After flashing the Meshtastic firmware to the device, you can proceed with the initial configuration.
+
+
+
+ Connect and Configure Device
+
+
diff --git a/docs/getting-started/flashing-firmware/esp32/index.mdx b/docs/getting-started/flashing-firmware/esp32/index.mdx
index af7d5fd9..4b48ea5c 100644
--- a/docs/getting-started/flashing-firmware/esp32/index.mdx
+++ b/docs/getting-started/flashing-firmware/esp32/index.mdx
@@ -11,7 +11,7 @@ The recommended method for firmware flashing is the [Web-Based Installer.](https
## Flashing Method for ESP32 Devices
-1. The [Web-Based Installer](https://flasher.meshtastic.org) requires either Chrome or Edge browsers but is an excellent choice for quickly flashing devices. **This is the recommended method for firmware flashing, especially for those new to the project, due to its ease of use.**
+1. The [Web-Based Installer](/docs/getting-started/flashing-firmware/esp32/web-flasher.mdx) requires either Chrome or Edge browsers but is an excellent choice for quickly flashing devices. **This method is highly recommended for firmware flashing, especially for new users of the project, as it is easy to use.**
2. The [Python Flasher](/docs/software/python/flasher) does a lot under the hood to prevent you from needing to use the terminal.
3. The [CLI Script](/docs/getting-started/flashing-firmware/esp32/cli-script) is considered the "manual process" for flashing firmware.
-4. Flashing your device using an [external serial adapter](/docs/getting-started/flashing-firmware/esp32/external-serial-adapter) should only be attempted as a last resort if no other method has been successful.
\ No newline at end of file
+4. Flashing your device using an [external serial adapter](/docs/getting-started/flashing-firmware/esp32/external-serial-adapter) should only be attempted as a last resort if no other method has been successful.
diff --git a/docs/getting-started/flashing-firmware/esp32/python-flasher.mdx b/docs/getting-started/flashing-firmware/esp32/python-flasher.mdx
index 3515772d..f9bee5dd 100644
--- a/docs/getting-started/flashing-firmware/esp32/python-flasher.mdx
+++ b/docs/getting-started/flashing-firmware/esp32/python-flasher.mdx
@@ -5,6 +5,7 @@ sidebar_label: Python Flasher
sidebar_position: 2
---
-import MFlasher from '../../../software/python-flasher.mdx'
+import MFlasher from "../../../software/python-flasher.mdx";
+import Link from "@docusaurus/Link";
-
\ No newline at end of file
+
diff --git a/docs/getting-started/flashing-firmware/esp32/web-flasher.mdx b/docs/getting-started/flashing-firmware/esp32/web-flasher.mdx
index f86fd86b..b6cc4233 100644
--- a/docs/getting-started/flashing-firmware/esp32/web-flasher.mdx
+++ b/docs/getting-started/flashing-firmware/esp32/web-flasher.mdx
@@ -5,8 +5,23 @@ sidebar_label: Web Flasher (recommended)
sidebar_position: 1
---
+import Link from "@docusaurus/Link";
+
## Web Flasher
1. Plug in your device
2. Visit [flasher.meshtastic.org](https://flasher.meshtastic.org) _\*requires Chrome or Edge browser_
-3. Follow the instructions
\ No newline at end of file
+3. Follow the instructions
+
+## Connect and Configure Device
+
+After flashing the Meshtastic firmware to the device, you can proceed with the initial configuration.
+
+
+
+ Connect and Configure Device
+
+
diff --git a/docs/getting-started/flashing-firmware/nrf52/convert-rak4631r.mdx b/docs/getting-started/flashing-firmware/nrf52/convert-rak4631r.mdx
index dacebba5..6c9a56e3 100644
--- a/docs/getting-started/flashing-firmware/nrf52/convert-rak4631r.mdx
+++ b/docs/getting-started/flashing-firmware/nrf52/convert-rak4631r.mdx
@@ -7,7 +7,7 @@ sidebar_position: 4
The only difference between the _RAK4631-R_ (RUI3) and the _RAK4631_ (Arduino) is the bootloader it is shipped with - the hardware is the same.
-Meshtastic requires the Arduino bootloader on RAK WisBlock NRF52-based boards. The process of converting the bootloader only needs to be performed once.
+Meshtastic requires the Arduino bootloader on RAK WisBlock nRF52-based boards. The process of converting the bootloader only needs to be performed once.
This conversion requires the use of either a [DAPLink](https://daplink.io/) or [J-Link](https://www.segger.com/products/debug-probes/j-link/). The most reasonably priced and available is the [RAKDAP1](https://store.rakwireless.com/products/daplink-tool).
@@ -25,4 +25,4 @@ This conversion requires the use of either a [DAPLink](https://daplink.io/) or [
```
6. Continue with the normal [flashing instructions](/docs/getting-started/flashing-firmware/nrf52/drag-n-drop)
-Alternate methods of flashing are outlined [here](https://github.com/RAKWireless/WisBlock/tree/master/bootloader/RAK4630).
\ No newline at end of file
+Alternate methods of flashing are outlined [here](https://github.com/RAKWireless/WisBlock/tree/master/bootloader/RAK4630).
diff --git a/docs/getting-started/flashing-firmware/nrf52/drag-n-drop.mdx b/docs/getting-started/flashing-firmware/nrf52/drag-n-drop.mdx
index 7aa26dbd..2418b0d4 100644
--- a/docs/getting-started/flashing-firmware/nrf52/drag-n-drop.mdx
+++ b/docs/getting-started/flashing-firmware/nrf52/drag-n-drop.mdx
@@ -1,32 +1,51 @@
---
id: drag-n-drop
-title: Drag & Drop NRF52 Firmware Updates
+title: Drag & Drop nRF52 Firmware Updates
sidebar_label: Drag & Drop (recommended)
sidebar_position: 1
---
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
+import Link from "@docusaurus/Link";
:::info
+
Before flashing confirm that you have [RAK4631](https://docs.rakwireless.com/Product-Categories/WisBlock/RAK4631/) and not a [RAK4631-R](https://docs.rakwireless.com/Product-Categories/WisBlock/RAK4631-R/) If this is not the case, fear not. The hardware is identical but requires changing the bootloader. Instructions on how to do this are located [here](/docs/getting-started/flashing-firmware/nrf52/convert-rak4631r).
+
:::
-## Upgrading from a previous version of Meshtastic
-
-If you are upgrading your NRF52 device from a previous version of Meshtastic rather than starting from scratch, you may need to do a full factory reset of the internal flash memory. Stale data saved by previous versions of the Meshtastic firmware can cause devices to get stuck in a crash loop at startup.
-
-Follow the guide to [factory erase your NRF52](/docs/getting-started/flashing-firmware/nrf52/nrf52-erase) device before continuing to [flash firmware](#flash-firmware).
-
-
## Flash Firmware
Download and unzip the latest firmware from [Meshtastic Downloads](https://meshtastic.org/downloads).
1. Connect your device to your computer with a USB data cable.
-2. Double click the reset button on your device (this will put it into bootloader mode)
+2. Double click the reset button on your device (this will put it into bootloader mode)
3. Notice a new drive will be mounted on your computer (Windows, Mac, or Linux)
4. Open this drive and you should see three files: `CURRENT.UF2`, `INDEX.HTM`, and `INFO_UF2.TXT`
5. Drop the appropriate firmware file (`firmware-DEVICE_NAME-vx.x.x-xxxxxxx.uf2`) from the release onto this drive.
-Once the file has finished copying onto the drive, the device will reboot and install the Meshtastic firmware.
\ No newline at end of file
+Once the file has finished copying onto the drive, the device will reboot and install the Meshtastic firmware.
+
+### Issues When Upgrading from A Previous Version of Meshtastic
+
+:::info
+
+Previous versions of the Meshtastic firmware may save stale data, causing devices to get stuck in a crash loop during startup. If you experience issues when upgrading your nRF52 device from a previous version of Meshtastic, you may need to perform a full factory reset of the internal flash memory.
+
+Follow the guide to [factory erase your nRF52](/docs/getting-started/flashing-firmware/nrf52/nrf52-erase) device before continuing to [flash firmware](#flash-firmware).
+
+:::
+
+## Connect and Configure Device
+
+After flashing the Meshtastic firmware to the device, you can proceed with the initial configuration.
+
+
+
+ Connect and Configure Device
+
+
diff --git a/docs/getting-started/flashing-firmware/nrf52/index.mdx b/docs/getting-started/flashing-firmware/nrf52/index.mdx
index 0b5e8473..ab7105b5 100644
--- a/docs/getting-started/flashing-firmware/nrf52/index.mdx
+++ b/docs/getting-started/flashing-firmware/nrf52/index.mdx
@@ -1,13 +1,13 @@
---
id: flashing-nrf52-devices
-title: Flash NRF52 Devices
-sidebar_label: NRF52 Device
+title: Flash nRF52 Devices
+sidebar_label: nRF52 Device
sidebar_position: 2
---
-## Flashing Methods for NRF52 Devices
+## Flashing Methods for nRF52 Devices
-The NRF52 based devices have the easiest firmware upgrade process. No driver or software install is required on any platform.
+The nRF52 based devices have the easiest firmware upgrade process. No driver or software install is required on any platform.
-1. The [drag and drop](/docs/getting-started/flashing-firmware/nrf52/drag-n-drop) firmware installation is considered the "manual process" and recommended as the easiest solution.
-2. The [Python Flasher](/docs/software/python/flasher) application does a lot under the hood to prevent you from needing to use the terminal. It also allows you to configure your device.
+1. The [Drag & Drop](/docs/getting-started/flashing-firmware/nrf52/drag-n-drop) firmware installation method is considered the "manual process" and recommended as the easiest solution.
+2. The [Python Flasher](/docs/software/python/flasher) application does a lot under the hood to prevent you from needing to use the terminal.
diff --git a/docs/getting-started/flashing-firmware/nrf52/nrf52-erase.mdx b/docs/getting-started/flashing-firmware/nrf52/nrf52-erase.mdx
index 0591ddeb..3e23e7c5 100644
--- a/docs/getting-started/flashing-firmware/nrf52/nrf52-erase.mdx
+++ b/docs/getting-started/flashing-firmware/nrf52/nrf52-erase.mdx
@@ -1,22 +1,33 @@
---
id: nrf52-erase
-title: Flash NRF52 Factory Erase
-sidebar_label: Factory Erase NRF52
+title: Flash nRF52 Factory Erase
+sidebar_label: Factory Erase nRF52
sidebar_position: 3
---
-Meshtastic uses the [littlefs](https://github.com/littlefs-project/littlefs) library to store configuration, logs, and other data in the internal flash of NRF52 devices. Updating the firmware does _not_ erase this additional data, which can cause issues when the format and location of data changes between releases.
+import Link from "@docusaurus/Link";
-To reset the flash storage on your NRF52 board:
+Meshtastic uses the [littlefs](https://github.com/littlefs-project/littlefs) library to store configuration, logs, and other data in the internal flash of nRF52 devices. Updating the firmware does _not_ erase this additional data, which can cause issues when the format and location of data changes between releases.
+
+To reset the flash storage on your nRF52 board:
Download and unzip the latest firmware from [Meshtastic Downloads](https://meshtastic.org/downloads).
1. Connect your device to your computer with a USB data cable.
-2. Double click the reset button on your device (this will put it into bootloader mode)
+2. Double click the reset button on your device (this will put it into bootloader mode)
3. Notice a new drive will be mounted on your computer (Windows, Mac, or Linux)
4. Open this drive and you should see three files: `CURRENT.UF2`, `INDEX.HTM`, and `INFO_UF2.TXT`
5. Copy the included file named `Meshtastic_nRF52_factory_erase.uf2` onto the virtual disk device. The device should reboot.
-6. Connect to the device via serial console using the [Meshtastic CLI `--noproto`](/docs/software/python/cli/#--noproto) mode or a standalone serial client like `minicom`.
+6. Connect to the device via serial console using the [Meshtastic CLI `--noproto`](/docs/software/python/cli/#--noproto) mode or a standalone serial client like `minicom`.
7. Press any key, you should see the message: `Formatting... Done`.
-Once the device has been erased, you can proceed to install the latest Meshtastic firmware on a clean storage filesystem by following the [flash firmware](/docs/getting-started/flashing-firmware/nrf52/drag-n-drop#flash-firmware) steps.
\ No newline at end of file
+Once the device has been erased, you can proceed to install the latest Meshtastic firmware on a clean storage filesystem by clicking the link below.
+
+
+
+ Flash nRF52 Firmware
+
+
diff --git a/docs/getting-started/flashing-firmware/nrf52/python-flasher.mdx b/docs/getting-started/flashing-firmware/nrf52/python-flasher.mdx
index 3515772d..375a9872 100644
--- a/docs/getting-started/flashing-firmware/nrf52/python-flasher.mdx
+++ b/docs/getting-started/flashing-firmware/nrf52/python-flasher.mdx
@@ -5,6 +5,7 @@ sidebar_label: Python Flasher
sidebar_position: 2
---
-import MFlasher from '../../../software/python-flasher.mdx'
+import Link from "@docusaurus/Link";
+import MFlasher from "../../../software/python-flasher.mdx";
-
\ No newline at end of file
+
diff --git a/docs/getting-started/index.mdx b/docs/getting-started/index.mdx
index f3c5f6d5..ef31503e 100644
--- a/docs/getting-started/index.mdx
+++ b/docs/getting-started/index.mdx
@@ -6,192 +6,116 @@ slug: /getting-started
sidebar_position: 2
---
-import Link from '@docusaurus/Link';
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
+import Link from "@docusaurus/Link";
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
## Identify Hardware
-The first order of business in getting started is determining what type of hardware you will be working with. Meshtastic currently supports devices with either of the two Micro-Controller Units (MCU):
+:::note
+
+This guide assumes that you have already purchased the devices you will be using with Meshtastic. If you haven't, you can check out our list of [supported hardware](/docs/supported-hardware/)
+to see your options.
+:::
+
+Before you begin, it's important to determine which kind of hardware you're using. Meshtastic works with devices that have either of these two types of Micro-Controller Units (MCU):
### ESP32
-The ESP32 is older and consumes more power than the nrf52, but is equipped with both WiFi and Bluetooth. Supported ESP32 devices:
+The ESP32 chip is older and consumes more power than the nRF52 chip, but is equipped with both WiFi and Bluetooth. Supported ESP32 devices:
- LILYGO® TTGO T-Beam
- LILYGO® TTGO Lora
- Nano G1
- Station G1
+- Heltec V3 and Wireless Stick Lite V3
-### NRF52
+### nRF52
-The NRF52 is much more power efficient than the esp32 and easier to update, but is only equipped with Bluetooth. Supported NRF52 devices:
+The nRF52 chip is much more power efficient than the ESP32 chip and easier to update, but is only equipped with Bluetooth. Supported nRF52 devices:
- RAK WisBlock
- LILYGO® TTGO T-Echo
:::info
+
If your device is not listed above, please review our [supported devices](/docs/supported-hardware) to determine which MCU your device has or contact us in [Discord](https://discord.gg/ktMAKGBnBs) with any questions.
+
:::
-## Setup Working Environment
+:::danger STOP! Put The Power Cable Down!
+
+Never power on the radio without attaching an antenna! _It_ could damage the radio chip.
-:::danger STOP! Put the power cable down!
-Never power on the radio without attaching an antenna! _it could damage the radio chip._
:::
Prior to connecting your Meshtastic device to the computer, you should perform the following basic checks.
-### Verify data cable
+### Verify Data Cable
-Some cables only provide _charging_, verify that your cable is also capable of _transferring data_ before proceeding.
+Some cables only provide _charging_, verify that your cable is also capable of _transferring data_ before proceeding. To check if your cable can also transfer data, try connecting it to another device (like a phone) and see if you can copy a file to or from it. If the file transfer works, then your cable is also able to transfer data and you can continue.
-There is no definitive way to determine the difference in cables if you aren't willing to pull it apart. Trying out a few cables will be the best way to verify.
+### Install Serial Drivers
-Once you've located a working data cable, [install the correct serial driver](#install-serial-drivers) and [test for driver installation](#test-driver-installation).
-
-### Install serial drivers
+If you don't have serial drivers installed on your computer, please choose one of the options below and install it before continuing.
-
-
-
- Install ESP32 Drivers
-
+
+
+
+ Install ESP32 Drivers
+
+
+
+
+
+ Install NRF52 Drivers
+
+
-
-
-
- Install NRF52 Drivers
-
-
-
-
+### Flash Firmware
-### Test driver installation
-
-You can verify that you have a proper data cable (rather than a charge-only type cable) and that the appropriate drivers for your system are installed by performing the following test:
-
-
-
-
-1. Connect your Meshtastic device to your USB port
-2. Open a **Terminal** and enter the following command:
-
- ```shell
- lsusb
- ```
-3. You should see something like:
-
- ```shell
- ID xxxx:xxxx Silicon Labs CP210x UART Bridge
- # or
- ID xxxx:xxxx QinHeng Electronics USB Single Serial
- # or
- FIXME (WISBLOCK OUTPUT)
- ```
-
-
-
-
-1. Navigate to `Apple Menu > About This Mac > System Report... > Hardware > USB`.
-2. You should see similar to one of the following entries:
- - `CP210X USB to UART Bridge Controller`
- - `CH9102 USB to UART Bridge Controller`
- - `WisCore RAK4631 Board`
-
-
-
-
-1. Navigate to `Device Manager > Ports (COM & LPT)`
-2. You should see similar to one of the following entries:
- - `Silicon Labs CP210X USB to UART Bridge (COM5)`
- - `Silicon Labs CH9102 USB to UART Bridge (COM5)`
- - `FIXME (WISBLOCK OUTPUT)`
-
-
-
-
-:::info
-If you do not see your device:
-
-1. You may be using a charging-only cable, [verify your cable](#verify-data-cable).
-2. You may need to [install the USB serial driver](/docs/getting-started/serial-drivers)).
-:::
-
-## Flash Firmware
-
-:::info
-If you have a RAK4631-R (the RUI3 bootloader version of the RAK4631), you must [convert the bootloader](/docs/getting-started/flashing-firmware/nrf52/convert-rak4631r) for use with the Arduino before flashing Meshtastic firmware.
-:::
+After completing the previous steps, you can now flash the Meshtastic firmware onto your device. To proceed, select the appropriate device type for your device.
-
-
-
- Flash ESP32 Firmware
-
+
+
+
+ Flash ESP32 Firmware
+
+
+
+
+
+ Flash nRF52 Firmware
+
+
-
-
-
- Flash NRF52 Firmware
-
-
-
-
+### Connect and Configure Device
-
-## Connect and Configure Device
-
-After connecting to the device for the first time, you should set the regional settings for the radio as well as other optional settings such as the name of the device.
+After flashing the Meshtastic firmware onto your device, you can now move on to initial configuration.
-
Connect and Configure Device
-
-## Use Meshtastic
-
-### with Command Line Tools
- - [Python CLI](/docs/software/python/cli)
-
-### with mobile apps
- - [Android](/docs/category/android-app)
- - [Apple](/docs/category/apple-apps)
-
-### with a browser
- - https://client.meshtastic.org
- - [Meshtastic Web](/docs/software/web-client)
-
-### over the internet with MQTT
- - [MQTT](/docs/software/mqtt/)
-
-There are many ways to interact with and use Meshtastic, please visit the [Software](/docs/software) page for more information.
\ No newline at end of file
diff --git a/docs/getting-started/initial-config.mdx b/docs/getting-started/initial-config.mdx
index de17edd9..140c7c0c 100644
--- a/docs/getting-started/initial-config.mdx
+++ b/docs/getting-started/initial-config.mdx
@@ -6,10 +6,10 @@ slug: /getting-started/initial-config
sidebar_position: 4
---
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
-import LoRaRegions from '../blocks/_lora-regions.mdx';
-
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
+import LoRaRegions from "../blocks/_lora-regions.mdx";
+import Link from "@docusaurus/Link";
## Supported Clients per Connection Type
@@ -17,7 +17,7 @@ Depending on your connection, some configuration options are not fully supported
@@ -49,7 +48,6 @@ Connecting over network is only supported on ESP32 devices.
- [iOS App](/docs/category/apple-apps)
- [Python CLI](/docs/software/python/cli/)
-
@@ -57,7 +55,6 @@ Connecting over network is only supported on ESP32 devices.
In order to start communicating over the mesh, you must set your region. This setting controls which frequency range your device uses and should be set according to your regional location.
-
1. Install [Meshtastic PythonCLI](/docs/software/python/cli/installation)
- ```sh
- pip3 install --upgrade pytap2
- pip3 install --upgrade meshtastic
- ```
+ ```sh
+ pip3 install --upgrade pytap2
+ pip3 install --upgrade meshtastic
+ ```
2. Run the following command, replacing `` with the region code listed above according to your regional location.
- ```sh
- meshtastic --set lora.region
- ```
+ ```sh
+ meshtastic --set lora.region
+ ```
@@ -109,6 +106,15 @@ Configuration of Region, Modem Preset and Hop Limit is available on iOS, iPadOS
+## Continue Configuration
+Now that you have set the LoRa region on your device, you can continue with configuring any additional configs to suit your needs.
-
+
+
+ Device Configuration
+
+
diff --git a/docs/getting-started/serial-drivers/_category_.yml b/docs/getting-started/serial-drivers/_category_.yml
index debaac12..4b00f93d 100644
--- a/docs/getting-started/serial-drivers/_category_.yml
+++ b/docs/getting-started/serial-drivers/_category_.yml
@@ -4,4 +4,4 @@ position: 1
link:
type: generated-index
title: Installing Serial Drivers
- slug: /getting-started/serial-drivers
\ No newline at end of file
+ slug: /getting-started/serial-drivers
diff --git a/docs/getting-started/serial-drivers/serial-drivers-esp32.mdx b/docs/getting-started/serial-drivers/serial-drivers-esp32.mdx
index cb6d18c7..7ae12650 100644
--- a/docs/getting-started/serial-drivers/serial-drivers-esp32.mdx
+++ b/docs/getting-started/serial-drivers/serial-drivers-esp32.mdx
@@ -5,8 +5,9 @@ sidebar_label: ESP32 Drivers
sidebar_position: 1
---
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
+import Link from "@docusaurus/Link";
## Install ESP32 USB to Serial Drivers
@@ -16,7 +17,7 @@ Some newer boards may require the CH9102 (CH340/CH341) Driver.
:::important
-Reboot your computer after you have installed the driver to complete the installation.
-:::
\ No newline at end of file
+
+After installing the driver, make sure to reboot your computer to finish the installation process.
+
+You can also [test your serial driver installation](/docs/getting-started/serial-drivers/test-serial-driver-installation) at this step if required.
+
+:::
+
+### Flash Firmware
+
+After installing the serial drivers, you can now flash the Meshtastic firmware onto your device. To proceed, select the appropriate device type for your device.
+
+
+
+ Flash ESP32 Firmware
+
+
diff --git a/docs/getting-started/serial-drivers/serial-drivers-nrf52.mdx b/docs/getting-started/serial-drivers/serial-drivers-nrf52.mdx
index 60435e39..52ec415b 100644
--- a/docs/getting-started/serial-drivers/serial-drivers-nrf52.mdx
+++ b/docs/getting-started/serial-drivers/serial-drivers-nrf52.mdx
@@ -1,18 +1,19 @@
---
id: nrf52
-title: NRF52 Serial Drivers
-sidebar_label: NRF52 Drivers
+title: nRF52 Serial Drivers
+sidebar_label: nRF52 Drivers
sidebar_position: 2
---
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
+import Link from "@docusaurus/Link";
-## Install NRF52 USB to Serial Drivers
+## Install nRF52 USB to Serial Drivers
- [CH9102 Driver - macOS Download](https://github.com/WCHSoftGroup/ch34xser_macos)
-:::important
-Reboot your computer after you have installed the driver to complete the installation.
-:::
-
:::caution
+
With the latest versions of MacOS, the USB Serial driver is built-in. Do _NOT_ download the USB device drivers unless required. If you downloaded/installed any already, please remove them.
+
:::
### Remove the CH34x USB Driver (macOS)
@@ -58,10 +53,27 @@ Uninstall the kernel extension:
- [CH9102 Driver - Windows Download](http://www.wch-ic.com/downloads/CH341SER_EXE.html)
-:::important
-Reboot your computer after you have installed the driver to complete the installation.
-:::
-
-
\ No newline at end of file
+
+
+:::important
+
+After installing the driver, make sure to reboot your computer to finish the installation process.
+
+You can also [test your serial driver installation](/docs/getting-started/serial-drivers/test-serial-driver-installation) at this step if required.
+
+:::
+
+### Flash Firmware
+
+After installing the serial drivers, you can now flash the Meshtastic firmware onto your device. To proceed, select the appropriate device type for your device.
+
+
+
+ Flash nRF52 Firmware
+
+
diff --git a/docs/getting-started/serial-drivers/test-serial-driver-installation.mdx b/docs/getting-started/serial-drivers/test-serial-driver-installation.mdx
new file mode 100644
index 00000000..bd66a98f
--- /dev/null
+++ b/docs/getting-started/serial-drivers/test-serial-driver-installation.mdx
@@ -0,0 +1,99 @@
+---
+id: test-serial-driver-installation
+title: Test Serial Driver Installation
+sidebar_label: Test Serial Driver Installation
+sidebar_position: 3
+---
+
+import Link from "@docusaurus/Link";
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
+
+### Test Serial Driver Installation
+
+You can verify that you have a proper data cable (rather than a charge-only type cable) and that the appropriate drivers for your system are installed by performing the following test:
+
+
+
+
+1. Connect your Meshtastic device to your USB port
+2. Open a **Terminal** and enter the following command:
+
+ ```shell
+ lsusb
+ ```
+
+3. You should see something like:
+
+ ```shell
+ ID xxxx:xxxx Silicon Labs CP210x UART Bridge
+ # or
+ ID xxxx:xxxx QinHeng Electronics USB Single Serial
+ # or
+ FIXME (WISBLOCK OUTPUT)
+ ```
+
+
+
+
+1. Navigate to `Apple Menu > About This Mac > System Report... > Hardware > USB`.
+2. You should see similar to one of the following entries:
+
+- `CP210X USB to UART Bridge Controller`
+- `CH9102 USB to UART Bridge Controller`
+- `WisCore RAK4631 Board`
+
+
+
+
+1. Navigate to `Device Manager > Ports (COM & LPT)`
+2. You should see similar to one of the following entries:
+
+- `Silicon Labs CP210X USB to UART Bridge (COM5)`
+- `Silicon Labs CH9102 USB to UART Bridge (COM5)`
+- `FIXME (WISBLOCK OUTPUT)`
+
+
+
+
+:::info
+
+If you are unable to see your device:
+
+- Make sure that your cable is not only for charging but also for [data transfer](/docs/getting-started/#verify-data-cable).
+- It's possible that you need to [reinstall the USB serial driver](/docs/getting-started/serial-drivers).
+
+:::
+
+## Flash Firmware
+
+After completing the previous steps, you can now flash the Meshtastic firmware onto your device. To proceed, select the appropriate device type for your device.
+
+
+
+
+
+ Flash ESP32 Firmware
+
+
+
+
+
+ Flash nRF52 Firmware
+
+
+
+
diff --git a/docs/hardware/_category_.yml b/docs/hardware/_category_.yml
index 0c5e85d6..0ee7fc5e 100644
--- a/docs/hardware/_category_.yml
+++ b/docs/hardware/_category_.yml
@@ -4,4 +4,4 @@ position: 5
link:
type: generated-index
title: Supported Hardware
- slug: hardware
\ No newline at end of file
+ slug: hardware
diff --git a/docs/hardware/antennas/_category_.yml b/docs/hardware/antennas/_category_.yml
index bf5ea630..adf027ff 100644
--- a/docs/hardware/antennas/_category_.yml
+++ b/docs/hardware/antennas/_category_.yml
@@ -4,4 +4,4 @@ position: 2
link:
type: generated-index
title: Antennas
- slug: antenna
\ No newline at end of file
+ slug: antenna
diff --git a/docs/hardware/antennas/antenna-report.mdx b/docs/hardware/antennas/antenna-report.mdx
index 176c41f6..cb339e85 100644
--- a/docs/hardware/antennas/antenna-report.mdx
+++ b/docs/hardware/antennas/antenna-report.mdx
@@ -7,6 +7,6 @@ sidebar_position: 2
## RicInNewMexico
-[_RicInNewMexico_](https://github.com/RicInNewMexico) has gone through the trouble of testing a number of commonly purchased antennas in the Meshtastic community and given an opinion on whether or not a given antenna is performing optimally.
+[_RicInNewMexico_](https://github.com/RicInNewMexico) has gone through the trouble of testing a number of commonly purchased antennas in the Meshtastic community and given an opinion on whether or not a given antenna is performing optimally.
Please check out the project on Github: [Meshtastic-Antenna-Reports](https://github.com/RicInNewMexico/Meshtastic-Antenna-Reports)
diff --git a/docs/hardware/antennas/lora-antennas.mdx b/docs/hardware/antennas/lora-antennas.mdx
index 719c6c7c..62181642 100644
--- a/docs/hardware/antennas/lora-antennas.mdx
+++ b/docs/hardware/antennas/lora-antennas.mdx
@@ -28,7 +28,7 @@ Devices on another frequency will not be able to interact with yours. See this l
### How will you be carrying / transporting the radio?
-A large directional antenna will transmit over significantly greater distance than an omni-directional antenna. However, it must be pointed at its target - so it is not optimal for mobile use.
+A large directional antenna will transmit over significantly greater distance than an omni-directional antenna. However, it must be pointed at its target - so it is not optimal for mobile use.
A tuned half-wave whip antenna may have more omni-directional range than the quarter wave stubby; but it will be conspicuous in your pocket.
@@ -50,7 +50,7 @@ The perfect antenna on paper, sourced from the other side of the world with mixe
### How close will the antenna be to my Meshtastic device?
-Most cables will significantly degrade the signal strength over any significant distance. It is often more effective to place a node outside than to have it indoors with the antenna outside. The exception might be if there is extreme heat, cold, or humidity, and if the shortest possible low loss cable is used.
+Most cables will significantly degrade the signal strength over any significant distance. It is often more effective to place a node outside than to have it indoors with the antenna outside. The exception might be if there is extreme heat, cold, or humidity, and if the shortest possible low loss cable is used.
Still, a proper enclosure should mitigate bad weather.
@@ -58,4 +58,4 @@ Still, a proper enclosure should mitigate bad weather.
You could do a lot worse than reading the [Wikipedia entry for Antenna](), along with the [Wikipedia entry for LoRa](https://en.wikipedia.org/wiki/LoRa).
-Instead of listing the terms, let us recommend this superb [tutorial](https://www.youtube.com/watch?v=J3PBL9oLPX8) by Andreas Spiess (the 'guy with the Swiss accent').
\ No newline at end of file
+Instead of listing the terms, let us recommend this superb [tutorial](https://www.youtube.com/watch?v=J3PBL9oLPX8) by Andreas Spiess (the 'guy with the Swiss accent').
diff --git a/docs/hardware/antennas/resources.mdx b/docs/hardware/antennas/resources.mdx
index 69a51197..33c4e98e 100644
--- a/docs/hardware/antennas/resources.mdx
+++ b/docs/hardware/antennas/resources.mdx
@@ -10,35 +10,32 @@ sidebar_position: 4
- [Hackaday's Introduction to Antenna Basics](https://www.youtube.com/playlist?list=PL_tws4AXg7authztKFg5ZN5qWGtq3N_nI)
- An excellent series of presentations on the basics of antenna design and function, presented by spacecraft radio engineer Karen Rucker.
-
### Coverage prediction
- [Tower Coverage.com](https://www.towercoverage.com)
+
- Commercial, but has free options
-
- [HeyWhat'sThat](http://www.heywhatsthat.com)
- - Free with path profiling options
+ - Free with path profiling options
- [Radio Mobile Online](https://www.ve2dbe.com/rmonline_s.asp)
- Radio Mobile Online is a radio wave propagation prediction tool dedicated to amateur radio
-
### RF Tools
- [Times Microwave Systems](https://www.timesmicrowave.com/calculator/?Product=RG-6&RunLength=10&Frequency=868)
+
- Coaxial Cable Attenuation & Power Handling Calculator
-
- [Solwise Link Budget Calculator](https://www.solwise.co.uk/link-budget.htm)
- - Predict the received signal strength
+ - Predict the received signal strength
- [Amateur Radio Toolkit](https://play.google.com/store/apps/details?id=com.daveyhollenberg.amateurradiotoolkit)
- Android app with lots of antenna information
-
### Antenna designs
- [1/4 Wave Ground Plane Antenna Calculator](https://m0ukd.com/calculators/quarter-wave-ground-plane-antenna-calculator)
diff --git a/docs/hardware/antennas/testing.mdx b/docs/hardware/antennas/testing.mdx
index 8a403769..40ecf34b 100644
--- a/docs/hardware/antennas/testing.mdx
+++ b/docs/hardware/antennas/testing.mdx
@@ -32,7 +32,6 @@ While the LoRa devices we are using for Meshtastic are relatively low power radi
The information collected here is by no means definitive, and necessarily abbreviated (it's a huge topic).
-
## Range Testing
As mentioned, while stating the obvious, the simplest way of performing a test is:
@@ -63,7 +62,6 @@ One of the first things to ensure, is that the antenna you have is tuned to the
Andreas Spiess also gives a great explanation of [how to use Vector Network Analyzers](https://www.youtube.com/watch?v=ZpKoLvqOWyc) to correctly tune your antennas, as well as a more [in depth tutorial of how to use VNAs](https://www.youtube.com/watch?v=_pjcEKQY_Tk). It is important to remember however, that VNAs can only tell you if the antenna is well-matched, not how well it is transmitting. A 50 ohm resistor across the transmitter output would show as ideally matched, but it would be useless at transmitting a signal. There are a number of VNAs now available for less than $100, making this no longer out of reach for most hobbyists, unlike expensive spectrum analyzers.
-
## Non-aerial Factors Affecting Transmission
Unless you're using your devices in a vacuum, with clear line of sight between aerials the following will have an effect:
@@ -87,11 +85,8 @@ For a bit of light reading on environmental research:
In summary - wavelengths in Europe fair well in plain sight, curve over not-so-tall obstacles (including trees), and they reflect off surfaces at low angles of incidence. They go through humans without much attenuation; but not brick, stone, or anything with more attenuation than glass / Kevlar. Oh, and don’t sit under an LTE tower and expect it to be plain sailing. RF emissions at adjacent frequencies can interfere at a high enough power.
-
## Discussion
To comment on / join in antenna range [Meshtastic discourse](https://meshtastic.discourse.group/t/antenna-improved-range/227/35?u=sens8tion)
There, you will also find reference to Meshtastic range achievements and aerial recommendations. (Note we've stopped short of making specific supplier aerial recommendations in this wiki.)
-
-
diff --git a/docs/hardware/devices/_category_.yml b/docs/hardware/devices/_category_.yml
index 6044c266..6c1cc508 100644
--- a/docs/hardware/devices/_category_.yml
+++ b/docs/hardware/devices/_category_.yml
@@ -4,4 +4,4 @@ position: 1
link:
type: generated-index
title: Supported Devices
- slug: supported-hardware
\ No newline at end of file
+ slug: supported-hardware
diff --git a/docs/hardware/devices/heltec/buttons.mdx b/docs/hardware/devices/heltec/buttons.mdx
index 04819979..c01bdbbe 100644
--- a/docs/hardware/devices/heltec/buttons.mdx
+++ b/docs/hardware/devices/heltec/buttons.mdx
@@ -8,8 +8,8 @@ sidebar_position: 3
## Functionality
- **Reset Button**
- - _**Single press**_ resets the device.
+ - _**Single press**_ resets the device.
- **Program button**
- - _**Single press**_ changes the page of information displayed on the screen.
- - _**Long press**_ adjusts the contrast of the screen.
- - _**Triple press**_ sends a broadcast message of the device position.
+ - _**Single press**_ changes the page of information displayed on the screen.
+ - _**Long press**_ adjusts the contrast of the screen.
+ - _**Triple press**_ sends a broadcast message of the device position.
diff --git a/docs/hardware/devices/heltec/enclosures.mdx b/docs/hardware/devices/heltec/enclosures.mdx
index 5e86351a..03957997 100644
--- a/docs/hardware/devices/heltec/enclosures.mdx
+++ b/docs/hardware/devices/heltec/enclosures.mdx
@@ -5,7 +5,7 @@ sidebar_label: Enclosures
sidebar_position: 3
---
-import Tropho from '/img/enclosures/3dp-tropho-heltec32.png';
+import Tropho from "/img/enclosures/3dp-tropho-heltec32.png";
## Created by tropho/TonyG
@@ -20,4 +20,4 @@ Download from [Printables](https://www.printables.com/model/118750-heltec-lora-3
- (x1) LiPo battery pack (1,000mAh)
- (x1) Latching micro push button switch
-
\ No newline at end of file
+
diff --git a/docs/hardware/devices/heltec/index.mdx b/docs/hardware/devices/heltec/index.mdx
index 0b81cfa8..10152537 100644
--- a/docs/hardware/devices/heltec/index.mdx
+++ b/docs/hardware/devices/heltec/index.mdx
@@ -5,8 +5,8 @@ sidebar_label: HELTEC® Lora 32
sidebar_position: 7
---
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
@@ -51,7 +53,7 @@ Not recommended! Very old board with design issues. Support is being phased out.
Not recommended because of design issues! Support is being phased out. Use V3 in new projects.
:::
-- **MCU**
+- **MCU**
- ESP32 (WiFi & Bluetooth)
- **LoRa Transceiver**
- Semtech SX127x
@@ -62,12 +64,14 @@ Not recommended because of design issues! Support is being phased out. Use V3 in
- Micro USB
- Antenna: U.FL antenna connector
-**Features**
+## Features
+
- Built in 0.96 inch OLED display
- User and Reset switches
- No GPS
-**Resources**
+## Resources
+
- Firmware file: `firmware-heltec-v2.0-X.X.X.xxxxxxx.bin`
@@ -77,7 +81,7 @@ Not recommended because of design issues! Support is being phased out. Use V3 in
Not recommended because of design issues! Support is being phased out. Use V3 in new projects.
:::
-- **MCU**
+- **MCU**
- ESP32 (WiFi & Bluetooth)
- **LoRa Transceiver**
- Semtech SX127x
@@ -89,18 +93,20 @@ Not recommended because of design issues! Support is being phased out. Use V3 in
- Micro USB
- Antenna: U.FL antenna connector
-**Features**
+## Features
+
- Built in 0.96 inch OLED display
- User and Reset switches
- No GPS
-**Resources**
+## Resources
+
- Firmware file: `firmware-heltec-v2.1-X.X.X.xxxxxxx.bin`
-- **MCU**
+- **MCU**
- ESP32-S3 (WiFi & Bluetooth)
- **LoRa Transceiver**
- Semtech SX126x
@@ -111,19 +117,21 @@ Not recommended because of design issues! Support is being phased out. Use V3 in
- USB-C
- Antenna: U.FL antenna connector
-**Features**
+## Features
+
- Built in 0.96 inch OLED display
- User and Reset switches
- No GPS
-**Resources**
+## Resources
+
- Firmware file: `firmware-heltec-v3-X.X.X.xxxxxxx.bin`
- Purchase link: [AliExpress](https://www.aliexpress.com/item/1005004823000595.html)
-- **MCU**
+- **MCU**
- ESP32-S3 (WiFi & Bluetooth)
- **LoRa Transceiver**
- Semtech SX126x
@@ -135,12 +143,14 @@ Not recommended because of design issues! Support is being phased out. Use V3 in
- USB-C
- Antenna: IPEX/u.FL antenna connector
-**Features**
+## Features
+
- no display
- User and Reset switches
- No GPS
-**Resources**
+## Resources
+
- Firmware file: `firmware-heltec-wsl-v3-X.X.X.xxxxxxx.bin`
- Purchase link: [AliExpress](https://www.aliexpress.com/item/1005004839521502.html)
diff --git a/docs/hardware/devices/lora/buttons.mdx b/docs/hardware/devices/lora/buttons.mdx
index 04819979..c01bdbbe 100644
--- a/docs/hardware/devices/lora/buttons.mdx
+++ b/docs/hardware/devices/lora/buttons.mdx
@@ -8,8 +8,8 @@ sidebar_position: 3
## Functionality
- **Reset Button**
- - _**Single press**_ resets the device.
+ - _**Single press**_ resets the device.
- **Program button**
- - _**Single press**_ changes the page of information displayed on the screen.
- - _**Long press**_ adjusts the contrast of the screen.
- - _**Triple press**_ sends a broadcast message of the device position.
+ - _**Single press**_ changes the page of information displayed on the screen.
+ - _**Long press**_ adjusts the contrast of the screen.
+ - _**Triple press**_ sends a broadcast message of the device position.
diff --git a/docs/hardware/devices/lora/enclosures.mdx b/docs/hardware/devices/lora/enclosures.mdx
index 3013df40..f0405d8a 100644
--- a/docs/hardware/devices/lora/enclosures.mdx
+++ b/docs/hardware/devices/lora/enclosures.mdx
@@ -5,7 +5,7 @@ sidebar_label: Enclosures
sidebar_position: 3
---
-import Tropho from '/img/enclosures/3dp-tropho-lora32.png';
+import Tropho from "/img/enclosures/3dp-tropho-lora32.png";
## Created by tropho/TonyG
diff --git a/docs/hardware/devices/lora/gpio.mdx b/docs/hardware/devices/lora/gpio.mdx
index fa1009ff..9a4ae8d9 100644
--- a/docs/hardware/devices/lora/gpio.mdx
+++ b/docs/hardware/devices/lora/gpio.mdx
@@ -9,6 +9,10 @@ sidebar_position: 4
For the Lora V2.1-1.6 and V2.1-1.8, Shorting IO12 to ground will progress through the screen pages and/or wake up the device. A simple push switch can be added for this purpose.
-
+
-
+
diff --git a/docs/hardware/devices/lora/index.mdx b/docs/hardware/devices/lora/index.mdx
index 01b91105..ed9adf63 100644
--- a/docs/hardware/devices/lora/index.mdx
+++ b/docs/hardware/devices/lora/index.mdx
@@ -5,8 +5,8 @@ sidebar_label: LILYGO® Lora
sidebar_position: 6
---
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
Further information on the LILYGO® LoRa devices can be found on LILYGO®'s [GitHub page](https://github.com/Xinyuan-LilyGO/LilyGo-LoRa-Series).
@@ -31,7 +31,7 @@ Not recommended with a battery! These boards contain the wrong component in the
This board is still in production but for various reasons not recommended for new purchases or for unattended installations. Firmware support is phased out. If in doubt, choose the Lora V2.1-1.6 or Lora T3S3 board.
:::
-- **MCU**
+- **MCU**
- ESP32 (WiFi & Bluetooth)
- **LoRa Transceiver**
- Semtech SX1276
@@ -42,13 +42,15 @@ This board is still in production but for various reasons not recommended for ne
- Micro USB
- Antenna: U.FL antenna connector
-**Features**
+## Features
+
- Built in 0.96 inch OLED display
-**Resources**
+## Resources
+
- Firmware file: `firmware-tlora-v1-X.X.X.xxxxxxx.bin`
- Purchase link: [AliExpress](https://www.aliexpress.com/item/32840238513.html)
-
+- US Distributor - Purchase link: [Rokland](https://store.rokland.com/products/lilygo-ttgo-lora32-v1-0-wireless-module-esp32-lora-915mhz-oled-0-96-inch-display-wifi-bluetooth-esp-32-antenna-ch9102-q184?ref=8Bb2mUO5i-jKwt)

@@ -63,7 +65,7 @@ Not recommended with a battery! These boards contain the wrong component in the
This board is still in production but for various reasons not recommended for new purchases or for unattended installations. Firmware support is phased out. If in doubt, choose the Lora V2.1-1.6 or Lora T3S3 board.
:::
-- **MCU**
+- **MCU**
- ESP32 (WiFi & Bluetooth)
- **LoRa Transceiver**
- Semtech SX127x
@@ -74,12 +76,15 @@ This board is still in production but for various reasons not recommended for ne
- Micro USB
- Antenna: U.FL antenna connector
-**Features**
+## Features
+
- Built in 0.96 inch OLED display
-**Resources**
+## Resources
+
- Firmware file: `firmware-tlora_v1_3-X.X.X.xxxxxxx.bin`
- Purchase link: [AliExpress](https://www.aliexpress.com/item/4000628100802.html)
+- US Distributor - Purchase link: [Rokland](https://store.rokland.com/products/lilygo-lora-v1-3-esp32-sx1276-915mhz-wifi-wireless-bluetooth-module-0-96-inch-oled-screen-support-arduino-development-board-q312?ref=8Bb2mUO5i-jKwt)


@@ -95,7 +100,7 @@ Not recommended with a battery! These boards contain the wrong component in the
This board is still in production but for various reasons not recommended for new purchases or for unattended installations. Firmware support is phased out. If in doubt, choose the Lora V2.1-1.6 or Lora T3S3 board.
:::
-- **MCU**
+- **MCU**
- ESP32 (WiFi & Bluetooth)
- **LoRa Transceiver**
- Semtech SX127x
@@ -107,13 +112,15 @@ This board is still in production but for various reasons not recommended for ne
- Micro USB
- Antenna: U.FL antenna connector
-**Features**
+## Features
+
- Built in 0.96 inch OLED display
- Power and Reset switches
- microSD connector
- No GPS
-**Resources**
+## Resources
+
- Firmware file: `firmware-tlora-v2-X.X.X.xxxxxxx.bin`
- Purchase link: [AliExpress](https://www.aliexpress.com/item/32846302183.html)
@@ -122,12 +129,11 @@ This board is still in production but for various reasons not recommended for ne
-
:::caution
Early versions of some of these boards contained the wrong component in the LiPo battery charging circuit allowing the battery to be overcharged. Boards purchased after 2021 should be ok.
:::
-- **MCU**
+- **MCU**
- ESP32 (WiFi & Bluetooth)
- **LoRa Transceiver**
- Semtech SX127x
@@ -139,16 +145,18 @@ Early versions of some of these boards contained the wrong component in the LiPo
- Micro USB
- Antenna: SMA antenna connector
-**Features**
+## Features
+
- Built in 0.96 inch OLED display
- Power and Reset switches
- microSD connector
- No GPS
-**Resources**
+## Resources
+
- Firmware file: `firmware-tlora-v2-1-1.6-X.X.X.xxxxxxx.bin`
- Purchase link: [AliExpress](https://www.aliexpress.com/item/32915894264.html)
-
+- US Distributor - Purchase link: [Rokland](https://store.rokland.com/products/lilygo-ttgo-lora32-v2-1_1-6-version-915mhz-esp32-lora-oled-0-96-inch-sd-card-bluetooth-wifi-wireless-module-esp-32-sma-q211?ref=8Bb2mUO5i-jKwt)

@@ -156,7 +164,7 @@ Early versions of some of these boards contained the wrong component in the LiPo
-- **MCU**
+- **MCU**
- ESP32 (WiFi & Bluetooth)
- **LoRa Transceiver**
- Semtech SX1280 (Region LORA_24 worldwide use)
@@ -166,23 +174,25 @@ Early versions of some of these boards contained the wrong component in the LiPo
- USB-C
- Antenna: SMA antenna connector
-**Features**
+## Features
+
- Built in 0.96 inch OLED display
- Power and Reset switches
- microSD connector
- No GPS
-**Resources**
+## Resources
+
- Firmware file: `firmware-tlora-v2-1-1.8-X.X.X.xxxxxxx.bin`
- Purchase link: [Banggood](https://www.banggood.com/LILYGO-LORA-H570-V1_8-SX1280-ESP32-2_4G-Smart-WiFi-bluetooth-Wireless-Module-0_96inch-OLED-Display-Development-Board-with-Antenna-Type-C-p-1969395.html)
-

+
-- **MCU**
+- **MCU**
- ESP32-S3 (WiFi & Bluetooth)
- **LoRa Transceiver**
- Semtech SX1262
@@ -196,17 +206,20 @@ Early versions of some of these boards contained the wrong component in the LiPo
- USB-C
- Antenna: SMA antenna connector
-**Features**
+## Features
+
- Built in 0.96 inch OLED display
- Power and Reset switches, Boot / User Button
- microSD connector
- No GPS
-**Resources**
-- Firmware file: `firmware-tlora-t3s3-v1.xxxxxxx.bin`
+## Resources
+
+- Firmware file: `firmware-tlora-t3s3-v1.xxxxxxx.bin`
- Purchase link: [AliExpress](https://www.aliexpress.com/item/1005004627139838.html)
-
+

+
diff --git a/docs/hardware/devices/nano-g1/buttons.mdx b/docs/hardware/devices/nano-g1/buttons.mdx
index 0370f296..4603ad13 100644
--- a/docs/hardware/devices/nano-g1/buttons.mdx
+++ b/docs/hardware/devices/nano-g1/buttons.mdx
@@ -8,6 +8,6 @@ sidebar_position: 3
## Functionality
- **Program button**
- - _**Single press**_ changes the page of information displayed on the screen.
- - _**Long press**_ adjusts the contrast of the screen.
- - _**Triple press**_ sends a broadcast message of the device position.
\ No newline at end of file
+ - _**Single press**_ changes the page of information displayed on the screen.
+ - _**Long press**_ adjusts the contrast of the screen.
+ - _**Triple press**_ sends a broadcast message of the device position.
diff --git a/docs/hardware/devices/nano-g1/index.mdx b/docs/hardware/devices/nano-g1/index.mdx
index 0b34b8f9..e35dbb28 100644
--- a/docs/hardware/devices/nano-g1/index.mdx
+++ b/docs/hardware/devices/nano-g1/index.mdx
@@ -36,7 +36,6 @@ The Nano G1 is the first dedicated hardware device to be designed from scratch p
- Firmware file: `firmware-nano-g1-1.x.x.bin`
- [Purchase link](https://www.tindie.com/products/neilhao/meshtastic-mesh-device-nano-edition/)
-
Further information on the Nano G1 can be found on [Unit Engineering's Wiki](https://uniteng.com/wiki/doku.php?id=meshtastic:nano).

diff --git a/docs/hardware/devices/rak/base-boards.mdx b/docs/hardware/devices/rak/base-boards.mdx
index 59082f6b..9aa53680 100644
--- a/docs/hardware/devices/rak/base-boards.mdx
+++ b/docs/hardware/devices/rak/base-boards.mdx
@@ -5,8 +5,8 @@ sidebar_label: Base Boards
sidebar_position: 1
---
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
## WisBlock Base
@@ -52,7 +52,7 @@ Further information on the RAK5005-O can be found on the [RAK Documentation Cent
@@ -77,10 +77,8 @@ Further information on the RAK5005-O can be found on the [RAK Documentation Cent
- **Screen Support**
- OLED screen support (OLED screen sold separately)
-
Further information on the RAK19007 can be found on the [RAK Documentation Center](https://docs.rakwireless.com/Product-Categories/WisBlock/RAK19007/Overview/#product-description).
-
@@ -103,13 +101,12 @@ Further information on the RAK19007 can be found on the [RAK Documentation Cente
- **Screen Support**
- OLED screen support (OLED screen sold separately)
-
Further information on the RAK19003 can be found on the [RAK Documentation Center](https://docs.rakwireless.com/Product-Categories/WisBlock/RAK19003/Overview/#product-description)
@@ -136,7 +133,6 @@ Further information on the RAK19003 can be found on the [RAK Documentation Cente
- **Screen Support**
- OLED screen support (OLED screen sold separately)
-
Further information on the RAK19001 can be found on the [RAK Documentation Center](https://docs.rakwireless.com/Product-Categories/WisBlock/RAK19001/Overview/#product-description).
diff --git a/docs/hardware/devices/rak/buttons.mdx b/docs/hardware/devices/rak/buttons.mdx
index 00434f66..81657de1 100644
--- a/docs/hardware/devices/rak/buttons.mdx
+++ b/docs/hardware/devices/rak/buttons.mdx
@@ -12,19 +12,19 @@ Button functionality for RAK devices greatly depends on the device specific conf
### RAK5005-O / RAK19007 / RAK19003
- **Program button**
- - _**Single press**_ changes the page of information displayed on the screen.
- - _**Double press (nRF52 only)**_ puts the device in bootloader mode and mounts a drive to your computer.
- - _**Long press**_ signals the device to shutdown.
- - _**Triple press**_ sends a broadcast message of the device position.
+ - _**Single press**_ changes the page of information displayed on the screen.
+ - _**Double press (nRF52 only)**_ puts the device in bootloader mode and mounts a drive to your computer.
+ - _**Long press**_ signals the device to shutdown.
+ - _**Triple press**_ sends a broadcast message of the device position.
### RAK19001
- **Program button**
- - _**Single press**_ changes the page of information displayed on the screen.
- - _**Double press (nRF52 only)**_ puts the device in bootloader mode and mounts a drive to your computer.
- - _**Long press**_ signals the device to shutdown.
- - _**Triple press**_ sends a broadcast message of the device position.
+ - _**Single press**_ changes the page of information displayed on the screen.
+ - _**Double press (nRF52 only)**_ puts the device in bootloader mode and mounts a drive to your computer.
+ - _**Long press**_ signals the device to shutdown.
+ - _**Triple press**_ sends a broadcast message of the device position.
- **User Button**
- - _Not yet implemented by Meshtastic_
\ No newline at end of file
+ - _Not yet implemented by Meshtastic_
diff --git a/docs/hardware/devices/rak/core-modules.mdx b/docs/hardware/devices/rak/core-modules.mdx
index 5b504b13..36a4c86d 100644
--- a/docs/hardware/devices/rak/core-modules.mdx
+++ b/docs/hardware/devices/rak/core-modules.mdx
@@ -5,8 +5,8 @@ sidebar_label: Core Modules
sidebar_position: 2
---
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
## WisBlock Core
@@ -27,8 +27,8 @@ Please be aware of the difference between the RAK4631 (Arduino bootloader) and t
:::
- [RAK4631](https://store.rakwireless.com/products/rak4631-lpwan-node?variant=37505443856582)
- - **MCU**
- - nRF52840
+ - **MCU**
+ - nRF52840
- Bluetooth BLE 5.0
- Very low power consumption
- **Meshtastic Firmware**
@@ -52,13 +52,12 @@ Further information on the RAK4631 can be found on the [RAK Documentation Center
-
### RAK11200 / RAK13300
:::caution Note
@@ -68,7 +67,7 @@ Only supported on the RAK5005-O / RAK19007 and the RAK19001 base board.
The RAK11200 does not contain a LoRa transceiver, and thus needs to be added separately in the form of the [RAK13300 LPWAN module](https://store.rakwireless.com/products/rak13300-wisblock-lpwan). This occupies the IO Port of the base board.
- [RAK11200](https://store.rakwireless.com/products/wiscore-esp32-module-rak11200)
- - **MCU**
+ - **MCU**
- ESP32-WROVER
- Bluetooth 4.2
- WiFi 802.11 b/g/n
@@ -93,14 +92,13 @@ Further information on the RAK11200 can be found on the [RAK Documentation Cente
- **Connectors**
- U.FL antenna
-
Further information on the RAK13300 can be found on the [RAK Documentation Center](https://docs.rakwireless.com/Product-Categories/WisBlock/RAK13300/Overview/#product-description).
-
\ No newline at end of file
+
diff --git a/docs/hardware/devices/rak/enclosures.mdx b/docs/hardware/devices/rak/enclosures.mdx
index 9f7dd571..07fd76bf 100644
--- a/docs/hardware/devices/rak/enclosures.mdx
+++ b/docs/hardware/devices/rak/enclosures.mdx
@@ -13,7 +13,6 @@ Download from [Printables](https://www.printables.com/model/297089-meshtastic-so

-
## Created by tropho/TonyG
### RAK5005 Case
diff --git a/docs/hardware/devices/rak/index.mdx b/docs/hardware/devices/rak/index.mdx
index bee08899..c6999dfe 100644
--- a/docs/hardware/devices/rak/index.mdx
+++ b/docs/hardware/devices/rak/index.mdx
@@ -5,8 +5,8 @@ sidebar_label: RAK WisBlock
sidebar_position: 1
---
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
@@ -16,11 +16,12 @@ RAK Wireless currently sells a [Meshtastic Starter kit](https://store.rakwireles
If you wish to purchase parts separately, you will need a [WisBlock Base Board](/docs/hardware/devices/rak/base-board) and a [WisBlock Core Module](/docs/hardware/devices/rak/core-module). Please ensure you choose the correct operating frequency for your country when purchasing.
-You can optionally purchase peripherals such as a GPS module, Screen, Sensor, or other various modules.
+You can optionally purchase peripherals such as a GPS module, Screen, Sensor, or other various modules.
Please see the RAK documentation for the correct way to connect your hardware to ensure that you do not damage the device. There is currently no pin required to pair RAK devices via BLE.
## Resources
- RAK's Wisblock [Documentation Center](https://docs.rakwireless.com/Product-Categories/WisBlock)
+- [American Distributor - Rokland - Purchase Link](https://store.rokland.com/products/rak-wireless-wisblock-meshtastic-starter-kit?ref=8Bb2mUO5i-jKwt)
- RAK's [GitHub Page](https://github.com/RAKWireless/WisBlock) for the WisBlock
diff --git a/docs/hardware/devices/rak/peripherals.mdx b/docs/hardware/devices/rak/peripherals.mdx
index d532dc17..a6d00409 100644
--- a/docs/hardware/devices/rak/peripherals.mdx
+++ b/docs/hardware/devices/rak/peripherals.mdx
@@ -5,8 +5,8 @@ sidebar_label: Peripherals
sidebar_position: 3
---
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
2C on slot B for firmware versions 1.49 and above.
@@ -32,7 +31,6 @@ To add a GPS to the RAK19003 base board, you need the [RAK12500 GPS sensor](http
- uBlox Zoe-M8Q GNSS receiver
- GPS, GLONASS, QZSS and BeiDou satellite support
-
Further information on the RAK12500 can be found on the [RAK Documentation Center](https://docs.rakwireless.com/Product-Categories/WisBlock/RAK12500/Overview/#product-description).
@@ -54,7 +52,6 @@ The [RAK13002 IO Module](https://store.rakwireless.com/collections/wisblock-inte
- 2x ADC interfaces
- 3.3v Power rails
-
There is development activity in progress to get sensors such as this added to the Meshtastic Core.
Further information on the RAK13002 can be found on the [RAK Documentation Center](https://docs.rakwireless.com/Product-Categories/WisBlock/RAK13002/Overview).
@@ -101,7 +98,7 @@ The [RAK1906 Environment Sensor](https://store.rakwireless.com/products/rak1906-
- Humidity measurement (Range 0% to 100%)
- Barometer measurement (Range 300 to 1100 hPa)
- Air Quality measurement
-
+
Further information on the RAK1906 can be found on the [RAK Documentation Center](https://docs.rakwireless.com/Product-Categories/WisBlock/RAK1906/Overview/#product-description).
@@ -110,4 +107,4 @@ Further information on the RAK1906 can be found on the [RAK Documentation Center
-
\ No newline at end of file
+
diff --git a/docs/hardware/devices/rak/screens.mdx b/docs/hardware/devices/rak/screens.mdx
index dadc4e6e..c716607c 100644
--- a/docs/hardware/devices/rak/screens.mdx
+++ b/docs/hardware/devices/rak/screens.mdx
@@ -5,8 +5,8 @@ sidebar_label: Screens
sidebar_position: 2
---
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
There are currently two different screens supported by the RAK WisBlock system:
@@ -25,7 +25,6 @@ The [RAK1921 OLED display](https://store.rakwireless.com/products/rak1921-oled-d
- Resolution 128 x 64 pixels
- I2C interface
-
This item requires soldering.
Further information on the RAK1921 can be found on the [RAK Documentation Center](https://docs.rakwireless.com/Product-Categories/WisBlock/RAK1921/Overview/#product-description).
Similar modules are widely available from other suppliers, but do check the boards as some have the VDD and GND pins swapped round. This will prevent directly soldering the display to the baseboard. The preferred order is VDD, GND, SCL, SDA.
@@ -43,13 +42,12 @@ The [RAK1400 EPD module](https://store.rakwireless.com/products/wisblock-epd-mod
- Resolution 212 x 104 pixels
- Occupies the IO Port of a Wisblock Base
-
- Firmware for 5005 with RAK14000 e-paper: [`firmware-rak4631_eink-1.3.x.uf2`](/downloads)
Please note only the white-black display is supported at this time, the white-black-red display may work, but is not supported.
diff --git a/docs/hardware/devices/station-g1/buttons.mdx b/docs/hardware/devices/station-g1/buttons.mdx
index 0370f296..4603ad13 100644
--- a/docs/hardware/devices/station-g1/buttons.mdx
+++ b/docs/hardware/devices/station-g1/buttons.mdx
@@ -8,6 +8,6 @@ sidebar_position: 3
## Functionality
- **Program button**
- - _**Single press**_ changes the page of information displayed on the screen.
- - _**Long press**_ adjusts the contrast of the screen.
- - _**Triple press**_ sends a broadcast message of the device position.
\ No newline at end of file
+ - _**Single press**_ changes the page of information displayed on the screen.
+ - _**Long press**_ adjusts the contrast of the screen.
+ - _**Triple press**_ sends a broadcast message of the device position.
diff --git a/docs/hardware/devices/station-g1/index.mdx b/docs/hardware/devices/station-g1/index.mdx
index 589a042a..dc19e49c 100644
--- a/docs/hardware/devices/station-g1/index.mdx
+++ b/docs/hardware/devices/station-g1/index.mdx
@@ -24,7 +24,7 @@ The Station G1 is the second dedicated hardware device to be designed from scrat
- SMA Socket
- **Connectors**
- USB-C
-
+
### Features
- Meshtastic pre-installed
diff --git a/docs/hardware/devices/tbeam/buttons.mdx b/docs/hardware/devices/tbeam/buttons.mdx
index 8ddb5d9f..62dd5c56 100644
--- a/docs/hardware/devices/tbeam/buttons.mdx
+++ b/docs/hardware/devices/tbeam/buttons.mdx
@@ -8,10 +8,10 @@ sidebar_position: 3
## Functionality
- **Reset Button (right)**
- - _**Single press**_ resets the device.
+ - _**Single press**_ resets the device.
- **Power Button (left)**
- - _**Long press**_ powers the device off or turns it back on again.
+ - _**Long press**_ powers the device off or turns it back on again.
- **Program button (middle)**
- - _**Single press**_ changes the page of information displayed on the screen.
- - _**Long press**_ adjusts the contrast of the screen.
- - _**Triple press**_ sends a broadcast message of the device position.
\ No newline at end of file
+ - _**Single press**_ changes the page of information displayed on the screen.
+ - _**Long press**_ adjusts the contrast of the screen.
+ - _**Triple press**_ sends a broadcast message of the device position.
diff --git a/docs/hardware/devices/tbeam/enclosures.mdx b/docs/hardware/devices/tbeam/enclosures.mdx
index 60cdc73f..bdf7493b 100644
--- a/docs/hardware/devices/tbeam/enclosures.mdx
+++ b/docs/hardware/devices/tbeam/enclosures.mdx
@@ -17,7 +17,6 @@ Download from [Printables](https://www.printables.com/model/127253-t-beam-case-f
- (x4) M3 nuts
- (x4) M2x4mm screws (no nuts) to secure T-Beam to the frame
-
-
+
diff --git a/docs/hardware/devices/tbeam/index.mdx b/docs/hardware/devices/tbeam/index.mdx
index e5fd855f..0b8d93d0 100644
--- a/docs/hardware/devices/tbeam/index.mdx
+++ b/docs/hardware/devices/tbeam/index.mdx
@@ -5,14 +5,13 @@ sidebar_label: LILYGO® T-Beam
sidebar_position: 5
---
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
All T-beam models have an 18650 size battery holder on the rear of the device. This is designed to the original specification of the 18650 and only fits unprotected flat top 18650 cells. Button top and protected cells are typically longer than 65mm, often approaching 70mm.
Further information on the LILYGO® T-Beam devices can be found on LILYGO®'s [GitHub page](https://github.com/Xinyuan-LilyGO/LilyGo-LoRa-Series).
-
-- **MCU**
+- **MCU**
- ESP32 (WiFi & Bluetooth)
- **LoRa Transceiver**
- Semtech SX1276
@@ -76,14 +75,17 @@ This is an earlier version of the T-Beam board. Due to changes in the design thi
- Micro USB
- Antenna: SMA antenna connector
-**Features**
+## Features
+
- Meshtastic preinstalled
- Power, Program and Reset switches
- **Comes with 0.96 inch OLED display** (soldering required to assemble)
-**Resources**
+## Resources
+
- Firmware file: `firmware-tbeam-X.X.X.xxxxxxx.bin`
- Purchase link: [AliExpress](https://www.aliexpress.com/item/4001178678568.html)
+- US Distributor - Purchase link: [Rokland](https://store.rokland.com/products/lilygo-ttgo-t-beam-v1-1-lora-esp32-development-board-wifi-bluetooth-module-gps-neo-6m-sx1276-915mhz-q219?ref=8Bb2mUO5i-jKwt)


@@ -92,7 +94,7 @@ This is an earlier version of the T-Beam board. Due to changes in the design thi
-- **MCU**
+- **MCU**
- ESP32 (WiFi & Bluetooth)
- **LoRa Transceiver**
- Semtech SX1276
@@ -107,23 +109,24 @@ This is an earlier version of the T-Beam board. Due to changes in the design thi
- Micro USB
- Antenna: U.FL antenna connector
-**Features**
+## Features
+
- Meshtastic preinstalled
- Power, Program and Reset switches
- Screen sold separately
-**Resources**
+## Resources
+
- Firmware file: `firmware-tbeam-X.X.X.xxxxxxx.bin`
- Purchase link: [AliExpress](https://www.aliexpress.com/item/33047631119.html)
+- US Distributor - Purchase link: [Rokland](https://store.rokland.com/products/lilygo-ttgo-t-beam-v1-1-ipex-esp32-lora-915mhz-wifi-wireless-bluetooth-module-gps-neo-m8n-ipex-18650-battery-holder-q107?ref=8Bb2mUO5i-jKwt)

-
-
-- **MCU**
+- **MCU**
- ESP32 (WiFi & Bluetooth)
- **LoRa Transceiver**
- **Semtech SX1262** (improved performance)
@@ -138,18 +141,19 @@ This is an earlier version of the T-Beam board. Due to changes in the design thi
- Micro USB
- Antenna: U.FL antenna connector
-**Features**
+## Features
+
- Meshtastic preinstalled
- Power, Program and Reset switches
- Screen sold separately
-**Resources**
+## Resources
+
- Firmware file: `firmware-tbeam-X.X.X.xxxxxxx.bin`
- Purchase link: [AliExpress](https://www.aliexpress.com/item/4001287221970.html)
-
+- US Distributor - Purchase link: [Rokland](https://store.rokland.com/products/lilygo-t-beam-v1-1-neo-m8n-gnss-ipex-lora-sx1262-915mhz-wireless-module-wifi-bluetooth-board-q215?ref=8Bb2mUO5i-jKwt)

-
diff --git a/docs/hardware/devices/tbeam/screens.mdx b/docs/hardware/devices/tbeam/screens.mdx
index 35e7fdea..7db0f33d 100644
--- a/docs/hardware/devices/tbeam/screens.mdx
+++ b/docs/hardware/devices/tbeam/screens.mdx
@@ -5,7 +5,6 @@ sidebar_label: Screens
sidebar_position: 2
---
-
## 0.96 inch OLED I2C display
- [Purchase link](https://www.aliexpress.com/item/32922106384.html)
@@ -21,4 +20,4 @@ To attach the screen:
3. Connect SCL to pin 22
4. Connect SDA to pin 21
-
\ No newline at end of file
+
diff --git a/docs/hardware/devices/techo/buttons.mdx b/docs/hardware/devices/techo/buttons.mdx
index 72692d3e..c946c67c 100644
--- a/docs/hardware/devices/techo/buttons.mdx
+++ b/docs/hardware/devices/techo/buttons.mdx
@@ -17,5 +17,4 @@ sidebar_position: 3
- _**Double press**_ turns the screen backlight on/off
- _**Long press**_ signals the device to shutdown.
-

diff --git a/docs/hardware/devices/techo/enclosures.mdx b/docs/hardware/devices/techo/enclosures.mdx
index 73635c88..18962d72 100644
--- a/docs/hardware/devices/techo/enclosures.mdx
+++ b/docs/hardware/devices/techo/enclosures.mdx
@@ -11,6 +11,6 @@ sidebar_position: 3
Download from [Thingiverse](https://www.thingiverse.com/thing:5028720).
-
+
diff --git a/docs/hardware/devices/techo/index.mdx b/docs/hardware/devices/techo/index.mdx
index 5a1c47b1..f42eb0c6 100644
--- a/docs/hardware/devices/techo/index.mdx
+++ b/docs/hardware/devices/techo/index.mdx
@@ -7,15 +7,17 @@ sidebar_position: 2
The T-Echo is the latest device to be release by LILYGO® supporting a low power consumption micro-controller.
+Further information on the LILYGO® T-Echo devices can be found on LILYGO®'s [GitHub page](https://github.com/Xinyuan-LilyGO/LilyGO-T-Echo).
+
### Specifications
- **MCU**
- - nRF52840
- - Bluetooth BLE 5.0 & NFC
- - Very low power consumption
+ - nRF52840 (Bluetooth BLE 5.0 & NFC)
- **LoRa Transceiver**
- Semtech SX1262
- **Frequency options**
+ - 433 MHz
+ - 868 MHz
- 915 MHz
- **Navigation Module**
- L76K GNSS receiver (Supports GPS, BeiDou, GLONASS & QZSS)
@@ -23,6 +25,7 @@ The T-Echo is the latest device to be release by LILYGO® supporting a low power
- U.FL antenna connector
### Features
+
- Reset, Program and capacitive touch buttons
- 1.54" eInk display
- Optional BME280 - Humidity and Pressure Sensor
@@ -31,7 +34,8 @@ The T-Echo is the latest device to be release by LILYGO® supporting a low power
### Resources
- Firmware file: `firmware-t-echo-2.x.x.uf2`
-- [Purchase link](https://www.aliexpress.com/item/1005002842456390.html)
-- TTGO's [GitHub page](https://github.com/Xinyuan-LilyGO/LilyGO-T-Echo) for the T-Echo
+- Purchase links:
+ - AliExpress: [Lilygo Official Store](https://www.aliexpress.com/item/1005003026107533.html)
+ - US Distributor - Rokland: [915MHz](https://store.rokland.com/products/lilygo-ttgo-meshtastic-t-echo-white-lora-sx1262-wireless-module-915mhz-nrf52840-gps-for-arduino?ref=8Bb2mUO5i-jKwt) [915MHz BME280 Kit](https://store.rokland.com/products/lilygo-ttgo-meshtastic-t-echo-white-bme280-lora-sx1262-wireless-module-915mhz-nrf52840-gps-rtc-nfc-for-arduino?ref=8Bb2mUO5i-jKwt)

diff --git a/docs/legal/trademark-grants.mdx b/docs/legal/trademark-grants.mdx
new file mode 100644
index 00000000..7bfbaa72
--- /dev/null
+++ b/docs/legal/trademark-grants.mdx
@@ -0,0 +1,10 @@
+---
+id: trademark-grants
+title: Trademark Grants
+sidebar_label: Trademark Grants
+---
+
+- Grant: http://meshtastic.pt
+ - Details: Meshtastic.pt is a fan page created before the trademark usage guidelines were authored. Agreement with Sérgio Matos that meshtastic.pt may continue use of meshtastic in domain name provided they stay non commercial and maintain that they are non-official. The grant is revokable at any time for any reason.
+- Grant: https://meshbrasil.com
+ - Details: Meshbrasil.com is an online shop for Meshtastic powered devices and accessories which carry the "Powered by Meshtastic" logo. The use of the Meshtastic Logo and Trademarks does not imply Meshbrasil.com is sponsored or endorsed by Meshtastic. Meshbrasil.com also agrees to maintain compliance with the Meshtastic Legal requirements. This grant is revokable at any time for any reason.
diff --git a/docs/legal/trademark.mdx b/docs/legal/trademark.mdx
index 55a63961..7f48aec6 100644
--- a/docs/legal/trademark.mdx
+++ b/docs/legal/trademark.mdx
@@ -6,11 +6,11 @@ sidebar_label: Trademark
Meshtastic® is a registered trademark of Meshtastic LLC. Meshtastic software components are released under various licenses, see [GitHub](https://github.com/meshtastic) for details. No warranty is provided - use at your own risk.
-# Meshtastic Trademark Policy
+## Meshtastic Trademark Policy
Meshtastic, and Meshtastic logo ("Meshtastic Logo"), either separately or in combination, are hereinafter referred to as "Meshtastic Trademarks" and are trademarks of the Meshtastic LLC. Except as provided in these guidelines, you may not use the Meshtastic Trademarks or any confusingly similar mark as a trademark for your product, or use the Meshtastic Trademarks in any other manner that might cause confusion in the marketplace, including but not limited to in advertising, on websites, or on software. In fact, the law obligates trademark owners to police their marks and prevent the use of confusingly similar names by third parties. If you have questions about this policy, please contact the Trademark Supervisor by enquiring at [trademark@meshtastic.org](mailto:trademark@meshtastic.org).
-# Usage That Does Not Require Written Permission
+## Usage That Does Not Require Written Permission
Below are the guidelines for use of the Meshtastic Trademarks where, as long as you are in compliance with the guidelines, no advance written permission is necessary. In all cases, use is permitted only provided that:
@@ -19,7 +19,7 @@ Below are the guidelines for use of the Meshtastic Trademarks where, as long as
- proper trademark symbols are used in connection with the Meshtastic Trademarks and the trademark attribution statement must appear as explained in Proper Trademark Use
- the Logo Usage Guidelines are strictly observed
-## Noncommercial and community web sites
+### Noncommercial and community web sites
In the past, community members have inquired whether it is permissible to show support for Meshtastic by:
@@ -30,16 +30,16 @@ The guidelines relating to such usage are set forth in this section.
It is permissible to use the Meshtastic Trademarks on websites to show your support for the open source software, provided that:
-where possible, the design logo hyperlinks to the Meshtastic website, [http://meshtastic.org/](http://meshtastic.org/), or if that is not possible, the site includes a prominent link to the Meshtastic website at [http://meshtastic.org/](http://meshtastic.org/).
-proper trademark symbols are used in connection with the Meshtastic Trademarks and the trademark attribution statement must appear as explained in Proper Trademark Use
-the Logo Usage Guidelines are strictly observed
-the site indicates clearly that it is not affiliated with or endorsed by Meshtastic; in addition, where possible:
-the site must include the text "This site is not affiliated with or endorsed by the Meshtastic project" prominently on any page that includes the Meshtastic Trademarks, and
-if the Meshtastic Trademarks appear in a page header or any area that is designed to be presented on more than one page, the notice must also be designed to be presented on all of those pages as well. (i.e., if the Meshtastic Trademarks appear in a site-wide header, the informational text must appear in that header or an identically site-wide footer.)
-the site does not use visual styling that could be confusing to viewers or visitors as to whether the site is hosted by or on behalf of Meshtastic.
-A copy of the use of the Meshtastic Trademarks is provided to the Trademark Supervisor within seven (7) days of its initial use, for example by sending a URL or other copy of such use.
+- where possible, the design logo hyperlinks to the Meshtastic website, [http://meshtastic.org/](http://meshtastic.org/), or if that is not possible, the site includes a prominent link to the Meshtastic website at [http://meshtastic.org/](http://meshtastic.org/).
+- proper trademark symbols are used in connection with the Meshtastic Trademarks and the trademark attribution statement must appear as explained in Proper Trademark Use
+- the Logo Usage Guidelines are strictly observed
+- the site indicates clearly that it is not affiliated with or endorsed by Meshtastic; in addition, where possible:
+ the site must include the text "This site is not affiliated with or endorsed by the Meshtastic project" prominently on any page that includes the Meshtastic Trademarks, and
+- if the Meshtastic Trademarks appear in a page header or any area that is designed to be presented on more than one page, the notice must also be designed to be presented on all of those pages as well. (i.e., if the Meshtastic Trademarks appear in a site-wide header, the informational text must appear in that header or an identically site-wide footer.)
+- the site does not use visual styling that could be confusing to viewers or visitors as to whether the site is hosted by or on behalf of Meshtastic.
+- A copy of the use of the Meshtastic Trademarks is provided to the Trademark Supervisor within seven (7) days of its initial use, for example by sending a URL or other copy of such use.
-## Business web sites
+### Business web sites
In the past, community members have inquired whether it is permissible to show support for Meshtastic by:
@@ -59,7 +59,7 @@ It is permissible to use the Meshtastic Trademarks on business web sites, provid
- the site does not use visual styling that could be confusing to viewers or visitors as to whether the site is hosted by or on behalf of Meshtastic
- A copy of the use of the Meshtastic Trademarks is provided to the Trademark Supervisor within seven (7) days of its initial use, for example by sending a URL or other copy of such use
-## Promotional events
+### Promotional events
In the past, community members have inquired whether it is permissible to use the Meshtastic Trademarks to promote events. The guidelines relating to such usage are set forth in this section.
@@ -73,7 +73,7 @@ It is permissible to use the Meshtastic Trademarks in such promotional events, p
If you would like to make some non-software goods to give away or sell at the event and don't already have a license to do so, see Non-software goods.
-## Publications
+### Publications
It is permissible to use the Meshtastic Trademarks in the title and content of a publication, provided that:
@@ -82,23 +82,26 @@ It is permissible to use the Meshtastic Trademarks in the title and content of a
- the Logo Usage Guidelines are strictly observed
- A copy of the use of the Meshtastic Trademarks is provided to the Trademark Supervisor within seven (7) days of its initial use, for example by sending a URL or other copy of such use
-# Usage that Require Prior Written Approval
+## Usage that Require Prior Written Approval
-## Social Media
+### Social Media
In the past, community members have inquired whether it is permissible to use the Meshtastic Trademarks, including the term "Meshtastic" in a Social Media account. It is not permissible without written permission of Meshtastic.
-## Domain names
+### Domain names
In the past, community members have inquired whether it is permissible to use the Meshtastic Trademarks, including the term "Meshtastic" in an Internet domain name. It is not permissible without written permission of Meshtastic.
-## Non-software goods
+### Non-software goods
In the past, community members have inquired whether it is permissible to use Meshtastic Trademarks on non-software goods such as Embedded Systems, Enclosures, Hardware, T-shirts, stickers, and pens.
-Community members may request from the Trademark Supervisor designated by the Admins of Meshtastic a license to use the Meshtastic Trademarks on non-software related goods or services, by enquiring at [trademark@meshtastic.org](mailto: trademark@meshtastic.org). The Trademark Supervisor will be responsible for reviewing samples of the goods and services and managing the relationship.
+Community members may request from the Trademark Supervisor designated by the Admins of Meshtastic a license to use the Meshtastic Trademarks on non-software related goods or services, by enquiring at [trademark@meshtastic.org](mailto:trademark@meshtastic.org). The Trademark Supervisor will be responsible for reviewing samples of the goods and services and managing the relationship.
-# Unapproved Use
+- The adding our logo or other marks to a non-software good may be allowed, with written permission from the the Meshtastic Trademark Supervisior, provided that the non-software good is a 100% original design or the requester has evidence of a grant of use from copyright holder of the original design.
+- The adding our logo or other marks to a non-software good is not an endorsement or sponsorship of that good by the Meshtastic Project.
+
+## Unapproved Use
The following uses of the Meshtastic Trademarks are not approved under any foreseeable circumstances.
@@ -108,15 +111,15 @@ The following uses of the Meshtastic Trademarks are not approved under any fores
These guidelines (except for trademark licenses executed for non software goods) may be amended from time to time at the discretion of Meshtastic and such changes will be effective ten (10) days after the changes are posted. Meshtastic may provide you with notice of such changes, but need not do so. You are responsible for checking this site for any changes.
-# Proper Trademark Use
+## Proper Trademark Use
One of the purposes of Meshtastic is to encourage the use of Meshtastic software to enable the public to come to trust the use of Meshtastic Trademarks. To achieve this purpose it is important that Meshtastic can quickly be identified. Meshtastic has chosen the Meshtastic Logo to identify such software and is granting usage rights in the Meshtastic Logo (and the other Meshtastic Trademarks) as previously described in this document in order to assure widespread availability.
-## Trademark Usage Guidelines
+### Trademark Usage Guidelines
-### Guideline
+#### Guideline
-#### Examples
+##### Examples
When using the Meshtastic Trademarks you must provide the proper trademark symbols and a trademark attribution statement.
@@ -124,27 +127,19 @@ Acceptable: Use for the first instance of the Meshtastic Logo include the ® mar
Unacceptable: Never using the ® mark for Meshtastic Logo, nor a trademark statement per the guidelines.
-Always distinguish trademarks from surrounding text with at least initial capital letters or in all capital letters.
-
-Never pluralize a trademark. Never use "a" or "the" to refer to an instance of the trademark. Always use a trademark as an adjective modifying a noun, or as a singular noun.
-
-Never use a trademark as a possessive. Instead, the following noun should be used in possessive form or the sentence reworded so there is no possessive.
-
-Never translate a trademark into another language.
-
-Never alter a trademark in any way including through unapproved fonts or visual identifiers.
-
-Never use or register any trademarks that are confusingly similar to, or a play on, the Meshtastic or Meshtastic Logo.
-
-Never combine your company name with the Meshtastic name or use the Meshtastic name in a way that it could be perceived that Meshtastic and your company have an organizational link such as a joint venture.
-
-Never use the Meshtastic Trademarks in a disparaging manner or that violates any federal, state, or international law.
+- Always distinguish trademarks from surrounding text with at least initial capital letters or in all capital letters.
+- Never pluralize a trademark. Never use "a" or "the" to refer to an instance of the trademark. Always use a trademark as an adjective modifying a noun, or as a singular noun.
+- Never use a trademark as a possessive. Instead, the following noun should be used in possessive form or the sentence reworded so there is no possessive.
+- Never translate a trademark into another language.
+- Never alter a trademark in any way including through unapproved fonts or visual identifiers.
+- Never use or register any trademarks that are confusingly similar to, or a play on, the Meshtastic or Meshtastic Logo.
+- Never combine your company name with the Meshtastic name or use the Meshtastic name in a way that it could be perceived that Meshtastic and your company have an organizational link such as a joint venture.
+- Never use the Meshtastic Trademarks in a disparaging manner or that violates any federal, state, or international law.
Unacceptable: Cartoon character micturating on the Meshtastic Logo, applying Meshtastic Logo outside permitted uses
-Never use terminology that states or implies that Meshtastic assumes any responsibility for the performance of your products and services.
-
-The Meshtastic Logo must be hyperlinked to [http://meshtastic.org/](http://meshtastic.org/), in contexts where such a hyperlink is technically feasible.
+- Never use terminology that states or implies that Meshtastic assumes any responsibility for the performance of your products and services.
+- The Meshtastic Logo must be hyperlinked to [http://meshtastic.org/](http://meshtastic.org/), in contexts where such a hyperlink is technically feasible.
Acceptable: Hyperlinking the Meshtastic Logo where feasible
@@ -152,7 +147,7 @@ Unacceptable: Not hyperlinking the Meshtastic Logo where feasible
Except as prohibited by law, the person or entity who is using the Meshtastic Trademark under the terms of these Guidelines ("User") acknowledges that Meshtastic is the sole and exclusive owner of the Meshtastic Trademarks and agrees that it will do nothing inconsistent with such ownership either during the term of such use or afterwards. Specifically, User will take no action that will interfere with or diminish Meshtastic's right in the Meshtastic Trademarks. The User acknowledges that the Meshtastic Trademarks are valid under the applicable law and that User's utilization of the Meshtastic Trademarks will not create any right, title or interest in the Meshtastic Trademarks. The User agrees not to apply or assist any third party to register the Meshtastic Trademarks or a confusingly similar designation anywhere in the world. If any application for registration is or has been filed by or on behalf of User in any country and relates to any mark which, in the reasonable opinion of Meshtastic, is confusingly similar, deceptive or misleading with respect to, or dilutes or any way damages the Meshtastic Trademark, User shall, at Meshtastic's request, abandon all use of such mark, and any registration or application for registration thereof and shall reimburse Meshtastic for all costs and expenses of any oppMeshtastiction or related legal proceeding, including attorneys' fees, instigation by Meshtastic or its authorized representative. Upon the written statement that the User is not using the Meshtastic Trademarks in accordance with the Guidelines, within ten (10) days, User shall modify its use to comply with the Guidelines or cease using the Meshtastic Trademarks.
-## Logo Usage Guidelines
+### Logo Usage Guidelines
The Meshtastic logo is a trademark of Meshtastic LLC. In order to protect and grow the Meshtastic brand, we have a distinguishable logo. When displaying the Meshtastic logo, please follow our standard Trademark Guidelines. Other sizes and resolutions of the logo, some suitable for print, can be found [here](https://github.com/meshtastic/design).
diff --git a/docs/software/_category_.yml b/docs/software/_category_.yml
index d78fe92d..9de43cef 100644
--- a/docs/software/_category_.yml
+++ b/docs/software/_category_.yml
@@ -4,4 +4,4 @@ position: 6
link:
type: generated-index
title: Software
- slug: /software
\ No newline at end of file
+ slug: /software
diff --git a/docs/software/android/_category_.yml b/docs/software/android/_category_.yml
index 50b7807a..1bd681f7 100644
--- a/docs/software/android/_category_.yml
+++ b/docs/software/android/_category_.yml
@@ -3,4 +3,4 @@ collapsible: true
position: 1
link:
type: generated-index
- title: Android App
\ No newline at end of file
+ title: Android App
diff --git a/docs/software/android/installation.mdx b/docs/software/android/installation.mdx
index 5df95ccb..85daa20f 100644
--- a/docs/software/android/installation.mdx
+++ b/docs/software/android/installation.mdx
@@ -14,31 +14,35 @@ The minimum Android version is 5.0 (Lollipop 2014, first BLE support), however A
### Install with F-Droid
1. Download and Install the F-Droid app from [f-droid.org](https://f-droid.org/)
-2. Open the F-Droid app and navigate to `Settings > Repositories`.
+2. Open the F-Droid app and navigate to `Settings > Repositories`.
3. Click on the `+` icon to add a new repo.
-3. Enter the Meshtastic repo address as follows: `https://mesh.tastic.app/fdroid/repo/` (no fingerprint required)
-4. Navigate to the `Categories` page and refresh (scroll down).
-5. Search for and install the `Meshtastic` App.
+4. Enter the Meshtastic repo address as follows: `https://apt.izzysoft.de/fdroid/repo/` (no fingerprint required)
+5. Navigate to the `Categories` page and refresh (scroll down).
+6. Search for and install the `Meshtastic` App.
### Install from Play Store
-There is a Play Store [testing program](https://play.google.com/apps/testing/com.geeksville.mesh) with the latest cutting edge changes, though this may come with extra bugs.
+There is a Play Store [testing program](https://play.google.com/apps/testing/com.geeksville.mesh) with the latest cutting edge changes, though this may come with extra bugs.
It is recommended that you follow the [Meshtastic Discourse Alpha Testers](https://meshtastic.discourse.group/c/development/alpha-testers) channel if you decide to join.
@@ -48,27 +52,28 @@ _Google Play and the Google Play logo are trademarks of Google LLC._
-The app can also be sideloaded by downloading the .APK from the [Github Releases](https://github.com/meshtastic/Meshtastic-Android/releases/latest) page.
+The app can also be sideloaded by downloading the .APK from the [Github Releases](https://github.com/meshtastic/Meshtastic-Android/releases/latest) page.
If you do sideload, you may have to give your browser permissions to run a package installer. If you wish to view the code or contribute to development of the app, please visit the app's [GitHub page](https://github.com/meshtastic/Meshtastic-Android)
-
### Install with Obtainium
1. Download and Install the Obtanium app from [Github](https://github.com/ImranR98/Obtainium).
2. Open the Obtanium app and navigate to `+ Add App`.
3. You can easily search for the Android repo with the search field by typing `Meshtastic-Android` and selecting the `Meshtastic/Meshtastic-Android` repo. You may also manually enter the Meshtastic Android Github Releases address as follows: `https://github.com/meshtastic/Meshtastic-Android/releases`.
-4. Under `Additional Options for Github` toggle as desired `Include prereleases`* or `Fallback to older releases` and press `Add`.
+4. Under `Additional Options for Github` toggle as desired `Include prereleases`\* or `Fallback to older releases` and press `Add`.
5. The first time you add an application, obtainium will prompt you for permission to install unknown apps, you will need to toggle `Allow from this source` and press back. Obtainium will download the Android .APK from the Github release page.
6. Press `Install`. Android Installer will prompt "Do you want to install this app?" press `Install`.
7. Press `Open`.
Obtainium allows you to install and update Open-Source Apps directly from their releases pages, and receive notifications when new releases are made available.
-*Alpha releases include the latest cutting edge changes which may come with extra bugs. It is recommended that you follow the [Meshtastic Discourse Alpha Testers](https://meshtastic.discourse.group/c/development/alpha-testers) channel if you decide to use these versions.
+\*Alpha releases include the latest cutting edge changes which may come with extra bugs. It is recommended that you follow the [Meshtastic Discourse Alpha Testers](https://meshtastic.discourse.group/c/development/alpha-testers) channel if you decide to use these versions.
diff --git a/docs/software/android/usage.mdx b/docs/software/android/usage.mdx
index b0394b59..3824cce6 100644
--- a/docs/software/android/usage.mdx
+++ b/docs/software/android/usage.mdx
@@ -25,10 +25,10 @@ To find devices to connect via Bluetooth click the button on the bottom right co
1. Select the device name, `Meshtastic_bebc` in this example. (You will see devices within range, so make sure to get the right one.)
2. Before you can connect for the first time, you need to "pair" the devices to allow communication between them. Some devices are pinless, others require entering a PIN shown on the screen.
-:::note
-If the device was flashed without a screen connected, it will automatically default to a pairing PIN of '123456'. If it was booted with a screen once, the config is set to random pin. If you remove the screen afterwards, it stays like this.
-Either set it to use the default pin manually, or factory reset it and it will revert to '123456' after the next boot.
-:::
+ :::note
+ If the device was flashed without a screen connected, it will automatically default to a pairing PIN of '123456'. If it was booted with a screen once, the config is set to random pin. If you remove the screen afterwards, it stays like this.
+ Either set it to use the default pin manually, or factory reset it and it will revert to '123456' after the next boot.
+ :::
3. This starts the communication with the device. The cloud icon on the status bar should change and show a check mark.
[](/img/android/android-settings-mike-c.png)
@@ -73,7 +73,7 @@ The app will generate a new QR code on the screen, and this encodes the channel
1. If another user shares a QR code, you will be able to scan it directly with your camera using the `Scan` button.
-[](/img/android/android-open-with.png)
+ [](/img/android/android-open-with.png)
2. If the channel is shared from a file or link using the `Share` button, you can click on the file or link and you need to choose "Open with Meshtastic".
diff --git a/docs/software/apple/_category_.yml b/docs/software/apple/_category_.yml
index 9a6fa6dd..17e07834 100644
--- a/docs/software/apple/_category_.yml
+++ b/docs/software/apple/_category_.yml
@@ -3,4 +3,4 @@ collapsible: true
position: 2
link:
type: generated-index
- title: Apple Applications
\ No newline at end of file
+ title: Apple Applications
diff --git a/docs/software/apple/installation.mdx b/docs/software/apple/installation.mdx
index 04f40bba..cffae21a 100644
--- a/docs/software/apple/installation.mdx
+++ b/docs/software/apple/installation.mdx
@@ -5,5 +5,8 @@ sidebar_label: Installation
---
-
+
diff --git a/docs/software/apple/usage.mdx b/docs/software/apple/usage.mdx
index 9bd37e17..8bbddce2 100644
--- a/docs/software/apple/usage.mdx
+++ b/docs/software/apple/usage.mdx
@@ -8,14 +8,14 @@ sidebar_label: Usage
The Meshtastic app for iOS, iPadOS and macOS supports the sharing of a .mbtiles file with the app for offline map support.
-There is an open source cross platform mapping program call [QGIS](https://www.qgis.org/en/site/)
+There is an open source cross platform mapping program call [QGIS](https://www.qgis.org/en/site/)
-to get a mbtiles out of qgis, start with a small area that you are familiar with. Open qgis, and add a openstreetmap source from the left bar (might be under one of the tile headings). Now you should see something in the main map view. zoom to the area you want.
+to get a mbtiles out of qgis, start with a small area that you are familiar with. Open qgis, and add a openstreetmap source from the left bar (might be under one of the tile headings). Now you should see something in the main map view. zoom to the area you want.
In the Processing Toolbox (right bar, you may have to show it from the View menu), open Raster Tools > Generate XYZ Tiles (MBTiles)
-In Extent, choose Use Map Canvas Extent. This defines the area of the map that will be rendered into the export file
-Use a zoom level of 12-17. You can play with this later, but thats a good starting point. Note that every increment of maximum zoom will increase the map size 4x.
-Select JPG if there's aerial/satellite imagery, otherwise just use PNG. That will give the best compression.
+In Extent, choose Use Map Canvas Extent. This defines the area of the map that will be rendered into the export file
+Use a zoom level of 12-17. You can play with this later, but thats a good starting point. Note that every increment of maximum zoom will increase the map size 4x.
+Select JPG if there's aerial/satellite imagery, otherwise just use PNG. That will give the best compression.
-Finally choose a location for the output file. Click Run and you should eventually get a file that should play nice in the Meshtastic app.
\ No newline at end of file
+Finally choose a location for the output file. Click Run and you should eventually get a file that should play nice in the Meshtastic app.
diff --git a/docs/software/community/atak.mdx b/docs/software/community/atak.mdx
index efe45244..045a7a41 100644
--- a/docs/software/community/atak.mdx
+++ b/docs/software/community/atak.mdx
@@ -16,18 +16,16 @@ Support should be sought from the respective authors.
:::info
The ATAK Forwarder plugin has recently been updated to support Meshtastic 2.0.6+ but is currently a pre-release version to allow for additional testing to be completed.
+
- After installing you need to open the Meshtastic app and click the add device "+" so it will ask for Bluetooth permissions.
:::
The ATAK Forwarder plugin requires the Meshtastic Android app to be installed.
-This is a plugin for ATAK (Android Team Awareness Kit) that uses Meshtastic to provide off-grid communications. This includes plotting the position of others on the map, transmission of markers and routes, and chat messages. It has been signed by the TAK Product Center for use with the Play Store version of ATAK. He is currently distributing development builds via [Google Drive](https://drive.google.com/drive/folders/1xeKJnn9tmzkkmuDbMp0LCLOV9OzHU-Ex), aiming to publish it to the Play Store in the future.
+This is a plugin for ATAK (Android Team Awareness Kit) that uses Meshtastic to provide off-grid communications. This includes plotting the position of others on the map, transmission of markers and routes, and chat messages.

-The builds of the module on the Google Drive are now signed for the Play Store version of ATAK, as of 6/3/2021.
-
- A walk-through on how to [set up ATAK](https://paul-mandal.medium.com/atak-for-hikers-d96d5246193e).
-- The module source is available on [GitHub](https://github.com/paulmandal/atak-forwarder), along with instructions for setting it up.
-- Development builds are available on [Google Drive](https://drive.google.com/drive/folders/1xeKJnn9tmzkkmuDbMp0LCLOV9OzHU-Ex).
+- The module source is available on [GitHub](https://github.com/paulmandal/atak-forwarder), along with instructions for setting it up, and the latest [Releases](https://github.com/paulmandal/atak-forwarder/releases/).
diff --git a/docs/software/community/index.mdx b/docs/software/community/index.mdx
index 87f7bb59..c89cbb67 100644
--- a/docs/software/community/index.mdx
+++ b/docs/software/community/index.mdx
@@ -12,4 +12,4 @@ Current community projects:
- [ATAK (Android Team Awareness Kit) Forwarder](/docs/software/community/community-atak) - An ATAK plugin for forwarding CoT messages via a hardware layer which supports Meshtastic devices.
- [Meshtasticator (Simulator)](/docs/software/community/community-meshtasticator) - Meshtasticator is a discrete-event and interactive simulator that mimics the radio section of the device software.
-Support for these projects should be sought from their respective authors.
\ No newline at end of file
+Support for these projects should be sought from their respective authors.
diff --git a/docs/software/linux-native.mdx b/docs/software/linux-native.mdx
index 0c057dd3..05269262 100644
--- a/docs/software/linux-native.mdx
+++ b/docs/software/linux-native.mdx
@@ -6,14 +6,13 @@ sidebar_position: 9
---
The device software can also run on a native Linux machine thanks to the [Portduino framework](https://github.com/geeksville/framework-portduino).
-See either [Usage with a Linux machine](#usage-with-a-linux-machine) or [Usage with Docker](#usage-with-docker) for instructions to run it.
The application either simulates some of the interfaces, or uses the real hardware of your machine.
Device firmware from 1.3.42 and on even allows you to simulate the LoRa chip by sending and receiving Meshtastic packets via a local TCP port.
In this way, you can let multiple instances of the application communicate with each other as if they did via LoRa.
For instructions on how to use it, see the [interactive simulator](https://github.com/GUVWAF/Meshtasticator/blob/master/INTERACTIVE_SIM.md) that also emulates a wireless environment using simulated positions of the nodes.
-## Usage with a Linux machine {#usage-with-a-linux-machine}
+## Usage with a Linux machine
The easiest way of building the native application is using Visual Studio Code with the PlatformIO extension.
See the instructions for creating such a building environment [here](/docs/development/firmware/build).
@@ -29,7 +28,7 @@ Additional arguments can be given to the program, which are listed as follows:
- `-h MAC_ADDRESS`: The MAC address to assign to this virtual machine.
- `-p TCP_PORT`: The local TCP port to use for running the Meshtastic API.
-## Usage with Docker {#usage-with-docker}
+## Usage with Docker
If you do not own a Linux machine, or you just want to separate things, you might want
to run the application inside a docker container.
@@ -66,7 +65,7 @@ First, some environment variables need to be set up with command:
You also want to make some adjustments in the bin/build-all.sh to conform the amd64 build:
-```
+```shell
sed -i 's/^BOARDS_ESP32.*/BOARDS_ESP32=""/' bin/build-all.sh
sed -i 's/^BOARDS_NRF52.*/BOARDS_NRF52=""/' bin/build-all.sh
sed -i 's/echo "Building SPIFFS.*/exit/' bin/build-all.sh
diff --git a/docs/software/mqtt/index.mdx b/docs/software/mqtt/index.mdx
index 450d2f83..125afba1 100644
--- a/docs/software/mqtt/index.mdx
+++ b/docs/software/mqtt/index.mdx
@@ -34,7 +34,7 @@ The device will uplink and downlink raw ([protobuf](https://developers.google.co
The payload is a raw protobuf. Looking at the MQTT traffic with a program like `mosquitto_sub` will tell you it's working, but you won't get much useful information out of it. For example:
-```
+```text
苓????"!
!937bed1cTanksTnk"D???05??=???aP`
ShortFast !937bed1c
@@ -102,7 +102,7 @@ If the channelid 'well known'/public it could be decrypted by a web service (if
#### Service Envelope
-The payload published on mesh/... will always be wrapped in a [ServiceEnvelope protobuf](/docs/developers/protobufs/api#serviceenvelope).
+The payload published on mesh/... will always be wrapped in a [ServiceEnvelope protobuf](https://buf.build/meshtastic/protobufs/docs/main:meshtastic#meshtastic.ServiceEnvelope).
ServiceEnvelope will include the message, and full information about arrival time, who forwarded it, source channel, source mesh id, etc...
@@ -139,43 +139,43 @@ An existing public [MQTT broker](https://mosquitto.org) will be the default for
1. install mqtt server
-```sh
-brew install mosquitto
-```
+ ```sh
+ brew install mosquitto
+ ```
2. start the mqtt server
-```sh
-brew services restart mosquitto
-```
+ ```sh
+ brew services restart mosquitto
+ ```
3. Do a quick test of server, start a subscriber on a topic:
-Note: this will wait until you press control-c (publish a message, see below)
+ Note: this will wait until you press control-c (publish a message, see below)
-```sh
-mosquitto_sub -t test/hello
-```
+ ```sh
+ mosquitto_sub -t test/hello
+ ```
4. In another window, publish a message to that topic:
-```sh
-mosquitto_pub -h localhost -q 0 -t test/hello -m 'yo!'
-```
+ ```sh
+ mosquitto_pub -h localhost -q 0 -t test/hello -m 'yo!'
+ ```
5. For Meshtastic to be able to access that server, two settings need to be changed in the
`/usr/local/etc/mosquitto/mosquitto.conf` file:
-```
-listener 1883 0.0.0.0
-allow_anonymous true
-```
+ ```shell
+ listener 1883 0.0.0.0
+ allow_anonymous true
+ ```
6. Restart the service:
-```sh
-brew services restart mosquitto
-```
+ ```shell
+ brew services restart mosquitto
+ ```
7. If you are using the mac firewall, you will need to go into: System Preferences > Security & Privacy > Firewall > Firewall Options and add it.
@@ -230,13 +230,13 @@ if __name__ == '__main__':
Below is a valid JSON envelope for information sent by MQTT to a device for broadcast onto the mesh.
- ```json
- {
- "sender":"whatever you want to be the SENDER",
- "type":"sendtext",
- "payload": text or a json object go here
- }
- ```
+```json
+{
+ "sender":"whatever you want to be the SENDER",
+ "type":"sendtext",
+ "payload": text or a json object go here
+}
+```
Node-RED is a free cross-platform programming tool for wiring together hardware, APIs, and online services developed originally by IBM for IOT. It is widely used for home automation by many non-professional programmers and runs well on Pi's. Node-red has many plug-in modules written by the community. I will use this platform as a practical example on how to interface with the MQTT features of Meshtastic. Everything can be done from GUI's without using command line.
@@ -244,11 +244,11 @@ Step one: use http://client.meshtastic.org/ one of the Apple apps or the CLI to
Enable and enter network SSID/PSK. Settings--> Device Config--> Network; Save.
Set MQTT server address. Settings--> Module Config--> MQTT config; Verify Encryption Enabled is OFF. Turn JSON Output Enabled ON. Save.
Go to Channel Editor and set Uplink and Downlink enabled to True. Save. There is currently a bug for setting Uplink and Downlink Saving for the default channel. If you encounter this use the CLI commands:
- ```
+
+```shell
meshtastic --ch-index 0 --ch-set uplink_enabled true
meshtastic --ch-index 0 --ch-set downlink_enabled true
- ```
-
+```
Step two: if you don't want to depend on JSON decoding on the device, you can decode the protobuf messages off-device. To do that you will need to get the .proto files from https://github.com/meshtastic/protobufs. They function as a schema and are required for decoding in Node-RED. Save the files where the node-RED application can access them and note the file path of the "mqtt.proto" file.
@@ -273,9 +273,566 @@ Forwarding a text message from one device, through a broker, to another broker/d
If you want to decode text and position messages without json, it gets complicated:
[](/documents/mqtt/DecodeNewest.jpg)
If you are interested in my flow for this it is here:
- ```
-[{"id":"10fe1b2e9cb3feb2","type":"decode","z":"23dbb1ee.bc2e8e","name":"decode Protobuf","protofile":"a0d4288141f6a629","protoType":"ServiceEnvelope","x":295.5,"y":285,"wires":[["d3e396cf4f0a9608","d08865b41a69d85d","6f592d47b6a2eac4"]]},{"id":"40c9ee66fe7a34cb","type":"function","z":"23dbb1ee.bc2e8e","name":"function get the message as string from TEXT_MESSAGE_APP","func":"msg.payload = msg.payload.packet.decoded.payload;\n\nlet bufferObj = Buffer.from(msg.payload, \"base64\");\nlet decodedString = bufferObj.toString(\"utf8\");\nmsg.payload = decodedString;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":410.5,"y":450,"wires":[["553374591214eaca"]]},{"id":"553374591214eaca","type":"debug","z":"23dbb1ee.bc2e8e","name":"text message out","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":762.5,"y":449,"wires":[]},{"id":"c6afbb9f1665b162","type":"debug","z":"23dbb1ee.bc2e8e","name":"channelId","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":785.5,"y":257,"wires":[]},{"id":"607ef387d5701985","type":"debug","z":"23dbb1ee.bc2e8e","name":"gatewayId","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":792.5,"y":293,"wires":[]},{"id":"d3e396cf4f0a9608","type":"debug","z":"23dbb1ee.bc2e8e","name":"entire payload","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":296.5,"y":247,"wires":[]},{"id":"2339b328bb9bb1d8","type":"comment","z":"23dbb1ee.bc2e8e","name":"Decode all cleartext text and position messages sent by Meshtastic devices into JSON without relying on JSON conversion on the device.","info":"","x":515.5,"y":214,"wires":[]},{"id":"408d796d997bb832","type":"function","z":"23dbb1ee.bc2e8e","name":"function get the nested payload as base64","func":"msg.payload = msg.payload.packet.decoded.payload;\n\nlet bufferObj = Buffer.from(msg.payload, \"base64\");\n//let decodedString = bufferObj.toString(\"hex\");\nmsg.payload = bufferObj;\nmsg.topic=\"\";\n//if you don't zero out the protubufTopic it will try to\n//decode it as part of the mqtt service envelope instead\n//of two-stage decoding\nmsg.protobufType=null;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":349,"y":552,"wires":[["9435a3c605efedb4","1ed6f96c8214d7b3"]]},{"id":"61995c9f8e8266b3","type":"debug","z":"23dbb1ee.bc2e8e","name":"portnum","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":784.5,"y":330,"wires":[]},{"id":"9435a3c605efedb4","type":"debug","z":"23dbb1ee.bc2e8e","name":"nested payload","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":281.5,"y":603,"wires":[]},{"id":"b832775d386f7ac9","type":"mqtt in","z":"23dbb1ee.bc2e8e","name":"","topic":"msh/+/c/#","qos":"2","datatype":"buffer","broker":"37cadac381653b1e","nl":false,"rap":true,"rh":0,"inputs":0,"x":117.5,"y":286,"wires":[["10fe1b2e9cb3feb2"]]},{"id":"d08865b41a69d85d","type":"switch","z":"23dbb1ee.bc2e8e","name":"switch manual decoding nested message based on portum","property":"payload.packet.decoded.portnum","propertyType":"msg","rules":[{"t":"eq","v":"TEXT_MESSAGE_APP","vt":"str"},{"t":"eq","v":"POSITION_APP","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":281.5,"y":505,"wires":[["40c9ee66fe7a34cb"],["408d796d997bb832"]]},{"id":"8abb1bb458af2c4f","type":"change","z":"23dbb1ee.bc2e8e","name":"","rules":[{"t":"set","p":"gatewayId","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1021.5,"y":288,"wires":[[]]},{"id":"1ced0be28eeef0d3","type":"change","z":"23dbb1ee.bc2e8e","name":"","rules":[{"t":"set","p":"latitude","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1026.5,"y":407,"wires":[[]]},{"id":"313fd3cfe6d91850","type":"change","z":"23dbb1ee.bc2e8e","name":"","rules":[{"t":"set","p":"longitude","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1036.5,"y":450,"wires":[["d02e53cdfb565da6"]]},{"id":"33dd43e3c05f826c","type":"geofence","z":"23dbb1ee.bc2e8e","name":"geofence","mode":"circle","inside":"true","rad":69174.91569647488,"points":[],"centre":{"latitude":40.16287050252407,"longitude":-86.60385131835938},"floor":"","ceiling":"","worldmap":true,"outputs":2,"x":1202.5,"y":595,"wires":[[],["4d01eb8f1b31f039"]]},{"id":"d02e53cdfb565da6","type":"function","z":"23dbb1ee.bc2e8e","name":"trigger function to send a mapping point","func":"let lat = parseFloat(flow.get(\"latitude\"));\nlet lon = parseFloat(flow.get(\"longitude\"));\nlat=lat * 0.0000001;\nlon=lon * 0.0000001;\nlet name = flow.get(\"from\")\n\nmsg={\"payload\":{\"name\":name,\n \"lat\":lat,\n \"lon\":lon,\n \"action\":\"send\",\n \"icon\": \"car\",\n \"label\":name\n }}\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1181.5,"y":520,"wires":[["33dd43e3c05f826c","4d01eb8f1b31f039"]]},{"id":"4d01eb8f1b31f039","type":"worldmap","z":"23dbb1ee.bc2e8e","name":"","lat":"40","lon":"-86","zoom":"7","layer":"OSMG","cluster":"","maxage":"","usermenu":"show","layers":"show","panit":"false","panlock":"false","zoomlock":"false","hiderightclick":"false","coords":"none","showgrid":"false","showruler":"false","allowFileDrop":"false","path":"/worldmap","overlist":"DR,CO,RA,DN,HM","maplist":"OSMG,OSMC,EsriC,EsriS,EsriT,EsriDG,UKOS","mapname":"","mapurl":"","mapopt":"","mapwms":false,"x":1206.5,"y":675,"wires":[]},{"id":"1ed6f96c8214d7b3","type":"decode","z":"23dbb1ee.bc2e8e","name":"decode Position Protobuf","protofile":"dbab6472b07929a0","protoType":"Position","x":667.5,"y":548,"wires":[["db1933ba36503bd9","dad9f487318f21d9"]]},{"id":"db1933ba36503bd9","type":"debug","z":"23dbb1ee.bc2e8e","name":"Position decoded","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":673.5,"y":607,"wires":[]},{"id":"dad9f487318f21d9","type":"function","z":"23dbb1ee.bc2e8e","name":"Split","func":"var lat = { payload: msg.payload.latitudeI };\nvar lon = { payload: msg.payload.longitudeI };\nvar alt = { payload: msg.payload.altitude };\nvar tm = { payload: msg.payload.time };\n\nreturn [lat,lon,alt,tm];","outputs":4,"noerr":0,"initialize":"","finalize":"","libs":[],"x":875.5,"y":549,"wires":[["1ced0be28eeef0d3","8bb97f802662976c"],["313fd3cfe6d91850","c8e135f3e542bb1b"],["602fb2020680280c"],["ed424ae3d45dd2ac"]]},{"id":"8bb97f802662976c","type":"debug","z":"23dbb1ee.bc2e8e","name":"lat","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1017.5,"y":583,"wires":[]},{"id":"c8e135f3e542bb1b","type":"debug","z":"23dbb1ee.bc2e8e","name":"lon","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1018.5,"y":618,"wires":[]},{"id":"602fb2020680280c","type":"debug","z":"23dbb1ee.bc2e8e","name":"alt","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1017.5,"y":654,"wires":[]},{"id":"ed424ae3d45dd2ac","type":"debug","z":"23dbb1ee.bc2e8e","name":"time","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1018.5,"y":688,"wires":[]},{"id":"6f592d47b6a2eac4","type":"function","z":"23dbb1ee.bc2e8e","name":"Split Decoded 1","func":"var channelId = { payload: msg.payload.channelId};\nvar gatewayId = { payload: msg.payload.gatewayId};\nvar portnum = { payload: msg.payload.packet.decoded.portnum};\nvar fr= {payload: \"!\" + msg.payload.packet.from.toString(16)};\nvar to = {payload:\"!\"+ msg.payload.packet.to.toString(16)};\n\nreturn [channelId, gatewayId, portnum, fr, to ];","outputs":5,"noerr":0,"initialize":"","finalize":"","libs":[],"x":577.5,"y":294,"wires":[["c6afbb9f1665b162"],["607ef387d5701985","8abb1bb458af2c4f"],["61995c9f8e8266b3"],["fd881fac22422773","a389f9875da672ec"],["cf066ad415df30ae"]]},{"id":"fd881fac22422773","type":"debug","z":"23dbb1ee.bc2e8e","name":"from","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":772.5,"y":365,"wires":[]},{"id":"cf066ad415df30ae","type":"debug","z":"23dbb1ee.bc2e8e","name":"to","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":771.5,"y":399,"wires":[]},{"id":"a389f9875da672ec","type":"change","z":"23dbb1ee.bc2e8e","name":"set flow.from","rules":[{"t":"set","p":"from","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1012.5,"y":364,"wires":[[]]},{"id":"a0d4288141f6a629","type":"protobuf-file","protopath":"E:\\Meshtastic-protobufs-master\\mqtt.proto","watchFile":true,"keepCase":false},{"id":"37cadac381653b1e","type":"mqtt-broker","name":"","broker":"192.168.2.45","port":"1883","clientid":"","autoConnect":true,"usetls":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willPayload":"","willMsg":{},"userProps":"","sessionExpiry":""},{"id":"dbab6472b07929a0","type":"protobuf-file","protopath":"E:\\Meshtastic-protobufs-master\\mesh.proto","watchFile":true,"keepCase":false}]
- ```
+
+```json
+[
+ {
+ "id": "10fe1b2e9cb3feb2",
+ "type": "decode",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "decode Protobuf",
+ "protofile": "a0d4288141f6a629",
+ "protoType": "ServiceEnvelope",
+ "x": 295.5,
+ "y": 285,
+ "wires": [["d3e396cf4f0a9608", "d08865b41a69d85d", "6f592d47b6a2eac4"]]
+ },
+ {
+ "id": "40c9ee66fe7a34cb",
+ "type": "function",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "function get the message as string from TEXT_MESSAGE_APP",
+ "func": "msg.payload = msg.payload.packet.decoded.payload;\n\nlet bufferObj = Buffer.from(msg.payload, \"base64\");\nlet decodedString = bufferObj.toString(\"utf8\");\nmsg.payload = decodedString;\n\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "libs": [],
+ "x": 410.5,
+ "y": 450,
+ "wires": [["553374591214eaca"]]
+ },
+ {
+ "id": "553374591214eaca",
+ "type": "debug",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "text message out",
+ "active": true,
+ "tosidebar": true,
+ "console": false,
+ "tostatus": false,
+ "complete": "payload",
+ "targetType": "msg",
+ "statusVal": "",
+ "statusType": "auto",
+ "x": 762.5,
+ "y": 449,
+ "wires": []
+ },
+ {
+ "id": "c6afbb9f1665b162",
+ "type": "debug",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "channelId",
+ "active": false,
+ "tosidebar": true,
+ "console": false,
+ "tostatus": false,
+ "complete": "payload",
+ "targetType": "msg",
+ "statusVal": "",
+ "statusType": "auto",
+ "x": 785.5,
+ "y": 257,
+ "wires": []
+ },
+ {
+ "id": "607ef387d5701985",
+ "type": "debug",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "gatewayId",
+ "active": false,
+ "tosidebar": true,
+ "console": false,
+ "tostatus": false,
+ "complete": "payload",
+ "targetType": "msg",
+ "statusVal": "",
+ "statusType": "auto",
+ "x": 792.5,
+ "y": 293,
+ "wires": []
+ },
+ {
+ "id": "d3e396cf4f0a9608",
+ "type": "debug",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "entire payload",
+ "active": false,
+ "tosidebar": true,
+ "console": false,
+ "tostatus": false,
+ "complete": "payload",
+ "targetType": "msg",
+ "statusVal": "",
+ "statusType": "auto",
+ "x": 296.5,
+ "y": 247,
+ "wires": []
+ },
+ {
+ "id": "2339b328bb9bb1d8",
+ "type": "comment",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "Decode all cleartext text and position messages sent by Meshtastic devices into JSON without relying on JSON conversion on the device.",
+ "info": "",
+ "x": 515.5,
+ "y": 214,
+ "wires": []
+ },
+ {
+ "id": "408d796d997bb832",
+ "type": "function",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "function get the nested payload as base64",
+ "func": "msg.payload = msg.payload.packet.decoded.payload;\n\nlet bufferObj = Buffer.from(msg.payload, \"base64\");\n//let decodedString = bufferObj.toString(\"hex\");\nmsg.payload = bufferObj;\nmsg.topic=\"\";\n//if you don't zero out the protubufTopic it will try to\n//decode it as part of the mqtt service envelope instead\n//of two-stage decoding\nmsg.protobufType=null;\n\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "libs": [],
+ "x": 349,
+ "y": 552,
+ "wires": [["9435a3c605efedb4", "1ed6f96c8214d7b3"]]
+ },
+ {
+ "id": "61995c9f8e8266b3",
+ "type": "debug",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "portnum",
+ "active": false,
+ "tosidebar": true,
+ "console": false,
+ "tostatus": false,
+ "complete": "payload",
+ "targetType": "msg",
+ "statusVal": "",
+ "statusType": "auto",
+ "x": 784.5,
+ "y": 330,
+ "wires": []
+ },
+ {
+ "id": "9435a3c605efedb4",
+ "type": "debug",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "nested payload",
+ "active": false,
+ "tosidebar": true,
+ "console": false,
+ "tostatus": false,
+ "complete": "true",
+ "targetType": "full",
+ "statusVal": "",
+ "statusType": "auto",
+ "x": 281.5,
+ "y": 603,
+ "wires": []
+ },
+ {
+ "id": "b832775d386f7ac9",
+ "type": "mqtt in",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "",
+ "topic": "msh/+/c/#",
+ "qos": "2",
+ "datatype": "buffer",
+ "broker": "37cadac381653b1e",
+ "nl": false,
+ "rap": true,
+ "rh": 0,
+ "inputs": 0,
+ "x": 117.5,
+ "y": 286,
+ "wires": [["10fe1b2e9cb3feb2"]]
+ },
+ {
+ "id": "d08865b41a69d85d",
+ "type": "switch",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "switch manual decoding nested message based on portum",
+ "property": "payload.packet.decoded.portnum",
+ "propertyType": "msg",
+ "rules": [
+ { "t": "eq", "v": "TEXT_MESSAGE_APP", "vt": "str" },
+ { "t": "eq", "v": "POSITION_APP", "vt": "str" }
+ ],
+ "checkall": "true",
+ "repair": false,
+ "outputs": 2,
+ "x": 281.5,
+ "y": 505,
+ "wires": [["40c9ee66fe7a34cb"], ["408d796d997bb832"]]
+ },
+ {
+ "id": "8abb1bb458af2c4f",
+ "type": "change",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "",
+ "rules": [
+ {
+ "t": "set",
+ "p": "gatewayId",
+ "pt": "flow",
+ "to": "payload",
+ "tot": "msg"
+ }
+ ],
+ "action": "",
+ "property": "",
+ "from": "",
+ "to": "",
+ "reg": false,
+ "x": 1021.5,
+ "y": 288,
+ "wires": [[]]
+ },
+ {
+ "id": "1ced0be28eeef0d3",
+ "type": "change",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "",
+ "rules": [
+ {
+ "t": "set",
+ "p": "latitude",
+ "pt": "flow",
+ "to": "payload",
+ "tot": "msg"
+ }
+ ],
+ "action": "",
+ "property": "",
+ "from": "",
+ "to": "",
+ "reg": false,
+ "x": 1026.5,
+ "y": 407,
+ "wires": [[]]
+ },
+ {
+ "id": "313fd3cfe6d91850",
+ "type": "change",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "",
+ "rules": [
+ {
+ "t": "set",
+ "p": "longitude",
+ "pt": "flow",
+ "to": "payload",
+ "tot": "msg"
+ }
+ ],
+ "action": "",
+ "property": "",
+ "from": "",
+ "to": "",
+ "reg": false,
+ "x": 1036.5,
+ "y": 450,
+ "wires": [["d02e53cdfb565da6"]]
+ },
+ {
+ "id": "33dd43e3c05f826c",
+ "type": "geofence",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "geofence",
+ "mode": "circle",
+ "inside": "true",
+ "rad": 69174.91569647488,
+ "points": [],
+ "centre": {
+ "latitude": 40.16287050252407,
+ "longitude": -86.60385131835938
+ },
+ "floor": "",
+ "ceiling": "",
+ "worldmap": true,
+ "outputs": 2,
+ "x": 1202.5,
+ "y": 595,
+ "wires": [[], ["4d01eb8f1b31f039"]]
+ },
+ {
+ "id": "d02e53cdfb565da6",
+ "type": "function",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "trigger function to send a mapping point",
+ "func": "let lat = parseFloat(flow.get(\"latitude\"));\nlet lon = parseFloat(flow.get(\"longitude\"));\nlat=lat * 0.0000001;\nlon=lon * 0.0000001;\nlet name = flow.get(\"from\")\n\nmsg={\"payload\":{\"name\":name,\n \"lat\":lat,\n \"lon\":lon,\n \"action\":\"send\",\n \"icon\": \"car\",\n \"label\":name\n }}\n\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "libs": [],
+ "x": 1181.5,
+ "y": 520,
+ "wires": [["33dd43e3c05f826c", "4d01eb8f1b31f039"]]
+ },
+ {
+ "id": "4d01eb8f1b31f039",
+ "type": "worldmap",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "",
+ "lat": "40",
+ "lon": "-86",
+ "zoom": "7",
+ "layer": "OSMG",
+ "cluster": "",
+ "maxage": "",
+ "usermenu": "show",
+ "layers": "show",
+ "panit": "false",
+ "panlock": "false",
+ "zoomlock": "false",
+ "hiderightclick": "false",
+ "coords": "none",
+ "showgrid": "false",
+ "showruler": "false",
+ "allowFileDrop": "false",
+ "path": "/worldmap",
+ "overlist": "DR,CO,RA,DN,HM",
+ "maplist": "OSMG,OSMC,EsriC,EsriS,EsriT,EsriDG,UKOS",
+ "mapname": "",
+ "mapurl": "",
+ "mapopt": "",
+ "mapwms": false,
+ "x": 1206.5,
+ "y": 675,
+ "wires": []
+ },
+ {
+ "id": "1ed6f96c8214d7b3",
+ "type": "decode",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "decode Position Protobuf",
+ "protofile": "dbab6472b07929a0",
+ "protoType": "Position",
+ "x": 667.5,
+ "y": 548,
+ "wires": [["db1933ba36503bd9", "dad9f487318f21d9"]]
+ },
+ {
+ "id": "db1933ba36503bd9",
+ "type": "debug",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "Position decoded",
+ "active": false,
+ "tosidebar": true,
+ "console": false,
+ "tostatus": false,
+ "complete": "true",
+ "targetType": "full",
+ "statusVal": "",
+ "statusType": "auto",
+ "x": 673.5,
+ "y": 607,
+ "wires": []
+ },
+ {
+ "id": "dad9f487318f21d9",
+ "type": "function",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "Split",
+ "func": "var lat = { payload: msg.payload.latitudeI };\nvar lon = { payload: msg.payload.longitudeI };\nvar alt = { payload: msg.payload.altitude };\nvar tm = { payload: msg.payload.time };\n\nreturn [lat,lon,alt,tm];",
+ "outputs": 4,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "libs": [],
+ "x": 875.5,
+ "y": 549,
+ "wires": [
+ ["1ced0be28eeef0d3", "8bb97f802662976c"],
+ ["313fd3cfe6d91850", "c8e135f3e542bb1b"],
+ ["602fb2020680280c"],
+ ["ed424ae3d45dd2ac"]
+ ]
+ },
+ {
+ "id": "8bb97f802662976c",
+ "type": "debug",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "lat",
+ "active": true,
+ "tosidebar": true,
+ "console": false,
+ "tostatus": false,
+ "complete": "payload",
+ "targetType": "msg",
+ "statusVal": "",
+ "statusType": "auto",
+ "x": 1017.5,
+ "y": 583,
+ "wires": []
+ },
+ {
+ "id": "c8e135f3e542bb1b",
+ "type": "debug",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "lon",
+ "active": true,
+ "tosidebar": true,
+ "console": false,
+ "tostatus": false,
+ "complete": "payload",
+ "targetType": "msg",
+ "statusVal": "",
+ "statusType": "auto",
+ "x": 1018.5,
+ "y": 618,
+ "wires": []
+ },
+ {
+ "id": "602fb2020680280c",
+ "type": "debug",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "alt",
+ "active": true,
+ "tosidebar": true,
+ "console": false,
+ "tostatus": false,
+ "complete": "payload",
+ "targetType": "msg",
+ "statusVal": "",
+ "statusType": "auto",
+ "x": 1017.5,
+ "y": 654,
+ "wires": []
+ },
+ {
+ "id": "ed424ae3d45dd2ac",
+ "type": "debug",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "time",
+ "active": true,
+ "tosidebar": true,
+ "console": false,
+ "tostatus": false,
+ "complete": "payload",
+ "targetType": "msg",
+ "statusVal": "",
+ "statusType": "auto",
+ "x": 1018.5,
+ "y": 688,
+ "wires": []
+ },
+ {
+ "id": "6f592d47b6a2eac4",
+ "type": "function",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "Split Decoded 1",
+ "func": "var channelId = { payload: msg.payload.channelId};\nvar gatewayId = { payload: msg.payload.gatewayId};\nvar portnum = { payload: msg.payload.packet.decoded.portnum};\nvar fr= {payload: \"!\" + msg.payload.packet.from.toString(16)};\nvar to = {payload:\"!\"+ msg.payload.packet.to.toString(16)};\n\nreturn [channelId, gatewayId, portnum, fr, to ];",
+ "outputs": 5,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "libs": [],
+ "x": 577.5,
+ "y": 294,
+ "wires": [
+ ["c6afbb9f1665b162"],
+ ["607ef387d5701985", "8abb1bb458af2c4f"],
+ ["61995c9f8e8266b3"],
+ ["fd881fac22422773", "a389f9875da672ec"],
+ ["cf066ad415df30ae"]
+ ]
+ },
+ {
+ "id": "fd881fac22422773",
+ "type": "debug",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "from",
+ "active": true,
+ "tosidebar": true,
+ "console": false,
+ "tostatus": false,
+ "complete": "payload",
+ "targetType": "msg",
+ "statusVal": "",
+ "statusType": "auto",
+ "x": 772.5,
+ "y": 365,
+ "wires": []
+ },
+ {
+ "id": "cf066ad415df30ae",
+ "type": "debug",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "to",
+ "active": false,
+ "tosidebar": true,
+ "console": false,
+ "tostatus": false,
+ "complete": "payload",
+ "targetType": "msg",
+ "statusVal": "",
+ "statusType": "auto",
+ "x": 771.5,
+ "y": 399,
+ "wires": []
+ },
+ {
+ "id": "a389f9875da672ec",
+ "type": "change",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "set flow.from",
+ "rules": [
+ { "t": "set", "p": "from", "pt": "flow", "to": "payload", "tot": "msg" }
+ ],
+ "action": "",
+ "property": "",
+ "from": "",
+ "to": "",
+ "reg": false,
+ "x": 1012.5,
+ "y": 364,
+ "wires": [[]]
+ },
+ {
+ "id": "a0d4288141f6a629",
+ "type": "protobuf-file",
+ "protopath": "E:\\Meshtastic-protobufs-master\\mqtt.proto",
+ "watchFile": true,
+ "keepCase": false
+ },
+ {
+ "id": "37cadac381653b1e",
+ "type": "mqtt-broker",
+ "name": "",
+ "broker": "192.168.2.45",
+ "port": "1883",
+ "clientid": "",
+ "autoConnect": true,
+ "usetls": false,
+ "protocolVersion": "4",
+ "keepalive": "60",
+ "cleansession": true,
+ "birthTopic": "",
+ "birthQos": "0",
+ "birthPayload": "",
+ "birthMsg": {},
+ "closeTopic": "",
+ "closeQos": "0",
+ "closePayload": "",
+ "closeMsg": {},
+ "willTopic": "",
+ "willQos": "0",
+ "willPayload": "",
+ "willMsg": {},
+ "userProps": "",
+ "sessionExpiry": ""
+ },
+ {
+ "id": "dbab6472b07929a0",
+ "type": "protobuf-file",
+ "protopath": "E:\\Meshtastic-protobufs-master\\mesh.proto",
+ "watchFile": true,
+ "keepCase": false
+ }
+]
+```
+
(documents/mqtt/Flow.txt)
Node-red can rapidly (minutes vs days) put together some pretty impressive output when paired with meshtastic. Here is the output of that flow geofencing and mapping via mqtt data.
@@ -284,23 +841,331 @@ Node-red can rapidly (minutes vs days) put together some pretty impressive outpu
Advanced use, such as encoding Position and sending it to a device via MQTT without using JSON can get a little complicated. An example of how it can be done is below.
[](/documents/mqtt/EncodingPosition.jpg)
The flow is:
- ```
-[{"id":"32ca608d9e7c5236","type":"inject","z":"23dbb1ee.bc2e8e","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":96.5,"y":1952,"wires":[["2b536512e8c7aef2"]]},{"id":"20bbd2d1408b8dc5","type":"change","z":"23dbb1ee.bc2e8e","name":"","rules":[{"t":"set","p":"channelId_outbound","pt":"flow","to":"LongFast","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":772,"y":2027,"wires":[[]]},{"id":"c6cb373157be01d6","type":"change","z":"23dbb1ee.bc2e8e","name":"","rules":[{"t":"set","p":"gatewayId_outbound","pt":"flow","to":"\"!55c7312c\"","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":772,"y":2066,"wires":[[]]},{"id":"24199ec7eaf89c1a","type":"change","z":"23dbb1ee.bc2e8e","name":"","rules":[{"t":"set","p":"portnum_outbound","pt":"flow","to":"3","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":774,"y":2106,"wires":[[]]},{"id":"de38ad5ef343623a","type":"change","z":"23dbb1ee.bc2e8e","name":"","rules":[{"t":"set","p":"from_outbound","pt":"flow","to":"1439117612","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":781,"y":2146,"wires":[[]]},{"id":"d435e8abe0852f93","type":"change","z":"23dbb1ee.bc2e8e","name":"","rules":[{"t":"set","p":"to_outbound","pt":"flow","to":"4294967295","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":790,"y":2188,"wires":[[]]},{"id":"1f8d172708898860","type":"function","z":"23dbb1ee.bc2e8e","name":"Assemble Position protobuf","func":"msg.protobufType=null;\nmsg.payload =\n{\n \"packet\": {\n \"from\": flow.get(\"from_outbound\"),\n \"to\": flow.get(\"to_outbound\"), \n \"decoded\":{\n //how ENUMS are handled here\n //portnum is decoded as string but encoded as number\n //in the encode/decode node-red nodes based on protobuf.js\n \"portnum\": flow.get(\"portnum_outbound\"),\n \"payload\": msg.payload \n } \n },\n\n \"channelId\": flow.get(\"channelId_outbound\"),\n \"gatewayId\": flow.get(\"gatewayId_outbound\"),\n};\nreturn msg;\n//info on how to get json data into protobuf \"bytes\" field\n//https://github.com/protobufjs/protobuf.js/wiki/Changes-in-ProtoBuf.js-3.8","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1086,"y":2019,"wires":[["b8ccf1cfe8bf40a3"]]},{"id":"b8ccf1cfe8bf40a3","type":"encode","z":"23dbb1ee.bc2e8e","name":"","protofile":"a0d4288141f6a629","protoType":"ServiceEnvelope","x":1287,"y":2020,"wires":[["dbc78f035c9c2b56","a002c148f3a06bac"]]},{"id":"03a7e69ca6d471fe","type":"debug","z":"23dbb1ee.bc2e8e","name":"show hex string","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1319,"y":2180,"wires":[]},{"id":"dbc78f035c9c2b56","type":"function","z":"23dbb1ee.bc2e8e","name":"dump payload as hex string","func":"var hex=Buffer.from(msg.payload,\"hex\");\nmsg.payload=hex.toString(\"hex\");\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1096,"y":2178,"wires":[["03a7e69ca6d471fe"]]},{"id":"2b536512e8c7aef2","type":"function","z":"23dbb1ee.bc2e8e","name":"Inject lat lon alt","func":"msg.payload={\n \"latitudeI\": 399600000,\n \"longitudeI\": -862600000,\n \"altitude\": 100\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":277.5,"y":1953,"wires":[["9443a9a980e54c75"]]},{"id":"9443a9a980e54c75","type":"encode","z":"23dbb1ee.bc2e8e","name":"encode Position as protobuf","protofile":"dbab6472b07929a0","protoType":"Position","x":506,"y":1953,"wires":[["5c36d3a7f4dca14e"]]},{"id":"5c36d3a7f4dca14e","type":"change","z":"23dbb1ee.bc2e8e","name":"","rules":[{"t":"set","p":"nested_outbound","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":776,"y":1952,"wires":[["20bbd2d1408b8dc5","c6cb373157be01d6","24199ec7eaf89c1a","de38ad5ef343623a","d435e8abe0852f93","04d0c4a5f3485c6f"]]},{"id":"04d0c4a5f3485c6f","type":"function","z":"23dbb1ee.bc2e8e","name":"dump payload as base64 string","func":"var hex=Buffer.from(msg.payload,\"base64\");\nmsg.payload=hex.toString(\"base64\");\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1082,"y":1952,"wires":[["1f8d172708898860"]]},{"id":"a002c148f3a06bac","type":"decode","z":"23dbb1ee.bc2e8e","name":"test decode Protobuf","protofile":"a0d4288141f6a629","protoType":"ServiceEnvelope","x":1249,"y":1860,"wires":[["4b6fc79398d05782"]]},{"id":"4b6fc79398d05782","type":"debug","z":"23dbb1ee.bc2e8e","name":"test entire payload","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1458,"y":1859,"wires":[]},{"id":"a0d4288141f6a629","type":"protobuf-file","protopath":"E:\\Meshtastic-protobufs-master\\mqtt.proto","watchFile":true,"keepCase":false},{"id":"dbab6472b07929a0","type":"protobuf-file","protopath":"E:\\Meshtastic-protobufs-master\\mesh.proto","watchFile":true,"keepCase":false}]
- ```
+
+```json
+[
+ {
+ "id": "32ca608d9e7c5236",
+ "type": "inject",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "",
+ "props": [{ "p": "payload" }, { "p": "topic", "vt": "str" }],
+ "repeat": "",
+ "crontab": "",
+ "once": false,
+ "onceDelay": 0.1,
+ "topic": "",
+ "payload": "",
+ "payloadType": "date",
+ "x": 96.5,
+ "y": 1952,
+ "wires": [["2b536512e8c7aef2"]]
+ },
+ {
+ "id": "20bbd2d1408b8dc5",
+ "type": "change",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "",
+ "rules": [
+ {
+ "t": "set",
+ "p": "channelId_outbound",
+ "pt": "flow",
+ "to": "LongFast",
+ "tot": "str"
+ }
+ ],
+ "action": "",
+ "property": "",
+ "from": "",
+ "to": "",
+ "reg": false,
+ "x": 772,
+ "y": 2027,
+ "wires": [[]]
+ },
+ {
+ "id": "c6cb373157be01d6",
+ "type": "change",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "",
+ "rules": [
+ {
+ "t": "set",
+ "p": "gatewayId_outbound",
+ "pt": "flow",
+ "to": "\"!55c7312c\"",
+ "tot": "str"
+ }
+ ],
+ "action": "",
+ "property": "",
+ "from": "",
+ "to": "",
+ "reg": false,
+ "x": 772,
+ "y": 2066,
+ "wires": [[]]
+ },
+ {
+ "id": "24199ec7eaf89c1a",
+ "type": "change",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "",
+ "rules": [
+ {
+ "t": "set",
+ "p": "portnum_outbound",
+ "pt": "flow",
+ "to": "3",
+ "tot": "num"
+ }
+ ],
+ "action": "",
+ "property": "",
+ "from": "",
+ "to": "",
+ "reg": false,
+ "x": 774,
+ "y": 2106,
+ "wires": [[]]
+ },
+ {
+ "id": "de38ad5ef343623a",
+ "type": "change",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "",
+ "rules": [
+ {
+ "t": "set",
+ "p": "from_outbound",
+ "pt": "flow",
+ "to": "1439117612",
+ "tot": "num"
+ }
+ ],
+ "action": "",
+ "property": "",
+ "from": "",
+ "to": "",
+ "reg": false,
+ "x": 781,
+ "y": 2146,
+ "wires": [[]]
+ },
+ {
+ "id": "d435e8abe0852f93",
+ "type": "change",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "",
+ "rules": [
+ {
+ "t": "set",
+ "p": "to_outbound",
+ "pt": "flow",
+ "to": "4294967295",
+ "tot": "num"
+ }
+ ],
+ "action": "",
+ "property": "",
+ "from": "",
+ "to": "",
+ "reg": false,
+ "x": 790,
+ "y": 2188,
+ "wires": [[]]
+ },
+ {
+ "id": "1f8d172708898860",
+ "type": "function",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "Assemble Position protobuf",
+ "func": "msg.protobufType=null;\nmsg.payload =\n{\n \"packet\": {\n \"from\": flow.get(\"from_outbound\"),\n \"to\": flow.get(\"to_outbound\"), \n \"decoded\":{\n //how ENUMS are handled here\n //portnum is decoded as string but encoded as number\n //in the encode/decode node-red nodes based on protobuf.js\n \"portnum\": flow.get(\"portnum_outbound\"),\n \"payload\": msg.payload \n } \n },\n\n \"channelId\": flow.get(\"channelId_outbound\"),\n \"gatewayId\": flow.get(\"gatewayId_outbound\"),\n};\nreturn msg;\n//info on how to get json data into protobuf \"bytes\" field\n//https://github.com/protobufjs/protobuf.js/wiki/Changes-in-ProtoBuf.js-3.8",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "libs": [],
+ "x": 1086,
+ "y": 2019,
+ "wires": [["b8ccf1cfe8bf40a3"]]
+ },
+ {
+ "id": "b8ccf1cfe8bf40a3",
+ "type": "encode",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "",
+ "protofile": "a0d4288141f6a629",
+ "protoType": "ServiceEnvelope",
+ "x": 1287,
+ "y": 2020,
+ "wires": [["dbc78f035c9c2b56", "a002c148f3a06bac"]]
+ },
+ {
+ "id": "03a7e69ca6d471fe",
+ "type": "debug",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "show hex string",
+ "active": true,
+ "tosidebar": true,
+ "console": false,
+ "tostatus": false,
+ "complete": "true",
+ "targetType": "full",
+ "statusVal": "",
+ "statusType": "auto",
+ "x": 1319,
+ "y": 2180,
+ "wires": []
+ },
+ {
+ "id": "dbc78f035c9c2b56",
+ "type": "function",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "dump payload as hex string",
+ "func": "var hex=Buffer.from(msg.payload,\"hex\");\nmsg.payload=hex.toString(\"hex\");\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "libs": [],
+ "x": 1096,
+ "y": 2178,
+ "wires": [["03a7e69ca6d471fe"]]
+ },
+ {
+ "id": "2b536512e8c7aef2",
+ "type": "function",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "Inject lat lon alt",
+ "func": "msg.payload={\n \"latitudeI\": 399600000,\n \"longitudeI\": -862600000,\n \"altitude\": 100\n}\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "libs": [],
+ "x": 277.5,
+ "y": 1953,
+ "wires": [["9443a9a980e54c75"]]
+ },
+ {
+ "id": "9443a9a980e54c75",
+ "type": "encode",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "encode Position as protobuf",
+ "protofile": "dbab6472b07929a0",
+ "protoType": "Position",
+ "x": 506,
+ "y": 1953,
+ "wires": [["5c36d3a7f4dca14e"]]
+ },
+ {
+ "id": "5c36d3a7f4dca14e",
+ "type": "change",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "",
+ "rules": [
+ {
+ "t": "set",
+ "p": "nested_outbound",
+ "pt": "flow",
+ "to": "payload",
+ "tot": "msg"
+ }
+ ],
+ "action": "",
+ "property": "",
+ "from": "",
+ "to": "",
+ "reg": false,
+ "x": 776,
+ "y": 1952,
+ "wires": [
+ [
+ "20bbd2d1408b8dc5",
+ "c6cb373157be01d6",
+ "24199ec7eaf89c1a",
+ "de38ad5ef343623a",
+ "d435e8abe0852f93",
+ "04d0c4a5f3485c6f"
+ ]
+ ]
+ },
+ {
+ "id": "04d0c4a5f3485c6f",
+ "type": "function",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "dump payload as base64 string",
+ "func": "var hex=Buffer.from(msg.payload,\"base64\");\nmsg.payload=hex.toString(\"base64\");\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "libs": [],
+ "x": 1082,
+ "y": 1952,
+ "wires": [["1f8d172708898860"]]
+ },
+ {
+ "id": "a002c148f3a06bac",
+ "type": "decode",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "test decode Protobuf",
+ "protofile": "a0d4288141f6a629",
+ "protoType": "ServiceEnvelope",
+ "x": 1249,
+ "y": 1860,
+ "wires": [["4b6fc79398d05782"]]
+ },
+ {
+ "id": "4b6fc79398d05782",
+ "type": "debug",
+ "z": "23dbb1ee.bc2e8e",
+ "name": "test entire payload",
+ "active": true,
+ "tosidebar": true,
+ "console": false,
+ "tostatus": false,
+ "complete": "payload",
+ "targetType": "msg",
+ "statusVal": "",
+ "statusType": "auto",
+ "x": 1458,
+ "y": 1859,
+ "wires": []
+ },
+ {
+ "id": "a0d4288141f6a629",
+ "type": "protobuf-file",
+ "protopath": "E:\\Meshtastic-protobufs-master\\mqtt.proto",
+ "watchFile": true,
+ "keepCase": false
+ },
+ {
+ "id": "dbab6472b07929a0",
+ "type": "protobuf-file",
+ "protopath": "E:\\Meshtastic-protobufs-master\\mesh.proto",
+ "watchFile": true,
+ "keepCase": false
+ }
+]
+```
Sending a position to a device for broadcast to the mesh is much easier with JSON. This introduces a new MQTT Service Envelope type: "sendposition". A valid MQTT envelope and message to broadcast lat, lon, altitude looks like this.
-```json
-{
- "sender": "someSender",
- "type": "sendposition",
- "payload": {
- "latitude_i": 399600000,
- "longitude_i": -862600000,
- "altitude": 100,
- "time": 1670201543
- }
-}
- ```
+```json
+{
+ "sender": "someSender",
+ "type": "sendposition",
+ "payload": {
+ "latitude_i": 399600000,
+ "longitude_i": -862600000,
+ "altitude": 100,
+ "time": 1670201543
+ }
+}
+```
+
An example of doing this in node-red:
[](/documents/mqtt/PosJSON.jpg)
diff --git a/docs/software/python-cli/index.mdx b/docs/software/python-cli/index.mdx
index e54f3450..23fe0c95 100644
--- a/docs/software/python-cli/index.mdx
+++ b/docs/software/python-cli/index.mdx
@@ -1,13 +1,11 @@
---
id: python-cli
-title: Meshtastic Command Line Interface
+title: Meshtastic Python CLI Guide
slug: /software/python/cli
sidebar_label: Python CLI
sidebar_position: 4
---
-# Meshtastic Python CLI Guide
-
The python pip package installs a "meshtastic" command line executable, which displays packets sent over the network as JSON and lets you see serial debugging information from the meshtastic devices. This command is not run inside of python, you run it from your operating system shell prompt directly. If when you type "meshtastic" it doesn't find the command and you are using Windows: Check that the python "scripts" directory is in your path.
## Optional Arguments
@@ -16,9 +14,7 @@ The python pip package installs a "meshtastic" command line executable, which di
Shows a help message that describes the arguments.
-**Usage**
-
-```shell
+```shell title="Usage"
meshtastic -h
```
@@ -26,9 +22,7 @@ meshtastic -h
The port the Meshtastic device is connected to, i.e. `/dev/ttyUSB0`, `/dev/cu.wchusbserial`, `COM4` etc. if unspecified, meshtastic will try to find it. Important to use when multiple devices are connected to ensure you call the command for the correct device.
-**Usage**
-
-```shell
+```shell title="Usage"
meshtastic --port /dev/ttyUSB0 --info
meshtastic --port COM4 --info
```
@@ -37,9 +31,7 @@ meshtastic --port COM4 --info
The hostname/ipaddr of the device to connect to (over TCP).
-**Usage**
-
-```shell
+```shell title="Usage"
meshtastic --host HOST
```
@@ -47,9 +39,7 @@ meshtastic --host HOST
Logs device serial output to either 'stdout', 'none' or a filename to append to.
-**Usage**
-
-```shell
+```shell title="Usage"
meshtastic --port /dev/ttyUSB0 --seriallog
```
@@ -57,9 +47,7 @@ meshtastic --port /dev/ttyUSB0 --seriallog
Read and display the radio config information.
-**Usage**
-
-```shell
+```shell title="Usage"
meshtastic --port /dev/ttyUSB0 --info
```
@@ -67,9 +55,7 @@ meshtastic --port /dev/ttyUSB0 --info
Prints a node list in a pretty, formatted table.
-**Usage**
-
-```shell
+```shell title="Usage"
meshtastic --nodes
```
@@ -77,9 +63,7 @@ meshtastic --nodes
Displays the QR code that corresponds to the current channel.
-**Usage**
-
-```shell
+```shell title="Usage"
meshtastic --qr
```
@@ -87,9 +71,7 @@ meshtastic --qr
Gets a preferences field.
-**Usage**
-
-```shell
+```shell title="Usage"
meshtastic --get lora.region
```
@@ -99,9 +81,7 @@ Sets a preferences field.
Configuration values are described in this section: [Configuration Sections](https://meshtastic.org/docs/settings/config)
-**Usage**
-
-```shell
+```shell title="Usage"
meshtastic --set lora.region Unset
```
@@ -109,9 +89,7 @@ meshtastic --set lora.region Unset
Set a channel URL.
-**Usage**
-
-```shell
+```shell title="Usage"
meshtastic --seturl https://www.meshtastic.org/c/GAMiIE67C6zsNmlWQ-KE1tKt0fRKFciHka-DShI6G7ElvGOiKgZzaGFyZWQ=
```
@@ -119,9 +97,7 @@ meshtastic --seturl https://www.meshtastic.org/c/GAMiIE67C6zsNmlWQ-KE1tKt0fRKFci
Set the specified channel index
-**Usage**
-
-```shell
+```shell title="Usage"
meshtastic --ch-index 1 --ch-disable
```
@@ -129,9 +105,7 @@ meshtastic --ch-index 1 --ch-disable
Add a secondary channel, you must specify a channel name.
-**Usage**
-
-```shell
+```shell title="Usage"
meshtastic --ch-add testing-channel
```
@@ -139,9 +113,7 @@ meshtastic --ch-add testing-channel
Delete the ch-index channel.
-**Usage**
-
-```shell
+```shell title="Usage"
meshtastic --ch-index 1 --ch-del
```
@@ -149,9 +121,7 @@ meshtastic --ch-index 1 --ch-del
Enable the specified channel.
-**Usage**
-
-```shell
+```shell title="Usage"
meshtastic --ch-index 1 --ch-enable
```
@@ -159,9 +129,7 @@ meshtastic --ch-index 1 --ch-enable
Disable the specified channel.
-**Usage**
-
-```shell
+```shell title="Usage"
meshtastic --ch-index 1 --ch-disable
```
@@ -169,9 +137,7 @@ meshtastic --ch-index 1 --ch-disable
Set a channel parameter.
-**Usage**
-
-```shell
+```shell title="Usage"
meshtastic --ch-set id 1234 --ch-index 0
```
@@ -179,9 +145,7 @@ meshtastic --ch-set id 1234 --ch-index 0
Change to the standard long-range (but slow) channel.
-**Usage**
-
-```shell
+```shell title="Usage"
meshtastic --ch-longslow
```
@@ -189,9 +153,7 @@ meshtastic --ch-longslow
Change to the standard fast (but short range) channel.
-**Usage**
-
-```shell
+```shell title="Usage"
meshtastic --ch-shortfast
```
@@ -199,9 +161,7 @@ meshtastic --ch-shortfast
Set device owner name.
-**Usage**
-
-```shell
+```shell title="Usage"
meshtastic --dest '!28979058' --set-owner "MeshyJohn"
```
@@ -209,9 +169,7 @@ meshtastic --dest '!28979058' --set-owner "MeshyJohn"
Set licensed Ham ID and turn off encryption.
-**Usage**
-
-```shell
+```shell title="Usage"
meshtastic --set-ham KI1345
```
@@ -219,9 +177,7 @@ meshtastic --set-ham KI1345
The destination node id for any sent commands
-**Usage**
-
-```shell
+```shell title="Usage"
meshtastic --dest '!28979058' --set-owner "MeshyJohn"
```
@@ -229,9 +185,7 @@ meshtastic --dest '!28979058' --set-owner "MeshyJohn"
Send a text message. Can specify a channel index ('--ch-index') or a destination ('--dest')
-**Usage**
-
-```shell
+```shell title="Usage"
meshtastic --sendtext "Hello Mesh!"
```
@@ -239,9 +193,7 @@ meshtastic --sendtext "Hello Mesh!"
Send a ping message (which requests a reply).
-**Usage**
-
-```shell
+```shell title="Usage"
meshtastic --sendping
```
@@ -249,9 +201,7 @@ meshtastic --sendping
Tell the destination node to reboot.
-**Usage**
-
-```shell
+```shell title="Usage"
meshtastic --dest '!28979058' --reboot
```
@@ -259,9 +209,7 @@ meshtastic --dest '!28979058' --reboot
Reply to received messages.
-**Usage**
-
-```shell
+```shell title="Usage"
meshtastic --reply
```
@@ -269,9 +217,7 @@ meshtastic --reply
Set a particular GPIO # to 1 or 0.
-**Usage**
-
-```shell
+```shell title="Usage"
meshtastic --port /dev/ttyUSB0 --gpio-wrb 4 1 --dest '!28979058'
```
@@ -279,9 +225,7 @@ meshtastic --port /dev/ttyUSB0 --gpio-wrb 4 1 --dest '!28979058'
Read from a GPIO mask.
-**Usage**
-
-```shell
+```shell title="Usage"
meshtastic --port /dev/ttyUSB0 --gpio-rd 0x10 --dest '!28979058'
```
@@ -289,9 +233,7 @@ meshtastic --port /dev/ttyUSB0 --gpio-rd 0x10 --dest '!28979058'
Start watching a GPIO mask for changes.
-**Usage**
-
-```shell
+```shell title="Usage"
meshtastic --port /dev/ttyUSB0 --gpio-watch 0x10 --dest '!28979058'
```
@@ -299,9 +241,7 @@ meshtastic --port /dev/ttyUSB0 --gpio-watch 0x10 --dest '!28979058'
Suppress sending the current time to the mesh.
-**Usage**
-
-```shell
+```shell title="Usage"
meshtastic --port /dev/ttyUSB0 --no-time
```
@@ -309,9 +249,7 @@ meshtastic --port /dev/ttyUSB0 --no-time
Set device altitude (allows use without GPS).
-**Usage**
-
-```shell
+```shell title="Usage"
meshtastic --setalt 120
```
@@ -319,9 +257,7 @@ meshtastic --setalt 120
Set device latitude (allows use without GPS).
-**Usage**
-
-```shell
+```shell title="Usage"
meshtastic --setlat 25.2
```
@@ -329,9 +265,7 @@ meshtastic --setlat 25.2
Set device longitude (allows use without GPS).
-**Usage**
-
-```shell
+```shell title="Usage"
meshtastic --setlon -16.8
```
@@ -339,9 +273,7 @@ meshtastic --setlon -16.8
Show API library debug log messages.
-**Usage**
-
-```shell
+```shell title="Usage"
meshtastic --debug --info
```
@@ -349,9 +281,7 @@ meshtastic --debug --info
Run stress test against all connected Meshtastic devices.
-**Usage**
-
-```shell
+```shell title="Usage"
meshtastic --test
```
@@ -359,9 +289,7 @@ meshtastic --test
BLE mac address to connect to (BLE is not yet supported for this tool).
-**Usage**
-
-```shell
+```shell title="Usage"
meshtastic --ble "83:38:92:32:37:48"
```
@@ -369,9 +297,7 @@ meshtastic --ble "83:38:92:32:37:48"
Don't start the API, just function as a dumb serial terminal. Probably not very helpful from the command line. Used more for testing/internal needs.
-**Usage**
-
-```shell
+```shell title="Usage"
meshtastic --noproto
```
@@ -379,9 +305,7 @@ meshtastic --noproto
Show program's version number and exit.
-**Usage**
-
-```shell
+```shell title="Usage"
meshtastic --version
```
@@ -389,9 +313,7 @@ meshtastic --version
Configure all of the radio configuration from a yaml file.
-**Usage**
-
-```shell
+```shell title="Usage"
meshtastic --configure example_config.yaml
```
@@ -401,15 +323,11 @@ Export the configuration of the device. (to be consumed by the '--configure' com
To create to a file with the connected device's configuration, this command's output must be piped to a yaml file
-**Usage**
-
-```shell
+```shell title="Usage"
meshtastic --export-config > example_config.yaml
```
-**Usage**
-
-```shell
+```title="Usage"shell
meshtastic --export-config
```
@@ -417,9 +335,7 @@ meshtastic --export-config
Print out info that would be helpful supporting any issues.
-**Usage**
-
-```shell
+```shell title="Usage"
meshtastic --support
```
diff --git a/docs/software/python-cli/installation.mdx b/docs/software/python-cli/installation.mdx
index 6a47a018..51aaa98d 100644
--- a/docs/software/python-cli/installation.mdx
+++ b/docs/software/python-cli/installation.mdx
@@ -6,8 +6,8 @@ slug: /software/python/cli/installation
sidebar_position: 1
---
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
This library provides a command line interface (CLI) for Meshtastic nodes and provides an easy API for sending and receiving messages over mesh radios, in addition to changing user settings. Using the command line is currently the most powerful. Events are delivered using a publish-subscribe model, and you can subscribe to only the message types you are interested in.
@@ -177,19 +177,19 @@ Wifi connection is currently under development and may not be working properly j
- Install [Termux](https://f-droid.org/en/packages/com.termux) from the F-Droid app store (Google play does not currently support the latest builds)
- Load Termux and update the package list
- ```
+ ```shell
pkg update
```
- Upgrade the installed packages
- ```
+ ```shell
pkg upgrade
```
- Install python
- ```
+ ```shell
pkg install python
```
- Upgrade pip and installed meshtastic and some of its dependencies
- ```
+ ```shell
pip install --upgrade pip pygatt pytap2 wheel mesthtastic
```
@@ -204,10 +204,8 @@ Be aware that the Meshtastic CLI is not able to control the nodes over USB throu
You may need to close and re-open the CLI. The path variables may or may not update for the current session when installing.
:::
-
## Standalone
-
There are standalone executable files for Mac, Windows and Ubuntu. A single file is all you need to run the command line interface (CLI) Meshtastic tool. There is a zip file per operating system. To use, see the operating system specific notes below:
They can be found on the [Releases](https://github.com/meshtastic/Meshtastic-python/releases) page.
@@ -226,13 +224,13 @@ values={[
- Run the following command to make the file executable and rename it 'meshtastic':
-```
+```shell
chmod +x meshtastic_ubuntu && mv meshtastic_ubuntu meshtastic
```
- To run the cli:
-```
+```shell
./meshtastic
```
@@ -247,13 +245,13 @@ Copy (or move) this binary somewhere in your path.
- Run the following command to make the file executable and to rename it 'meshtastic':
-```
+```shell
chmod +x meshtastic_mac && mv meshtastic_mac meshtastic
```
- Try to run it:
-```
+```shell
./meshtastic
```
@@ -266,7 +264,7 @@ You may get a dialog that says:
- Try to run it again:
-```
+```shell
./meshtastic
```
@@ -278,7 +276,7 @@ Click "Open".
- Now when you want to run it, you can simply run:
-```
+```shell
./meshtastic
```
@@ -295,10 +293,9 @@ Copy (or move) this binary somewhere in your path.
- To run, open a windows command prompt, navigate to the location of the executable and run:
-```
+```shell
meshtastic.exe
```
-
diff --git a/docs/software/python-cli/usage.mdx b/docs/software/python-cli/usage.mdx
index 56eff6bf..76d350da 100644
--- a/docs/software/python-cli/usage.mdx
+++ b/docs/software/python-cli/usage.mdx
@@ -46,7 +46,7 @@ meshtastic --set network.wifi_ssid mywifissid --set network.wifi_psk mywifipsw -
```
:::note
-For a full list of preferences which can be set (and their documentation) can be found in the [protobufs](/docs/developers/protobufs/api#radioconfiguserpreferences).
+For a full list of preferences which can be set (and their documentation) can be found in the [protobufs](https://buf.build/meshtastic/protobufs/docs/main:meshtastic#meshtastic.User).
:::
### Changing channel settings
@@ -54,7 +54,7 @@ For a full list of preferences which can be set (and their documentation) can be
The channel settings can also be changed, either by using a standard (shareable) meshtastic URL or you can set particular channel parameter (for advanced users).
:::warning
-Meshtastic encodes the radio channel and PSK in the channel's URL. All nodes must connect to the channel again by using the URL provided after a change in this section by performing the `--info` switch.
+Meshtastic encodes the radio channel and PSK in the channel's URL. All nodes must connect to the channel again by using the URL provided after a change in this section by performing the `--info` switch.
:::
```shell
@@ -93,18 +93,18 @@ Writing modified channels to device
Toggling `set-ham` changes your device settings in the following ways.
-| Setting | `set-ham` Default | Normal Default |
-| :----------------------: | :---------------: | :---------------------------------------: |
-| `IsLicensed` | `true` | See [User Config - IsLicensed](/docs/settings/config/user#is-licensed-ham) |
-| `LongName` | _Your CallSign_ | See [User Config - LongName](/docs/settings/config/user#long-name) |
-| `ShortName` | _Abrv CallSign_ | See [User Config - ShortName](/docs/settings/config/user#short-name) |
-| `PSK` | `""` | See [Channel Settings - PSK](#changing-the-preshared-key) |
+| Setting | `set-ham` Default | Normal Default |
+| :----------: | :---------------: | :------------------------------------------------------------------------: |
+| `IsLicensed` | `true` | See [User Config - IsLicensed](/docs/settings/config/user#is-licensed-ham) |
+| `LongName` | _Your CallSign_ | See [User Config - LongName](/docs/settings/config/user#long-name) |
+| `ShortName` | _Abrv CallSign_ | See [User Config - ShortName](/docs/settings/config/user#short-name) |
+| `PSK` | `""` | See [Channel Settings - PSK](#changing-the-preshared-key) |
-## Changing the preshared key:
+## Changing the preshared key
You can set the channel preshared key to a particular AES128 or AES256 sequence.
-```
+```shell
meshtastic --ch-set psk 0x1a1a1a1a2b2b2b2b1a1a1a1a2b2b2b2b1a1a1a1a2b2b2b2b1a1a1a1a2b2b2b2b --info
```
@@ -130,8 +130,9 @@ This indicates an OS permission problem for access by your user to the USB seria
sudo usermod -a -G dialout
```
-If the adding the user to the dialout group does not work, you can use the following command to find out which group to add your user to.
+If the adding the user to the dialout group does not work, you can use the following command to find out which group to add your user to.
In this example (from Arch Linux) the group was "uucp"
+
```shell
❯ ls -al /dev/ttyACM0
crw-rw---- 1 root uucp 166, 0 Jul 20 21:52 /dev/ttyACM0
diff --git a/docs/software/python-flasher.mdx b/docs/software/python-flasher.mdx
index 76ffdba3..980bb189 100644
--- a/docs/software/python-flasher.mdx
+++ b/docs/software/python-flasher.mdx
@@ -6,9 +6,9 @@ slug: /software/python/flasher
sidebar_position: 5
---
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
-import Link from '@docusaurus/Link';
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
+import Link from "@docusaurus/Link";
:::caution
Make sure not to power the radio on without first attaching the antenna! You could damage the radio chip!
@@ -90,7 +90,6 @@ sudo apt install -y python3 python3-pip python3-venv
-
### Install or Upgrade App
For **Windows**, the [installer](https://github.com/meshtastic/Meshtastic-gui-installer/releases/download/winapp1.0.3/meshtastic-flasher.zip) will manage installing python and flasher updates automatically.
@@ -198,3 +197,16 @@ The following are known limitations:
- Raspberry Pi is not available, since it is arm-based and there are no pre-built libraries for [PySide](https://wiki.qt.io/Qt_for_Python)
- Ubuntu 20.04 is the version used for testing, it may work with other versions.
- See [README](https://github.com/meshtastic/Meshtastic-gui-installer/blob/master/README.md) for more details.
+
+## Connect and Configure Device
+
+After flashing the Meshtastic firmware to the device, you can proceed with the initial configuration.
+
+
- Meshtastic is community driven. Thousands of hours have been donated by volunteers who want to develop this amazing project. Whether you've submitted a pull request or triaged a bug in our Discord/Forum. You've made Meshtastic possible. Thank you for your contributions.
-
-
- We would also like to recognize those who have donated financially to the project. As Meshtastic has grown, we've aquired some ongoing costs to keep the project running. Thank you for your generous donations.
-
-
-
-
Fiscal Sponsors
-
- We have partnered with both the Open Collective and the Open Source Collective to help us with a fiscal management framework and banking needs. They help support over three thousand open source projects including the PHP Foundation, F-Droid, Sonarr, LinuxServer and DarkReader. We are in good hands and good company.
-
-
- As with everything we do here, Open Collective provides a fully transparent framework for our budget and expenses. You can see what we’re bringing in, who is spending money and where that money is going here.
-
-
- In addition to our partnership with Open Collective and Open Source Collective, we have also been approved into the GitHub Sponsors program where we can set fundraising goals with GitHub.
-
-
- All donations made through GitHub will be deposited to our account with the Open Source Collective and managed by the Open Collective. This means we have a single place to monitor and maintain transparency of our finances.
-
-
- If you are able, please contribute to this amazing project.
-
-
-
- Sponsor Meshtastic
-
+ return (
+
+
+
+
Credits
+
+ Meshtastic is community driven. Thousands of hours have been donated
+ by volunteers who want to develop this amazing project. Whether
+ you've submitted a pull request or triaged a bug in our
+ Discord/Forum. You've made Meshtastic possible. Thank you for your
+ contributions.
+
+
+ We would also like to recognize those who have donated financially
+ to the project. As Meshtastic has grown, we've aquired some ongoing
+ costs to keep the project running. Thank you for your generous
+ donations.
+
-
- Open Collective Donations
- {/*Open Collective Donations*/}
-
-
- ))}
+ Open Collective
+ {" "}
+ and the{" "}
+
+ Open Source Collective
+ {" "}
+ to help us with a fiscal management framework and banking needs.
+ They help support over three thousand open source projects including
+ the PHP Foundation, F-Droid, Sonarr, LinuxServer and DarkReader. We
+ are in good hands and good company.
+
+
+ As with everything we do here, Open Collective provides a fully
+ transparent framework for our budget and expenses. You can see what
+ we’re bringing in, who is spending money and where that money is
+ going{" "}
+
+ here
+
+ .
+
+
+ In addition to our partnership with Open Collective and Open Source
+ Collective, we have also been approved into the{" "}
+
+ GitHub Sponsors
+ {" "}
+ program where we can set fundraising goals with GitHub.
+
+
+ All donations made through GitHub will be deposited to our account
+ with the Open Source Collective and managed by the Open Collective.
+ This means we have a single place to monitor and maintain
+ transparency of our finances.
+
+
If you are able, please contribute to this amazing project.
+
+
+ Sponsor Meshtastic
+
+
+
+ Open Collective Donations
+ {/*Open Collective Donations*/}
+
+
- Literally thousands of hours have gone into creating, maintaining, and improving Meshtastic. Without our contributors none of this would be possible. Thank you for donating the time for each and every commit, issue, and pull request.
-
- {/*GitHub Organization Contributors*/}
-
-
- {/*Admin Bios*/}
-
-
+
+
Partnerships
+
+ {partnerLogos.map((logo) => (
+
+
+
+ ))}
+
-
-
- )
-}
+
+
Contributors
+
+ Literally thousands of hours have gone into creating, maintaining,
+ and improving Meshtastic. Without our contributors none of this
+ would be possible. Thank you for donating the time for each and
+ every commit, issue, and pull request.
+
+ {/*GitHub Organization Contributors*/}
+
+
+ {/*Admin Bios*/}
+
+
+
+
+
+ );
+};
export default Credits;
diff --git a/src/pages/d/index.md b/src/pages/d/index.md
index 7dc393ae..c2f4c7ba 100644
--- a/src/pages/d/index.md
+++ b/src/pages/d/index.md
@@ -4,6 +4,4 @@ title: Meshtastic URL
sidebar_label: d
---
-# Error : Something happened
-
-Please go to [Android Usage](/docs/software/android/usage#join-a-channel) for more information.
\ No newline at end of file
+Please go to [Android Usage](/docs/software/android/usage#join-a-channel) for more information.
diff --git a/src/pages/downloads/_components/DownloadCard.tsx b/src/pages/downloads/_components/DownloadCard.tsx
index 46f8442d..6f1c7145 100644
--- a/src/pages/downloads/_components/DownloadCard.tsx
+++ b/src/pages/downloads/_components/DownloadCard.tsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import React from "react";
export interface downloadCardProps {
client: string;
@@ -17,33 +17,33 @@ export const DownloadCard = ({
imgUrl2,
url2,
notes,
- buttonText,
+ buttonText
}: downloadCardProps): JSX.Element => {
return (