wildekek / rdtech-esphome

Add Home Assistant support to your RDTech power supply
MIT License
33 stars 7 forks source link

Support RD6012/RD6018/RD6024 #5

Closed wildekek closed 11 months ago

wildekek commented 1 year ago

I'd love to support the other Riden power supply types and it seems that the protocol is fairly similar:

        if self.type == 6012 or self.type == 6018 or self.type == 6024:
            print("RD6012, RD6018 or RD6024 detected")
            self.voltres = 100
            self.ampres = 100
        else:
            print("RD6006 or other detected")
            self.voltres = 100
            self.ampres = 1000

Unfortunately I do not have these units to test, and I feel uncomfortable releasing software for controlling a PSU that people use for charging LiPo batteries and other spicy components that I can't test IRL.

chron0 commented 1 year ago

I do have the RD6018 and would like to install this to it to have it under esphome/hass control and be able to log long term data, especially for my lifepo4 battery bank top balance formation runs. So I could test this if it's already merged.

wildekek commented 1 year ago

Found the following differences between the models: Model number: 60062 Name: RD6006 Voltage precision: 2 Current precision: 3 Max voltage: 60 Max current: 6 60065 Name: RD6006P Voltage precision: 3 Current precision: 4 Max voltage: 60 Max current: 6 60121 Name: RD6012 Voltage precision: 2 Current precision: 2 Max voltage: 60 Max current: 20 60181 Name: RD6018 Voltage precision: 2 Current precision: 2 Max voltage: 60 Max current: 18

I'll try and make support for the other models in the near future. Could you help me test the RD6018 @chron0 ? I would like to know if the model number shows up correctly using the latest version of the main branch. I can then change some parameters and make it work, should be fairly simple.

chron0 commented 1 year ago

I could give it a try, it's been a while since I pimped my riden (see https://odysee.com/@Apollo-NG:2/pimp-my-riden-1:1?r=9GPazzWhkRN7uXjT7tbgNuzpoZAF4G6Z&t=6064) but the next time i rotate back to it I could try this yaml config instead to test it for the rd6018 and will report back on it.

bassclarinetl2 commented 1 year ago

I have a 6012 if you need a tester.

Dom4n commented 1 year ago

I have RD6018 with UniSoft firmware 1.41.1k, and I can confirm, that everything works after these changes are applied:

@@ -1,6 +1,6 @@
 substitutions:
-  device_name: "rd6006-controller"
-  device_friendly_name: "RD 6006"
+  device_name: "riden-rd6018"
+  device_friendly_name: "Riden RD6018"
   device_description: "Power Supply"
   time_timezone: "Europe/Amsterdam"

@@ -10,7 +10,7 @@
   comment: $device_description
   name_add_mac_suffix: false
   project:
-    name: "wildekek.rd6006-controller"
+    name: "wildekek.rd6018-controller"
     version: "1.3.2"

 esp8266:
@@ -160,7 +160,7 @@
     value_type: U_WORD
     accuracy_decimals: 3
     filters:
-      - multiply: 0.001
+      - multiply: 0.01

   - platform: modbus_controller
     modbus_controller_id: powersupply
@@ -409,9 +409,9 @@
     entity_category: config
     value_type: U_WORD
     min_value: 0
-    max_value: 6
+    max_value: 60
     step: 0.01
-    multiply: 1000
+    multiply: 100

   - platform: modbus_controller
     modbus_controller_id: powersupply
@@ -383,9 +383,9 @@
     address: 9
     value_type: U_WORD
     min_value: 0
-    max_value: 6
-    step: 0.001
-    multiply: 1000
+    max_value: 60
+    step: 0.01
+    multiply: 100

   # Date components are kept internal
   - platform: modbus_controller

I have tested all sensors except temperature external, because I never used it. Disconnected probe shows 65,625stC. Current is shown in 10mA steps, on UniSoft's fw this value is interpolated and accuracy is 1mA on display. This is not really a problem for me, but worth noting.

If accuracy of current is reported up to two decimals, then I think that we can add this too:

 esp8266:
@@ -158,9 +158,9 @@
     unit_of_measurement: "A"
     register_type: holding
     value_type: U_WORD
-    accuracy_decimals: 3
+    accuracy_decimals: 2

I think that second file in this repository for RD6018 should be best solution.

