From 9f439414f42e2e5e359302282647aa305ebf5f52 Mon Sep 17 00:00:00 2001 From: Ian McEwen Date: Thu, 22 Feb 2024 13:10:30 -0700 Subject: [PATCH 01/40] Update home-assistant.mdx to add device_class and use this.state Just a couple small improvements. By adding these device classes, some history graphs will be made a bit nicer (splitting out battery percentage from channel utilization graphs) and HA can better know how to use the values. Using `this.state` is slightly better form for retaining the same sensor value since it won't look up the current value, just reuse the one HA has already looked up. --- .../integrations/mqtt/home-assistant.mdx | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/docs/software/integrations/mqtt/home-assistant.mdx b/docs/software/integrations/mqtt/home-assistant.mdx index cc47fb2a..d0d75bcd 100644 --- a/docs/software/integrations/mqtt/home-assistant.mdx +++ b/docs/software/integrations/mqtt/home-assistant.mdx @@ -46,7 +46,7 @@ sensor: value_json.payload.temperature is not defined %} {{ (value_json.payload.voltage | float) | round(2) }} {% else %} - {{ states('sensor.node_1_battery_voltage') }} + {{ this.state }} {% endif %} unit_of_measurement: "Volts" # Telemetry packets come in two flavors: The default node telemetry, and the I2C sensor data. @@ -60,8 +60,9 @@ sensor: {% if value_json.from == 4038675309 and value_json.payload.battery_level is defined %} {{ (value_json.payload.battery_level | float) | round(2) }} {% else %} - {{ states('sensor.node_1_battery_percent') }} + {{ this.state }} {% endif %} + device_class: "battery" unit_of_measurement: "%" - name: "Node 1 ChUtil" @@ -72,7 +73,7 @@ sensor: {% if value_json.from == 4038675309 and value_json.payload.channel_utilization is defined %} {{ (value_json.payload.channel_utilization | float) | round(2) }} {% else %} - {{ states('sensor.node_1_chutil') }} + {{ this.state }} {% endif %} unit_of_measurement: "%" @@ -84,7 +85,7 @@ sensor: {% if value_json.from == 4038675309 and value_json.payload.air_util_tx is defined %} {{ (value_json.payload.air_util_tx | float) | round(2) }} {% else %} - {{ states('sensor.node_1_airutiltx') }} + {{ this.state }} {% endif %} unit_of_measurement: "%" @@ -103,9 +104,12 @@ sensor: {% if value_json.from == 4038675309 and value_json.payload.temperature is defined %} {{ (((value_json.payload.temperature | float) * 1.8) +32) | round(2) }} {% else %} - {{ states('sensor.node_1_temperature') }} + {{ this.state }} {% endif %} + device_class: "temperature" unit_of_measurement: "F" +# With device_class: "temperature" set, make sure to use the configured unit for temperature in your HA instance. +# If you don't, then non-temperature messages will change the value of this sensor by reinterpreting the current state with the wrong unit, unless you account for it. # For Celsius use: {{ (value_json.payload.temperature | float) | round(1) }} # For Fahrenheit use: {{ (((value_json.payload.temperature | float) * 1.8) +32) | round(2) }} @@ -117,8 +121,9 @@ sensor: {% if value_json.from == 4038675309 and value_json.payload.relative_humidity is defined %} {{ (value_json.payload.relative_humidity | float) | round(2) }} {% else %} - {{ states('sensor.node_1_humidity') }} + {{ this.state }} {% endif %} + device_class: "humidity" unit_of_measurement: "%" - name: "Node 1 Pressure" @@ -129,9 +134,12 @@ sensor: {% if value_json.from == 4038675309 and value_json.payload.barometric_pressure is defined %} {{ (value_json.payload.barometric_pressure | float) | round(2) }} {% else %} - {{ states('sensor.node_1_pressure') }} + {{ this.state }} {% endif %} + device_class: "pressure" unit_of_measurement: "hPa" +# With device_class: "pressure" set, make sure to use the configured unit for pressure in your HA instance. +# For psi use: {{ ((value_json.payload.barometric_pressure | float) / 68.9475729) | round(2) }} - name: "Node 1 Gas Resistance" unique_id: "node_1_gas_resistance" @@ -141,7 +149,7 @@ sensor: {% if value_json.from == 4038675309 and value_json.payload.gas_resistance is defined %} {{ (value_json.payload.gas_resistance | float) | round(2) }} {% else %} - {{ states('sensor.node_1_gas_resistance') }} + {{ this.state }} {% endif %} unit_of_measurement: "MOhms" ``` @@ -158,7 +166,7 @@ sensor: {% if value_json.from == 4038675309 and value_json.payload.text is defined %} {{ value_json.payload.text }} {% else %} - {{ states('sensor.node_1_messages') }} + {{ this.state }} {% endif %} ``` @@ -184,7 +192,7 @@ Copy and paste these entities then change `name`, `unique_id`, `from`, and `stat {% if value_json.from == 695318008 and value_json.payload.text is defined %} {{ value_json.payload.text }} {% else %} - {{ states('sensor.node_2_messages') }} + {{ this.state }} {% endif %} ``` From dc91b0678a91c2789d3bf37ccd34de0508bc468c Mon Sep 17 00:00:00 2001 From: "thomas.ekstrand" Date: Mon, 19 Feb 2024 14:17:23 -0600 Subject: [PATCH 02/40] Add docusaurus-prince-pdf and script --- package.json | 4 +- pnpm-lock.yaml | 316 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 319 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 4f87ef41..be6b0b81 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,8 @@ "build": "docusaurus build", "swizzle": "docusaurus swizzle", "serve": "docusaurus serve", - "clear": "docusaurus clear" + "clear": "docusaurus clear", + "pdf": "pnpm 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", @@ -24,6 +25,7 @@ "autoprefixer": "^10.4.17", "base64-js": "^1.5.1", "clsx": "^2.1.0", + "docusaurus-prince-pdf": "^1.2.1", "dotenv": "^16.4.4", "postcss": "^8.4.35", "react": "^18.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d714f25a..16b23c9a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -41,6 +41,9 @@ dependencies: clsx: specifier: ^2.1.0 version: 2.1.0 + docusaurus-prince-pdf: + specifier: ^1.2.1 + version: 1.2.1 dotenv: specifier: ^16.4.4 version: 16.4.4 @@ -2910,6 +2913,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: false + /@trysound/sax@0.2.0: resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} engines: {node: '>=10.13.0'} @@ -3310,6 +3318,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: false + /accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -3347,6 +3360,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: false + /aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} @@ -3500,6 +3522,10 @@ packages: resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} hasBin: true + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false + /at-least-node@1.0.0: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} @@ -3899,6 +3925,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: false + /clone-deep@4.0.1: resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} engines: {node: '>=6'} @@ -3947,6 +3982,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: false + /comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} @@ -4358,6 +4400,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: false + /csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} @@ -4656,6 +4705,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: false + /dayjs@1.11.10: resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} dev: false @@ -4686,6 +4744,10 @@ packages: dependencies: ms: 2.1.2 + /decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + dev: false + /decode-named-character-reference@1.0.2: resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} dependencies: @@ -4763,6 +4825,11 @@ packages: robust-predicates: 3.0.2 dev: false + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: false + /depd@1.1.2: resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} engines: {node: '>= 0.6'} @@ -4837,6 +4904,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: false + /dom-converter@0.2.0: resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} dependencies: @@ -4863,6 +4945,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: false + /domhandler@4.3.1: resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} engines: {node: '>= 4'} @@ -5359,6 +5449,15 @@ packages: 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: false + /format@0.2.2: resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} engines: {node: '>=0.4.x'} @@ -5420,6 +5519,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: false + /get-intrinsic@1.2.4: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} @@ -5555,6 +5659,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: false + /graceful-fs@4.2.10: resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} dev: false @@ -5768,6 +5889,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: false + /html-entities@2.4.0: resolution: {integrity: sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==} dev: false @@ -5888,6 +6016,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: false + /http-proxy-middleware@2.0.6(@types/express@4.17.21): resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} engines: {node: '>=12.0.0'} @@ -5926,6 +6065,16 @@ packages: 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: false + /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} @@ -6177,6 +6326,10 @@ packages: engines: {node: '>=0.10.0'} dev: false + /is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + dev: false + /is-reference@3.0.2: resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} dependencies: @@ -6297,6 +6450,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: false + /jsesc@0.5.0: resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} hasBin: true @@ -7529,6 +7720,10 @@ packages: boolbase: 1.0.0 dev: false + /nwsapi@2.2.7: + resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} + dev: false + /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -8355,6 +8550,10 @@ packages: ipaddr.js: 1.9.1 dev: false + /psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + dev: false + /punycode@1.4.1: resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} dev: false @@ -8377,6 +8576,10 @@ packages: side-channel: 1.0.5 dev: false + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: false + /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -8841,6 +9044,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: false + /require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} @@ -8902,6 +9110,10 @@ packages: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} dev: false + /rrweb-cssom@0.6.0: + resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} + dev: false + /rtl-detect@1.1.2: resolution: {integrity: sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ==} dev: false @@ -8948,6 +9160,13 @@ packages: 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: false + /scheduler@0.23.0: resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} dependencies: @@ -9460,6 +9679,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: false + /tailwindcss@3.4.1: resolution: {integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==} engines: {node: '>=14.0.0'} @@ -9580,6 +9803,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: false + + /tr46@4.1.1: + resolution: {integrity: sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==} + engines: {node: '>=14'} + dependencies: + punycode: 2.3.1 + dev: false + /trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} @@ -9747,6 +9987,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: false + /universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} @@ -9809,6 +10054,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: false + /use-sync-external-store@1.2.0(react@18.2.0): resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} peerDependencies: @@ -9883,6 +10135,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: false + /watchpack@2.4.0: resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} engines: {node: '>=10.13.0'} @@ -9904,6 +10163,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: false + /webpack-bundle-analyzer@4.10.1: resolution: {integrity: sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ==} engines: {node: '>= 10.13.0'} @@ -10070,6 +10334,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: false + + /whatwg-mimetype@3.0.0: + resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} + engines: {node: '>=12'} + dev: false + + /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: false + /which@1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true @@ -10161,6 +10445,20 @@ packages: sax: 1.3.0 dev: false + /xml-name-validator@4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + engines: {node: '>=12'} + dev: false + + /xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + dev: false + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: false + /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} dev: false @@ -10178,6 +10476,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: false + + /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: false + /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} From bfda6f9320a6a291094de3f42d579e10d1168008 Mon Sep 17 00:00:00 2001 From: "thomas.ekstrand" Date: Sat, 24 Feb 2024 15:27:58 -0600 Subject: [PATCH 03/40] github action, add to gitignore --- .github/workflows/pdf.yml | 34 ++++++++++++++++++++++++++++++++++ .gitignore | 3 ++- package.json | 2 +- 3 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/pdf.yml diff --git a/.github/workflows/pdf.yml b/.github/workflows/pdf.yml new file mode 100644 index 00000000..7adb4219 --- /dev/null +++ b/.github/workflows/pdf.yml @@ -0,0 +1,34 @@ +name: Generate Documentation PDF +on: [push] +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Install Prince + run: | + curl https://www.princexml.com/download/prince-14.2-linux-generic-x86_64.tar.gz -O + tar zxf prince-14.2-linux-generic-x86_64.tar.gz + cd prince-14.2-linux-generic-x86_64 + yes "" | sudo ./install.sh + + - name: Build PDF + run: npx docusaurus-prince-pdf -u https://meshtastic.org/docs/about/ --dest ./pdf --output ./pdf/Meshtastic-Documentation.pdf + + - name: Fetch GitHub App Installation Access Token + id: generate_token + uses: tibdex/github-app-token@v2 + with: + app_id: ${{ secrets.APP_ID }} + private_key: ${{ secrets.APP_PRIVATE_KEY }} + + - name: Commit and push PDF to the artifacts repository + run: | + git config --global user.email "github-actions[bot]@users.noreply.github.com" + git config --global user.name "GitHub Actions Bot" + git clone --single-branch -b docs https://github.com/meshtastic/artifacts.git --depth=1 + DATE_TIME=$(date +'%Y-%m-%d_%H-%M-%S') + mv ./pdf/Meshtastic-Documentation.pdf ./artifacts/Meshtastic-Documentation-${DATE_TIME}_${{ github.sha }}.pdf + cd artifacts + git add . + git commit -m "Auto generated PDF documentation ${DATE_TIME}" + git push --set-upstream https://x-access-token:${{ steps.generate_token.outputs.token }}@github.com/meshtastic/artifacts.git docs diff --git a/.gitignore b/.gitignore index fc1fbbcc..48aca114 100644 --- a/.gitignore +++ b/.gitignore @@ -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 \ No newline at end of file +*.code-workspace diff --git a/package.json b/package.json index be6b0b81..ae2fcedd 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "swizzle": "docusaurus swizzle", "serve": "docusaurus serve", "clear": "docusaurus clear", - "pdf": "pnpm docusaurus-prince-pdf -u http://localhost:3000/docs/about/ --dest ./static/documents/pdf --output ./static/documents/pdf/Meshtastic-Documentation.pdf" + "pdf": "npm docusaurus-prince-pdf -u https://meshtastic.org/docs/about/ --dest ./static/documents/pdf --output ./static/documents/pdf/Meshtastic-Documentation.pdf" }, "dependencies": { "@algolia/client-search": "^4.22.1", From 68c5e1e022a737f225cc84e7d54057de7ffa56cb Mon Sep 17 00:00:00 2001 From: "thomas.ekstrand" Date: Sat, 24 Feb 2024 15:45:04 -0600 Subject: [PATCH 04/40] print css for pdf generation --- .github/workflows/pdf.yml | 2 +- package.json | 2 +- src/css/custom.css | 12 +++++++++++- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pdf.yml b/.github/workflows/pdf.yml index 7adb4219..04569eee 100644 --- a/.github/workflows/pdf.yml +++ b/.github/workflows/pdf.yml @@ -26,7 +26,7 @@ jobs: git config --global user.email "github-actions[bot]@users.noreply.github.com" git config --global user.name "GitHub Actions Bot" git clone --single-branch -b docs https://github.com/meshtastic/artifacts.git --depth=1 - DATE_TIME=$(date +'%Y-%m-%d_%H-%M-%S') + DATE_TIME=$(date +'%Y-%m-%d_%H-%M') mv ./pdf/Meshtastic-Documentation.pdf ./artifacts/Meshtastic-Documentation-${DATE_TIME}_${{ github.sha }}.pdf cd artifacts git add . diff --git a/package.json b/package.json index ae2fcedd..3ef96f22 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "swizzle": "docusaurus swizzle", "serve": "docusaurus serve", "clear": "docusaurus clear", - "pdf": "npm docusaurus-prince-pdf -u https://meshtastic.org/docs/about/ --dest ./static/documents/pdf --output ./static/documents/pdf/Meshtastic-Documentation.pdf" + "pdf": "npx docusaurus-prince-pdf -u http://localhost:3000/docs/hardware/devices/rak/base-board/ --dest ./static/documents/pdf --output ./static/documents/pdf/Meshtastic-Documentation.pdf" }, "dependencies": { "@algolia/client-search": "^4.22.1", diff --git a/src/css/custom.css b/src/css/custom.css index bc9db741..7c784021 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -228,4 +228,14 @@ th, td { padding-left: 10px !important; padding-right: 10px !important; -} \ No newline at end of file +} + +/* Need all tab content to show for PDF generation */ +@media print { + ul.tabs { + display: none; + } + .tabs-container div > div { + display: block; + } +} From bfa6b35f2adab610c08051764b7386115f985b88 Mon Sep 17 00:00:00 2001 From: "thomas.ekstrand" Date: Sat, 24 Feb 2024 15:59:32 -0600 Subject: [PATCH 05/40] move docusaurus-prince-pdf to dev deps --- package.json | 4 +- pnpm-lock.yaml | 115 +++++++++++++++++++------------------------------ 2 files changed, 46 insertions(+), 73 deletions(-) diff --git a/package.json b/package.json index 3ef96f22..4a3d6ea5 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "swizzle": "docusaurus swizzle", "serve": "docusaurus serve", "clear": "docusaurus clear", - "pdf": "npx docusaurus-prince-pdf -u http://localhost:3000/docs/hardware/devices/rak/base-board/ --dest ./static/documents/pdf --output ./static/documents/pdf/Meshtastic-Documentation.pdf" + "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", @@ -25,7 +25,6 @@ "autoprefixer": "^10.4.17", "base64-js": "^1.5.1", "clsx": "^2.1.0", - "docusaurus-prince-pdf": "^1.2.1", "dotenv": "^16.4.4", "postcss": "^8.4.35", "react": "^18.2.0", @@ -46,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" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 16b23c9a..836963b1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -41,9 +41,6 @@ dependencies: clsx: specifier: ^2.1.0 version: 2.1.0 - docusaurus-prince-pdf: - specifier: ^1.2.1 - version: 1.2.1 dotenv: specifier: ^16.4.4 version: 16.4.4 @@ -100,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 @@ -2722,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==} @@ -2899,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==} @@ -2916,7 +2914,7 @@ packages: /@tootallnate/once@2.0.0: resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} - dev: false + dev: true /@trysound/sax@0.2.0: resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} @@ -3033,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==} @@ -3321,7 +3318,7 @@ packages: /abab@2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} deprecated: Use your platform's native atob() and btoa() methods instead - dev: false + dev: true /accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} @@ -3367,7 +3364,7 @@ packages: debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: false + dev: true /aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} @@ -3524,7 +3521,7 @@ packages: /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: false + dev: true /at-least-node@1.0.0: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} @@ -3727,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==} @@ -3740,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==} @@ -3932,7 +3927,7 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - dev: false + dev: true /clone-deep@4.0.1: resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} @@ -3987,7 +3982,7 @@ packages: engines: {node: '>= 0.8'} dependencies: delayed-stream: 1.0.0 - dev: false + dev: true /comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} @@ -4405,7 +4400,7 @@ packages: engines: {node: '>=14'} dependencies: rrweb-cssom: 0.6.0 - dev: false + dev: true /csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} @@ -4712,7 +4707,7 @@ packages: abab: 2.0.6 whatwg-mimetype: 3.0.0 whatwg-url: 12.0.1 - dev: false + dev: true /dayjs@1.11.10: resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} @@ -4746,7 +4741,7 @@ packages: /decimal.js@10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} - dev: false + dev: true /decode-named-character-reference@1.0.2: resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} @@ -4758,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==} @@ -4780,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==} @@ -4828,7 +4821,7 @@ packages: /delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} - dev: false + dev: true /depd@1.1.2: resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} @@ -4917,7 +4910,7 @@ packages: - canvas - supports-color - utf-8-validate - dev: false + dev: true /dom-converter@0.2.0: resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} @@ -4951,7 +4944,7 @@ packages: deprecated: Use your platform's native DOMException instead dependencies: webidl-conversions: 7.0.0 - dev: false + dev: true /domhandler@4.3.1: resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} @@ -5062,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==} @@ -5447,7 +5439,6 @@ 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==} @@ -5456,7 +5447,7 @@ packages: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - dev: false + dev: true /format@0.2.2: resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} @@ -5522,7 +5513,7 @@ packages: /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - dev: false + dev: true /get-intrinsic@1.2.4: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} @@ -5542,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==} @@ -5674,7 +5664,7 @@ packages: lowercase-keys: 3.0.0 p-cancelable: 3.0.0 responselike: 3.0.0 - dev: false + dev: true /graceful-fs@4.2.10: resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} @@ -5894,7 +5884,7 @@ packages: engines: {node: '>=12'} dependencies: whatwg-encoding: 2.0.0 - dev: false + dev: true /html-entities@2.4.0: resolution: {integrity: sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==} @@ -5985,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==} @@ -6025,7 +6014,7 @@ packages: debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: false + dev: true /http-proxy-middleware@2.0.6(@types/express@4.17.21): resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} @@ -6063,7 +6052,6 @@ 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==} @@ -6073,7 +6061,7 @@ packages: debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: false + dev: true /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} @@ -6092,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==} @@ -6328,7 +6315,7 @@ packages: /is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - dev: false + dev: true /is-reference@3.0.2: resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} @@ -6486,7 +6473,7 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: false + dev: true /jsesc@0.5.0: resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} @@ -6501,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==} @@ -6531,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==} @@ -6675,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==} @@ -7564,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==} @@ -7701,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==} @@ -7722,7 +7703,7 @@ packages: /nwsapi@2.2.7: resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} - dev: false + dev: true /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} @@ -7797,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==} @@ -7922,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==} @@ -8552,7 +8531,7 @@ packages: /psl@1.9.0: resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - dev: false + dev: true /punycode@1.4.1: resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} @@ -8578,7 +8557,7 @@ packages: /querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - dev: false + dev: true /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -8592,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==} @@ -9047,7 +9025,7 @@ packages: /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - dev: false + dev: true /require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} @@ -9060,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==} @@ -9088,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==} @@ -9112,7 +9087,7 @@ packages: /rrweb-cssom@0.6.0: resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} - dev: false + dev: true /rtl-detect@1.1.2: resolution: {integrity: sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ==} @@ -9154,7 +9129,6 @@ packages: /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: false /sax@1.3.0: resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} @@ -9165,7 +9139,7 @@ packages: engines: {node: '>=v12.22.7'} dependencies: xmlchars: 2.2.0 - dev: false + dev: true /scheduler@0.23.0: resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} @@ -9681,7 +9655,7 @@ packages: /symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - dev: false + dev: true /tailwindcss@3.4.1: resolution: {integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==} @@ -9811,14 +9785,14 @@ packages: punycode: 2.3.1 universalify: 0.2.0 url-parse: 1.5.10 - dev: false + dev: true /tr46@4.1.1: resolution: {integrity: sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==} engines: {node: '>=14'} dependencies: punycode: 2.3.1 - dev: false + dev: true /trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} @@ -9990,7 +9964,7 @@ packages: /universalify@0.2.0: resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} engines: {node: '>= 4.0.0'} - dev: false + dev: true /universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} @@ -10059,7 +10033,7 @@ packages: dependencies: querystringify: 2.2.0 requires-port: 1.0.0 - dev: false + dev: true /use-sync-external-store@1.2.0(react@18.2.0): resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} @@ -10140,7 +10114,7 @@ packages: engines: {node: '>=14'} dependencies: xml-name-validator: 4.0.0 - dev: false + dev: true /watchpack@2.4.0: resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} @@ -10166,7 +10140,7 @@ packages: /webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} - dev: false + dev: true /webpack-bundle-analyzer@4.10.1: resolution: {integrity: sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ==} @@ -10339,12 +10313,12 @@ packages: engines: {node: '>=12'} dependencies: iconv-lite: 0.6.3 - dev: false + dev: true /whatwg-mimetype@3.0.0: resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} engines: {node: '>=12'} - dev: false + dev: true /whatwg-url@12.0.1: resolution: {integrity: sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==} @@ -10352,7 +10326,7 @@ packages: dependencies: tr46: 4.1.1 webidl-conversions: 7.0.0 - dev: false + dev: true /which@1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} @@ -10431,7 +10405,6 @@ packages: optional: true utf-8-validate: optional: true - dev: false /xdg-basedir@5.1.0: resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} @@ -10448,16 +10421,16 @@ packages: /xml-name-validator@4.0.0: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} - dev: false + dev: true /xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - dev: false + dev: true /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - dev: false + dev: true /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} @@ -10479,7 +10452,7 @@ packages: /yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - dev: false + dev: true /yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} @@ -10492,7 +10465,7 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 21.1.1 - dev: false + dev: true /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} From ccf59fe6786575ebd2e7ccc2a8899dbe223ce48d Mon Sep 17 00:00:00 2001 From: "thomas.ekstrand" Date: Sat, 24 Feb 2024 16:15:56 -0600 Subject: [PATCH 06/40] update pdf generation to run once per day --- .github/workflows/pdf.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/pdf.yml b/.github/workflows/pdf.yml index 04569eee..4cb3fdba 100644 --- a/.github/workflows/pdf.yml +++ b/.github/workflows/pdf.yml @@ -1,5 +1,7 @@ name: Generate Documentation PDF -on: [push] +on: + schedule: + - cron: '0 0 * * *' jobs: build: runs-on: ubuntu-latest From 64bbbf98aa6d66c549bb80290b6832d80c91b919 Mon Sep 17 00:00:00 2001 From: "thomas.ekstrand" Date: Sat, 24 Feb 2024 16:19:11 -0600 Subject: [PATCH 07/40] only run github action on meshtastic/meshtastic master --- .github/workflows/pdf.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/pdf.yml b/.github/workflows/pdf.yml index 4cb3fdba..1b0f0bd4 100644 --- a/.github/workflows/pdf.yml +++ b/.github/workflows/pdf.yml @@ -4,6 +4,7 @@ on: - cron: '0 0 * * *' jobs: build: + if: github.repository == 'meshtastic/meshtastic' && github.ref == 'refs/heads/master' runs-on: ubuntu-latest steps: - name: Install Prince From 3566d1b38b2601dcc7f7791fce636d74633cf325 Mon Sep 17 00:00:00 2001 From: "thomas.ekstrand" Date: Sat, 24 Feb 2024 19:11:38 -0600 Subject: [PATCH 08/40] use same action types as firmware --- .github/workflows/pdf.yml | 45 ++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/.github/workflows/pdf.yml b/.github/workflows/pdf.yml index 1b0f0bd4..71a081f5 100644 --- a/.github/workflows/pdf.yml +++ b/.github/workflows/pdf.yml @@ -1,12 +1,25 @@ name: Generate Documentation PDF on: - schedule: - - cron: '0 0 * * *' + # # Triggers the workflow on push but only for the master branch + push: + branches: [master] + + # Note: This is different from "pull_request". Need to specify ref when doing checkouts. + pull_request_target: + branches: [master] + paths-ignore: + - "**.md" jobs: build: if: github.repository == 'meshtastic/meshtastic' && github.ref == 'refs/heads/master' 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-14.2-linux-generic-x86_64.tar.gz -O @@ -15,23 +28,15 @@ jobs: yes "" | sudo ./install.sh - name: Build PDF - run: npx docusaurus-prince-pdf -u https://meshtastic.org/docs/about/ --dest ./pdf --output ./pdf/Meshtastic-Documentation.pdf + run: npx docusaurus-prince-pdf -u https://meshtastic.org/docs/about/ --dest ./pdf --output ./pdf/${{ steps.filename.outputs.filename }} - - name: Fetch GitHub App Installation Access Token - id: generate_token - uses: tibdex/github-app-token@v2 + - name: Create request artifacts + if: ${{ github.event_name == 'pull_request_target' || github.event_name == 'pull_request' }} + uses: gavv/pull-request-artifacts@v2.1.0 with: - app_id: ${{ secrets.APP_ID }} - private_key: ${{ secrets.APP_PRIVATE_KEY }} - - - name: Commit and push PDF to the artifacts repository - run: | - git config --global user.email "github-actions[bot]@users.noreply.github.com" - git config --global user.name "GitHub Actions Bot" - git clone --single-branch -b docs https://github.com/meshtastic/artifacts.git --depth=1 - DATE_TIME=$(date +'%Y-%m-%d_%H-%M') - mv ./pdf/Meshtastic-Documentation.pdf ./artifacts/Meshtastic-Documentation-${DATE_TIME}_${{ github.sha }}.pdf - cd artifacts - git add . - git commit -m "Auto generated PDF documentation ${DATE_TIME}" - git push --set-upstream https://x-access-token:${{ steps.generate_token.outputs.token }}@github.com/meshtastic/artifacts.git docs + 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: ./pdf/${{ steps.version.outputs.version }} From fa511f880cab6ab824189c1c4949cd0db12f0716 Mon Sep 17 00:00:00 2001 From: "thomas.ekstrand" Date: Sat, 24 Feb 2024 19:18:38 -0600 Subject: [PATCH 09/40] remove double master/fork check --- .github/workflows/pdf.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/pdf.yml b/.github/workflows/pdf.yml index 71a081f5..f147dd1f 100644 --- a/.github/workflows/pdf.yml +++ b/.github/workflows/pdf.yml @@ -11,7 +11,6 @@ on: - "**.md" jobs: build: - if: github.repository == 'meshtastic/meshtastic' && github.ref == 'refs/heads/master' runs-on: ubuntu-latest steps: - name: Get filename with date and sha From 4c4e89d991e2132239bf2d75da604c2f8ae9b9f5 Mon Sep 17 00:00:00 2001 From: pdxlocations Date: Sun, 25 Feb 2024 10:32:13 -0800 Subject: [PATCH 10/40] add android and web client --- docs/configuration/module/paxcounter.mdx | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/configuration/module/paxcounter.mdx b/docs/configuration/module/paxcounter.mdx index 6e24847e..b9d8593b 100644 --- a/docs/configuration/module/paxcounter.mdx +++ b/docs/configuration/module/paxcounter.mdx @@ -37,7 +37,11 @@ values={[ #### 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** + ::: @@ -81,8 +85,8 @@ meshtastic --get paxcounter :::info -No Paxcounter module config options are available in the Web UI. +All Paxcounter module config options are available in the Web UI. ::: - + \ No newline at end of file From 1985712b9b844bcf715ec057cc55f3a0452251a2 Mon Sep 17 00:00:00 2001 From: pdxlocations Date: Sun, 25 Feb 2024 18:30:55 -0800 Subject: [PATCH 11/40] clarify usage --- docs/configuration/module/paxcounter.mdx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/configuration/module/paxcounter.mdx b/docs/configuration/module/paxcounter.mdx index b9d8593b..3e4190a0 100644 --- a/docs/configuration/module/paxcounter.mdx +++ b/docs/configuration/module/paxcounter.mdx @@ -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 From 7dbe07eb39f4c8a177126fdb531b722022c42e93 Mon Sep 17 00:00:00 2001 From: GUVWAF Date: Wed, 28 Feb 2024 20:29:40 +0100 Subject: [PATCH 12/40] Clarify broadcast interval for Device Metrics and NodeInfo --- docs/configuration/module/telemetry.mdx | 4 +++- docs/configuration/radio/device.mdx | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/configuration/module/telemetry.mdx b/docs/configuration/module/telemetry.mdx index d6b4bd5a..bb3ada3f 100644 --- a/docs/configuration/module/telemetry.mdx +++ b/docs/configuration/module/telemetry.mdx @@ -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 diff --git a/docs/configuration/radio/device.mdx b/docs/configuration/radio/device.mdx index a2794b6a..5ba782b0 100644 --- a/docs/configuration/radio/device.mdx +++ b/docs/configuration/radio/device.mdx @@ -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 From 231cc8545ad9915499317aeface3ce5e4f0ae5b9 Mon Sep 17 00:00:00 2001 From: "thomas.ekstrand" Date: Thu, 29 Feb 2024 17:51:43 -0600 Subject: [PATCH 13/40] use filename as var --- .github/workflows/pdf.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pdf.yml b/.github/workflows/pdf.yml index f147dd1f..7cbfac3f 100644 --- a/.github/workflows/pdf.yml +++ b/.github/workflows/pdf.yml @@ -27,10 +27,11 @@ jobs: yes "" | sudo ./install.sh - name: Build PDF - run: npx docusaurus-prince-pdf -u https://meshtastic.org/docs/about/ --dest ./pdf --output ./pdf/${{ steps.filename.outputs.filename }} + run: npx docusaurus-prince-pdf -u https://meshtastic.org/docs/about/ --dest ./ --output ./${{ steps.filename.outputs.filename }} - name: Create request artifacts if: ${{ github.event_name == 'pull_request_target' || github.event_name == 'pull_request' }} + # 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 }} @@ -38,4 +39,4 @@ jobs: artifacts-token: ${{ secrets.ARTIFACTS_TOKEN }} artifacts-repo: meshtastic/artifacts artifacts-branch: docs - artifacts: ./pdf/${{ steps.version.outputs.version }} + artifacts: ./${{ steps.filename.outputs.filename }} From 041c56d813085176f7f16dae43101dcb19881f2f Mon Sep 17 00:00:00 2001 From: "thomas.ekstrand" Date: Thu, 29 Feb 2024 18:19:41 -0600 Subject: [PATCH 14/40] run on merge only --- .github/workflows/pdf.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/pdf.yml b/.github/workflows/pdf.yml index 7cbfac3f..6d4cd166 100644 --- a/.github/workflows/pdf.yml +++ b/.github/workflows/pdf.yml @@ -30,8 +30,7 @@ jobs: run: npx docusaurus-prince-pdf -u https://meshtastic.org/docs/about/ --dest ./ --output ./${{ steps.filename.outputs.filename }} - name: Create request artifacts - if: ${{ github.event_name == 'pull_request_target' || github.event_name == 'pull_request' }} - # if: github.event.pull_request.merged + 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 }} From 51e4689dc6a4c852f9a41cd08511c701da8022d1 Mon Sep 17 00:00:00 2001 From: Tommy Ekstrand Date: Thu, 29 Feb 2024 20:04:51 -0600 Subject: [PATCH 15/40] run pdf action on pull_request (#1064) --- .github/workflows/pdf.yml | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/.github/workflows/pdf.yml b/.github/workflows/pdf.yml index 6d4cd166..bc94bcc7 100644 --- a/.github/workflows/pdf.yml +++ b/.github/workflows/pdf.yml @@ -1,14 +1,9 @@ name: Generate Documentation PDF on: - # # Triggers the workflow on push but only for the master branch - push: - branches: [master] + pull_request: + types: + - closed - # Note: This is different from "pull_request". Need to specify ref when doing checkouts. - pull_request_target: - branches: [master] - paths-ignore: - - "**.md" jobs: build: runs-on: ubuntu-latest From 87c7583e61b9beb123ce20f5f5a3e75373e56b24 Mon Sep 17 00:00:00 2001 From: rcarteraz Date: Thu, 29 Feb 2024 19:52:09 -0700 Subject: [PATCH 16/40] Update index.mdx Heltec v3 has BLE 5.0 --- docs/hardware/devices/index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/hardware/devices/index.mdx b/docs/hardware/devices/index.mdx index f1131a97..888f4a17 100644 --- a/docs/hardware/devices/index.mdx +++ b/docs/hardware/devices/index.mdx @@ -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/3.1](./heltec/?heltec=v23) | ESP32 | SX1262 | 2.4GHz b/g/n | 4.2 | NO | +| [LoRa32 V3/3.1](./heltec/?heltec=v23) | ESP32 | 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 | From 6a9e4682574fbcdca70507032c738022a6c74bf8 Mon Sep 17 00:00:00 2001 From: rcarteraz Date: Thu, 29 Feb 2024 19:55:36 -0700 Subject: [PATCH 17/40] Update index.mdx Update mcu --- docs/hardware/devices/index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/hardware/devices/index.mdx b/docs/hardware/devices/index.mdx index 888f4a17..a749f70e 100644 --- a/docs/hardware/devices/index.mdx +++ b/docs/hardware/devices/index.mdx @@ -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/3.1](./heltec/?heltec=v23) | ESP32 | SX1262 | 2.4GHz b/g/n | 5.0 | 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 | From 7ae88507016105f162152a0ab0a86994d9ad48ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?TC=C2=B2?= <130875305+TheCommsChannel@users.noreply.github.com> Date: Fri, 1 Mar 2024 10:11:04 -0500 Subject: [PATCH 18/40] Update home-assistant.mdx Add info on bug with nrf52 and JSON --- docs/software/integrations/mqtt/home-assistant.mdx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/software/integrations/mqtt/home-assistant.mdx b/docs/software/integrations/mqtt/home-assistant.mdx index cc47fb2a..3e5e346b 100644 --- a/docs/software/integrations/mqtt/home-assistant.mdx +++ b/docs/software/integrations/mqtt/home-assistant.mdx @@ -15,6 +15,13 @@ It is highly recommended to download MQTT Explorer for analyzing the JSON thread ::: +:::info + +Due to a bug with nrf52 devices and JSON, nrf52 devices are not supported for use with Home Assistant +https://github.com/meshtastic/firmware/issues/2804 + +::: + ## Create Meshtastic MQTT Sensor Entities - Ensure your mesh unit is connected to your MQTT broker and using JSON as an output. From 907c3ce215c3743bf99e05efde9d91c289b3289d Mon Sep 17 00:00:00 2001 From: rcarteraz Date: Fri, 1 Mar 2024 08:52:02 -0700 Subject: [PATCH 19/40] changes --- .../software/integrations/mqtt/home-assistant.mdx | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/docs/software/integrations/mqtt/home-assistant.mdx b/docs/software/integrations/mqtt/home-assistant.mdx index 3e5e346b..09a0b68f 100644 --- a/docs/software/integrations/mqtt/home-assistant.mdx +++ b/docs/software/integrations/mqtt/home-assistant.mdx @@ -7,18 +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/ - -::: - -:::info - -Due to a bug with nrf52 devices and JSON, nrf52 devices are not supported for use with Home Assistant -https://github.com/meshtastic/firmware/issues/2804 +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/). ::: From 504eb3aa5f73d610fdf8da3f198d88bc1352193b Mon Sep 17 00:00:00 2001 From: Tommy Ekstrand Date: Fri, 1 Mar 2024 09:53:30 -0600 Subject: [PATCH 20/40] bump prince pdf version to 15.3 latest (#1066) --- .github/workflows/pdf.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pdf.yml b/.github/workflows/pdf.yml index bc94bcc7..62d61d2a 100644 --- a/.github/workflows/pdf.yml +++ b/.github/workflows/pdf.yml @@ -16,7 +16,7 @@ jobs: - name: Install Prince run: | - curl https://www.princexml.com/download/prince-14.2-linux-generic-x86_64.tar.gz -O + curl https://www.princexml.com/download/prince-15.3-linux-generic-x86_64.tar.gz -O tar zxf prince-14.2-linux-generic-x86_64.tar.gz cd prince-14.2-linux-generic-x86_64 yes "" | sudo ./install.sh From 285ae1b6c18ecd7e1e54797fa084987a2b7fc5fa Mon Sep 17 00:00:00 2001 From: Tommy Ekstrand Date: Fri, 1 Mar 2024 10:40:29 -0600 Subject: [PATCH 21/40] bump prince pdf version to 15.3 latest (#1068) --- .github/workflows/pdf.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pdf.yml b/.github/workflows/pdf.yml index 62d61d2a..1fd43444 100644 --- a/.github/workflows/pdf.yml +++ b/.github/workflows/pdf.yml @@ -17,8 +17,8 @@ jobs: - name: Install Prince run: | curl https://www.princexml.com/download/prince-15.3-linux-generic-x86_64.tar.gz -O - tar zxf prince-14.2-linux-generic-x86_64.tar.gz - cd prince-14.2-linux-generic-x86_64 + 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 From 47afb1192487b638c4b028bb03dffdda4a1b4f5d Mon Sep 17 00:00:00 2001 From: rcarteraz Date: Fri, 1 Mar 2024 14:21:10 -0700 Subject: [PATCH 22/40] Update store-and-forward-module.mdx S&F configs in Apple now. --- docs/configuration/module/store-and-forward-module.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/configuration/module/store-and-forward-module.mdx b/docs/configuration/module/store-and-forward-module.mdx index 4f1ec936..b0930559 100644 --- a/docs/configuration/module/store-and-forward-module.mdx +++ b/docs/configuration/module/store-and-forward-module.mdx @@ -118,7 +118,7 @@ Store and Forward Config options are available for Android. #### Apple :::info -Store and Forward configuration is not currently available via the Apple clients. +All Store & Forward module config options are available on iOS, iPadOS and macOS at Settings > Module Configuration > Store & Forward. ::: From 4fd6bc7529f36c7cfd9e83743f1829c5470734a1 Mon Sep 17 00:00:00 2001 From: rcarteraz Date: Fri, 1 Mar 2024 15:08:51 -0700 Subject: [PATCH 23/40] Update lora.mdx change channel number to frequency slot --- docs/configuration/radio/lora.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/configuration/radio/lora.mdx b/docs/configuration/radio/lora.mdx index 4d1ea645..3d012813 100644 --- a/docs/configuration/radio/lora.mdx +++ b/docs/configuration/radio/lora.mdx @@ -100,9 +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". +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). If set to `0`/UNSET, the device reverts to the older channel name hash-based algorithm for determining the frequency slot. :::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. From 20555585cf4d79de1bef3f19ac3c6c417b949596 Mon Sep 17 00:00:00 2001 From: rcarteraz Date: Fri, 1 Mar 2024 15:13:46 -0700 Subject: [PATCH 24/40] Update FrequencyCalculator.tsx change channel references to slot --- src/components/tools/FrequencyCalculator.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/tools/FrequencyCalculator.tsx b/src/components/tools/FrequencyCalculator.tsx index d66dd227..029072f6 100644 --- a/src/components/tools/FrequencyCalculator.tsx +++ b/src/components/tools/FrequencyCalculator.tsx @@ -356,12 +356,12 @@ export const FrequencyCalculator = (): JSX.Element => {
- +
- +
From ed42ae81b42948c38b68091b405341eb80e6e061 Mon Sep 17 00:00:00 2001 From: rcarteraz Date: Fri, 1 Mar 2024 15:16:24 -0700 Subject: [PATCH 25/40] Update radio-settings.mdx change channel calculator to frequency slot calculator --- docs/about/overview/radio-settings.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/about/overview/radio-settings.mdx b/docs/about/overview/radio-settings.mdx index b703bbdd..2ff2c7bd 100644 --- a/docs/about/overview/radio-settings.mdx +++ b/docs/about/overview/radio-settings.mdx @@ -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 From 0bdedb1c3f81eec47ec5e7589dd7a801983d11c9 Mon Sep 17 00:00:00 2001 From: rcarteraz Date: Fri, 1 Mar 2024 15:19:31 -0700 Subject: [PATCH 26/40] frequency of slot --- src/components/tools/FrequencyCalculator.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/tools/FrequencyCalculator.tsx b/src/components/tools/FrequencyCalculator.tsx index 029072f6..76f9309a 100644 --- a/src/components/tools/FrequencyCalculator.tsx +++ b/src/components/tools/FrequencyCalculator.tsx @@ -375,7 +375,7 @@ export const FrequencyCalculator = (): JSX.Element => {
- +
From 53acb00348638b90238206d8dd3c33b2f15076f5 Mon Sep 17 00:00:00 2001 From: rcarteraz Date: Fri, 1 Mar 2024 15:22:43 -0700 Subject: [PATCH 27/40] remove admonition --- docs/configuration/radio/lora.mdx | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/docs/configuration/radio/lora.mdx b/docs/configuration/radio/lora.mdx index 3d012813..29c4cb6d 100644 --- a/docs/configuration/radio/lora.mdx +++ b/docs/configuration/radio/lora.mdx @@ -102,11 +102,7 @@ Defaults to true ### Frequency Slot -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). If set to `0`/UNSET, the device reverts to the older channel name hash-based algorithm for determining the frequency slot. - -:::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 From b74b71aca4a850f0e2e10cf0a36bae658826a186 Mon Sep 17 00:00:00 2001 From: rcarteraz Date: Fri, 1 Mar 2024 15:31:53 -0700 Subject: [PATCH 28/40] update FIXME for RAK under Linux --- .../serial-drivers/test-serial-driver-installation.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/getting-started/serial-drivers/test-serial-driver-installation.mdx b/docs/getting-started/serial-drivers/test-serial-driver-installation.mdx index f22f1482..a5e5539f 100644 --- a/docs/getting-started/serial-drivers/test-serial-driver-installation.mdx +++ b/docs/getting-started/serial-drivers/test-serial-driver-installation.mdx @@ -39,7 +39,7 @@ values={[ # or ID xxxx:xxxx QinHeng Electronics USB Single Serial # or - FIXME (WISBLOCK OUTPUT) + ID xxxx:xxxx Adafruit WisCore RAK4631 Board ``` From ff773fac9cb09b36b6c5828b314557bb25b115df Mon Sep 17 00:00:00 2001 From: Tommy Ekstrand Date: Fri, 1 Mar 2024 17:11:06 -0600 Subject: [PATCH 29/40] Clean up admonitions on power (#1069) * clean up admonitions on power * typos and simplification --- docs/configuration/radio/power.mdx | 104 +++++++++++++++-------------- 1 file changed, 55 insertions(+), 49 deletions(-) diff --git a/docs/configuration/radio/power.mdx b/docs/configuration/radio/power.mdx index 86d58794..ff3e089e 100644 --- a/docs/configuration/radio/power.mdx +++ b/docs/configuration/radio/power.mdx @@ -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 - - - - - - - - - - - - - - - - - - -
Battery Charge Percent: - -
Current Adc Multiplier: - -
Calculated New Operative Adc Multiplier: - -
- -
-::: - -:::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. -::: +
+ ADC Calculator +
+ +

This calibration method only maps 4.2V to Battery Charge Percent 100%, and does not address the potential non-linearities of the ADC.

+
+ + + + + + + + + + + + + + + + + +
Battery Charge Percent: + +
Current Adc Multiplier: + +
Calculated New Operative Adc Multiplier: + +
+ +
+
+
### 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. ::: From be7891c5cd2555113c7ea78b56a90b524c675a9e Mon Sep 17 00:00:00 2001 From: Tommy Ekstrand Date: Sat, 2 Mar 2024 09:42:47 -0600 Subject: [PATCH 30/40] improve title/meta description for sharing and SEO (#1076) Co-authored-by: rcarteraz --- docs/hardware/devices/index.mdx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/hardware/devices/index.mdx b/docs/hardware/devices/index.mdx index a749f70e..6a9ddbea 100644 --- a/docs/hardware/devices/index.mdx +++ b/docs/hardware/devices/index.mdx @@ -1,6 +1,7 @@ --- id: devices -title: Devices +title: Devices | Supported Hardware Overview +description: Detailed documentation on Meshtastic supported devices, including hardware specifications, performance comparisons, and guides. sidebar_label: Devices sidebar_position: 1 --- From 7a8654934a177ac1a3a1b72b3f2b056d2c02beea Mon Sep 17 00:00:00 2001 From: "thomas.ekstrand" Date: Fri, 1 Mar 2024 17:47:41 -0600 Subject: [PATCH 31/40] Increase clarity around Power Saving and ROUTER --- docs/configuration/radio/device.mdx | 28 +++++++++++++++------------- docs/configuration/radio/power.mdx | 8 +++++++- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/docs/configuration/radio/device.mdx b/docs/configuration/radio/device.mdx index 5ba782b0..c9fd035e 100644 --- a/docs/configuration/radio/device.mdx +++ b/docs/configuration/radio/device.mdx @@ -30,20 +30,22 @@ The device config options are: Role, Serial Output, and Debug Log. Device config This table shows the **default** values after selecting a preset. As always, individual settings can be adjusted after choosing a preset. -| Device Role | Bluetooth/Wi-Fi Enabled | Screen Enabled | Power Consumption | Retransmit | Prioritized Routing | Visible in Nodes List | -| -------------- | ----------------------- | -------------- | ----------------- | ---------- | ------------------- | --------------------- | -| CLIENT | Yes | Yes | Regular | Yes | No | Yes | -| CLIENT_MUTE | Yes | Yes | Lowest | No | No | Yes | -| CLIENT_HIDDEN | Yes | Yes | Lowest | Local only | No | No | -| TRACKER | Yes | No | Regular | No | No | Yes | -| LOST_AND_FOUND | Yes | No | Regular | No | No | Yes | -| SENSOR | Yes | No | High | No | No | Yes | -| TAK | Yes | Optional | Regular | Yes | No | Yes | -| TAK_TRACKER | Yes | Optional | Regular | Yes | No | Yes | -| ROUTER | No | No | High | Yes | Yes | Yes | -| ROUTER_CLIENT | Yes | Yes | Highest | Yes | Yes | Yes | -| REPEATER | Yes | No | High | Yes | Yes | No | +| Device Role | BLE/WiFi/Serial | Screen Enabled | Power Consumption | Retransmit | Prioritized Routing | Visible in Nodes List | +| -------------- | --------------- | -------------- | ----------------- | ---------- | ------------------- | --------------------- | +| CLIENT | Yes | Yes | Regular | Yes | No | Yes | +| CLIENT_MUTE | Yes | Yes | Lowest | No | No | Yes | +| CLIENT_HIDDEN | Yes | Yes | Lowest | Local only | No | No | +| TRACKER | Yes | No | Regular | No | No | Yes | +| LOST_AND_FOUND | Yes | No | Regular | No | No | Yes | +| SENSOR | Yes | No | High | No | No | Yes | +| TAK | Yes | Optional | Regular | Yes | No | Yes | +| TAK_TRACKER | Yes | Optional | Regular | Yes | No | Yes | +| ROUTER | No1 | No | High | Yes | Yes | Yes | +| ROUTER_CLIENT | Yes | Yes | Highest | Yes | Yes | Yes | +| REPEATER | Yes | No | High | Yes | Yes | No | +##### Citations +1. Caution: The Router role enables [Power Saving](/docs/configuration/radio/power/#power-saving) by default. Consider ROUTER_CLIENT if BLE/WiFi/Serial are still needed. ### Rebroadcast Mode diff --git a/docs/configuration/radio/power.mdx b/docs/configuration/radio/power.mdx index ff3e089e..db3c2962 100644 --- a/docs/configuration/radio/power.mdx +++ b/docs/configuration/radio/power.mdx @@ -19,7 +19,13 @@ The power config options are: Power Saving, Shutdown after losing power, ADC Mul ### Power Saving -If set, Bluetooth, Wifi, and screen (if applicable) are turned off. When using the Router device role, this setting is on by default. The assumption for a Router is that the device will be used in a standalone manner where these features are not needed, and will be shut off to conserve power. This is especially useful when a device is powered from a low-current source (i.e. solar). +:::warning +Enabling Power Saving will disable Bluetooth, Serial, and WiFi, preventing further changes to the device. Press the user button or reset the device to make changes. +::: + +If enabled, turns off Bluetooth, Serial, WiFi, and Screen. Useful when a device is powered from a low-current source (i.e. solar). To see device roles this is enabled for by default, visit [Device Config](/docs/configuration/radio/device). + + ### Shutdown after losing power From 8de74bb3f6648290bc78216005fc9141dd8949e9 Mon Sep 17 00:00:00 2001 From: "thomas.ekstrand" Date: Sat, 2 Mar 2024 09:53:40 -0600 Subject: [PATCH 32/40] use footnote, update sleep warning --- docs/configuration/radio/device.mdx | 5 ++--- docs/configuration/radio/power.mdx | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/configuration/radio/device.mdx b/docs/configuration/radio/device.mdx index c9fd035e..00c1d3b5 100644 --- a/docs/configuration/radio/device.mdx +++ b/docs/configuration/radio/device.mdx @@ -40,12 +40,11 @@ This table shows the **default** values after selecting a preset. As always, ind | SENSOR | Yes | No | High | No | No | Yes | | TAK | Yes | Optional | Regular | Yes | No | Yes | | TAK_TRACKER | Yes | Optional | Regular | Yes | No | Yes | -| ROUTER | No1 | No | High | Yes | Yes | Yes | +| ROUTER | No[^1] | No | High | Yes | Yes | Yes | | ROUTER_CLIENT | Yes | Yes | Highest | Yes | Yes | Yes | | REPEATER | Yes | No | High | Yes | Yes | No | -##### Citations -1. Caution: The Router role enables [Power Saving](/docs/configuration/radio/power/#power-saving) by default. Consider ROUTER_CLIENT if BLE/WiFi/Serial are still needed. +[^1]: The Router role enables [Power Saving](/docs/configuration/radio/power/#power-saving) by default. Consider ROUTER_CLIENT if BLE/WiFi/Serial are still needed. ### Rebroadcast Mode diff --git a/docs/configuration/radio/power.mdx b/docs/configuration/radio/power.mdx index db3c2962..d57105c3 100644 --- a/docs/configuration/radio/power.mdx +++ b/docs/configuration/radio/power.mdx @@ -20,7 +20,7 @@ The power config options are: Power Saving, Shutdown after losing power, ADC Mul ### Power Saving :::warning -Enabling Power Saving will disable Bluetooth, Serial, and WiFi, preventing further changes to the device. Press the user button or reset the device to make changes. +If enabled, to modify settings afterward, wake the device by pressing the user button or resetting. ::: If enabled, turns off Bluetooth, Serial, WiFi, and Screen. Useful when a device is powered from a low-current source (i.e. solar). To see device roles this is enabled for by default, visit [Device Config](/docs/configuration/radio/device). From 3ca467716dcb58758cb55cf3e67b261dfb73553d Mon Sep 17 00:00:00 2001 From: "thomas.ekstrand" Date: Sat, 2 Mar 2024 09:55:03 -0600 Subject: [PATCH 33/40] update power saving description --- docs/configuration/radio/power.mdx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/configuration/radio/power.mdx b/docs/configuration/radio/power.mdx index d57105c3..7b54d7f0 100644 --- a/docs/configuration/radio/power.mdx +++ b/docs/configuration/radio/power.mdx @@ -23,9 +23,7 @@ The power config options are: Power Saving, Shutdown after losing power, ADC Mul If enabled, to modify settings afterward, wake the device by pressing the user button or resetting. ::: -If enabled, turns off Bluetooth, Serial, WiFi, and Screen. Useful when a device is powered from a low-current source (i.e. solar). To see device roles this is enabled for by default, visit [Device Config](/docs/configuration/radio/device). - - +When activated, this feature disables Bluetooth, Serial, WiFi, and the device's screen to conserve power. This is particularly beneficial for devices relying on low-current power sources, like solar panels. For details on which device roles have this feature enabled by default, please check the [Device Config](/docs/configuration/radio/device) section. ### Shutdown after losing power From bf967fc9ebadb093dc7134fc0df1ac9db86b3ef3 Mon Sep 17 00:00:00 2001 From: rcarteraz Date: Sat, 2 Mar 2024 12:09:25 -0700 Subject: [PATCH 34/40] --noproto usage example --- docs/software/python-cli/usage.mdx | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/docs/software/python-cli/usage.mdx b/docs/software/python-cli/usage.mdx index 65a765af..e7758507 100644 --- a/docs/software/python-cli/usage.mdx +++ b/docs/software/python-cli/usage.mdx @@ -12,6 +12,23 @@ This section covers using the "meshtastic" command line executable, which displa The `meshtastic` command is not run within python but is a script run from your operating system shell prompt. When you type "meshtastic" and the prompt is unable to find the command in Windows, check that the python "scripts" directory [is in your path](https://datatofish.com/add-python-to-windows-path). ::: +## Viewing Serial Output + +The `--noproto` command in the Meshtastic Python CLI is used to disable the API and function merely as a "dumb serial terminal." This mode of operation allows both the API and device functionalities to remain accessible for regular use, while simultaneously providing a window into the raw serial output. This feature can be particularly useful for debugging, development, or understanding the low-level communication between devices. + +```shell title="Example Usage" +user@host: meshtastic --noproto +# You should see a result similar to this: +WARNING file:mesh_interface.py _sendToRadio line:681 Not sending packet because protocol use is disabled by noProto +Connected to radio +WARNING file:mesh_interface.py _sendPacket line:531 Not sending packet because protocol use is disabled by noProto +INFO | 18:38:04 711 [DeviceTelemetryModule] (Sending): air_util_tx=0.116361, channel_utilization=1.916667, battery_level=101, voltage=4.171000 +DEBUG | 18:38:04 711 [DeviceTelemetryModule] updateTelemetry LOCAL +DEBUG | 18:38:04 711 [DeviceTelemetryModule] Node status update: 2 online, 4 total +INFO | 18:38:04 711 [DeviceTelemetryModule] Sending packet to phone +INFO | 18:38:04 711 Telling client we have new packets 28 +``` + ## Getting a list of User Preferences You can get a list of user preferences by running '--get' with an invalid attribute such as 'all'. From 82713c5d987454641f1fdc6cf0669a1924ff45fb Mon Sep 17 00:00:00 2001 From: rcarteraz Date: Sat, 2 Mar 2024 12:20:10 -0700 Subject: [PATCH 35/40] results --- docs/software/python-cli/usage.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/software/python-cli/usage.mdx b/docs/software/python-cli/usage.mdx index e7758507..1163cec8 100644 --- a/docs/software/python-cli/usage.mdx +++ b/docs/software/python-cli/usage.mdx @@ -18,7 +18,7 @@ The `--noproto` command in the Meshtastic Python CLI is used to disable the API ```shell title="Example Usage" user@host: meshtastic --noproto -# You should see a result similar to this: +# You should see results similar to this: WARNING file:mesh_interface.py _sendToRadio line:681 Not sending packet because protocol use is disabled by noProto Connected to radio WARNING file:mesh_interface.py _sendPacket line:531 Not sending packet because protocol use is disabled by noProto From e316e01d0098dcdbcd49be8836e48079f5450e15 Mon Sep 17 00:00:00 2001 From: rcarteraz Date: Sat, 2 Mar 2024 12:38:35 -0700 Subject: [PATCH 36/40] update docusaurus config --- docusaurus.config.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docusaurus.config.js b/docusaurus.config.js index d7e177d5..f71413e0 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -102,6 +102,9 @@ const config = { }, }, }, + prism: { + additionalLanguages: ["shell-session", "bash"], + }, }, plugins: [ () => { From 95e3e74f1ec2ba4a14f54adf47f7d265743059e1 Mon Sep 17 00:00:00 2001 From: "thomas.ekstrand" Date: Sat, 2 Mar 2024 13:53:22 -0600 Subject: [PATCH 37/40] add remote admin to power saving warning --- docs/configuration/radio/power.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/configuration/radio/power.mdx b/docs/configuration/radio/power.mdx index 7b54d7f0..e2f2dab9 100644 --- a/docs/configuration/radio/power.mdx +++ b/docs/configuration/radio/power.mdx @@ -20,7 +20,7 @@ The power config options are: Power Saving, Shutdown after losing power, ADC Mul ### Power Saving :::warning -If enabled, to modify settings afterward, wake the device by pressing the user button or resetting. +If enabled, modifications to settings can be made by waking the device through pressing the user button, resetting, or through the [admin channel](/docs/configuration/remote-admin/) for remote administration. ::: When activated, this feature disables Bluetooth, Serial, WiFi, and the device's screen to conserve power. This is particularly beneficial for devices relying on low-current power sources, like solar panels. For details on which device roles have this feature enabled by default, please check the [Device Config](/docs/configuration/radio/device) section. From e905710e6560b99250b43a9a725feb557306b11c Mon Sep 17 00:00:00 2001 From: rcarteraz Date: Sat, 2 Mar 2024 14:17:35 -0700 Subject: [PATCH 38/40] shellsession is good enough --- docs/software/python-cli/usage.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/software/python-cli/usage.mdx b/docs/software/python-cli/usage.mdx index 1163cec8..cd61b8f4 100644 --- a/docs/software/python-cli/usage.mdx +++ b/docs/software/python-cli/usage.mdx @@ -16,8 +16,8 @@ The `meshtastic` command is not run within python but is a script run from your The `--noproto` command in the Meshtastic Python CLI is used to disable the API and function merely as a "dumb serial terminal." This mode of operation allows both the API and device functionalities to remain accessible for regular use, while simultaneously providing a window into the raw serial output. This feature can be particularly useful for debugging, development, or understanding the low-level communication between devices. -```shell title="Example Usage" -user@host: meshtastic --noproto +```shellsession title="Example Usage" +user@host % meshtastic --noproto # You should see results similar to this: WARNING file:mesh_interface.py _sendToRadio line:681 Not sending packet because protocol use is disabled by noProto Connected to radio From 0da042dc095a2a551756fa82c8af4c81e615c49e Mon Sep 17 00:00:00 2001 From: pdxlocations Date: Sat, 2 Mar 2024 22:20:27 -0800 Subject: [PATCH 39/40] can't flash firmware over lora --- docs/about/faq.mdx | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/about/faq.mdx b/docs/about/faq.mdx index 19e8ec6b..98a86321 100644 --- a/docs/about/faq.mdx +++ b/docs/about/faq.mdx @@ -20,6 +20,12 @@ export const Faq = { content: "Everyone contributes in a different way. Join the [Meshtastic Discord](https://discord.gg/ktMAKGBnBs) and introduce yourself. We're all very friendly. If you'd like to pitch in some code, check out the [Development](/docs/developers) menu on the left. If you'd like to contribute financially, please visit our page on [Open Collective](https://opencollective.com/meshtastic) or you may choose to [sponsor a developer](https://github.com/sponsors/meshtastic). Check out [Contributing](/docs/contributing/) for more details.", }, ], + "firmware": [ + { + title: "Can I update my node's firmware over the mesh?", + content: `No, Meshtastic does not support OTA updates over LoRa. Please visit [Flash Firmware](/docs/getting-started/flashing-firmware/) for update options.`, + }, + ], "android": [ { title: "What versions of Android does the Meshtastic Android App require?", @@ -192,6 +198,10 @@ If you use your ham radio license with Meshtastic, consider both the privileges +## Firmware + + + ## Android Client From 590f33a0d10714cebe219344622ef9cdd4876ac1 Mon Sep 17 00:00:00 2001 From: Tavis Date: Sun, 3 Mar 2024 02:05:27 -1000 Subject: [PATCH 40/40] Update adafruit-io.mdx add improved generic code and bitbucket code repo link. --- .../integrations/mqtt/adafruit-io.mdx | 199 ++++++++++++------ 1 file changed, 131 insertions(+), 68 deletions(-) diff --git a/docs/software/integrations/mqtt/adafruit-io.mdx b/docs/software/integrations/mqtt/adafruit-io.mdx index 641158a2..bb5c54e0 100644 --- a/docs/software/integrations/mqtt/adafruit-io.mdx +++ b/docs/software/integrations/mqtt/adafruit-io.mdx @@ -15,11 +15,37 @@ To utilize this script you need to have an Adafruit IO account, a working mqtt b ::: -You will need to modify the script with your Adafruit IO and mqtt credentials and mqtt publisher node id +You will need to modify the ini sample file with your Adafruit IO and mqtt credentials +Code repository is here [https://bitbucket.org/tavdog/mesh_aio_logger/src/main/] + +```ini +[GENERAL] +PRINT_CONFIG = false +; https://pynative.com/list-all-timezones-in-python/ +TIMEZONE = US/Hawaii +CHANNEL_LIST = LongFast,Private + +[MQTT] +SERVER = mqtt.server.net +PORT = 1883 +USERNAME = a +PASSWORD = a + +[AIO] +USER = a +KEY = a +;leave FEED_GROUP as Default is you don't want a separate group. +FEED_GROUP = Default +[LOG] +VOLTAGE = true +MESSAGE = true +POSITION = false +SNR = false +RSSI = false +``` ```python -# Persistent mqtt client, watch for voltage, teleme, message packets and publish them to io -# feeds will be created. free tier maxes out at 10 +# Persistent mqtt client, watch for voltage, telemetry, message packets and publish them to io # Import Adafruit IO REST client. from Adafruit_IO import Client, Feed, Data, RequestError @@ -29,107 +55,129 @@ import os import sys import json import time -import random - import pytz +import configparser + +config = configparser.ConfigParser() +# Read the configuration file +config.read('config.ini') + +if config.getboolean('GENERAL','PRINT_CONFIG'): + # Iterate through sections and options to print all config values + for section in config.sections(): + print(f"[{section}]") + for key, value in config.items(section): + print(f"{key} = {value}") + print() # Add an empty line between sections for better readability + # set your timezone here -timezone = pytz.timezone("US/Hawaii") +TIMEZONE = config['GENERAL']['TIMEZONE'] +CHANNEL_LIST = config['GENERAL']['CHANNEL_LIST'] +MQTT_SERVER = config['MQTT']['SERVER'] +MQTT_PORT = int(config['MQTT']['PORT']) +MQTT_USERNAME = config['MQTT']['USERNAME'] +MQTT_PASSWORD = config['MQTT']['PASSWORD'] +AIO_USER = config['AIO']['USER'] +AIO_KEY = config['AIO']['KEY'] +AIO_FEED_GROUP = config['AIO']['FEED_GROUP'] # leave as Default is you don't want a separate group. +LOG_SNR = config.getboolean('LOG','SNR') +LOG_VOLTAGE = config.getboolean('LOG','VOLTAGE') +LOG_RSSI = config.getboolean('LOG','RSSI') +LOG_MESSAGE = config.getboolean('LOG','MESSAGE') +LOG_POSITION = config.getboolean('LOG','POSITION') -# set your Adafruit IO creds here -AIO_USER = "tavdog" -AIO_KEY = "XXXXXXXXXXXXX" +###### END SETTINGS ###### -# set your MQTT broker information -MQTT_SERVER = "XXXXXXXXXX" -MQTT_PORT = 1883 # default -MQTT_TOPIC_PREFIX = "mesh" # specified when you setup your node to publish mqtt -MQTT_USERNAME = "xxxxxxxxx" -MQTT_PASSWORD = "xxxxxxxxx" - -# your node ID that is publishingn to the MQTT broker -MQTT_NODE_ID = "!387e0248" -# your channel (node must be set to json output) -MQTT_CHANNEL = "LongFast" - -print("\n\n") -client_id = str(random.randint(0, 100)) -mqttClient = mqtt.Client("python_mesh_client_%s" % client_id) # this needs to be kind of unique. mqtt broker will not allow duplicate connections. +my_timezone = pytz.timezone(TIMEZONE) +channel_array = CHANNEL_LIST.split(',') +print("\n") +mqttClient = mqtt.Client("mesh_client_rssi") mqttClient.username_pw_set(MQTT_USERNAME, MQTT_PASSWORD) -mqttClient.connect(MQTT_SERVER, MQTT_PORT) -mqttClient.loop_start() -print("Subscribing to %s/2/json/%s/%s" % (MQTT_TOPIC_PREFIX, MQTT_CHANNEL,MQTT_NODE_ID)) -mqttClient.subscribe("%s/2/json/%s/%s" % (MQTT_TOPIC_PREFIX, MQTT_CHANNEL,MQTT_NODE_ID)) -time.sleep(1) -# you can add more channels here -#mqttClient.subscribe("%s/2/json/MauiMesh/%s" % (MQTT_TOPIC_PREFIX, MQTT_NODE_ID)) +aio = Client(AIO_USER,AIO_KEY) +# bootstrap your node_db here if you want +#node_db = dict() +node_db = { 947782216: 'G1 Kula', + 1839130823: 'HR-Haleakala Repeater', + 1969840052: 'MR8-Magnet Rak 8dbi', +} -aio = Client(AIO_USER, AIO_KEY) - -node_db = dict() -# bootstrap your node_db here if you want. otherwise it will populate eventually but die on restart. -# node_db = { 634792740: 'Tavis Blue', -# 947782216: 'G1 Wailuku', -# 1839130823: 'Giggle Hill', -# 2330585902: 'Ayla Kekona', -# 634717328: 'Nani Hoku', -# 3667835576: 'Rachael'} - +# get feed object or create it if it doesn't exist yet. def get_feed(full_name,kind): name = full_name.split('-')[0] + #print("getting feed: " + name) + if "\\x00" in name or "\\u0000" in name or "\x00" in name: # json don't like emojis + name = full_name.split('-')[1].replace(' ','-').replace('.','-') try: - feed = aio.feeds(f"mesh.{name.lower()}-{kind}") + feed = aio.feeds(f"{AIO_FEED_GROUP}.{name.lower()}-{kind}") except: - print("creating feed:" + kind) + print("creating feed:" + f"{AIO_FEED_GROUP}.{name.lower()}-{kind}") # Create Feed new_feed = Feed(name=f"{name}_{kind}") - feed = aio.create_feed(feed=new_feed,group_key="mesh") + feed = aio.create_feed(feed=new_feed,group_key=AIO_FEED_GROUP) return feed def publish_rssi(data,metadata): name = node_db[data['from']] feed = get_feed(name,"rssi") # use a function here because we will create the feed if it doens't exist already. - print(feed.key + " \t\t: " + str(data['rssi'])) + #print(feed.key + " \t\t: " + str(data['rssi'])) aio.send_data(feed.key, data['rssi'],metadata) def publish_snr(data,metadata): name = node_db[data['from']] feed = get_feed(name,"snr") # use a function here because we will create the feed if it doens't exist already. - print(feed.key + " \t\t: " + str(data['snr'])) + #print(feed.key + " \t\t: " + str(data['snr'])) aio.send_data(feed.key, data['snr'],metadata) def publish_voltage(data,metadata): name = node_db[data['from']] feed = get_feed(name,"voltage") # use a function here because we will create the feed if it doens't exist already. print(feed.key + " \t: " + str(data['payload'].get('voltage',"none"))) - print(feed.key + " \t: " + str(data['payload']['voltage'])) + #print(feed.key + " \t: " + str(data['payload']['voltage'])) aio.send_data(feed.key, data['payload'].get('voltage',0),metadata) def publish_packet(data): - feed = aio.feeds("mesh.messages") + feed = aio.feeds(AIO_FEED_GROUP+".messages") if (data['from'] in node_db): data['fname'] = node_db[data['from']] + if (data['to'] in node_db): + data['tname'] = node_db[data['to']] # trim down the data. we really only want to see the message content + if 'stamp' in data: + stamp = datetime.fromtimestamp(data['timestamp'],my_timezone).strftime('%Y-%m-%d %H:%M:%S') + else: + current_time = datetime.now() # Assuming UTC time + # Convert to the desired timezone (e.g., 'America/Los_Angeles' or your preferred timezone) + current_time = current_time.astimezone(my_timezone) + stamp = current_time.strftime('%Y-%m-%d %H:%M:%S') + trimmed = { 'from' : data.get('fname',None) or data.get('from'), - 'message' : data['payload']['text'], - 'stamp' : datetime.fromtimestamp(data['timestamp'],timezone).strftime('%Y-%m-%d %H:%M:%S'), + 'to' : data.get('tname',None) or data.get('to'), + 'channel' : data['channel'], + 'message' : data['payload'], + 'stamp' : stamp, } aio.send_data(feed.key, json.dumps(trimmed, indent=4)) - + print(trimmed) def on_message(client, userdata, message): - print("\n") - print("message received " ,str(message.payload.decode("utf-8"))) - print("\n") - data = json.loads(str(message.payload.decode("utf-8"))) + try: + data = json.loads(str(message.payload.decode("utf-8"))) + except Exception as e: + print(e) + return # check the topic of the message - if data['type'] == "text": - # publish all message packets to the packet log - publish_packet(data) + if data['type'] == "text" and LOG_MESSAGE: + # publish all message packets to the message log + print(data) + try: + publish_packet(data) + except Exception as e: + print("error in publish:",e) # update node_db if needed if data['type'] == 'nodeinfo': @@ -141,34 +189,49 @@ def on_message(client, userdata, message): # "payload":{"altitude":113,"latitude_i":208759687,"longitude_i":-1565037665 metadata = None - if data['type'] == 'position': + if data['type'] == 'position' and LOG_POSITION: metadata = { 'lat': data['payload']['latitude_i'] / 10000000, #40.726190, 'lon': data['payload']['longitude_i'] / 10000000, #-74.005334, 'ele': data['payload'].get('altitude',None), - 'created_at': datetime.now(timezone), + 'created_at': str(datetime.now(my_timezone)), } # add to the node_db if we know who they are already - +# if metadata: +# print(metadata) + if data['from'] in node_db: try: - if 'rssi' in data and data['rssi'] != 0: - # do the doings + if LOG_RSSI and 'rssi' in data and data['rssi'] != 0: publish_rssi( data, metadata ) - if 'snr' in data and data['snr'] != 0: + if LOG_SNR and 'snr' in data and data['snr'] != 0: publish_snr( data, metadata ) - if 'payload' in data and data['payload'].get('voltage',0) != 0: + if LOG_VOLTAGE and 'payload' in data and 'voltage' in data['payload'] and data['payload'].get('voltage',0) != 0: publish_voltage( data, metadata ) + pass except Exception as e: print("Error sending to IO:", str(e)) mqttClient.on_message = on_message -# loop forever +#def on_log(client, userdata, level, buf): + #print("log: ",buf) + +#mqttClient.on_log=on_log + while(True): - pass + if (not mqttClient.is_connected()) : + print("Connecting to mqtt server") + mqttClient.connect(MQTT_SERVER, MQTT_PORT) + mqttClient.loop_start() + for channel in channel_array: + print("Subscribing to %s" % channel) + mqttClient.subscribe("mesh/2/json/%s/#" % (channel)) + time.sleep(1) + + time.sleep(.01) ```