- Remove extra lines between section headers and content
- Add blank lines only after sections for better readability
- Add _print_rule_differences() method to display rules in row format
- Rules show device names as rows with detailed rule info below each
- More space-efficient report layout
Enhanced readability with table-style columnar output
Changes:
- Converted vertical list format to columnar table format
- First column: Parameter name
- Second column: Device 1 value
- Third column: Device 2 value
- Added header row with device names
- Auto-adjusts column widths based on content
- Truncates very long values (>60 chars) with "..."
- Maintains section separation (Firmware, Network, MQTT, etc.)
Before:
SetOption32:
KitchenMain = 40
KitchenBar = 8
After:
Parameter KitchenMain-3040 KitchenBar-7845
--------------- -------------------- --------------------
SetOption32 40 8
Much easier to scan and compare values side-by-side!
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Performance Improvement: Query both devices simultaneously
Changes:
- Added ThreadPoolExecutor to device_diff.py compare_devices()
- Both devices are now queried in parallel (max 2 workers)
- Each device queries ~150+ SetOptions independently
- Roughly 2x faster than sequential queries
Before: ~30 seconds (sequential)
After: ~15 seconds (parallel)
The parallel approach significantly improves user experience when comparing
devices, especially when querying all SetOptions (0-150) and Rules.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
New Feature: Device configuration comparison tool for diagnostics
Usage:
python TasmotaManager.py --diff DEVICE1 DEVICE2
Features:
- Queries all SetOptions (0-150) from both devices
- Compares firmware versions, network config, MQTT settings
- Shows Rule configurations and status
- Displays all differences in human-readable format
- Helps diagnose configuration issues between working/non-working devices
Files Added:
- device_diff.py: New DeviceComparison class with full status queries
Files Modified:
- TasmotaManager.py: Added --diff argument and comparison mode handler
Example:
python TasmotaManager.py --diff KitchenMain KitchenBar
This tool revealed that KitchenMain (working) and KitchenBar (problematic)
have significant SetOption differences including SetOption32, SetOption40,
and others that may affect button press behavior.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Root Cause: console_settings.py was using "Rule{N} 1" command which BOTH
enables the rule AND sets the Once flag to ON. The Once flag causes rules
to fire only one time and then stop, requiring multiple button presses
before the rule would work again.
Solution: Changed rule enablement from "Rule{N} 1" to "Rule{N} 4"
- Rule 1 = Enable rule + Set Once ON (WRONG)
- Rule 4 = Enable rule only (CORRECT)
- Rule 5 = Set Once ON only
- Rule 6 = Set Once OFF only
This allows rules to fire repeatedly on every button press, fixing the
issue where devices like KitchenBar required multiple presses.
Changes:
- console_settings.py line 190: Use Rule{N} 4 instead of Rule{N} 1
- Added detailed comments explaining Tasmota rule command behavior
- Reverted SetOption32 changes (was red herring, not the actual issue)
Tested on KitchenBar (192.168.8.244) - button now responds on every press.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Issue: Some Tasmota switches (e.g., KitchenBar) required multiple button
presses before responding, while others (e.g., KitchenMain) worked immediately.
Root Cause: SetOption32 was set to 8 (0.8 seconds) which creates too short
a time window for multi-press detection. This causes the device to sometimes
misinterpret single presses or require multiple attempts.
Solution: Changed SetOption32 from 8 to 40 (4.0 seconds) in both Traditional
and SONOFF_ULTIMATE console_set profiles. This matches the working devices
and provides a longer, more reliable detection window for single button presses
when using rule: "on button1#state=10 do power0 toggle endon"
SetOption32 controls the button hold time in 0.1s increments. A higher value
means the device waits longer to confirm it's a single press vs multi-press,
resulting in more reliable single-press detection.
Tested on KitchenBar (192.168.8.244) - button now responds reliably on first press.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Major changes:
- Implement parallel device processing using ThreadPoolExecutor (10 workers)
- Add comprehensive error and warning tracking in ReportGenerator
- Fix MQTT configuration verification (query Topic/FullTopic directly)
- Improve console settings thread safety with locks
- Fix UniFi client for UniFi OS API endpoints
- Normalize FullTopic handling (strip URL-encoded spaces)
- Update network exclude patterns to support wildcards
- Add test_unifi_connection.py for debugging UniFi connectivity
Performance improvements:
- Process devices concurrently for faster execution
- Reduced verbose logging during parallel processing
Bug fixes:
- Handle deprecated.json format correctly (list vs dict)
- Fix exclude_patterns matching with partial string support
- Fix UniFi API authentication and endpoint paths for UniFi OS
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
UDM-SE uses UniFi OS which requires /proxy/network prefix for Network
application API endpoints. The legacy controller endpoints (/api/s/...)
return 404 on UniFi OS devices.
Changes:
- Updated get_clients() to use /proxy/network/api/s/{site}/stat/sta
- Updated get_devices() to use /proxy/network/api/s/{site}/stat/device
- Added comments explaining UniFi OS API structure
Fixes 404 errors when querying UniFi controller for devices
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
The authentication endpoint /api/auth/login returns HTTP 200 with a different
JSON response format than data endpoints. UDM-SE (UniFi OS) does not include
the meta.rc field in authentication responses, causing false authentication
failures.
Changes:
- Added skip_meta_check parameter to _request_json() method
- Updated _login() to skip meta.rc validation for auth endpoint
- Added debug logging to show actual API responses for troubleshooting
Fixes authentication error: "UniFi API error: Unknown error"
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Moved tasmota_manager_refactor_notes.md to docs/REFACTORING_NOTES.md
- Moved migrate_to_refactored.py to docs/ for future reference
- Moved GitWorkflowRefactor.sh to docs/ for future reference
- Renamed main.py to TasmotaManager.py for consistency with project name
- Updated pyproject.toml to reflect the new module name
- All functionality remains the same
- Created modular Python files (main, utils, discovery, configuration, console_settings, unknown_devices, reporting, unifi_client)
- Moved documentation files to docs/
- Moved data files to data/
- Removed old monolithic TasmotaManager.py and TasmotaManager_fixed.py
- Updated .gitignore and pyproject.toml
- All functionality preserved, command-line interface unchanged
Version: 2.0.0
- Removed blank entry that was causing empty parameter errors
- Fixes 'Verification failed for blank parameter' errors on all devices
- Issue discovered during testing and root cause identified in config
- Add 1-second delay after MQTT changes to allow device to process
- Only delays when MQTT settings were actually updated
- Prevents intermittent failures when applying console settings
- Device needs time to process MQTT reconnection before accepting new commands
- Add 0.5s delays after Template and Module commands for device processing
- Verify Module=0 (activation) in post-update verification, not just template
- Apply fixes to both template update and device name update code paths
- Enhanced logging for Module operations and verification
- Fixes issue where template was set but not activated, leaving device inoperable
1. Restructured configuration: Moved config_other and console to top level
2. Added common _match_pattern function for regex pattern matching
3. Implemented Unifi Hostname bug fix in is_hostname_unknown
4. Created common get_device_hostname function to eliminate code duplication
5. Added comprehensive test scripts for all new functionality
6. Added detailed documentation for all changes
This commit implements automatic enabling of Tasmota rules when they are defined in the configuration.
Key changes:
- Modified TasmotaManager.py to detect rule definitions and automatically send enable commands
- Updated network_configuration.json to remove redundant Rule1 entry
- Updated documentation in README.md and CONSOLE_COMMANDS.md to explain the new feature
- Added test script to verify the automatic rule enabling functionality
This change simplifies the configuration by allowing users to define rules without needing to
explicitly enable them with a separate command.
This template file provides a reference for developers to create their own configuration file without exposing sensitive information. It should be included in the PyCharm project structure, while the actual configuration file (network_configuration.json) should also be included in the project but excluded from version control.