Thanks for Your work!

ShayBox commented 1 year ago

I'm not super familiar with esphome, but couldn't the lambda if x true false be simplified to just return the condition directly?

EDIT: Yes, you can lambda: return X; instead

Though a file for each model wouldn't be a bad idea, the only difference is voltage/current min/max/multipliers, which can either be set using a variable by user or determined by the model number automatically. See here

This is my heavily modified version for RD6018 ```yaml substitutions: name: "riden" friendly_name: "Riden" esphome: name: $name friendly_name: $friendly_name esp8266: board: esp01_1m # Enable logging logger: baud_rate: 0 # Enable Home Assistant API api: encryption: key: "3IAlK13CXHrdbjpi8NRbfKN/0kvaly3ViwlZoQ371hQ=" ota: password: "d2e055799331e1260302636634d0aafd" wifi: ssid: !secret wifi_ssid password: !secret wifi_password # Enable fallback hotspot (captive portal) in case wifi connection fails ap: ssid: "Riden Fallback Hotspot" password: !secret wifi_password captive_portal: uart: tx_pin: 1 rx_pin: 3 baud_rate: 1000000 modbus_controller: address: 0x01 setup_priority: -10 update_interval: 1s sensor: - platform: modbus_controller id: model_number name: "Model Number" entity_category: diagnostic disabled_by_default: True address: 0 skip_updates: 10 unit_of_measurement: "" register_type: holding value_type: U_WORD accuracy_decimals: 0 on_value: then: - lambda: id(model_name).publish_state(value_accuracy_to_string(x, 0)); - platform: modbus_controller id: serial_number name: "Serial Number" entity_category: diagnostic disabled_by_default: True address: 1 skip_updates: 10 register_type: holding value_type: U_DWORD accuracy_decimals: 0 - platform: modbus_controller address: 3 id: firmware_version name: "Firmware Version" entity_category: diagnostic disabled_by_default: True unit_of_measurement: "" register_type: holding value_type: U_WORD accuracy_decimals: 2 filters: - multiply: 0.01 - platform: modbus_controller address: 10 id: output_voltage name: "Output Voltage" device_class: voltage state_class: measurement unit_of_measurement: "V" register_type: holding value_type: U_WORD accuracy_decimals: 3 filters: - multiply: 0.01 - platform: modbus_controller address: 11 id: output_current name: "Output Current" device_class: current state_class: measurement unit_of_measurement: "A" register_type: holding value_type: U_WORD accuracy_decimals: 3 filters: - multiply: 0.01 - platform: modbus_controller address: 12 id: output_power name: "Output Power" device_class: power state_class: measurement unit_of_measurement: "W" register_type: holding value_type: U_DWORD accuracy_decimals: 2 filters: - multiply: 0.01 - platform: modbus_controller address: 33 id: battery_voltage name: "Battery Voltage" device_class: voltage state_class: measurement unit_of_measurement: "V" register_type: holding value_type: U_WORD accuracy_decimals: 3 filters: - multiply: 0.01 - platform: modbus_controller address: 40 id: battery_energy name: "Battery Energy" device_class: "energy_storage" state_class: measurement unit_of_measurement: "Wh" icon: "mdi:battery-60" register_type: holding value_type: U_DWORD accuracy_decimals: 3 filters: - multiply: 0.001 - platform: modbus_controller address: 16 id: "protection_status" name: "Protection Status" register_type: holding value_type: U_WORD accuracy_decimals: 0 - platform: modbus_controller address: 17 id: "cv_cc_status" name: "CV CC Status" register_type: holding value_type: U_WORD accuracy_decimals: 0 - platform: modbus_controller address: 14 id: input_voltage name: "Input Voltage" device_class: voltage unit_of_measurement: "V" register_type: holding value_type: U_WORD accuracy_decimals: 2 filters: - multiply: 0.01 - platform: modbus_controller id: internal_temperature name: "Internal Temperature" device_class: temperature state_class: measurement register_type: holding address: 4 value_type: S_DWORD unit_of_measurement: "°C" - platform: modbus_controller id: external_temperature name: "External Temperature" state_class: measurement register_type: holding address: 34 value_type: S_DWORD device_class: temperature unit_of_measurement: "°C" - platform: wifi_signal name: "Wi-Fi Signal" disabled_by_default: True update_interval: 60s # Uptime is used internally only - platform: uptime id: sensor_uptime text_sensor: - platform: wifi_info ip_address: name: "IP Address" disabled_by_default: True ssid: name: "Wi-Fi SSID" disabled_by_default: True bssid: name: "Wi-Fi BSSID" disabled_by_default: True - platform: template id: model_name name: "Model Name" entity_category: diagnostic # Updated by model number update_interval: never filters: - map: - 60062 -> RD6006 - 60065 -> RD6006P - 60121 -> RD6012 - 60181 -> RD6018 binary_sensor: - platform: modbus_controller id: keypad_lock name: "Keypad Lock" entity_category: diagnostic device_class: lock address: 15 register_type: holding bitmask: 0x1 filters: - invert: - platform: modbus_controller address: 32 id: battery_mode name: "Battery Mode" device_class: connectivity register_type: holding bitmask: 0x1 - platform: template id: over_voltage_protection name: "Over Voltage Protection" device_class: problem lambda: return id(protection_status).state == 1; - platform: template id: over_current_protection name: "Over Current Protection" device_class: problem lambda: return id(protection_status).state == 2; - platform: template id: constant_voltage name: "Constant Voltage" lambda: return id(cv_cc_status).state == 0; - platform: template id: constant_current name: "Constant Current" lambda: return id(cv_cc_status).state == 1; number: - platform: modbus_controller id: backlight name: "Backlight" icon: "mdi:lightbulb" entity_category: config address: 72 value_type: U_WORD min_value: 0 max_value: 5 - platform: modbus_controller name: "Output Voltage" device_class: voltage unit_of_measurement: "V" entity_category: config address: 8 value_type: U_WORD min_value: 0 max_value: 60 step: 0.01 multiply: 100 - platform: modbus_controller name: "Output Current" device_class: current unit_of_measurement: "A" entity_category: config address: 9 value_type: U_WORD min_value: 0 max_value: 6 step: 0.001 multiply: 100 - platform: modbus_controller name: "Over Voltage Protection" device_class: voltage unit_of_measurement: "V" address: 82 entity_category: config value_type: U_WORD min_value: 0 max_value: 62 step: 0.01 multiply: 100 - platform: modbus_controller name: "Over Current Protection" device_class: current unit_of_measurement: "A" address: 83 entity_category: config value_type: U_WORD min_value: 0 max_value: 6 step: 0.01 multiply: 1000 # Date components are kept internal - platform: modbus_controller id: date_year name: "Year" entity_category: diagnostic register_type: holding address: 48 value_type: U_WORD - platform: modbus_controller id: date_month name: "Month" entity_category: diagnostic register_type: holding address: 49 value_type: U_WORD - platform: modbus_controller id: date_day name: "Day" entity_category: diagnostic register_type: holding address: 50 value_type: U_WORD - platform: modbus_controller id: date_hour name: "Hour" entity_category: diagnostic register_type: holding address: 51 value_type: U_WORD - platform: modbus_controller id: date_minute name: "Minute" entity_category: diagnostic register_type: holding address: 52 value_type: U_WORD - platform: modbus_controller id: date_second name: "Second" entity_category: diagnostic register_type: holding address: 53 value_type: U_WORD switch: - platform: modbus_controller id: output name: "Output" address: 18 register_type: holding bitmask: 0x1 entity_category: config button: - platform: safe_mode name: "Safe mode" ```
wildekek commented 1 year ago

