-
-
Notifications
You must be signed in to change notification settings - Fork 2k
Add info for multiplexing to sml.rst #5341
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: current
Are you sure you want to change the base?
Conversation
Add info on how multiple meters can be read using a single HardwareSerial UART.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull Request Overview
This PR adds documentation for multiplexing functionality to the SML component, enabling users to read data from multiple meters using a single UART on controllers with limited UART availability.
- Adds a new section explaining how to multiplex between multiple SML meters
- Provides a complete YAML configuration example showing UART multiplexing setup
- Documents the use of the
on_data
trigger with lambda code to switch between GPIO pins
- lambda: |- | ||
std::vector<gpio_num_t> multiplex_pins = {::GPIO_NUM_17,::GPIO_NUM_19}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The lambda code uses ESP-IDF specific gpio_num_t
and GPIO_NUM_*
constants without explaining this is ESP-specific. Consider adding a note that this example is for ESP32/ESP8266 platforms or provide a more platform-agnostic example.
Copilot uses AI. Check for mistakes.
static size_t current_index = 0; | ||
current_index = (current_index + 1) % multiplex_pins.size(); | ||
gpio_num_t new_rx_pin = multiplex_pins[current_index]; | ||
id(uart_multiplex_rx_pin).set_pin(new_rx_pin); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The load_settings(true)
call and its parameter are not explained. Consider adding a comment explaining what this does and why the true
parameter is necessary for the multiplexing to work properly.
id(uart_multiplex_rx_pin).set_pin(new_rx_pin); | |
id(uart_multiplex_rx_pin).set_pin(new_rx_pin); | |
// Reload the UART settings after changing the RX pin. | |
// The 'true' parameter forces the reload, which is necessary for multiplexing to work properly. |
Copilot uses AI. Check for mistakes.
✅ Deploy Preview for esphome ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
Note Other AI code review bot(s) detectedCodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review. Caution Review failedAn error occurred during the review process. Please try again later. ✨ Finishing Touches🧪 Generate unit tests
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
🧹 Nitpick comments (3)
content/components/sml.md (3)
217-218
: Clarify ESP32 UART count to avoid confusion.ESP32 has three UART controllers (typically two free depending on board/usage). Suggest rephrasing to “more than the available UARTs on your board (ESP32 typically provides 3 UARTs).”
219-221
: Tighten wording.“An example on how to do this is this:” → “An example of how to do this:”
- An example on how to do this is this: + An example of how to do this:
236-243
: Request compile-time validation of APIs used in lambda.Please confirm that:
- rx_pin accepts id and exposes set_pin(...)
- UART component exposes load_settings(true) in current ESPHome
If not, we should update the example to the supported API.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
content/components/sml.md
(1 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
**
⚙️ CodeRabbit configuration file
- Do not generate or add any sequence diagrams
Files:
content/components/sml.md
```yaml | ||
uart: | ||
- baud_rate: 9600 | ||
data_bits: 8 | ||
rx_pin: | ||
number: GPIO17 # Set to the first of the GPIO pins in multiplex_pins | ||
id: uart_multiplex_rx_pin | ||
stop_bits: 1 | ||
rx_buffer_size: 512 | ||
id: uart_multiplexed | ||
sml: | ||
- id: sml_multiplexed | ||
uart_id: uart_multiplexed | ||
on_data: | ||
- lambda: |- | ||
std::vector<gpio_num_t> multiplex_pins = {::GPIO_NUM_17,::GPIO_NUM_19}; | ||
static size_t current_index = 0; | ||
current_index = (current_index + 1) % multiplex_pins.size(); | ||
gpio_num_t new_rx_pin = multiplex_pins[current_index]; | ||
id(uart_multiplex_rx_pin).set_pin(new_rx_pin); | ||
id(uart_multiplexed).load_settings(true); | ||
sensor: | ||
- platform: sml | ||
name: "Solar Roof" | ||
sml_id: sml_multiplexed | ||
server_id: "12345ab" # IMPORTANT! Set the correct server id | ||
obis_code: "1-0:2.8.0" | ||
- platform: sml | ||
name: "Solar Carport" | ||
sml_id: sml_multiplexed | ||
server_id: "67890cd" # IMPORTANT! Set the correct server id | ||
obis_code: "1-0:2.8.0" | ||
``` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fix YAML indentation (invalid as written) and guard pin switch on valid frames.
- The list items under uart:, sml:, and sensor: must be indented.
- Only rotate RX after a valid SML frame to reduce missed reads.
- Use realistic server_id examples (consistent length/format with earlier docs).
- Consider adding a short note that the gpio_num_t example is ESP32/ESP-IDF–specific.
```yaml
-uart:
-- baud_rate: 9600
- data_bits: 8
- rx_pin:
- number: GPIO17 # Set to the first of the GPIO pins in multiplex_pins
- id: uart_multiplex_rx_pin
- stop_bits: 1
- rx_buffer_size: 512
- id: uart_multiplexed
+uart:
+ - baud_rate: 9600
+ data_bits: 8
+ rx_pin:
+ number: GPIO17 # Set to the first of the GPIO pins in multiplex_pins
+ id: uart_multiplex_rx_pin
+ stop_bits: 1
+ rx_buffer_size: 512
+ id: uart_multiplexed
sml:
-- id: sml_multiplexed
- uart_id: uart_multiplexed
- on_data:
- - lambda: |-
- std::vector<gpio_num_t> multiplex_pins = {::GPIO_NUM_17,::GPIO_NUM_19};
- static size_t current_index = 0;
- current_index = (current_index + 1) % multiplex_pins.size();
- gpio_num_t new_rx_pin = multiplex_pins[current_index];
- id(uart_multiplex_rx_pin).set_pin(new_rx_pin);
- id(uart_multiplexed).load_settings(true);
+ - id: sml_multiplexed
+ uart_id: uart_multiplexed
+ on_data:
+ - lambda: |-
+ // NOTE: ESP32-only example using ESP-IDF types (gpio_num_t).
+ std::vector<gpio_num_t> multiplex_pins = {::GPIO_NUM_17, ::GPIO_NUM_19};
+ if (valid) {
+ static size_t current_index = 0;
+ current_index = (current_index + 1) % multiplex_pins.size();
+ gpio_num_t new_rx_pin = multiplex_pins[current_index];
+ id(uart_multiplex_rx_pin).set_pin(new_rx_pin);
+ id(uart_multiplexed).load_settings(true);
+ }
sensor:
-- platform: sml
- name: "Solar Roof"
- sml_id: sml_multiplexed
- server_id: "12345ab" # IMPORTANT! Set the correct server id
- obis_code: "1-0:2.8.0"
-- platform: sml
- name: "Solar Carport"
- sml_id: sml_multiplexed
- server_id: "67890cd" # IMPORTANT! Set the correct server id
- obis_code: "1-0:2.8.0"
+ - platform: sml
+ name: "Solar Roof"
+ sml_id: sml_multiplexed
+ server_id: "0123456789abcdef" # Set your meter's server_id
+ obis_code: "1-0:2.8.0"
+ - platform: sml
+ name: "Solar Carport"
+ sml_id: sml_multiplexed
+ server_id: "fedcba9876543210" # Set your meter's server_id
+ obis_code: "1-0:2.8.0"
🤖 Prompt for AI Agents
In content/components/sml.md around lines 222–254, fix the invalid YAML and
unsafe pin rotation: indent the list items under uart:, sml:, and sensor: so
each block is a proper list element (e.g., "- baud_rate..." under uart:), change
the on_data lambda to only rotate the RX pin after a validated SML frame (wrap
the current_index increment, set_pin and load_settings calls in an if(valid)
guard or equivalent), replace the example server_id values with realistic-length
hex strings consistent with the docs, and add a brief inline note that
gpio_num_t/::GPIO_NUM_* usage is ESP32/ESP-IDF specific.
Add info on how multiple meters can be read using a single HardwareSerial UART.
Description:
Related issue (if applicable): fixes
Pull request in esphome with YAML changes (if applicable):
Checklist:
I am merging into
next
because this is new documentation that has a matching pull-request in esphome as linked above.or
I am merging into
current
because this is a fix, change and/or adjustment in the current documentation and is not for a new component or feature.Link added in
/components/index.rst
when creating new documents for new components or cookbook.