TasmotaManager/fulltopic_equals_fix_summary.md

65 lines
2.7 KiB
Markdown

# FullTopic Equals Sign Fix Summary
## Issue Description
When setting the MQTT FullTopic parameter, an extra equals sign ('=') was being added to the beginning of the value. For example, instead of setting the FullTopic to `%prefix%/%topic%/`, it was being set to `=%prefix%/%topic%/`.
## Root Cause
The issue was related to how the Tasmota device interprets the command when an equals sign is used as a separator between the command and the value. When using the format:
```
http://{ip}/cm?cmnd=FullTopic={value}
```
The Tasmota device was interpreting this as a command to set the FullTopic to `={value}` rather than just `{value}`.
## Investigation
A test script was created to reproduce the issue and test different approaches for setting the FullTopic parameter. The script tested several methods:
1. Current approach (setting=value): `http://{ip}/cm?cmnd=FullTopic={full_topic}`
2. URL encoded value: `http://{ip}/cm?cmnd=FullTopic={urllib.parse.quote(full_topic)}`
3. Using space (%20) instead of equals: `http://{ip}/cm?cmnd=FullTopic%20{full_topic}`
4. Backslash before equals: `http://{ip}/cm?cmnd=FullTopic\={full_topic}`
5. Double equals: `http://{ip}/cm?cmnd=FullTopic=={full_topic}`
6. No separator (direct value): `http://{ip}/cm?cmnd=FullTopic{full_topic}`
The testing revealed that three approaches worked correctly:
1. Using space (%20) instead of equals
2. Backslash before equals
3. No separator (direct value)
## Solution
The "no separator" approach was chosen as the simplest and most reliable solution. The code was modified in two places:
1. In the `configure_unknown_device` method:
```python
# For FullTopic, we need to avoid adding a space (%20) or equals sign between the command and value
if setting == "FullTopic":
url = f"http://{ip}/cm?cmnd={setting}{value}"
else:
url = f"http://{ip}/cm?cmnd={setting}%20{value}"
```
2. In the `check_mqtt_settings` function:
```python
# For FullTopic, we need to avoid adding a space (%20) or equals sign between the command and value
if setting == "FullTopic":
url = f"http://{ip}/cm?cmnd={setting}{value}"
else:
url = f"http://{ip}/cm?cmnd={setting}%20{value}"
```
## Testing
The fix was tested by running the TasmotaManager.py script with the --Device parameter and verifying that the FullTopic parameter was set correctly without the extra '=' at the beginning of the value.
Before the fix:
```json
{"FullTopic":"=%prefix%/%topic%/"}
```
After the fix:
```json
{"FullTopic":"%prefix%/%topic%/"}
```
## Conclusion
The issue has been resolved by changing how the FullTopic parameter is set. Instead of using an equals sign as a separator between the command and value, the fix uses no separator at all, which prevents the Tasmota device from adding an extra equals sign to the beginning of the value.