Thanks for all your efforts to get other models tested and included! Since the diff between the models is so small, the neatest solution imo is to make 1 file that supports all models. That way it is easier to update in the future. I think I can write something that checks the model once during startup and saves the accuracy/range values to EEPROM. I'll work on it a bit this week and will poke this thread when I have a testable version.

wildekek commented 1 year ago

I'm not super familiar with esphome, but couldn't the lambda if x true false be simplified to just return the condition directly?

EDIT: Yes, you can lambda: return X; instead

I don't understand which code you're referring to and how this is related to this issue, help me.

ShayBox commented 1 year ago

https://github.com/wildekek/riden-esphome/blob/main/rd6006-controller.yaml#L321-L326

This format can be replaced with just lambda: return id(protection_status).state == 1;

wildekek commented 1 year ago

So, I just checked out the possibility of setting the differences between models (like accuracy and min/max current) based on the model name (available since v1.3.3 59bf17debba40bc707cccee08bd506463f199ce6). The issue however is that ESPHome does not allow templates in configuration variables (like max_value in a modbus number).

The most elegant solution I can think of, is to have a main yaml which substitutes a model specific yaml like so:

#in rd-powersupply.yaml

<<: !include 6018.yaml

Any more elegant ideas?

ShayBox commented 1 year ago

