Merge branch 'master' into patch-2

This commit is contained in:
rcarteraz 2024-03-01 21:47:59 -07:00 committed by GitHub
commit fc2d12f44a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
51 changed files with 907 additions and 265 deletions

36
.github/workflows/pdf.yml vendored Normal file
View file

@ -0,0 +1,36 @@
name: Generate Documentation PDF
on:
pull_request:
types:
- closed
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Get filename with date and sha
run: |
DATE_TIME=$(date +'%Y-%m-%d_%H-%M')
echo "filename=Meshtastic-Documentation-${DATE_TIME}-${{ github.sha }}.pdf" >> $GITHUB_OUTPUT
id: filename
- name: Install Prince
run: |
curl https://www.princexml.com/download/prince-15.3-linux-generic-x86_64.tar.gz -O
tar zxf prince-15.3-linux-generic-x86_64.tar.gz
cd prince-15.3-linux-generic-x86_64
yes "" | sudo ./install.sh
- name: Build PDF
run: npx docusaurus-prince-pdf -u https://meshtastic.org/docs/about/ --dest ./ --output ./${{ steps.filename.outputs.filename }}
- name: Create request artifacts
if: github.event.pull_request.merged
uses: gavv/pull-request-artifacts@v2.1.0
with:
commit: ${{ (github.event.pull_request_target || github.event.pull_request).head.sha }}
repo-token: ${{ secrets.GITHUB_TOKEN }}
artifacts-token: ${{ secrets.ARTIFACTS_TOKEN }}
artifacts-repo: meshtastic/artifacts
artifacts-branch: docs
artifacts: ./${{ steps.filename.outputs.filename }}

3
.gitignore vendored
View file

