diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 18466585..066b2d92 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -4,15 +4,9 @@ about: Suggest an idea for this project --- - - - **Is your feature request related to a problem? Please describe.** A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - - - **Describe the solution you'd like** A clear and concise description of what you want to happen. diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 675cc385..cb771162 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,10 +1,6 @@ ## Description: - - ## Checklist: - - [ ] The pull request is done against the latest development branch - - [ ] Only one feature/fix was added per PR and the code change compiles without warnings - - [ ] I accept the [DCO](https://github.com/theengs/gateway/blob/development/docs/participate/development.md#developer-certificate-of-origin). - - + - [ ] I have created the pull request against the latest development branch + - [ ] I have added only one feature/fix per PR and the code change compiles without warnings + - [ ] I accept the [Developer Certificate of Origin (DCO)](https://github.com/theengs/gateway/blob/development/docs/participate/development.md#developer-certificate-of-origin). diff --git a/.vale.ini b/.vale.ini index 61dd701d..25dc1536 100644 --- a/.vale.ini +++ b/.vale.ini @@ -1,10 +1,13 @@ StylesPath = "vale/styles" -MinAlertLevel = warning +MinAlertLevel = suggestion Vocab = Theengs Packages = Google [*.md] BasedOnStyles = Vale, Google +Google.Ellipses = NO +Google.FirstPerson = NO Google.Headings = NO +Google.Parens = NO Google.WordList = NO Google.We = NO diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index bc157623..c75374c4 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -1,3 +1,5 @@ + + # Contributor Covenant Code of Conduct ## Our Pledge @@ -11,7 +13,7 @@ Examples of behavior that contributes to creating a positive environment include * Using welcoming and inclusive language * Being respectful of differing viewpoints and experiences * Gracefully accepting constructive criticism -* Focusing on what is best for the community +* Focusing on what's best for the community * Showing empathy towards other community members Examples of unacceptable behavior by participants include: @@ -26,7 +28,7 @@ Examples of unacceptable behavior by participants include: Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. -Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that aren't aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. ## Scope @@ -36,7 +38,7 @@ This Code of Conduct applies both within project spaces and in public spaces whe Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at untechnophile@gmail.com. The project team reviews and investigates all complaints, and responds in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. -Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. +Project maintainers who don't follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. ## Attribution diff --git a/README.md b/README.md index 1ddba85a..79b8bd00 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,17 @@ -**Theengs Gateway** is a multi-platform, multi devices BLE to MQTT gateway that leverages the [Theengs Decoder library](https://github.com/theengs/decoder). -It retrieves data from a wide range of [BLE sensors](https://decoder.theengs.io/devices/devices.html), including the LYWSD03MMC, CGD1, CGP1W, H5072, H5075, H5102, TH1, TH2, BBQ, CGH1, CGDK2, CGPR1, RuuviTag, WS02, WS08, TPMS, MiScale, LYWSD02, LYWSDCGQ, and MiFlora, and translates this information into a readable JSON format and pushes those to an MQTT broker. +**Theengs Gateway** is a multi-platform, multi devices Bluetooth Low Energy (BLE) to MQTT gateway that leverages the [Theengs Decoder library](https://github.com/theengs/decoder). +It retrieves data from a wide range of [BLE sensors](https://decoder.theengs.io/devices/devices.html), including the LYWSD03MMC, CGD1, CGP1W, H5072, H5075, H5102, TH1, TH2, CGH1, CGDK2, CGPR1, RuuviTag, WS02, WS08, TPMS, MiScale, LYWSD02, LYWSDCGQ, and MiFlora, and translates this information into a readable JSON format and pushes those to an MQTT broker. -Enabling integration to IOT platforms or home automation controllers like [NodeRED](https://nodered.org/), [AWS IOT](https://aws.amazon.com/iot/), [Home Assistant](https://www.home-assistant.io/), [OpenHAB](https://www.openhab.org/), [FHEM](https://fhem.de/), [ioBroker](https://www.iobroker.net/) or [Domoticz](https://domoticz.com/). +Enabling integration to Internet of Things (IoT) platforms or home automation controllers like [NodeRED](https://nodered.org/), [AWS IoT](https://aws.amazon.com/iot/), [Home Assistant](https://www.home-assistant.io/), [OpenHAB](https://www.openhab.org/), [FHEM](https://fhem.de/), [ioBroker](https://www.iobroker.net/) or [Domoticz](https://domoticz.com/). The gateway uses the Bluetooth Low Energy adapter of your Raspberry Pi, Windows, Apple desktop, laptop, or server by leveraging Python and multi-platform libraries. ![Gateway](https://github.com/theengs/home/raw/development/docs/img/Theengs-gateway-raspberry-pi.jpg) -**Theengs Gateway** can be used as a standalone solution or as a complementary solution to [OpenMQTTGateway](https://docs.openmqttgateway.com/) as it uses the same MQTT topic structure and the same payload messages. Your OpenMQTTGateway home automation BLE sensors integration also works with Theengs Gateway. +You can use **Theengs Gateway** as a standalone solution or as a complementary solution to [OpenMQTTGateway](https://docs.openmqttgateway.com/) as it uses the same MQTT topic structure and the same payload messages. Your OpenMQTTGateway home automation BLE sensors integration also works with Theengs Gateway. The gateway retrieves data from BLE sensors from Govee, Xiaomi, Inkbird, Qingping, ThermoBeacon, Blue Maestro and many more. -Full documentation for installation and usage can be found [here](https://theengs.github.io/gateway) +You can find full documentation for installation and usage [here](https://theengs.github.io/gateway) ## Install Theengs Gateway as a pip package Prerequisites: diff --git a/docs/README.md b/docs/README.md index 24ef815a..2a11ee08 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,17 +1,20 @@ --- title: Theengs BLE MQTT gateway --- + + # Theengs BLE MQTT gateway + -**Theengs Gateway** is a multi platforms, multi devices BLE to MQTT gateway that leverages the [Theengs Decoder library](https://github.com/theengs/decoder). -It retrieves data from a wide range of [BLE sensors](https://decoder.theengs.io/devices/devices.html), including the LYWSD03MMC, CGD1, CGP1W, H5072, H5075, H5102, TH1, TH2, BBQ, CGH1, CGDK2, CGPR1, RuuviTag, WS02, WS08, TPMS, MiScale, LYWSD02, LYWSDCGQ, and MiFlora, and translates this information into a readable JSON format and pushes those to an MQTT broker. +**Theengs Gateway** is a multi-platform, multi devices Bluetooth Low Energy (BLE) to MQTT gateway that leverages the [Theengs Decoder library](https://github.com/theengs/decoder). +It retrieves data from a wide range of [BLE sensors](https://decoder.theengs.io/devices/devices.html), including the LYWSD03MMC, CGD1, CGP1W, H5072, H5075, H5102, TH1, TH2, CGH1, CGDK2, CGPR1, RuuviTag, WS02, WS08, TPMS, MiScale, LYWSD02, LYWSDCGQ, and MiFlora, and translates this information into a readable JSON format and pushes those to an MQTT broker. -Enabling integration to IOT platforms or home automation controllers like [NodeRED](https://nodered.org/), [AWS IOT](https://aws.amazon.com/iot/), [Home Assistant](https://www.home-assistant.io/), [OpenHAB](https://www.openhab.org/), [FHEM](https://fhem.de/), [ioBroker](https://www.iobroker.net/) or [Domoticz](https://domoticz.com/). +Enabling integration to Internet of Things (IoT) platforms or home automation controllers like [NodeRED](https://nodered.org/), [AWS IoT](https://aws.amazon.com/iot/), [Home Assistant](https://www.home-assistant.io/), [OpenHAB](https://www.openhab.org/), [FHEM](https://fhem.de/), [ioBroker](https://www.iobroker.net/) or [Domoticz](https://domoticz.com/). The gateway uses the Bluetooth Low Energy adapter of your Raspberry Pi, Windows, Apple desktop, laptop, or server by leveraging Python and multi-platform libraries. ![Gateway](https://github.com/theengs/home/raw/development/docs/img/Theengs-gateway-raspberry-pi.jpg) -**Theengs Gateway** can be used as a standalone solution or as a complementary solution to [OpenMQTTGateway](https://docs.openmqttgateway.com/) as it uses the same MQTT topic structure and the same payload messages. Your OpenMQTTGateway home automation BLE sensors integration also works with Theengs Gateway. +You can use **Theengs Gateway** as a standalone solution or as a complementary solution to [OpenMQTTGateway](https://docs.openmqttgateway.com/), as it uses the same MQTT topic structure and the same payload messages. Your OpenMQTTGateway home automation BLE sensors integration also works with Theengs Gateway. The gateway retrieves data from BLE sensors from Govee, Xiaomi, Inkbird, Qingping, ThermoBeacon, Blue Maestro, and many more. diff --git a/docs/participate/development.md b/docs/participate/development.md index bd473373..9add1e99 100644 --- a/docs/participate/development.md +++ b/docs/participate/development.md @@ -14,7 +14,7 @@ agree to follow the [code of conduct](https://github.com/theengs/gateway/blob/ma * Request for review. * We may suggest some changes, improvements or alternatives. -Some things that increase the chance that your pull request is accepted: +The following things increase the chance that we accept your pull request: * Comment your code. * Ask eventually for design guidelines. @@ -48,8 +48,12 @@ Some things that increase the chance that your pull request is accepted: this project or the open source license(s) involved. ``` -This Developer Certificate Of Origin (DCO) was adopted on February 26, 2022. + -The text of this license is available under the [Creative Commons Attribution-ShareAlike 3.0 Unported License](http://creativecommons.org/licenses/by-sa/3.0/). It is based on the Linux [Developer Certificate Of Origin](http://elinux.org/Developer_Certificate_Of_Origin). +This Developer Certificate of Origin (DCO) was adopted on February 26, 2022. -To accept the DCO it is required to put a x between [ ] on `[ ] I accept the DCO` in the PR template when submitting it. The [ ] is an opt-in box, so you have to manually accept it. + + +The text of this license is available under the [Creative Commons Attribution-ShareAlike 3.0 Unported License](http://creativecommons.org/licenses/by-sa/3.0/). It's based on the Linux [Developer Certificate of Origin](http://elinux.org/Developer_Certificate_Of_Origin). + +To accept the DCO, put a x between [ ] on `[ ] I accept the Developer Certificate of Origin (DCO)` in the PR template when submitting it. The [ ] is an opt-in box, so you have to manually accept it. diff --git a/docs/participate/support.md b/docs/participate/support.md index 971afeff..f1e799f2 100644 --- a/docs/participate/support.md +++ b/docs/participate/support.md @@ -1,6 +1,6 @@ # Supporting the project -If you like the project and/or use it, please consider supporting us. It can be done in different ways: +If you like the project and/or use it, please consider supporting us. You can do this in different ways: * Helping others in the [community](https://github.com/theengs/gateway/discussions) * [Contribute](development) to the [code](https://github.com/theengs/gateway) or the documentation, * Buy devices, boards or parts from the [compatible web site](https://compatible.openmqttgateway.com), the devices and parts linked use affiliated links, diff --git a/docs/prerequisites/broker.md b/docs/prerequisites/broker.md index 9c96ed3d..125f10be 100644 --- a/docs/prerequisites/broker.md +++ b/docs/prerequisites/broker.md @@ -1,19 +1,19 @@ # Broker -The broker acts as an intermediary between TheengsGateway and your [controller](/prerequisites/controller), it can be seen as a centralized hub at the heart of your automation system. It carry on messages following a publish / subscribe mechanism. +The broker acts as an intermediary between TheengsGateway and your [controller](/prerequisites/controller). Consider it as a centralized hub at the heart of your home automation system. It carries on messages following a publish/subscribe mechanism. All the events or commands could pass by the broker. There are many choices of brokers, here are some of the most popular: -* [Mosquitto](https://mosquitto.org/) (Open source) -* [Moquette](https://moquette-io.github.io/moquette/) (Open source) +* [Mosquitto](https://mosquitto.org/) (open source) +* [Moquette](https://moquette-io.github.io/moquette/) (open source) * [HiveMQ](https://www.hivemq.com/hivemq/features/) -* Embedded MQTT brokers (Home Assistant and OpenHAB) +* Embedded MQTT brokers (Home Assistant and openHAB) This [comparison of MQTT implementations](https://en.wikipedia.org/wiki/Comparison_of_MQTT_implementations) on Wikipedia gives you more details about the different choices you have. This [list of brokers](https://github.com/mqtt/mqtt.github.io/wiki/brokers) on GitHub seems to be the most exhaustive ones. Here is also a [list of criteria for selecting a MQTT broker](https://www.hivemq.com/blog/top-10-mqtt-broker-criteria/) from HiveMQ. -Once your broker is installed, it can be interesting to see the traffic passing to it and to publish data. There are several tools available to do this: +Once you've installed your broker, it can be interesting to see the traffic passing to it and to publish data. There are several tools available to do this: * [MQTT Explorer](http://mqtt-explorer.com/) * [HiveMQ MQTT web client](https://github.com/hivemq/hivemq-mqtt-web-client) * [MQTT FX](https://mqttfx.jensd.de/) diff --git a/docs/prerequisites/hardware.md b/docs/prerequisites/hardware.md index e6087d49..a90d5a62 100644 --- a/docs/prerequisites/hardware.md +++ b/docs/prerequisites/hardware.md @@ -1,6 +1,6 @@ # Hardware -You can [install](../install/install) Theengs Gateway on various hardware as long as they have a BLE module. +You can [install](../install/install) Theengs Gateway on various hardware as long as they have a Bluetooth Low Energy (BLE) module. The project is primarily developed for Linux, with the Raspberry Pi as a reference platform. diff --git a/docs/use/use.md b/docs/use/use.md index fc8728e0..0f0b53a0 100644 --- a/docs/use/use.md +++ b/docs/use/use.md @@ -19,7 +19,7 @@ docker run --rm \ ``` :::tip -If your MQTT broker is installed on the same instance as the gateway you can use `localhost` as the ``. +If you've installed your MQTT broker on the same instance as the gateway, you can use `localhost` as the ``. ::: ### Checking the data published by the gateway @@ -34,10 +34,10 @@ Example payload received: The `mfr` key has the company name of the manufacturer as its value in two cases: -* The advertisement of the device has been successfully decoded, its manufacturer data have a company ID compliant to the Bluetooth specification, and it's no beacon (iBeacon, Microsoft Advertising Beacon). -* The advertisement of the device can't be decoded. +* Theengs Gateway has successfully decoded the advertisement of the device, its manufacturer data have a company ID compliant to the Bluetooth specification, and it's no beacon (iBeacon, Microsoft Advertising Beacon). +* Theengs Gateway isn't able to decode the advertisement of the device. -Note that in the latter case, there's guarantee that the manufacturer name is correct, as many devices are not compliant to the Bluetooth specification and encode their data in the bytes where the manufacturer ID should be. +Note that in the latter case, there's guarantee that the manufacturer name is correct, as many devices aren't compliant to the Bluetooth specification and encode their data in the bytes where the manufacturer ID should be. ## Details options ### For a regular installation @@ -157,15 +157,15 @@ python -m TheengsGateway -H "192.168.1.17" -u "username" -p "password" -pt "home ``` ## Configuration record -Once you have entered your credentials and parameters they are saved into a configuration file `theengsgw.conf` into your user directory and you can simply launch the gateway by using: +Once you have entered your credentials and parameters, Theengs Gateway saves them into a configuration file `theengsgw.conf` into your user directory and you can simply launch the gateway by using: ```shell python -m TheengsGateway ``` ## MQTTtoMQTT decoding -Messages with BLE data sent to the subscribe topic are decoded, and the result is published to the publish topic. This allows for offloading the decode operation from other devices, such as an ESP32, to enhance performance. +Theengs Gateway decodes messages with Bluetooth Low Energy (BLE) data sent to the subscribe topic, and publishes the decoded result to the publish topic. This allows for offloading the decode operation from other devices, such as an ESP32, to enhance performance. -The data sent to the topic is expected to be formatted in JSON and MUST have at least an "id" entry. +The data sent to the topic should be in JSON format and must have at least an "id" entry. Example message: ``` @@ -177,7 +177,7 @@ Example message: "txpower":12 } ``` -If possible, the data is decoded and published. +If possible, the gateway decodes and publishes the data. [OpenMQTTGateway](https://docs.openmqttgateway.com/), proposes a [web upload](https://docs.openmqttgateway.com/upload/web-install.html) binary `esp32dev-ble-mqtt-undecoded` that publishes directly to 'home//BTtoMQTT` making it directly compatible with Theengs Gateway MQTTtoMQTT decoding feature. @@ -186,14 +186,14 @@ By default Theengs Gateway listens to `home/+/BTtoMQTT/undecoded`, if you have s ::: ## Home Assistant auto discovery -If enabled (default), decoded devices publish their configuration to Home Assistant to be discovered. -- This can be enabled/disabled with the `-D` or `--discovery` command line argument with a value of 1 (enable) or 0 (disable). +If enabled (default), decoded devices publish their configuration to Home Assistant so the latter can discover them. +- You can enable/disable this with the `-D` or `--discovery` command line argument with a value of 1 (enable) or 0 (disable). - If you want to use Home Assistant discovery with other home automation gateways such as openHAB, set `-Dh` or `--hass_discovery` to 0 (disable). -- The discovery topic can be set with the `-Dt` or `--discovery_topic` command line argument. -- The discovery name can be set wit the `-Dn` or `--discovery_name` command line argument. -- Devices can be filtered from discovery with the `-Df` or `--discovery_filter` argument which takes a list of device model ID to be filtered. +- You can set the discovery topic with the `-Dt` or `--discovery_topic` command line argument. +- You can set the discovery name with the `-Dn` or `--discovery_name` command line argument. +- You can filter devices from discovery with the `-Df` or `--discovery_filter` argument which takes a list of device model ID to filter. -The `IBEACON` and random MAC devices (APPLE, MS-CDP and GAEN) are not discovered as their addresses (IDs) change over time resulting in multiple discoveries. +The `IBEACON` and random MAC devices (`APPLE`, `MS-CDP` and `GAEN`) aren't discovered, as their addresses (IDs) change over time resulting in multiple discoveries. ## Passive scanning Passive scanning (`-s passive` or `--scanning_mode passive`) only works on Windows or Linux kernel >= 5.10 and BlueZ >= 5.56 with experimental features enabled. @@ -213,7 +213,7 @@ ExecStart=/usr/lib/bluetooth/bluetoothd --experimental ``` :::tip -On other Linux variants the path might be slightly different. This can usually be seen by the commented out entries of `ExecStart=…` when editing `bluetooth.service` or with the `which bluetoothd` command. +On other Linux variants the path might be slightly different. You can usually see this by the commented out entries of `ExecStart=…` when editing `bluetooth.service` or with the `which bluetoothd` command. ::: Save and close the file and then run the following commands: @@ -224,21 +224,21 @@ sudo systemctl restart bluetooth.service ``` ## Time synchronization -If you have specified the MAC addresses of [supported Bluetooth clocks](https://bluetooth-clocks.readthedocs.io/en/latest/devices.html) with the `--time_sync` argument, Theengs Gateway automatically synchronizes their time once a day. Therefore, make sure that your gateway's time is set correctly. +If you have specified the MAC addresses of [supported Bluetooth clocks](https://bluetooth-clocks.readthedocs.io/en/latest/devices.html) with the `--time_sync` argument, Theengs Gateway automatically synchronizes their time once a day. Therefore, make sure to correctly set your gateway's time. Some Bluetooth clocks let you choose between 12-hour (AM/PM) and 24-hour format to show their time. Use the argument `--time_format 0` (default) for 24-hour format and `--time_format 1` for 12-hour format. -Note that the first time synchronization of each specified clock happens at a random time in the next day. This way the connections to these devices are spaced out in time. After this first time synchronization, Theengs Gateway synchronizes its time every 24 hours. +Note that the first time synchronization of each specified clock happens at a random time in the next day. This way the gateway spaces out connections to these devices in time. After this first time synchronization, Theengs Gateway synchronizes its time every 24 hours. If a device isn't recognized as a supported clock, Theengs Gateway won't try to synchronize its time ever. But if there are other errors, such as connection errors or write errors (which could be temporary), the device is still tried every 24 hours. -If you want to know which of your devices are supported by Theengs Gateway's time synchronization feature, run the following command: +If you want to know which of your devices Theengs Gateway's time synchronization feature supports, run the following command: ``` bluetooth-clocks discover ``` -The `bluetooth-clocks` command is installed as part of Theengs Gateway. +Theengs Gateway installs the `bluetooth-clocks` command as part of its dependencies. ## Reading encrypted advertisements If you want to read encrypted advertisements, you need to add a bindkey for each device address with the `--bindkeys` argument. For example: @@ -250,7 +250,7 @@ TheengsGateway --bindkeys 00:11:22:33:44:55:66 0dc540f3025b474b9ef1085e051b1add Theengs Gateway then uses the bindkey `0dc540f3025b474b9ef1085e051b1add` to decrypt all advertisements from device `00:11:22:33:44:55:66` and bindkey `6385424e1b0341109942ad2a6bb42e58` for all advertisements from device `AA:BB:CC:DD:EE:FF`. ## Resolving random private addresses -If you want to resolve random private addresses into a device's identity address, you need to add an identity resolving key (IRK) for each identity address with the `--identities` argument. For example: +If you want to resolve random private addresses into a device's identity address, you need to add an Identity Resolving Key (IRK) for each identity address with the `--identities` argument. For example: ``` TheengsGateway --identities 00:11:22:33:44:55:66 0dc540f3025b474b9ef1085e051b1add AA:BB:CC:DD:EE:FF 6385424e1b0341109942ad2a6bb42e58 @@ -258,7 +258,7 @@ TheengsGateway --identities 00:11:22:33:44:55:66 0dc540f3025b474b9ef1085e051b1ad Theengs Gateway then uses the identity resolving key `0dc540f3025b474b9ef1085e051b1add` to resolve random private addresses from device `00:11:22:33:44:55:66` and identity resolving key `6385424e1b0341109942ad2a6bb42e58` to resolve random private addresses from device `AA:BB:CC:DD:EE:FF`. -The identity resolving key can also be specified as a Base64 encoded string, such as `"MGRjNTQwZjMwMjViNDc0YjllZjEwODVlMDUxYjFhZGQ="`. +You can also specify the identity resolving key as a Base64 encoded string, such as `"MGRjNTQwZjMwMjViNDc0YjllZjEwODVlMDUxYjFhZGQ="`. ## Getting Identity Resolving Key (IRK) for Apple Watch, iPhone and iPad diff --git a/vale/styles/Vocab/Theengs/accept.txt b/vale/styles/Vocab/Theengs/accept.txt index 7e3400a8..5739652b 100644 --- a/vale/styles/Vocab/Theengs/accept.txt +++ b/vale/styles/Vocab/Theengs/accept.txt @@ -1,15 +1,20 @@ +AWS bindkey Domoticz +FHEM Govee Inkbird iBeacon iCloud ioBroker Jeedom +M[AC|ac] Mosquitto +MQTT Python Qingping Theengs +TPMS undecoded Unported Xiaomi