Are you able to use lambdas in configuration variables? global variables with lambdas, the yaml substitutes are a good solution if not

I'm not sure if you'd have to use lambda: or !lambda format

wildekek commented 1 year ago

No, lambda's in configuration variables are not an option. I'm working on a pretty clean solution using substitutions like so:

substitutions:
  # Change this model to fit your particular one.
  # You can find it in Home Assistant as the device diagnostic "Model Name".
  model: "RD6006"
  device_name: "rd6006-controller"
  device_friendly_name: "RD 6006"
  device_description: "Power Supply"
  time_timezone: "Europe/Amsterdam"

  # Model specific settings (Don't change these!)
  RD6006_max_voltage: "60"
  RD6006_max_current: "6"
  RD6006_voltage_precision: "2"
  RD6006_current_precision: "3"

  RD6006P_max_voltage: "60"
  RD6006P_max_current: "6"
  RD6006P_voltage_precision: "3"
  RD6006P_current_precision: "4"

  RD6012_max_voltage: "60"
  RD6012_max_current: "12"
  RD6012_voltage_precision: "2"
  RD6012_current_precision: "2"

  RD6018_max_voltage: "60"
  RD6018_max_current: "18"
  RD6018_voltage_precision: "2"
  RD6018_current_precision: "2"

snip

max_value: ${${model}_max_voltage}
wildekek commented 1 year ago

I created 1.4.0 as a beta release, go check it out! If it is confirmed to work, let me know. Your help is appreciated! https://github.com/wildekek/rdtech-esphome/releases/tag/1.4.0

Dom4n commented 1 year ago

Nice!


❓ RD6006P: Needs testing: check out the latest release candidate (> 1.4)

❓ RD60012: Needs testing: check out the latest release candidate (> 1.4)

❓ RD60018: Needs testing: check out the latest release candidate (> 1.4)

🛑 RD60024: Not supported. You're welcome to make a pull request :)

It's RD6012, RD6018, RD6024, one zero too much ;)

I will test RD6018 and post results.

ShayBox commented 1 year ago

You added an extra 0 to the 12 and 18 substitution model number variable names, I wish these things could do 600v output lol

EDIT: Dom4n beat me to it EDIT2: The link to the yaml file in the flashing section of the readme is broken EDIT3: If you use the custom firmware you can use higher baudrates and increase the polling speed (if you want), I can use max 1,000,000 but sometimes, using some modbus libraries I can only get 500,000

ShayBox commented 1 year ago

It seems to work for me on my RD6018

Would it be possible to add a button that syncs the units date/time with home assistant, because even with the internal battery it never saves the time for me