@ -6,6 +6,7 @@ build
.vercel
.env
.pnpm-debug.log
static/documents/pdf
# macOS
.DS_Store
@ -25,4 +26,4 @@ gen
!.vscode/*.code-snippets
.history/
*.vsix
*.code-workspace
*.code-workspace

View file

@ -190,38 +190,38 @@ If you use your ham radio license with Meshtastic, consider both the privileges
## Overview
<FaqAccordion rows={Faq.general} slug="general" />
<FaqAccordion rows={Faq.general} />
## Android Client
<FaqAccordion rows={Faq.android} slug="android" />
<FaqAccordion rows={Faq.android} />
## Apple Clients
<FaqAccordion rows={Faq.apple} slug="apple" />
<FaqAccordion rows={Faq.apple} />
## Channels
<FaqAccordion rows={Faq.channels} slug="channels" />
<FaqAccordion rows={Faq.channels} />
## Python CLI
<FaqAccordion rows={Faq.python} slug="python" />
<FaqAccordion rows={Faq.python} />
## Devices
<FaqAccordion rows={Faq.devices} slug="devices" />
<FaqAccordion rows={Faq.devices} />
## Amateur Radio (ham)
Meshtastic can be used by both unlicensed people and licensed HAM operators.
<FaqAccordion rows={Faq.ham} slug="ham" />
<FaqAccordion rows={Faq.ham} />
## Mesh
<FaqAccordion rows={Faq.mesh} slug="mesh" />
<FaqAccordion rows={Faq.mesh} />
## Modules
<FaqAccordion rows={Faq.modules} slug="modules" />
<FaqAccordion rows={Faq.modules} />

View file

@ -17,7 +17,7 @@ Meshtastic is **not** LoRaWAN, Helium or TTN (TheThingsNetwork). Meshtastic uses
Power limits will generally be lifted in the software if `is_licensed` is set to `true`. See [HAM Mode](/docs/faq#amateur-radio-ham) for more information.
:::
## Channel Frequency Calculator
## Frequency Slot Calculator
<FrequencyCalculator />

View file

@ -19,13 +19,15 @@ values={[
<TabItem value="ground">
## Current Ground Record: 254km
#### Ground
##### Current Ground Record: 254km
- **Range:** 254km (158 miles)
- **Record Holders:** _kboxlabs_
- **Source:** [Meshtastic Discourse](https://meshtastic.discourse.group/t/practical-range-test-results/692/137)
<h2 id="modem-settings-254">Modem Settings</h2>
<h5 id="modem-settings-254">Modem Settings</h5>
Default Long_Fast
- **Frequency:** 915MHz
@ -33,13 +35,13 @@ Default Long_Fast
- **Spread Factor:** 11
- **Coding Rate:** 4/8
<h2 id="node-a-254">Node A</h2>
<h5 id="node-a-254">Node A</h5>
- **Device:** [RAK4631 Core](https://meshtastic.org/docs/hardware/devices/rak/core-module) with [RAK 5005-O Base Board](https://meshtastic.org/docs/hardware/devices/rak/base-board)
- **Firmware Version:** 2.1.17
- **Antenna:** 902-928MHz 5.8 dBi Slinkdsco Outdoor
<h2 id="node-b-254">Node B</h2>
<h5 id="node-b-254">Node B</h5>
- **Device:** [RAK4631 Core](https://meshtastic.org/docs/hardware/devices/rak/core-module) with [RAK 19003 Mini Base Board](https://meshtastic.org/docs/hardware/devices/rak/base-board)
- **Firmware Version:** 2.1.18
@ -52,26 +54,26 @@ Default Long_Fast
<img src="/img/records/kboxlabs_map.webp" alt="Geographic Locations" />
## Previous Record 166km
##### Previous Record 166km
- **Range:** 166km (103 miles)
- **Record Holder:** _PuzzledPancake_
- **Source:** [Meshtastic Discourse](https://meshtastic.discourse.group/t/practical-range-test-results/692/44)
<h2 id="modem-settings-166">Modem Settings</h2>
<h5 id="modem-settings-166">Modem Settings</h5>
- **Frequency:** 868MHz
- **Bandwidth:** 125
- **Spread Factor:** 12
- **Coding Rate:** 4/8
<h2 id="node-a-166">Node A</h2>
<h5 id="node-a-166">Node A</h5>
- **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)
<h2 id="node-b-166">Node B</h2>
<h5 id="node-b-166">Node B</h5>
- **Device:** [LILYGO TTGO T-Beam w/ SX1262](/docs/hardware/devices/tbeam)
- **Firmware Version:** 1.2
@ -83,20 +85,22 @@ Default Long_Fast
![Node B](https://canada1.discourse-cdn.com/free1/uploads/meshtastic/optimized/2X/1/1c8bd5fc41f7bab925404b657a9c481882de9313_2_1332x1000.jpeg)
<h2>Resources Used</h2>
<h5>Resources Used</h5>
- http://www.heywhatsthat.com
</TabItem>
<TabItem value="air">
## Current Air Record: 206km
#### Air
##### Current Air Record: 206km
- **Range:** 206km (128 miles)
- **Record Holders:** _StarWatcher, CVR, rook, kboxlabs_
- **Source:** [Meshtastic Discourse](https://meshtastic.discourse.group/t/practical-range-test-results/692/130)
<h2 id="modem-settings-206">Modem Settings</h2>
<h5 id="modem-settings-206">Modem Settings</h5>
Default Long_Fast
- **Frequency:** 915MHz
@ -104,13 +108,13 @@ Default Long_Fast
- **Spread Factor:** 11
- **Coding Rate:** 4/8
<h2 id="node-a-206">Node A</h2>
<h5 id="node-a-206">Node A</h5>
- **Device:** [LILYGO TTGO T-Beam](/docs/hardware/devices/tbeam)
- **Firmware Version:** 2.1.10
- **Antenna:** Stock Antenna
<h2 id="node-b-206">Node B</h2>
<h5 id="node-b-206">Node B</h5>
- **Device:** [LILYGO TTGO T-Beam](/docs/hardware/devices/tbeam)
- **Firmware Version:** 2.1.10 (modified to place GPS in flight mode)

View file

@ -38,5 +38,8 @@ us on [Discord](https://discord.com/invite/ktMAKGBnBs) to add your group.
### Hawaii
- [Hawaii Meshnet](https://www.hawaiimesh.net/)
### Massachusetts
- [Boston Meshnet](https://github.com/Darachnid/Boston-Meshnet)
### Texas
- [Austin Mesh](https://austinmesh.org/)

View file

@ -46,6 +46,7 @@ values={[
]}>
<TabItem value="android">
#### Android
:::info
All Ambient Lighting Module config options are available for Android in app version 2.2.3 and higher.
@ -57,6 +58,8 @@ All Ambient Lighting Module config options are available for Android in app vers
</TabItem>
<TabItem value="apple">
#### Apple
:::info
All Ambient Lighting Module config options are available on iOS, iPadOS and macOS app versions 2.2.3 and higher at Settings > Modules > Ambient Lighting
:::
@ -64,6 +67,8 @@ All Ambient Lighting Module config options are available on iOS, iPadOS and macO
</TabItem>
<TabItem value="cli">
#### CLI
:::info
All Ambient Lighting Module config options are available in the python CLI version 2.2.3 and higher.
@ -99,10 +104,12 @@ meshtastic --get ambient_lighting
</TabItem>
<TabItem value="web">
#### Web
:::info
All Ambient Lighting module config options are available in the Web UI.
:::
</TabItem>
</Tabs>
</Tabs>

View file

@ -68,6 +68,8 @@ values={[
]}>
<TabItem value="android">
#### Android
:::info
Audio Config options are available for Android.
@ -81,6 +83,8 @@ Audio Config options are available for Android.
</TabItem>
<TabItem value="apple">
#### Apple
:::info
Audio module config is not available on iOS, iPadOS and macOS.
:::
@ -88,6 +92,8 @@ Audio module config is not available on iOS, iPadOS and macOS.
</TabItem>
<TabItem value="cli">
#### CLI
:::info
All audio module config options are available in the python CLI. Example commands are below:
@ -139,11 +145,13 @@ meshtastic --set audio.bitrate CODEC2_1400
</TabItem>
<TabItem value="web">
#### Web
:::info
All audio module config options are available in the Web UI.
:::
</TabItem>
</TabItem>
</Tabs>
:::warning

View file

@ -86,6 +86,8 @@ values={[
]}>
<TabItem value="android">
#### Android
:::info
Canned Message Config options are available for Android.
@ -98,6 +100,8 @@ Canned Message Config options are available for Android.
</TabItem>
<TabItem value="apple">
#### Apple
:::info
All canned message module config options are available on iOS, iPadOS and macOS at Settings > Modules > Canned Messages.
:::
@ -105,6 +109,8 @@ All canned message module config options are available on iOS, iPadOS and macOS
</TabItem>
<TabItem value="cli">
#### CLI
:::info
All canned message module config options are available in the python CLI.
@ -192,11 +198,13 @@ meshtastic --set canned_message.inputbroker_event_press ""
</TabItem>
<TabItem value="web">
#### Web
:::info
All canned message module config options are available in the Web UI.
:::
</TabItem>
</TabItem>
</Tabs>
:::warning

View file

@ -59,6 +59,8 @@ values={[
]}>
<TabItem value="android">
#### Android
:::info
All Detection Sensor Module config options are available for Android in app version 2.2.2 and higher.
@ -70,6 +72,8 @@ All Detection Sensor Module config options are available for Android in app vers
</TabItem>
<TabItem value="apple">
#### Apple
:::info
All Detection Sensor Module config options are available on iOS, iPadOS and macOS app versions 2.2.2 and higher at Settings > Modules > Detection Sensor
:::
@ -77,6 +81,8 @@ All Detection Sensor Module config options are available on iOS, iPadOS and macO
</TabItem>
<TabItem value="cli">
#### CLI
:::info
All Detection Sensor Module config options are available in the python CLI version 2.2.2 and higher.
@ -129,6 +135,8 @@ meshtastic --get detection_sensor
</TabItem>
<TabItem value="web">
#### Web
:::info
All Detection Sensor module config options are available in the Web UI.

View file

@ -63,6 +63,8 @@ values={[
]}>
<TabItem value="android">
#### Android
:::info
External Notification Config options are available for Android.
@ -75,6 +77,8 @@ External Notification Config options are available for Android.
</TabItem>
<TabItem value="apple">
#### Apple
:::info
All external notification module config options are available on iOS, iPadOS and macOS at Settings > Modules > External Notification.
:::
@ -82,6 +86,8 @@ All external notification module config options are available on iOS, iPadOS and
</TabItem>
<TabItem value="cli">
#### CLI
:::info
All external notification module config options are available in the python CLI. Example commands are below:
@ -147,6 +153,8 @@ meshtastic --set external_notification.output_ms 1500
</TabItem>
<TabItem value="web">
#### Web
:::info
All External Notification module config is available for the Web UI.
:::

View file

@ -38,6 +38,10 @@ Whether to send encrypted or unencrypted packets to MQTT. This parameter is only
### JSON Enabled
:::note
JSON is not supported on the nRF52 platform.
:::
Enable the sending / consumption of JSON packets on MQTT. These packets are not encrypted, but offer an easy way to integrate with systems that can read JSON.
### TLS Enabled
@ -61,6 +65,8 @@ values={[
]}>
<TabItem value="android">
#### Android
:::info
MQTT Config options are available for Android.
@ -73,6 +79,8 @@ MQTT Config options are available for Android.
</TabItem>
<TabItem value="apple">
#### Apple
:::info
MQTT Config options are available on iOS, iPadOS and macOS at Settings > Modules > MQTT.
@ -82,6 +90,8 @@ MQTT Config options are available on iOS, iPadOS and macOS at Settings > Modules
</TabItem>
<TabItem value="cli">
#### CLI
:::info
All MQTT module config options are available in the python CLI. Example commands are below:
@ -119,14 +129,16 @@ meshtastic --set mqtt.json_enabled true
meshtastic --set mqtt.json_enabled false
```
</TabItem>
<TabItem value="web">
</TabItem>
<TabItem value="web">
#### Web
:::info
All MQTT module config options are available for the Web UI.
:::
</TabItem>
</TabItem>
</Tabs>
## Connect to the Default Public Server
@ -146,7 +158,9 @@ values={[
<TabItem value="android">
<h3>1. Enable the MQTT Module</h3>
#### Android
##### 1. Enable the MQTT Module
Navigate to: Vertical Ellipsis (3 dots top right) > Radio configuration > MQTT: Turn on the slider for **MQTT enabled** and tap **Send**.
@ -156,13 +170,13 @@ Navigate to: Vertical Ellipsis (3 dots top right) > Radio configuration > MQTT:
[![Client Proxy](/img/modules/mqtt/android_mqtt_proxy_sm.webp)](/img/modules/mqtt/android_mqtt_proxy_encryption.webp)
<h3>2. Enable Channel Uplink & Downlink</h3>
##### 2. Enable Channel Uplink & Downlink
Navigate to: Vertical Ellipsis (3 dots top right) > Radio configuration > Channels > LongFast: Turn on the sliders for **Uplink enabled** and **Downlink enabled**, then tap **Save** and tap **Send**.
[![Channel Settings](/img/modules/mqtt/android_channel_sm.webp)](/img/modules/mqtt/android_channel.webp)
<h3>3. Configure Network Settings</h3>
##### 3. Configure Network Settings
Navigate to: Vertical Ellipsis (3 dots top right) > Radio configuration > Network: Turn on the slider for **WiFi enabled**, Enter the **SSID** and **PSK** for your network, then tap **Send**.
@ -171,7 +185,9 @@ Navigate to: Vertical Ellipsis (3 dots top right) > Radio configuration > Networ
</TabItem>
<TabItem value="apple">
<h3>1. Enable the MQTT Module</h3>
#### Apple
##### 1. Enable the MQTT Module
Navigate to Settings > MQTT: Turn on the slider for MQTT enabled and tap **Save**
@ -182,13 +198,13 @@ Navigate to Settings > MQTT: Turn on the slider for MQTT enabled and tap **Save*
[![Client Proxy](/img/modules/mqtt/apple_mqtt_1_proxy_sm.webp)](/img/modules/mqtt/apple_mqtt_1_proxy_encryption.webp)
<h3>2. Enable Channel Uplink & Downlink</h3>
##### 2. Enable Channel Uplink & Downlink
Navigate to Settings > Channels > Primary Channel: Turn on the sliders for **Uplink enabled** and **Downlink enabled** - Tap **Save**
[![Channel Settings](/img/modules/mqtt/apple_channel_sm.webp)](/img/modules/mqtt/apple_channel.webp)
<h3>3. Configure Network Settings</h3>
##### 3. Configure Network Settings
Navigate to Settings > Network: Turn on the slider for **WiFi enabled** - Enter your **SSID** and **PSK** for your network - Tap **Save**
@ -197,13 +213,15 @@ Navigate to Settings > Network: Turn on the slider for **WiFi enabled** - Enter
</TabItem>
<TabItem value="cli">
<h3>1. Enable the MQTT Module</h3>
#### CLI
##### 1. Enable the MQTT Module
```shell
meshtastic --set mqtt.enabled true
```
<h3>2. Enable Channel Uplink & Downlink</h3>
##### 2. Enable Channel Uplink & Downlink
```shell
meshtastic --ch-set uplink_enabled true --ch-index 0
@ -215,7 +233,7 @@ or chained together:
meshtastic --ch-set uplink_enabled true --ch-index 0 --ch-set downlink_enabled true --ch-index 0
```
<h3>3. Configure Network Settings</h3>
##### 3. Configure Network Settings
```shell
meshtastic --set network.wifi_enabled true
@ -231,7 +249,9 @@ meshtastic --set network.wifi_enabled true --set network.wifi_ssid "your network
</TabItem>
<TabItem value="web">
<h3>1. Enable the MQTT Module</h3>
#### Web
##### 1. Enable the MQTT Module
Navigate to Config > Module Config > MQTT - Turn on the slider for MQTT enabled - Click the **Save** icon.
@ -248,13 +268,13 @@ Though this option may be visible in your UI, Client Proxy is not yet functional
:::
<h3>2. Enable Channel Uplink & Downlink</h3>
##### 2. Enable Channel Uplink & Downlink
Navigate to Channels > Primary: Turn on the sliders for **Uplink Enabled** and **Downlink Enabled** - Click the **Save** icon.
[![Channel Settings](/img/modules/mqtt/web_channel_sm.webp)](/img/modules/mqtt/web_channel.webp)
<h3>3. Configure Network Settings</h3>
##### 3. Configure Network Settings
Navigate to Radio Config > Device > Network: Turn on the slider for **Enabled** - Enter your **SSID** and **PSK** for your network - Click the **Save** icon.

View file

@ -37,6 +37,7 @@ values={[
]}>
<TabItem value="android">
#### Android
:::info
All Neighbor Info Module config options are available for Android in app version 2.2.0 and higher.
@ -48,6 +49,8 @@ All Neighbor Info Module config options are available for Android in app version
</TabItem>
<TabItem value="apple">
#### Apple
Not yet implemented.
</TabItem>

View file

@ -7,10 +7,14 @@ sidebar_label: Paxcounter
import Tabs from "@theme/Tabs";
import TabItem from "@theme/TabItem";
The Paxcounter module counts the number of people passing by a specific area. It is commonly used in retail stores, museums, and other public spaces to monitor foot traffic and gather valuable data for analysis.
The Paxcounter module counts the number of people passing by a specific area by scanning for WiFi and BLE MAC addresses. It is commonly used in retail stores, museums, and other public spaces to monitor foot traffic and gather valuable data for analysis.
In order to use this module, make sure your devices have firmware version 2.2.17 or higher.
:::info
To operate the Paxcounter Module, it is mandatory to switch off both WiFi and Bluetooth in your Network and Bluetooth settings.
:::
## Paxcounter Module Config Values
### Enabled
@ -34,13 +38,21 @@ values={[
]}>
<TabItem value="android">
#### Android
:::info
No Paxcounter Module config options are available for Android.
Paxcounter Config options are available for Android.
1. Open the Meshtastic App
2. Navigate to: **Vertical Ellipsis (3 dots top right) > Radio Configuration > Paxcounter**
:::
</TabItem>
<TabItem value="apple">
#### Apple
:::info
No Paxcounter Module config options are available on the iOS, iPadOS and macOS app.
:::
@ -48,6 +60,8 @@ No Paxcounter Module config options are available on the iOS, iPadOS and macOS a
</TabItem>
<TabItem value="cli">
#### CLI
:::info
All Paxcounter Module config options are available in the python CLI version 2.2.16 and higher.
@ -61,7 +75,7 @@ meshtastic --set paxcounter.enabled true
meshtastic --set paxcounter.enabled false
```
```shell title="Set the Minimum Broadcast Interval to 90 seconds"
```shell title="Set the Minimum Broadcast Interval to 900 seconds"
meshtastic --set paxcounter.paxcounter_update_interval 900
```
@ -71,9 +85,11 @@ meshtastic --get paxcounter
</TabItem>
<TabItem value="web">
#### Web
:::info
No Paxcounter module config options are available in the Web UI.
All Paxcounter module config options are available in the Web UI.
:::
</TabItem>

View file

@ -67,6 +67,8 @@ values={[
]}>
<TabItem value="android">
#### Android
:::info
Range Test Config options are available for Android.
@ -81,6 +83,8 @@ Android also had the option to download a rangetest.csv file which is stored on
</TabItem>
<TabItem value="apple">
#### Apple
:::info
All range test module config options are available on iOS, iPadOS and macOS at Settings > Modules > Range Test.
:::
@ -90,6 +94,8 @@ Apple apps also have the option to download logged position data which is stored
</TabItem>
<TabItem value="cli">
#### CLI
:::info
Range Test module config options are available in the python CLI. Example commands are below:
@ -133,6 +139,8 @@ meshtastic --set range_test.sender 0
</TabItem>
<TabItem value="web">
#### Web
:::info
All range test module config options are available in the Web UI.

View file

@ -34,6 +34,7 @@ values={[
]}>
<TabItem value="android">
#### Android
:::info
All Remote Hardware Module config options are available for Android in app.
@ -45,6 +46,8 @@ All Remote Hardware Module config options are available for Android in app.
</TabItem>
<TabItem value="apple">
#### Apple
:::info
All Remote Hardware Module config options are available on iOS, iPadOS and macOS app.and higher at Settings > Modules > Remote Hardware
:::
@ -52,6 +55,8 @@ All Remote Hardware Module config options are available on iOS, iPadOS and macOS
</TabItem>
<TabItem value="cli">
#### CLI
:::info
All Remote Hardware Module config options are available in the python CLI.
@ -61,6 +66,8 @@ All Remote Hardware Module config options are available in the python CLI.
</TabItem>
<TabItem value="web">
#### Web
Not implemented.
</TabItem>

View file

@ -79,6 +79,8 @@ values={[
]}>
<TabItem value="android">
#### Android
:::info
Serial Module Config options are available for Android.
@ -91,6 +93,8 @@ Serial Module Config options are available for Android.
</TabItem>
<TabItem value="apple">
#### Apple
:::info
All serial module config options are available on iOS, iPadOS and macOS at Settings > Modules > Serial.
:::
@ -98,6 +102,8 @@ All serial module config options are available on iOS, iPadOS and macOS at Setti
</TabItem>
<TabItem value="cli">
#### CLI
:::info
All serial module config options are available in the python CLI. Example commands are below:
@ -161,6 +167,8 @@ meshtastic --set serial.timeout 15
</TabItem>
<TabItem value="web">
#### Web
:::info
All serial module config options are available in the Web UI.
:::

View file

@ -7,19 +7,20 @@ sidebar_label: Store & Forward
import Tabs from "@theme/Tabs";
import TabItem from "@theme/TabItem";
:::info
Currently only available for ESP32 based devices with external PSRAM like the tbeam. Requires the device to be set as a ROUTER or ROUTER_CLIENT.
:::
## Overview
:::caution
This is a work in progress and the required client support is not yet available.
Using this module, a client device can ask a special Store & Forward Router to resend text messages after the client has been temporarily not in LoRa range of the mesh.
:::info
Only ESP32 based devices with onboard PSRAM like the T-Beam and T3S3 can be a Store & Forward Router. Requires the device to use at least firmware version 2.2.23 and to be set as a `ROUTER` or `ROUTER_CLIENT`.
:::
The Store & Forward Module is an implementation of a Store and Forward system to enable resilient messaging in the event that a client device is disconnected from the main network.
When a client device requests the history from the Store & Forward Router, the router will resend the text messages over LoRa that it has received. The router will only return messages that are within the time window the client has requested up to the maximum number of messages configured for the router.
The router does not know which messages the client device actually missed, so it is possible that you receive duplicates.
Because of the increased network traffic for this overhead, it's not advised to use this if you are duty cycle limited for your airtime usage (EU_868 and EU_433) nor is it advised to use this for presets using SF11 or SF12 (e.g. all of the LongRange and VeryLongRange presets).
:::important
Be mindful when requesting the history, as the router might send a lot of messages which will burden your mesh for a short period of time.
:::
## Details
@ -29,28 +30,22 @@ Because of the increased network traffic for this overhead, it's not advised to
### Requirements
Initial Requirements:
Initial requirements for the Store and Forward Router:
- Must be installed on a ROUTER or ROUTER_CLIENT node.
- Must be installed on a `ROUTER` or `ROUTER_CLIENT` node.
- This is an artificial limitation, but is in place to enforce best practices.
- Router nodes are intended to be always online. If this module misses any messages, the reliability of the stored messages will be reduced.
- ESP32 Processor based device with external PSRAM. (tbeam > v1.0, T3S3, and maybe others)
- ESP32 Processor based device with onboard PSRAM (T-Beam > v1.0, T3S3, and maybe others).
### Usage Overview
- To use / test this you will want at least 3 devices
- One ESP32 device with PSRAM configured as a Meshtastic router.
- Two others will be regular clients. Nothing special required.
### Meshtastic channel configuration
Don't use this on the "LongRange" channel settings. You're welcome to try and report back, but those channels have a [low bitrate](/docs/overview/radio-settings#presets).
Either use a custom channel configuration with at an at least 1kbit data rate or use a Medium or Short range preset.
- One ESP32 device with PSRAM configured as `ROUTER` or `ROUTER_CLIENT`.
- Two others will be regular clients. If one client sends a text message when the other is not in range, the other can request the history from the router to receive the missed message when it is back in range.
### Router setup
- Configure your device as a router.
- Configure your device as a `ROUTER` or `ROUTER_CLIENT`.
- Name your router node something that makes it easily identifiable, aka "Router".
- Configure the Store and Forward module
@ -58,17 +53,18 @@ Either use a custom channel configuration with at an at least 1kbit data rate or
meshtastic --set store_forward.enabled true
```
```shell title="Optional - Set maximum number of records to save to device"
meshtastic --set store_forward.records 100
```shell title="Optional - Disable sending heartbeat."
meshtastic --set store_forward.heartbeat false
```
:::tip
Best to leave `store_forward.records` at the default (`0`) where the module will use 2/3 of your device's available PSRAM. This is about 11,000 records.
Best to disable the heartbeat (which is sent every 15 minutes) when all client devices have identified the router to reduce network traffic.
:::
### Client Usage
Currently there are no clients that support store and forward.
Currently implemented in the Android and Apple apps version 2.2.23 and higher. To request the history from the Store & Forward Router, for Android it is required to send it a direct message containing the text "SF" (without quotes). The router will then respond with the requested messages.
The Apple apps will also show whether a node is a Store & Forward Router in the node list after it heard the heartbeat. You can then long press the node and select "Client History" to request the history from the router.
## Settings
@ -82,7 +78,7 @@ The Store & Forward Router sends a periodic message onto the network. This allow
### History Return Max
Sets the maximum number of messages to return to a client device.
Sets the maximum number of messages to return to a client device when it requests the history.
### History Return Window
@ -90,7 +86,7 @@ Limits the time period (in minutes) a client device can request.
### Records
Set this to the maximum number of records to save. Best to leave this at the default (`0`) where the module will use 2/3 of your device's available PSRAM. This is about 11,000 records.
Set this to the maximum number of records the router will save. Best to leave this at the default (`0`) where the module will use 2/3 of your device's available PSRAM. This is about 11,000 records.
### Client Config
@ -106,6 +102,8 @@ values={[
<TabItem value="android">
#### Android
:::info
Store and Forward Config options are available for Android.
@ -117,6 +115,8 @@ Store and Forward Config options are available for Android.
<TabItem value="apple">
#### Apple
:::info
Store and Forward configuration is not currently available via the Apple clients.
:::
@ -125,13 +125,15 @@ Store and Forward configuration is not currently available via the Apple clients
<TabItem value="cli">
#### CLI
| Setting | Acceptable Values | Default |
| :---------------------------------: | :---------------: | :-----: |
| store_forward.enabled | `true`, `false` | `false` |
| store_forward.heartbeat | `true`, `false` | `false` |
| store_forward.history_return_max | `integer` | `0` |
| store_forward.history_return_window | `integer` | `0` |
| store_forward.records | `integer` | `0` |
| store_forward.history_return_max | `integer` | `0` (25 messages) |
| store_forward.history_return_window | `integer` | `0` (240 minutes) |
| store_forward.records | `integer` | `0` (≈11,000 records) |
:::tip
@ -143,7 +145,7 @@ meshtastic --set store_forward.enabled true --set store_forward.history_return_m
:::
### Examples of CLI Usage
##### Examples of CLI Usage
```shell title="Enable the module"
meshtastic --set store_forward.enabled true
@ -158,14 +160,14 @@ meshtastic --set store_forward.heartbeat 0
```
```shell title="Set store_forward.history_return_max to default"
```shell title="Set store_forward.history_return_max to default (25 messages)"
meshtastic --set store_forward.history_return_max 0
```
```shell title="Set store_forward.history_return_max to 100 messages"
meshtastic --set store_forward.history_return_max 100
```
```shell title="Set store_forward.history_return_window to default"
```shell title="Set store_forward.history_return_window to default (240 minutes)"
meshtastic --set store_forward.history_return_window 0
```
```shell title="Set store_forward.history_return_window to 1 day (1440 minutes)"
@ -183,6 +185,8 @@ meshtastic --set store_forward.records 100
<TabItem value="web">
#### Web
:::info
Store and Forward configuration is not currently available via the web client.
:::

View file

@ -44,7 +44,9 @@ Default is `900` seconds (15 minutes).
How often we should send Device Metrics over the mesh.
Default is `900` seconds (15 minutes).
Default is `900` seconds (15 minutes).
Device Metrics to a connected client app will always be sent once per minute, regardless of this setting.
### Environment Screen Enabled
@ -83,6 +85,8 @@ values={[
]}>
<TabItem value="android">
#### Android
:::info
Telemetry Config options are available for Android.
@ -95,6 +99,8 @@ Telemetry Config options are available for Android.
</TabItem>
<TabItem value="apple">
#### Apple
:::info
All telemetry module config options are available on iOS, iPadOS and macOS at Settings > Module Configuration > Telemetry.
@ -103,6 +109,8 @@ All telemetry module config options are available on iOS, iPadOS and macOS at Se
</TabItem>
<TabItem value="cli">
#### CLI
:::info
All telemetry module config options are available in the python CLI. Example commands are below:
@ -157,6 +165,8 @@ meshtastic --set telemetry.environment_display_fahrenheit false
</TabItem>
<TabItem value="web">
#### Web
:::info
All telemetry module config options are available in the Web UI.

View file

@ -28,6 +28,8 @@ values={[
]}>
<TabItem value="android">
#### Android
Make sure the app is at least version 2.1.10.
Under the node list, long hold a destination node and select 'Traceroute' to send the request. Depending on the amount of hops that is needed, this might take a while. The result will be shown using a pop-up.
@ -35,6 +37,8 @@ Under the node list, long hold a destination node and select 'Traceroute' to sen
</TabItem>
<TabItem value="apple">
#### Apple
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.
@ -42,6 +46,8 @@ Under Contacts > Direct Messages, long hold a destination node and select 'Trace
</TabItem>
<TabItem value="cli">
#### CLI
Make sure the CLI is at least version 2.0.6. Then use this command:
```shell title="CLI traceroute command"
@ -63,6 +69,8 @@ The first ID shown is the device you are connected to with the CLI. As you can s
</TabItem>
<TabItem value="web">
#### Web
Not yet implemented.
</TabItem>

View file

@ -51,6 +51,8 @@ values={[
]}>
<TabItem value="android">
#### Android
:::info
All Bluetooth config options are available for Android.
@ -63,6 +65,8 @@ All Bluetooth config options are available for Android.
</TabItem>
<TabItem value="apple">
#### Apple
:::info
All Bluetooth config values are available on iOS, iPadOS and macOS.
@ -75,6 +79,8 @@ All Bluetooth config values are available on iOS, iPadOS and macOS.
</TabItem>
<TabItem value="cli">
#### CLI
:::info
All Bluetooth module config options are available in the python CLI. Example commands are below:
@ -107,8 +113,10 @@ meshtastic --set bluetooth.mode FIXED_PIN
meshtastic --set bluetooth.fixed_pin 111111
```
</TabItem>
<TabItem value="web">
</TabItem>
<TabItem value="web">
#### Web
:::info
@ -119,5 +127,5 @@ All Bluetooth module config options are available for the Web UI.
:::
</TabItem>
</TabItem>
</Tabs>

View file

@ -118,6 +118,8 @@ values={[
<TabItem value="android">
#### Android
:::info
Channel Config options are available on Android.
:::
@ -143,6 +145,8 @@ Tap the Channel Name (or the pen icon) to access the Channel Menu:
<TabItem value="apple">
#### Apple
:::info
Channel settings are only available on Apple platforms by scanning QR codes.
:::
@ -151,6 +155,8 @@ Channel settings are only available on Apple platforms by scanning QR codes.
<TabItem value="cli">
#### CLI
:::info
All Channel config options are available in the python CLI. Example commands are below:
:::
@ -165,7 +171,7 @@ meshtastic --ch-set name "My Channel" --ch-set psk random --ch-set uplink_enable
:::
### Name
##### Name
```shell title="Set channel name for the PRIMARY channel"
# without spaces
@ -174,7 +180,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.
@ -213,7 +219,7 @@ Use this to copy and paste the `base64` encoded (single channel) key from the me
meshtastic --ch-set psk none --ch-index 0
```
### Uplink / Downlink
##### Uplink / Downlink
For configuring gateways, please see [MQTT](/docs/configuration/module/mqtt)
@ -231,6 +237,8 @@ meshtastic --ch-set downlink_enabled false --ch-index 5
<TabItem value="web">
#### Web
:::info
All Channel config options are available in the Web UI.
:::

View file

@ -78,7 +78,7 @@ This is the GPIO pin number that will be used for the PWM buzzer, if your device
### 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.
This is the number of seconds between NodeInfo message (containing i.a. long and short name) broadcasts from the device. The device will still respond ad-hoc to NodeInfo messages when a response is wanted. When the device hears any packet from a node it doesn't know yet, it will send its NodeInfo and ask for a response automatically.
### Double Tap as Button Press
@ -101,6 +101,8 @@ values={[
]}>
<TabItem value="android">
#### Android
:::info
Device Config is available for Android.
@ -113,6 +115,8 @@ Device Config is available for Android.
</TabItem>
<TabItem value="apple">
#### Apple
:::info
All device config options other than NTP Server are available on iOS, iPadOS and macOS at Settings > Radio Configuration > Device.
:::
@ -120,6 +124,8 @@ All device config options other than NTP Server are available on iOS, iPadOS and
</TabItem>
<TabItem value="cli">
#### CLI
:::info
All device config options are available in the python CLI. Example commands are below:
@ -163,9 +169,11 @@ meshtastic --set device.debug_log_enabled true
</TabItem>
<TabItem value="web">
#### Web
:::info
All device config options are available in the Web UI.
:::
</TabItem>
</TabItem>
</Tabs>

View file

@ -84,6 +84,8 @@ values={[
]}>
<TabItem value="android">
#### Android
:::info
Display Config is available for Android.
@ -96,6 +98,8 @@ Display Config is available for Android.
</TabItem>
<TabItem value="apple">
#### Apple
:::info
All display config options are available on iOS, iPadOS and macOS at Settings > Radio Configuration > Display.
:::
@ -103,6 +107,8 @@ All display config options are available on iOS, iPadOS and macOS at Settings >
</TabItem>
<TabItem value="cli">
#### CLI
:::info
All display config options are available in the python CLI. Example commands are below:
@ -150,9 +156,11 @@ meshtastic --set display.gps_format UTM
</TabItem>
<TabItem value="web">
#### Web
:::info
All display config options are available in the Web UI.
:::
</TabItem>
</TabItem>
</Tabs>

View file

@ -100,13 +100,9 @@ Allows you to enable and disable transmit (TX) from the LoRa radio. Useful for h
Defaults to true
### Channel Number
### Frequency Slot
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".
:::info
LoRa Channel Configuration should not to be confused with messaging [Channel Configuration](/docs/configuration/radio/channels). See [Chat Channels VS Lora Modem Channels](/docs/configuration/tips#chat-channels-vs-lora-modem-channels) for further clarification.
:::
This setting controls the actual hardware frequency at which the radio transmits, represented by a frequency slot between 1 and NUM_SLOTS (the maximum for the current region and modem preset). If set to `0`/UNSET, the device reverts to the older channel name hash-based algorithm for determining the frequency slot.
### Ignore Incoming Array
@ -141,6 +137,8 @@ values={[
]}>
<TabItem value="android">
#### Android
:::info
LoRa Config options are available on Android.
@ -153,6 +151,8 @@ LoRa Config options are available on Android.
</TabItem>
<TabItem value="apple">
#### Apple
:::info
Configuration of Region, Modem Preset, Transmit Enabled, Hop Limit, Channel Number and RX Boosted gain is available on iOS, iPadOS and macOS at Settings > Radio Configuration > LoRa.
:::
@ -160,6 +160,8 @@ Configuration of Region, Modem Preset, Transmit Enabled, Hop Limit, Channel Numb
</TabItem>
<TabItem value="cli">
#### CLI
:::info
LoRa config commands are available in the python CLI. Example commands are below:
@ -217,9 +219,11 @@ meshtastic --set lora.override_duty_cycle false
</TabItem>
<TabItem value="web">
#### Web
:::info
All LoRa config options are available in the Web UI.
:::
</TabItem>
</TabItem>
</Tabs>

View file

@ -73,6 +73,8 @@ values={[
<TabItem value="android">
#### Android
:::info
Network Config options are available for Android.
@ -86,6 +88,8 @@ Network Config options are available for Android.
<TabItem value="apple">
#### Apple
:::info
Network config options are available on iOS, iPadOS and macOS.
@ -96,6 +100,8 @@ Network config options are available on iOS, iPadOS and macOS.
<TabItem value="cli">
#### CLI
:::info
All Network config options are available in the python CLI.
@ -147,6 +153,8 @@ meshtastic --set network.wifi_psk "my password"
<TabItem value="web">
#### Web
:::info
All Network config options are available in the Web UI.
:::
@ -159,7 +167,7 @@ All Network config options are available in the Web UI.
### WiFi Client
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.
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 and it is a 2.4GHz-only network. 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.
### Disable WiFi

View file

@ -102,6 +102,8 @@ values={[
]}>
<TabItem value="android">
#### Android
:::info
Position Config options are available for Android.
@ -114,6 +116,8 @@ Position Config options are available for Android.
</TabItem>
<TabItem value="apple">
#### Apple
:::info
All position config values are available on iOS, iPadOS and macOS at Settings > Radio Configuration > Position.
:::
@ -121,6 +125,8 @@ All position config values are available on iOS, iPadOS and macOS at Settings >
</TabItem>
<TabItem value="cli">
#### CLI
:::info
All Position config commands are available in the python CLI. Example commands are below:
@ -199,6 +205,8 @@ meshtastic --pos-fields UNSET
</TabItem>
<TabItem value="web">
#### Web
:::info
All position config options are available in the Web UI.
:::

View file

@ -4,20 +4,17 @@ title: Power Configuration
sidebar_label: Power
---
import Admonition from '@theme/Admonition';
import Tabs from "@theme/Tabs";
import TabItem from "@theme/TabItem";
import calculateADC from "/src/utils/calculateADC";
:::info
:::info Use Device Config first
Power settings are advanced configuration, most users should choose a role under [Device Config](/docs/configuration/radio/device) to manage power for their device and shouldn't ever need to adjust these settings.
:::
The power config options are: Power Saving, Shutdown after losing power, ADC Multiplier Override, Wait Bluetooth Interval, Light Sleep Interval, Minimum Wake Interval, and Device Battery INA2xx Address. Power config uses an admin message sending a `Config.Power` protobuf.
:::info
ADC Multiplier, The Light Sleep setting only applies to ESP32-based boards. This settings will have no effect on nRF52/RP2040 modules.
:::
## Power Config Values
### Power Saving
@ -30,6 +27,10 @@ Automatically shut down a device after a defined time period if power is lost.
### ADC Multiplier Override
:::info ESP32 Only
This setting only applies to ESP32-based boards, it will have no effect on nRF52/RP2040 boards.
:::
Ratio of voltage divider for battery pin e.g. 3.20 (R1=100k, R2=220k)
Overrides the ADC_MULTIPLIER defined in the firmware device variant file for battery voltage calculation.
@ -44,49 +45,50 @@ Should be set to floating point value between 2 and 6
4. If "Battery Charge Percent" (e.g., B 3.82V 60%) is not displayed on the screen, it means that the default value of "Operative Adc Multiplier" is too high. Lower the "Operative Adc Multiplier" to a smaller number (it is recommended to decrease by 0.1) until the screen displays "Battery Charge Percent". Enter the current "Operative Adc Multiplier" in use into the "Operative Adc Multiplier" field in the calculator. Also, input the "Battery Charge Percent" displayed on the screen into the calculator.
5. Click the "Calculate" button to compute the "Calculated New Operative Adc Multiplier", and set it as the new "Operative Adc Multiplier" for the device.
:::tip ADC Calculator
<table>
<tr>
<td> Battery Charge Percent: </td>
<td>
<input type="text" id="batteryChargePercent" defaultValue="65" />
</td>
</tr>
<tr>
<td>Current Adc Multiplier: </td>
<td>
<input type="text" id="operativeAdcMultiplier" defaultValue="2" />
</td>
</tr>
<tr>
<td>Calculated New Operative Adc Multiplier: </td>
<td>
<input
type="text"
id="newOperativeAdcMultiplier"
value="2"
disabled="disabled"
/>
</td>
</tr>
<tr>
<td></td>
<td>
<button
className="button button--outline button--lg cta--button"
onClick={calculateADC}
>
Calculate
</button>
</td>
</tr>
</table>
:::
:::info
It's important to note that this calibration method only maps 4.2V to Battery Charge Percent 100%, and does not address the potential non-linearities of the ADC.
:::
<details>
<summary>ADC Calculator</summary>
<div>
<Admonition type="info">
<p>This calibration method only maps 4.2V to Battery Charge Percent 100%, and does not address the potential non-linearities of the ADC.</p>
</Admonition>
<table>
<tr>
<td> Battery Charge Percent: </td>
<td>
<input type="text" id="batteryChargePercent" defaultValue="65" />
</td>
</tr>
<tr>
<td>Current Adc Multiplier: </td>
<td>
<input type="text" id="operativeAdcMultiplier" defaultValue="2" />
</td>
</tr>
<tr>
<td>Calculated New Operative Adc Multiplier: </td>
<td>
<input
type="text"
id="newOperativeAdcMultiplier"
value="2"
disabled="disabled"
/>
</td>
</tr>
<tr>
<td></td>
<td>
<button
className="button button--outline button--lg cta--button"
onClick={calculateADC}
>
Calculate
</button>
</td>
</tr>
</table>
</div>
</details>
### Wait Bluetooth Interval
@ -96,6 +98,10 @@ How long to wait before turning off BLE in no Bluetooth states
### Light Sleep Interval
:::info ESP32 Only
This setting only applies to ESP32-based boards, it will have no effect on nRF52/RP2040 boards.
:::
In light sleep the CPU is suspended, LoRa radio is on, BLE is off and GPS is on
`0` for default of five minutes
@ -110,7 +116,7 @@ While in light sleep when we receive packets on the LoRa radio we will wake and
If an INA-2XX device is auto-detected on one of the I2C buses at the specified address, it will be used as the authoritative source for reading device battery level voltage. Setting is ignored for devices with PMUs (e.g. T-beams)
:::tip
:::tip[Convert hexadecimal to decimal]
I2C addresses are normally represented in hexadecimal and will require conversion to decimal in order to set via Meshtastic clients. For example the I2C address of 0x40 converted to decimal is 64.
:::
@ -127,6 +133,8 @@ values={[
]}>
<TabItem value="android">
#### Android
:::info
Power Config options are available for Android.
@ -139,6 +147,8 @@ Power Config options are available for Android.
</TabItem>
<TabItem value="apple">
#### Apple
:::info
Power config is not available on Apple OS's.
@ -147,6 +157,8 @@ Power config is not available on Apple OS's.
</TabItem>
<TabItem value="cli">
#### CLI
:::info
All Power config options are available in the python CLI.
@ -201,9 +213,11 @@ meshtastic --set power.min_wake_secs 120
</TabItem>
<TabItem value="web">
#### Web
:::info
All power config options are available in the Web UI.
:::
</TabItem>
</TabItem>
</Tabs>

View file

@ -48,6 +48,8 @@ values={[
<TabItem value="android">
#### Android
:::info
All User config options are available for Android.
@ -61,6 +63,8 @@ All User config options are available for Android.
<TabItem value="apple">
#### Apple
:::info
All User config options are available on iOS, iPadOS and macOS at `Settings > Radio Configuration > User`.
:::
@ -69,6 +73,8 @@ All User config options are available on iOS, iPadOS and macOS at `Settings > Ra
<TabItem value="cli">
#### CLI
:::info
All User config options are available in the python CLI. Example commands are below:
@ -103,6 +109,8 @@ meshtastic --set-ham 'CALLSIGN'
<TabItem value="web">
#### Web
:::info
All User config options are available in the Web UI.
:::

View file

@ -88,15 +88,19 @@ values={[
{label: 'Web', value: 'web'},
]}>
<TabItem value="cli">
#### CLI (Required for accessibility)
CLI content here
</TabItem>
<TabItem value="android">
#### Android (Required for accessibility)
Android content here
</TabItem>
<TabItem value="iOS">
#### iOS (Required for accessibility)
iOS content here
</TabItem>
<TabItem value="web">
#### Web (Required for accessibility)
Web content here
</TabItem>
</Tabs>

View file

@ -35,6 +35,8 @@ values={[
]}>
<TabItem value="linux">
#### Linux
Check if you have `python3` and `pip` installed with the following command
```shell
@ -58,6 +60,8 @@ sudo apt-get install python3-pip
</TabItem>
<TabItem value="macos">
#### macOS
OS X comes with `Python 2.7` installed, but not `pip`. The following uses Homebrew to install `python3` which includes `pip3`. On MacOS you will use `pip3` instead > of `pip`.
:::note
@ -93,6 +97,8 @@ pip3 -v
</TabItem>
<TabItem value="windows">
#### Windows
- Download and install [Python](https://www.python.org). When installing, make sure to click `Add Python X.Y to PATH`.
- Download and install [Gitbash](https://gitforwindows.org) (or other appropriate shell) and run all subsequent commands from that shell.
@ -130,6 +136,8 @@ values={[
]}>
<TabItem value="linux">
#### Linux
:::important
On Linux, you may need to explicitly declare esptool as a .py script. Use `esptool.py chip_id`.
:::
@ -137,6 +145,8 @@ On Linux, you may need to explicitly declare esptool as a .py script. Use `espto
</TabItem>
<TabItem value="macos">
#### macOS
:::important
On macOS, you may need to explicitly declare esptool as a .py script. Use `esptool.py chip_id`.
:::
@ -144,6 +154,8 @@ On macOS, you may need to explicitly declare esptool as a .py script. Use `espto
</TabItem>
<TabItem value="windows">
#### Windows
:::important
On Windows, you must explicitly declare esptool as a .py script. Use `esptool.py chip_id`.
:::
@ -202,13 +214,15 @@ values={[
]}>
<TabItem value="linux">
#### Install
#### Linux
##### Install
```shell title="Command"
./device-install.sh -f firmware-BOARD-VERSION.bin
```
#### Update
##### Update
```shell title="Command"
./device-update.sh -f firmware-BOARD-VERSION.bin
@ -217,13 +231,15 @@ values={[
</TabItem>
<TabItem value="macos">
#### Install
#### macOS
##### Install
```shell title="Command"
./device-install.sh -f firmware-BOARD-VERSION.bin
```
#### Update
##### Update
```shell title="Command"
./device-update.sh -f firmware-BOARD-VERSION.bin
@ -232,13 +248,15 @@ values={[
</TabItem>
<TabItem value="windows">
#### Install
#### Windows
##### Install
```shell title="Command"
device-install.bat -f firmware-BOARD-VERSION.bin
```
#### Update
##### Update
```shell title="Command"
device-update.bat -f firmware-BOARD-VERSION.bin

View file

@ -20,6 +20,8 @@ values={[
<TabItem value="android">
#### Android
:::info
As of this writing, the current Android release of the nRF DFU app (v2.3.0) is not compatible with Meshtastic firmware updates. Please use the instructions below for updating via OTA with the nRF Connect App.
:::
@ -38,6 +40,8 @@ OTA firmware updates are available for Android using an older release of the mor
<TabItem value="apple">
#### Apple
OTA firmware updates are available on iOS & iPadOS using the nRF Device Firmware Update App available through the [Apple App Store](https://apps.apple.com/us/app/nrf-device-firmware-update/id1624454660)
1. Download the firmware release you wish to install from the [Meshtastic Download Page](/downloads), [Meshtastic GitHub](https://github.com/meshtastic/firmware/releases), or via the iOS or iPadOS app.

View file

@ -25,6 +25,8 @@ values={[
]}>
<TabItem value="serial">
#### Serial
- [Python CLI](/docs/software/python/cli/)
- [Web Client](https://client.meshtastic.org)
- [Android App](/docs/category/android-app)
@ -32,6 +34,8 @@ values={[
</TabItem>
<TabItem value="ble">
#### Bluetooth
- [Android App](/docs/category/android-app)
- [Web Client](https://client.meshtastic.org)
- [iOS/iPadOS/macOS App](/docs/category/apple-apps)
@ -39,6 +43,8 @@ values={[
</TabItem>
<TabItem value="network">
#### Network
:::info
Connecting over network is only supported on ESP32 devices.
:::
@ -66,6 +72,8 @@ values={[
]}>
<TabItem value="android">
#### Android
1. Follow the [installation](/docs/software/android/installation) and [usage](/docs/software/python/cli/usage) instructions for [Meshtastic Android](/docs/category/android-app).
2. Open the app, connect to the device from your phone over USB Serial or Bluetooth.
3. Once paired, Click "UNSET" next to the device name.
@ -74,6 +82,8 @@ values={[
</TabItem>
<TabItem value="apple">
#### Apple
:::info
Configuration of Region, Modem Preset and Hop Limit is available on iOS, iPadOS and macOS at Settings > Radio Configuration > LoRa.
:::
@ -81,6 +91,8 @@ Configuration of Region, Modem Preset and Hop Limit is available on iOS, iPadOS
</TabItem>
<TabItem value="cli">
#### CLI
1. Install [Meshtastic PythonCLI](/docs/software/python/cli/installation)
```sh
pip3 install --upgrade pytap2
@ -94,6 +106,8 @@ Configuration of Region, Modem Preset and Hop Limit is available on iOS, iPadOS
</TabItem>
<TabItem value="web">
#### Web
1. Open the Meshtastic Web interface: [client.meshtastic.org](https://client.meshtastic.org)
2. Navigate to the **LoRa** menu.
3. Under **Regional Settings**, set your **Region** according to your regional location.

View file

@ -26,6 +26,8 @@ values={[
<TabItem value="linux">
#### Linux
- [CP210X USB to UART bridge - Download](https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers)
- [CH9102 Driver - Linux Download](http://www.wch-ic.com/downloads/CH341SER_LINUX_ZIP.html)
@ -33,6 +35,8 @@ values={[
<TabItem value="macos">
#### macOS
- [CP210X USB to UART bridge - Download](https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers)
- [CH9102 Driver - MacOS Download](https://github.com/WCHSoftGroup/ch34xser_macos)
@ -40,6 +44,8 @@ values={[
<TabItem value="windows">
#### Windows
- [CP210X USB to UART bridge - Download](https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers)
- [CH9102 Driver - Windows Download](http://www.wch.cn/downloads/CH343SER_ZIP.html)
- [CH9102 Driver - Windows Download (Direct Download for Windows 7)](https://github.com/Xinyuan-LilyGO/CH9102_Driver)

View file

@ -28,12 +28,15 @@ values={[
<TabItem value="linux">
#### Linux
- [CH34x Driver - Linux Download](http://www.wch-ic.com/downloads/CH341SER_LINUX_ZIP.html)
</TabItem>
<TabItem value="macos">
#### macOS
:::info
@ -41,7 +44,7 @@ With the latest versions of MacOS, the USB Serial driver is built-in. If you dow
:::
### Remove the CH34x USB Driver (macOS)
##### Remove the CH34x USB Driver (macOS)
If you have already downloaded/installed the macOS WCH-IC CH340/CH341
("CH341SER_MAC") drivers via the CH34x_Install_V1.5.pkg, you will have to
@ -53,7 +56,7 @@ Uninstall the kernel extension:
4. Reboot
### Install the CH34x Driver
##### Install the CH34x Driver
- [CH34x Driver- macOS Download](https://github.com/WCHSoftGroup/ch34xser_macos)
@ -63,6 +66,8 @@ Uninstall the kernel extension:
<TabItem value="windows">
#### Windows
- [CH34x Driver - Windows Download](http://www.wch-ic.com/downloads/CH341SER_EXE.html)
</TabItem>

View file

@ -23,6 +23,8 @@ values={[
]}>
<TabItem value="linux">
#### Linux
1. Connect your Meshtastic device to your USB port
2. Open a **Terminal** and enter the following command:
@ -43,6 +45,8 @@ values={[
</TabItem>
<TabItem value="macos">
#### macOS
1. Navigate to `Apple Menu  > About This Mac > More Info > System Report... > Hardware > USB`.
2. You should see similar to one of the following entries:
@ -54,6 +58,8 @@ values={[
</TabItem>
<TabItem value="windows">
#### Windows
1. Navigate to `Device Manager > Ports (COM & LPT)`
2. You should see similar to one of the following entries:

View file

@ -14,7 +14,7 @@ queryString="heltec"
defaultValue="v3"
values={[
{label: 'LoRa32 V2.1', value: 'v2.1'},
{label: 'LoRa32 V3', value:'v3'},
{label: 'LoRa32 V3/V3.1', value:'v3'},
{label: 'Wireless Stick Lite V3', value:'Wireless Stick Lite V3'},
{label: 'Wireless Tracker', value: 'tracker'},
{label: 'Wireless Paper', value: 'paper'}
@ -54,7 +54,7 @@ Not recommended because of design issues! Support is being phased out. Use V3 in
<TabItem value="v3">
## HELTEC v3
## HELTEC v3/v3.1
:::info
This device may have issues charging a connected battery if utilizing a USB-C to USB-C cable. It's recommended to use a USB-A to USB-C cable.
@ -75,6 +75,13 @@ This device may have issues charging a connected battery if utilizing a USB-C to
- Dedicated 2.4 GHz metal spring antenna for WiFi/Bluetooth
- U.FL/IPEX antenna connector for LoRa
### V3.1 differences
Firmware remains the same as V3 below. Compare schematics: [V3.0](https://web.archive.org/web/20221127054612/https://resource.heltec.cn/download/WiFi_LoRa32_V3/HTIT-WB32LA(F)_V3_Schematic_Diagram.pdf) and [V3.1](https://resource.heltec.cn/download/WiFi_LoRa_32_V3/HTIT-WB32LA(F)_V3.1_Schematic_Diagram.pdf). Key differences:
- Removal of [FDG6322C](https://www.mouser.com/datasheet/2/308/1/FDG6322C_D-2312203.pdf) (a dual N & P channel FET) from the V3.1 power supply.
- Antenna filter values in V3.1 (L11 = 1.8pF, C15 = 2.7nH, C24 = 1.8pF) align more closely with ESP32-S3 reference design than V3.0 (L11 = 1.6nH, C15 = 6.9pF, C24 = 2.4pF).
### Features
- Built in 0.96 inch OLED display

View file

@ -77,14 +77,15 @@ By following this guide, you can enhance your Heltec ESP32 V3 board with valuabl
## Keyboard
Comming Soon
Coming Soon
</TabItem>
<TabItem value="Buzzer">
## Buzzer
Commming Soon
Coming Soon
</TabItem>
</Tabs>

View file

@ -106,7 +106,7 @@ Inexpensive basic ESP32-based boards.
| Name | MCU | Radio | WiFi | BT | GPS |
|:------------------------------------------------------------------|:------------|:-------|:------------:|:---:|:---:|
| [LoRa32 V2.1](./heltec/?heltec=v2.1) | ESP32 | SX127x | 2.4GHz b/g/n | 4.2 | NO |
| [LoRa32 V3](./heltec/?heltec=v23) | ESP32 | SX1262 | 2.4GHz b/g/n | 4.2 | NO |
| [LoRa32 V3/3.1](./heltec/?heltec=v23) | ESP32-S3FN8 | SX1262 | 2.4GHz b/g/n | 5.0 | NO |
| [Wireless Stick Lite V3](./heltec/?heltec=Wireless+Stick+Lite+V3) | ESP32-S3FN8 | SX1262 | 2.4GHz b/g/n | 5.0 | NO |
| [Wireless Tracker](./heltec/?heltec=tracker) | ESP32-S3FN8 | SX1262 | 2.4GHz b/g/n | 5.0 | YES |
| [Wireless Paper](./heltec/?heltec=paper) | ESP32-S3FN8 | SX1262 | 2.4GHz b/g/n | 5.0 | NO |

View file

@ -21,7 +21,9 @@ values={[
<TabItem value="g2">
### Nano G2 Ultra Buttons
### Nano G2 Ultra
#### Buttons
- **User/Program Button:**
- **Single press:** Changes the information page displayed on the device's screen.
@ -30,7 +32,7 @@ values={[
- **Message Read Button:**
- **Single press:** Clears the New Message LED.
### Nano G2 Ultra Switches
#### Switches
- **Power:**
- **Toggle Up:** Turns on the device.
@ -46,7 +48,9 @@ values={[
</TabItem>
<TabItem value="g1-e">
### Nano G1 Explorer Buttons
### Nano G1 Explorer
#### Buttons
- **User/Program Button:**
- **Single press:** Changes the information page displayed on the device's screen.
@ -54,7 +58,7 @@ values={[
- **Message Read Button:**
- **Single press:** Clears the New Message LED.
### Nano G1 Explorer Switches
### Switches
- **Power:**
- **Toggle Up:** Turns on the device.

View file

@ -21,13 +21,15 @@ The ATAK plugin does not permit any Meshtastic configuration. The plugin does th
1. Use the Meshtastic Android App on all parties' devices, and ensure they can talk to their local LoRa radio. Confirm they are able to achieve basic text messaging using the App.
2. Set the device's role to `TAK` in the (device configuration settings)[/docs/configuration/radio/device/].
2. Set the device's role to `TAK` in the [device configuration settings](/docs/configuration/radio/device/).
3. With the Meshtastic Android App running in the background (to ensure the IMeshService is alive), launch ATAK (with the Meshtastic ATAK-Plugin installed or install it once ATAK is running) and you should observe a green Meshtastic icon in the bottom right. If the icon is red, then the plugin was not able to bind to the IMeshService provided by the Meshtastic Android App. If this is the case, check to ensure the Meshtastic Android App is functioning. The plugin will reconnect after a failed bind without restarting ATAK.
3. Install the version of the Meshtastic ATAK-Plugin that matches the ATAK version on all participants' devices from the [project's GitHub Releases](https://github.com/meshtastic/ATAK-Plugin/releases).
4. With the Meshtastic Android App running in the background (to ensure the IMeshService is alive), launch ATAK (with the Meshtastic ATAK-Plugin installed or install it once ATAK is running) and you should observe a green Meshtastic icon in the bottom right. If the icon is red, then the plugin was not able to bind to the IMeshService provided by the Meshtastic Android App. If this is the case, check to ensure the Meshtastic Android App is functioning. The plugin will reconnect after a failed bind without restarting ATAK. If you do not see a Meshtastic icon, make sure that you have installed the Meshtastic ATAK-Plugin correctly.
## Standalone TAK Tracker usage
For devices with GPS available, configuring the device's role to `TAK_TRACKER` will allow the Meshtastic to transmit TAK PLI (Position Location Information) independently of ATAK. This data can be received and displayed within ATAK EUDs connected to a Meshtastic device and configured with the Meshtastic ATAK plugin (provided they are configured on the same Meshtastic channels).
For devices with GPS available, configuring the device's role to `TAK_TRACKER` will allow the Meshtastic to transmit TAK PLI (Position Location Information) independently of ATAK. This data can be received and displayed within ATAK EUDs connected to a Meshtastic device and configured with the Meshtastic ATAK plugin (provided they are configured on the same Meshtastic channels).
A couple of important notes regarding this setup:

View file

@ -7,11 +7,17 @@ sidebar_position: 4
### Home Assistant Integrations for Meshtastic
:::warning Note
Due to a known issue with nRF52 devices and JSON, nRF52 devices are not supported for use with Home Assistant at this time.
:::
Integrating Meshtastic into Home Assistant brings a new level of control and monitoring to your mesh network. On this page, we'll guide you through the process of creating Meshtastic MQTT sensor entities within Home Assistant. Whether you want to keep an eye on battery levels, environmental conditions, or even receive notifications from your mesh network, these integrations provide you with the tools to make it happen.
:::info
It is highly recommended to download MQTT Explorer for analyzing the JSON threads that come across the broker. This can be downloaded here: http://mqtt-explorer.com/
It is highly recommended to download MQTT Explorer for analyzing the JSON threads that come across the broker. This can be downloaded here [http://mqtt-explorer.com/](http://mqtt-explorer.com/).
:::

View file

@ -54,6 +54,10 @@ The payload is a raw protobuf, whose definitions for Meshtastic can be found [he
If [encryption_enabled](/docs/configuration/module/mqtt#encryption-enabled) is set to true, the payload of the MeshPacket will remain encrypted with the key for the specified channel.
#### JSON topic
:::note
JSON is not supported on the nRF52 platform.
:::
If [JSON is enabled](/docs/configuration/module/mqtt#json-enabled), packets from the following [port numbers](/docs/development/firmware/portnum) are serialized to JSON: `TEXT_MESSAGE_APP`, `TELEMETRY_APP`, `NODEINFO_APP`, `POSITION_APP`, `WAYPOINT_APP`, `NEIGHBORINFO_APP`, `TRACEROUTE_APP`, `DETECTION_SENSOR_APP`, `PAXCOUNTER_APP` and `REMOTE_HARDWARE_APP`. These are then forwarded to the topic:
`msh/2/json/CHANNELNAME/USERID`.
@ -123,7 +127,7 @@ For the type `sendtext`, the `payload` should be a string containing the text to
Check out [MQTT Settings](/docs/configuration/module/mqtt) for full information. For quick start instructions, read on.
- Connect your gateway node to wifi, by setting the `network.wifi_ssid`, `network.wifi_psk` and `network.wifi_enabled` preferences.
- Alternatively use the RAK4631 with Ethernet Module RAK13800, by setting `network.eth_mode` and `network.eth_enabled`.
- Alternatively use the RAK4631 with Ethernet Module RAK13800, by setting `network.eth_mode` and `network.eth_enabled` (note that JSON is not supported on the nRF52 platform).
- Configure your broker settings: `mqtt.address`, `mqtt.username`, and `mqtt.password`. If all are left blank, the device will connect to the Meshtastic broker.
- Set `uplink_enabled` and `downlink_enabled` as appropriate for each channel. Most users will just have a single channel (at channel index 0). `meshtastic --ch-index 0 --ch-set uplink_enabled true`

View file

@ -54,6 +54,10 @@ The JSON output only publishes the following subset of the messages on a Meshtas
> Protobufs are mesh native.
#### 1. Using JSON-encoded messages
:::note
JSON is not supported on the nRF52 platform.
:::
Make sure that option *JSON Output Enabled* is set in MQTT module options and you have a channel called "mqtt".
Below is a valid JSON envelope for information sent by MQTT to a device for broadcast onto the mesh. The `to` field is optional and can be omitted for broadcast. The `channel` field is also optional and can be omitted to send to the primary channel.

View file

@ -41,6 +41,8 @@ values={[
]}>
<TabItem value="linux">
#### Linux
- Check that your computer has the required serial drivers installed
- Connect your Meshtastic device to your USB port
@ -98,6 +100,8 @@ values={[
</TabItem>
<TabItem value="macos">
#### macOS
- Check that your computer has the required serial drivers installed
- Connect your Meshtastic device to your USB port
- Navigate to `Apple Menu  > About This Mac > System Report... > Hardware > USB`
@ -139,6 +143,8 @@ values={[
</TabItem>
<TabItem value="windows">
#### Windows
- Check that your computer has the required serial drivers installed
- Connect your Meshtastic device to your USB port
- Open Device Manager
@ -171,6 +177,8 @@ values={[
</TabItem>
<TabItem value="termux">
#### Termux
:::note
Wifi connection is currently under development and may not be working properly just yet. If you would like to provide feedback or test this feature, please visit our [forum](https://meshtastic.discourse.group) or join our [Discord server](https://discord.gg/ktMAKGBnBs) for more information.
:::
@ -219,6 +227,8 @@ values={[
]}>
<TabItem value="ubuntu">
#### Ubuntu
- Download meshtastic_ubuntu
- Run the following command to make the file executable and rename it 'meshtastic':
@ -240,6 +250,8 @@ Copy (or move) this binary somewhere in your path.
</TabItem>
<TabItem value="windows">
#### Windows
- Download meshtastic_windows
- Rename to meshtastic.exe

View file

@ -23,7 +23,6 @@ const config = {
},
},
navbar: {
title: "Meshtastic",
hideOnScroll: true,
logo: {
alt: "Meshtastic Logo",
@ -39,6 +38,10 @@ const config = {
label: "Downloads",
to: "downloads",
},
{
label: "Donate",
to: "docs/contributing/#supporting-and-contributing-to-meshtastic",
},
{
label: "About",
position: "right",

View file

@ -9,7 +9,8 @@
"build": "docusaurus build",
"swizzle": "docusaurus swizzle",
"serve": "docusaurus serve",
"clear": "docusaurus clear"
"clear": "docusaurus clear",
"pdf": "npx docusaurus-prince-pdf -u http://localhost:3000/docs/about/ --dest ./static/documents/pdf --output ./static/documents/pdf/Meshtastic-Documentation.pdf"
},
"dependencies": {
"@algolia/client-search": "^4.22.1",
@ -44,6 +45,7 @@
"@types/node": "^20.11.19",
"@types/react": "^18.2.56",
"@types/react-dom": "^18.2.19",
"docusaurus-prince-pdf": "^1.2.1",
"typescript": "^5.3.3"
}
}

View file

@ -97,6 +97,9 @@ devDependencies:
'@types/react-dom':
specifier: ^18.2.19
version: 18.2.19
docusaurus-prince-pdf:
specifier: ^1.2.1
version: 1.2.1
typescript:
specifier: ^5.3.3
version: 5.3.3
@ -2719,7 +2722,6 @@ packages:
/@sindresorhus/is@5.6.0:
resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==}
engines: {node: '>=14.16'}
dev: false
/@slorber/remark-comment@1.0.0:
resolution: {integrity: sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==}
@ -2896,7 +2898,6 @@ packages:
engines: {node: '>=14.16'}
dependencies:
defer-to-connect: 2.0.1
dev: false
/@tailwindcss/typography@0.5.10(tailwindcss@3.4.1):
resolution: {integrity: sha512-Pe8BuPJQJd3FfRnm6H0ulKIGoMEQS+Vq01R6M5aCrFB/ccR/shT+0kXLjouGC1gFLm9hopTFN+DMP0pfwRWzPw==}
@ -2910,6 +2911,11 @@ packages:
tailwindcss: 3.4.1
dev: true
/@tootallnate/once@2.0.0:
resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==}
engines: {node: '>= 10'}
dev: true
/@trysound/sax@0.2.0:
resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==}
engines: {node: '>=10.13.0'}
@ -3025,7 +3031,6 @@ packages:
/@types/http-cache-semantics@4.0.4:
resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==}
dev: false
/@types/http-errors@2.0.4:
resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==}
@ -3310,6 +3315,11 @@ packages:
/@xtuc/long@4.2.2:
resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==}
/abab@2.0.6:
resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==}
deprecated: Use your platform's native atob() and btoa() methods instead
dev: true
/accepts@1.3.8:
resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
engines: {node: '>= 0.6'}
@ -3347,6 +3357,15 @@ packages:
engines: {node: '>= 10.0.0'}
dev: false
/agent-base@6.0.2:
resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
engines: {node: '>= 6.0.0'}
dependencies:
debug: 4.3.4
transitivePeerDependencies:
- supports-color
dev: true
/aggregate-error@3.1.0:
resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==}
engines: {node: '>=8'}
@ -3500,6 +3519,10 @@ packages:
resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==}
hasBin: true
/asynckit@0.4.0:
resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
dev: true
/at-least-node@1.0.0:
resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==}
engines: {node: '>= 4.0.0'}
@ -3701,7 +3724,6 @@ packages:
/cacheable-lookup@7.0.0:
resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==}
engines: {node: '>=14.16'}
dev: false
/cacheable-request@10.2.14:
resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==}
@ -3714,7 +3736,6 @@ packages:
mimic-response: 4.0.0
normalize-url: 8.0.0
responselike: 3.0.0
dev: false
/call-bind@1.0.7:
resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==}
@ -3899,6 +3920,15 @@ packages:
resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
dev: false
/cliui@8.0.1:
resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
engines: {node: '>=12'}
dependencies:
string-width: 4.2.3
strip-ansi: 6.0.1
wrap-ansi: 7.0.0
dev: true
/clone-deep@4.0.1:
resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==}
engines: {node: '>=6'}
@ -3947,6 +3977,13 @@ packages:
engines: {node: '>=10'}
dev: false
/combined-stream@1.0.8:
resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
engines: {node: '>= 0.8'}
dependencies:
delayed-stream: 1.0.0
dev: true
/comma-separated-tokens@2.0.3:
resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
@ -4358,6 +4395,13 @@ packages:
css-tree: 1.1.3
dev: false
/cssstyle@3.0.0:
resolution: {integrity: sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==}
engines: {node: '>=14'}
dependencies:
rrweb-cssom: 0.6.0
dev: true
/csstype@3.1.3:
resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
@ -4656,6 +4700,15 @@ packages:
lodash-es: 4.17.21
dev: false
/data-urls@4.0.0:
resolution: {integrity: sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==}
engines: {node: '>=14'}
dependencies:
abab: 2.0.6
whatwg-mimetype: 3.0.0
whatwg-url: 12.0.1
dev: true
/dayjs@1.11.10:
resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==}
dev: false
@ -4686,6 +4739,10 @@ packages:
dependencies:
ms: 2.1.2
/decimal.js@10.4.3:
resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==}
dev: true
/decode-named-character-reference@1.0.2:
resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==}
dependencies:
@ -4696,7 +4753,6 @@ packages:
engines: {node: '>=10'}
dependencies:
mimic-response: 3.1.0
dev: false
/deep-extend@0.6.0:
resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==}
@ -4718,7 +4774,6 @@ packages:
/defer-to-connect@2.0.1:
resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==}
engines: {node: '>=10'}
dev: false
/define-data-property@1.1.4:
resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
@ -4763,6 +4818,11 @@ packages:
robust-predicates: 3.0.2
dev: false
/delayed-stream@1.0.0:
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
engines: {node: '>=0.4.0'}
dev: true
/depd@1.1.2:
resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==}
engines: {node: '>= 0.6'}
@ -4837,6 +4897,21 @@ packages:
'@leichtgewicht/ip-codec': 2.0.4
dev: false
/docusaurus-prince-pdf@1.2.1:
resolution: {integrity: sha512-8/ssMwm60bDP9MSsFIlcnKPXVpclLh/VPRA01dosx3/1Pt1OcFfy5fkRSL2WBOSxEoVZcWr+oPzbeimlRJqfNA==}
hasBin: true
dependencies:
got: 13.0.0
jsdom: 22.1.0
tough-cookie: 4.1.3
yargs: 17.7.2
transitivePeerDependencies:
- bufferutil
- canvas
- supports-color
- utf-8-validate
dev: true
/dom-converter@0.2.0:
resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==}
dependencies:
@ -4863,6 +4938,14 @@ packages:
resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
dev: false
/domexception@4.0.0:
resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==}
engines: {node: '>=12'}
deprecated: Use your platform's native DOMException instead
dependencies:
webidl-conversions: 7.0.0
dev: true
/domhandler@4.3.1:
resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==}
engines: {node: '>= 4'}
@ -4972,7 +5055,6 @@ packages:
/entities@4.5.0:
resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
engines: {node: '>=0.12'}
dev: false
/error-ex@1.3.2:
resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
@ -5357,7 +5439,15 @@ packages:
/form-data-encoder@2.1.4:
resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==}
engines: {node: '>= 14.17'}
dev: false
/form-data@4.0.0:
resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
engines: {node: '>= 6'}
dependencies:
asynckit: 0.4.0
combined-stream: 1.0.8
mime-types: 2.1.35
dev: true
/format@0.2.2:
resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==}
@ -5420,6 +5510,11 @@ packages:
engines: {node: '>=6.9.0'}
dev: false
/get-caller-file@2.0.5:
resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
engines: {node: 6.* || 8.* || >= 10.*}
dev: true
/get-intrinsic@1.2.4:
resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==}
engines: {node: '>= 0.4'}
@ -5438,7 +5533,6 @@ packages:
/get-stream@6.0.1:
resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
engines: {node: '>=10'}
dev: false
/github-slugger@1.5.0:
resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==}
@ -5555,6 +5649,23 @@ packages:
responselike: 3.0.0
dev: false
/got@13.0.0:
resolution: {integrity: sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==}
engines: {node: '>=16'}
dependencies:
'@sindresorhus/is': 5.6.0
'@szmarczak/http-timer': 5.0.1
cacheable-lookup: 7.0.0
cacheable-request: 10.2.14
decompress-response: 6.0.0
form-data-encoder: 2.1.4
get-stream: 6.0.1
http2-wrapper: 2.2.1
lowercase-keys: 3.0.0
p-cancelable: 3.0.0
responselike: 3.0.0
dev: true
/graceful-fs@4.2.10:
resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==}
dev: false
@ -5768,6 +5879,13 @@ packages:
wbuf: 1.7.3
dev: false
/html-encoding-sniffer@3.0.0:
resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==}
engines: {node: '>=12'}
dependencies:
whatwg-encoding: 2.0.0
dev: true
/html-entities@2.4.0:
resolution: {integrity: sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==}
dev: false
@ -5857,7 +5975,6 @@ packages:
/http-cache-semantics@4.1.1:
resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==}
dev: false
/http-deceiver@1.2.7:
resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==}
@ -5888,6 +6005,17 @@ packages:
resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==}
dev: false
/http-proxy-agent@5.0.0:
resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==}
engines: {node: '>= 6'}
dependencies:
'@tootallnate/once': 2.0.0
agent-base: 6.0.2
debug: 4.3.4
transitivePeerDependencies:
- supports-color
dev: true
/http-proxy-middleware@2.0.6(@types/express@4.17.21):
resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==}
engines: {node: '>=12.0.0'}
@ -5924,7 +6052,16 @@ packages:
dependencies:
quick-lru: 5.1.1
resolve-alpn: 1.2.1
dev: false
/https-proxy-agent@5.0.1:
resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==}
engines: {node: '>= 6'}
dependencies:
agent-base: 6.0.2
debug: 4.3.4
transitivePeerDependencies:
- supports-color
dev: true
/human-signals@2.1.0:
resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
@ -5943,7 +6080,6 @@ packages:
engines: {node: '>=0.10.0'}
dependencies:
safer-buffer: 2.1.2
dev: false
/icss-utils@5.1.0(postcss@8.4.35):
resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==}
@ -6177,6 +6313,10 @@ packages:
engines: {node: '>=0.10.0'}
dev: false
/is-potential-custom-element-name@1.0.1:
resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==}
dev: true
/is-reference@3.0.2:
resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==}
dependencies:
@ -6297,6 +6437,44 @@ packages:
argparse: 2.0.1
dev: false
/jsdom@22.1.0:
resolution: {integrity: sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw==}
engines: {node: '>=16'}
peerDependencies:
canvas: ^2.5.0
peerDependenciesMeta:
canvas:
optional: true
dependencies:
abab: 2.0.6
cssstyle: 3.0.0
data-urls: 4.0.0
decimal.js: 10.4.3
domexception: 4.0.0
form-data: 4.0.0
html-encoding-sniffer: 3.0.0
http-proxy-agent: 5.0.0
https-proxy-agent: 5.0.1
is-potential-custom-element-name: 1.0.1
nwsapi: 2.2.7
parse5: 7.1.2
rrweb-cssom: 0.6.0
saxes: 6.0.0
symbol-tree: 3.2.4
tough-cookie: 4.1.3
w3c-xmlserializer: 4.0.0
webidl-conversions: 7.0.0
whatwg-encoding: 2.0.0
whatwg-mimetype: 3.0.0
whatwg-url: 12.0.1
ws: 8.16.0
xml-name-validator: 4.0.0
transitivePeerDependencies:
- bufferutil
- supports-color
- utf-8-validate
dev: true
/jsesc@0.5.0:
resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==}
hasBin: true
@ -6310,7 +6488,6 @@ packages:
/json-buffer@3.0.1:
resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
dev: false
/json-parse-even-better-errors@2.3.1:
resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
@ -6340,7 +6517,6 @@ packages:
resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
dependencies:
json-buffer: 3.0.1
dev: false
/khroma@2.1.0:
resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==}
@ -6484,7 +6660,6 @@ packages:
/lowercase-keys@3.0.0:
resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
dev: false
/lru-cache@10.2.0:
resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==}
@ -7373,12 +7548,10 @@ packages:
/mimic-response@3.1.0:
resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==}
engines: {node: '>=10'}
dev: false
/mimic-response@4.0.0:
resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
dev: false
/mini-css-extract-plugin@2.8.0(webpack@5.90.2):
resolution: {integrity: sha512-CxmUYPFcTgET1zImteG/LZOy/4T5rTojesQXkSNBiquhydn78tfbCE9sjIjnJ/UcjNjOC1bphTCCW5rrS7cXAg==}
@ -7510,7 +7683,6 @@ packages:
/normalize-url@8.0.0:
resolution: {integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==}
engines: {node: '>=14.16'}
dev: false
/npm-run-path@4.0.1:
resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
@ -7529,6 +7701,10 @@ packages:
boolbase: 1.0.0
dev: false
/nwsapi@2.2.7:
resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==}
dev: true
/object-assign@4.1.1:
resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
engines: {node: '>=0.10.0'}
@ -7602,7 +7778,6 @@ packages:
/p-cancelable@3.0.0:
resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==}
engines: {node: '>=12.20'}
dev: false
/p-limit@2.3.0:
resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
@ -7727,7 +7902,6 @@ packages:
resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==}
dependencies:
entities: 4.5.0
dev: false
/parseurl@1.3.3:
resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
@ -8355,6 +8529,10 @@ packages:
ipaddr.js: 1.9.1
dev: false
/psl@1.9.0:
resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==}
dev: true
/punycode@1.4.1:
resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==}
dev: false
@ -8377,6 +8555,10 @@ packages:
side-channel: 1.0.5
dev: false
/querystringify@2.2.0:
resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==}
dev: true
/queue-microtask@1.2.3:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
@ -8389,7 +8571,6 @@ packages:
/quick-lru@5.1.1:
resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==}
engines: {node: '>=10'}
dev: false
/randombytes@2.1.0:
resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
@ -8841,6 +9022,11 @@ packages:
strip-ansi: 6.0.1
dev: false
/require-directory@2.1.1:
resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
engines: {node: '>=0.10.0'}
dev: true
/require-from-string@2.0.2:
resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
engines: {node: '>=0.10.0'}
@ -8852,11 +9038,9 @@ packages:
/requires-port@1.0.0:
resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==}
dev: false
/resolve-alpn@1.2.1:
resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==}
dev: false
/resolve-from@4.0.0:
resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
@ -8880,7 +9064,6 @@ packages:
engines: {node: '>=14.16'}
dependencies:
lowercase-keys: 3.0.0
dev: false
/retry@0.13.1:
resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==}
@ -8902,6 +9085,10 @@ packages:
resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==}
dev: false
/rrweb-cssom@0.6.0:
resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==}
dev: true
/rtl-detect@1.1.2:
resolution: {integrity: sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ==}
dev: false
@ -8942,12 +9129,18 @@ packages:
/safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
dev: false
/sax@1.3.0:
resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==}
dev: false
/saxes@6.0.0:
resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==}
engines: {node: '>=v12.22.7'}
dependencies:
xmlchars: 2.2.0
dev: true
/scheduler@0.23.0:
resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==}
dependencies:
@ -9460,6 +9653,10 @@ packages:
use-sync-external-store: 1.2.0(react@18.2.0)
dev: false
/symbol-tree@3.2.4:
resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
dev: true
/tailwindcss@3.4.1:
resolution: {integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==}
engines: {node: '>=14.0.0'}
@ -9580,6 +9777,23 @@ packages:
engines: {node: '>=6'}
dev: false
/tough-cookie@4.1.3:
resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==}
engines: {node: '>=6'}
dependencies:
psl: 1.9.0
punycode: 2.3.1
universalify: 0.2.0
url-parse: 1.5.10
dev: true
/tr46@4.1.1:
resolution: {integrity: sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==}
engines: {node: '>=14'}
dependencies:
punycode: 2.3.1
dev: true
/trim-lines@3.0.1:
resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
@ -9747,6 +9961,11 @@ packages:
unist-util-is: 6.0.0
unist-util-visit-parents: 6.0.1
/universalify@0.2.0:
resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==}
engines: {node: '>= 4.0.0'}
dev: true
/universalify@2.0.1:
resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
engines: {node: '>= 10.0.0'}
@ -9809,6 +10028,13 @@ packages:
webpack: 5.90.2
dev: false
/url-parse@1.5.10:
resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==}
dependencies:
querystringify: 2.2.0
requires-port: 1.0.0
dev: true
/use-sync-external-store@1.2.0(react@18.2.0):
resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==}
peerDependencies:
@ -9883,6 +10109,13 @@ packages:
unist-util-stringify-position: 4.0.0
vfile-message: 4.0.2
/w3c-xmlserializer@4.0.0:
resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==}
engines: {node: '>=14'}
dependencies:
xml-name-validator: 4.0.0
dev: true
/watchpack@2.4.0:
resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==}
engines: {node: '>=10.13.0'}
@ -9904,6 +10137,11 @@ packages:
resolution: {integrity: sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==}
dev: false
/webidl-conversions@7.0.0:
resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}
engines: {node: '>=12'}
dev: true
/webpack-bundle-analyzer@4.10.1:
resolution: {integrity: sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ==}
engines: {node: '>= 10.13.0'}
@ -10070,6 +10308,26 @@ packages:
engines: {node: '>=0.8.0'}
dev: false
/whatwg-encoding@2.0.0:
resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==}
engines: {node: '>=12'}
dependencies:
iconv-lite: 0.6.3
dev: true
/whatwg-mimetype@3.0.0:
resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==}
engines: {node: '>=12'}
dev: true
/whatwg-url@12.0.1:
resolution: {integrity: sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==}
engines: {node: '>=14'}
dependencies:
tr46: 4.1.1
webidl-conversions: 7.0.0
dev: true
/which@1.3.1:
resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==}
hasBin: true
@ -10147,7 +10405,6 @@ packages:
optional: true
utf-8-validate:
optional: true
dev: false
/xdg-basedir@5.1.0:
resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==}
@ -10161,6 +10418,20 @@ packages:
sax: 1.3.0
dev: false
/xml-name-validator@4.0.0:
resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==}
engines: {node: '>=12'}
dev: true
/xmlchars@2.2.0:
resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==}
dev: true
/y18n@5.0.8:
resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
engines: {node: '>=10'}
dev: true
/yallist@3.1.1:
resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
dev: false
@ -10178,6 +10449,24 @@ packages:
resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==}
engines: {node: '>= 14'}
/yargs-parser@21.1.1:
resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
engines: {node: '>=12'}
dev: true
/yargs@17.7.2:
resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
engines: {node: '>=12'}
dependencies:
cliui: 8.0.1
escalade: 3.1.2
get-caller-file: 2.0.5
require-directory: 2.1.1
string-width: 4.2.3
y18n: 5.0.8
yargs-parser: 21.1.1
dev: true
/yocto-queue@0.1.0:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'}

View file

@ -1,4 +1,3 @@
import BrowserOnly from "@docusaurus/BrowserOnly";
import {
Accordion,
AccordionItem,
@ -16,83 +15,84 @@ export interface Faq {
}
/**
* Gets the query parameter `openFaqItems` which is an array of
* faq items that should be pre-opened
* @type {Function}
* Finds the nearest heading to an element
* @param {Element} null The element to find the nearest heading to
* @return {Element|null} The heading or null
*/
const getOpenFaqItemsFromUrl = (slug: string): string[] => {
if (typeof window !== "undefined") {
// Use URLSearchParams to parse the query parameters from the current URL
const searchParams = new URLSearchParams(window.location.search);
const findNearestHeading = (element: Element): Element | null => {
const isHeading = (element: Element): boolean =>
/^H[1-6]$/.test(element.tagName);
let currentElement: Element | null = element;
// Get the 'openFaqItems' parameter as a comma-separated string
const openFaqItemsString = searchParams.get(`openFaqItems-${slug}`);
while (currentElement !== null) {
// Check previous siblings
let prevSibling: Element | null = currentElement.previousElementSibling;
while (prevSibling) {
if (isHeading(prevSibling)) {
return prevSibling;
}
prevSibling = prevSibling.previousElementSibling;
}
// If the parameter exists, split it by commas into an array; otherwise, return an empty array
return openFaqItemsString ? openFaqItemsString.split(",") : [];
// If no heading is found among siblings, move to the parent node
currentElement = currentElement.parentElement;
}
return null;
};
/**
* Updates query parameters in the url when items are opened
* so that a link can be shared with the faq item already opened
* Takes in uuids from react-accessible-accordion onchange event
* and updates the browser url with the nearest heading's id
* @param {[type]} void [description]
* @return {[type]} [description]
*/
const handleChange = (
openFaqItems: (string | number)[],
slug: string,
): void => {
const searchParams = new URLSearchParams(window.location.search);
const updateUrlWithNearestHeadingId = (targetElementUuid: string): void => {
const targetElement: HTMLElement | null = document.getElementById(
`accordion__heading-${targetElementUuid[0]}`,
);
if (openFaqItems.length > 0) {
// Create comma-separated string and update/add the parameter
searchParams.set(
`openFaqItems-${slug}`,
openFaqItems.map(String).join(","),
);
} else {
// If openFaqItems is empty, remove the parameter from the URL
searchParams.delete(`openFaqItems-${slug}`);
const nearestHeading: Element | null = targetElement
? findNearestHeading(targetElement)
: null;
// Add the hash without scrolling the page
if (nearestHeading?.id) {
window.history.pushState({}, "", `#${nearestHeading.id}`);
}
// Construct the new URL, preserve existing parameters
const newUrl = `${window.location.protocol}//${window.location.host}${
window.location.pathname
}?${searchParams.toString()}`;
// Change the URL without reloading the page
window.history.pushState({ path: newUrl }, "", newUrl);
// If they're all collapsed, remove the hash
if (!targetElement) {
history.pushState(
null,
null,
window.location.origin +
window.location.pathname +
window.location.search,
);
}
};
export const FaqAccordion = ({
rows,
slug,
}: { rows: Faq[]; slug: string }): JSX.Element => {
export const FaqAccordion = ({ rows }: { rows: Faq[] }): JSX.Element => {
return (
<BrowserOnly fallback={<div>Loading FAQ's...</div>}>
{() => {
return (
<Accordion
allowMultipleExpanded={true}
allowZeroExpanded={true}
onChange={(itemUuids) => {
handleChange(itemUuids, slug);
}}
preExpanded={getOpenFaqItemsFromUrl(slug)}
>
{rows.map((row, index) => (
// biome-ignore lint/suspicious/noArrayIndexKey: React complains if there is no key
<AccordionItem key={index}>
<AccordionItemHeading aria-level="3">
<AccordionItemButton>{row.title}</AccordionItemButton>
</AccordionItemHeading>
<AccordionItemPanel>
<ReactMarkdown>{row.content}</ReactMarkdown>
</AccordionItemPanel>
</AccordionItem>
))}
</Accordion>
);
<Accordion
allowMultipleExpanded={true}
allowZeroExpanded={true}
onChange={(itemUuids) => {
updateUrlWithNearestHeadingId(itemUuids);
}}
</BrowserOnly>
>
{rows.map((row, index) => (
// biome-ignore lint/suspicious/noArrayIndexKey: React complains if there is no key
<AccordionItem key={index}>
<AccordionItemHeading aria-level="3">
<AccordionItemButton>{row.title}</AccordionItemButton>
</AccordionItemHeading>
<AccordionItemPanel>
<ReactMarkdown>{row.content}</ReactMarkdown>
</AccordionItemPanel>
</AccordionItem>
))}
</Accordion>
);
};

View file

@ -356,12 +356,12 @@ export const FrequencyCalculator = (): JSX.Element => {
</div>
<div className="flex gap-2 mb-4">
<label className="font-semibold">Number of channels:</label>
<label className="font-semibold">Number of slots:</label>
<input type="number" disabled={true} value={numChannels} />
</div>
<div className="flex gap-2">
<label>Channel:</label>
<label>Frequency Slot:</label>
<select
value={channel}
onChange={(e) => setChannel(Number.parseInt(e.target.value))}
@ -375,7 +375,7 @@ export const FrequencyCalculator = (): JSX.Element => {
</div>
<div className="flex gap-2">
<label className="font-semibold">Channel Frequency:</label>
<label className="font-semibold">Frequency of slot:</label>
<input type="number" disabled={true} value={channelFrequency} />
</div>
</div>

View file

@ -228,4 +228,14 @@ th,
td {
padding-left: 10px !important;
padding-right: 10px !important;
}
}
/* Need all tab content to show for PDF generation */
@media print {
ul.tabs {
display: none;
}
.tabs-container div > div {
display: block;
}
}