This is my modified version ```yaml substitutions: name: "riden" friendly_name: "Riden" # Change this model to fit your particular one. # You can find it in Home Assistant as the device diagnostic "Model Name". model: "RD6018" # Model specific settings (Don't change these!) RD6006_voltage_maximum: "60" RD6006_voltage_accuracy: "2" RD6006_voltage_multiplier: "0.01" RD6006_current_maximum: "6" RD6006_current_accuracy: "3" RD6006_current_multiplier: "0.001" RD6006P_voltage_maximum: "60" RD6006P_voltage_accuracy: "3" RD6006P_voltage_multiplier: "0.001" RD6006P_current_maximum: "6" RD6006P_current_accuracy: "4" RD6006P_current_multiplier: "0.0001" RD6012_voltage_maximum: "60" RD6012_voltage_accuracy: "2" RD6012_voltage_multiplier: "0.01" RD6012_current_maximum: "12" RD6012_current_accuracy: "2" RD6012_current_multiplier: "0.01" RD6018_voltage_maximum: "60" RD6018_voltage_accuracy: "2" RD6018_voltage_multiplier: "0.01" RD6018_current_maximum: "18" RD6018_current_accuracy: "2" RD6018_current_multiplier: "0.01" esphome: name: $name friendly_name: $friendly_name esp8266: board: esp01_1m # Enable logging logger: baud_rate: 0 # Enable Home Assistant API api: encryption: key: "3IAlK13CXHrdbjpi8NRbfKN/0kvaly3ViwlZoQ371hQ=" ota: password: "d2e055799331e1260302636634d0aafd" wifi: ssid: !secret wifi_ssid password: !secret wifi_password # Enable fallback hotspot (captive portal) in case wifi connection fails ap: ssid: "Riden Fallback Hotspot" password: !secret wifi_password captive_portal: uart: tx_pin: 1 rx_pin: 3 baud_rate: 1000000 modbus_controller: ## This address should be set to the "Address" value in the config menu address: 0x01 setup_priority: -10 update_interval: 1s sensor: - platform: modbus_controller id: model_number name: "Model Number" entity_category: diagnostic disabled_by_default: True address: 0 skip_updates: 10 unit_of_measurement: "" register_type: holding value_type: U_WORD accuracy_decimals: 0 on_value: then: - lambda: id(model_name).publish_state(value_accuracy_to_string(x, 0)); - platform: modbus_controller name: "Serial Number" entity_category: diagnostic disabled_by_default: True address: 1 skip_updates: 10 register_type: holding value_type: U_DWORD accuracy_decimals: 0 - platform: modbus_controller address: 3 name: "Firmware Version" entity_category: diagnostic disabled_by_default: True unit_of_measurement: "" register_type: holding value_type: U_WORD accuracy_decimals: 2 filters: - multiply: 0.01 - platform: modbus_controller address: 10 name: "Output Voltage" device_class: voltage state_class: measurement unit_of_measurement: "V" register_type: holding value_type: U_WORD accuracy_decimals: ${${model}_voltage_accuracy} filters: - multiply: ${${model}_voltage_multiplier} - platform: modbus_controller address: 11 name: "Output Current" device_class: current state_class: measurement unit_of_measurement: "A" register_type: holding value_type: U_WORD accuracy_decimals: ${${model}_current_accuracy} filters: - multiply: ${${model}_current_multiplier} - platform: modbus_controller address: 12 name: "Output Power" device_class: power state_class: measurement unit_of_measurement: "W" register_type: holding value_type: U_DWORD accuracy_decimals: 2 filters: - multiply: 0.01 - platform: modbus_controller address: 33 name: "Battery Voltage" device_class: voltage state_class: measurement unit_of_measurement: "V" register_type: holding value_type: U_WORD accuracy_decimals: ${${model}_voltage_accuracy} filters: - multiply: ${${model}_voltage_multiplier} - platform: modbus_controller address: 40 name: "Battery Energy" device_class: "energy_storage" state_class: measurement unit_of_measurement: "Wh" icon: "mdi:battery-60" register_type: holding value_type: U_DWORD accuracy_decimals: 3 filters: - multiply: 0.001 - platform: modbus_controller address: 14 name: "Input Voltage" device_class: voltage unit_of_measurement: "V" register_type: holding value_type: U_WORD accuracy_decimals: ${${model}_voltage_accuracy} filters: - multiply: ${${model}_voltage_multiplier} - platform: modbus_controller name: "Internal Temperature" device_class: temperature state_class: measurement register_type: holding address: 4 value_type: S_DWORD unit_of_measurement: "°C" - platform: modbus_controller name: "External Temperature" state_class: measurement register_type: holding address: 34 value_type: S_DWORD device_class: temperature unit_of_measurement: "°C" - platform: wifi_signal name: "Wi-Fi Signal" disabled_by_default: True update_interval: 60s # Uptime is used internally only - platform: uptime id: sensor_uptime text_sensor: - platform: wifi_info ip_address: name: "IP Address" disabled_by_default: True ssid: name: "Wi-Fi SSID" disabled_by_default: True bssid: name: "Wi-Fi BSSID" disabled_by_default: True - platform: template id: model_name name: "Model Name" entity_category: diagnostic # Updated by model number update_interval: never filters: - map: - 60062 -> RD6006 - 60065 -> RD6006P - 60121 -> RD6012 - 60181 -> RD6018 binary_sensor: - platform: modbus_controller name: "Keypad lock" entity_category: diagnostic device_class: lock address: 15 register_type: holding bitmask: 0x1 filters: - invert: - platform: modbus_controller address: 32 name: "Battery mode" device_class: connectivity register_type: holding bitmask: 0x1 - platform: modbus_controller name: "Over Voltage Protection" device_class: problem address: 16 register_type: holding bitmask: 0x1 - platform: modbus_controller name: "Over Current Protection" device_class: problem address: 16 register_type: holding bitmask: 0x2 - platform: modbus_controller name: "Constant Voltage" address: 17 register_type: holding bitmask: 0x1 filters: - invert: - platform: modbus_controller name: "Constant Current" address: 17 register_type: holding bitmask: 0x1 number: - platform: modbus_controller name: "Backlight" icon: "mdi:lightbulb" entity_category: config address: 72 value_type: U_WORD min_value: 0 max_value: 5 - platform: modbus_controller name: "Output Voltage" device_class: voltage unit_of_measurement: "V" entity_category: config address: 8 value_type: U_WORD min_value: 0 max_value: ${${model}_voltage_maximum} step: ${${model}_voltage_multiplier} lambda: !lambda return x * ${${model}_voltage_multiplier}; write_lambda: !lambda return x * (1/${${model}_voltage_multiplier}); - platform: modbus_controller name: "Output Current" device_class: current unit_of_measurement: "A" entity_category: config address: 9 value_type: U_WORD min_value: 0 max_value: ${${model}_current_maximum} step: ${${model}_current_multiplier} lambda: !lambda return x * ${${model}_current_multiplier}; write_lambda: !lambda return x * (1/${${model}_current_multiplier}); - platform: modbus_controller name: "Over Voltage Protection" device_class: voltage unit_of_measurement: "V" address: 82 entity_category: config value_type: U_WORD min_value: 0 max_value: ${${model}_voltage_maximum} step: ${${model}_voltage_multiplier} lambda: !lambda return x * ${${model}_voltage_multiplier}; write_lambda: !lambda return x * (1/${${model}_voltage_multiplier}); - platform: modbus_controller name: "Over Current Protection" device_class: current unit_of_measurement: "A" address: 83 entity_category: config value_type: U_WORD min_value: 0 max_value: ${${model}_current_maximum} step: ${${model}_current_multiplier} lambda: !lambda return x * ${${model}_current_multiplier}; write_lambda: !lambda return x * (1/${${model}_current_multiplier}); # Date components are kept internal - platform: modbus_controller id: date_year entity_category: diagnostic register_type: holding address: 48 value_type: U_WORD - platform: modbus_controller id: date_month entity_category: diagnostic register_type: holding address: 49 value_type: U_WORD - platform: modbus_controller id: date_day entity_category: diagnostic register_type: holding address: 50 value_type: U_WORD - platform: modbus_controller id: date_hour entity_category: diagnostic register_type: holding address: 51 value_type: U_WORD - platform: modbus_controller id: date_minute entity_category: diagnostic register_type: holding address: 52 value_type: U_WORD - platform: modbus_controller id: date_second entity_category: diagnostic register_type: holding address: 53 value_type: U_WORD switch: - platform: modbus_controller name: "Output" address: 18 register_type: holding bitmask: 0x1 entity_category: config button: - platform: safe_mode name: "Safe mode" ```
wildekek commented 1 year ago

Nice!


❓ RD6006P: Needs testing: check out the latest release candidate (> 1.4)

❓ RD60012: Needs testing: check out the latest release candidate (> 1.4)

❓ RD60018: Needs testing: check out the latest release candidate (> 1.4)

🛑 RD60024: Not supported. You're welcome to make a pull request :)

It's RD6012, RD6018, RD6024, one zero too much ;)

I will test RD6018 and post results.

Fixed! Thank you for testing, appreciated!

wildekek commented 1 year ago

It seems to work for me on my RD6018

Would it be possible to add a button that syncs the units date/time with home assistant, because even with the internal battery it never saves the time for me

This is my modified version

Please create a new issue, let's discuss there.

Edit: See #2

wildekek commented 1 year ago

EDIT2: The link to the yaml file in the flashing section of the readme is broken.

Fixed!

wildekek commented 1 year ago

If anyone is able to test the RD6006P or RD6012, I'd be super happy! 🙏

wildekek commented 11 months ago

I'm going to close this issue and release it. There was enough chance to test it and any issues should be low-risk and can go into new issues. Thanks!