From 2d3c9cf674a50971277298eeb6df098315947070 Mon Sep 17 00:00:00 2001 From: Commander1024 Date: Mon, 6 Nov 2023 23:22:06 +0100 Subject: [PATCH] Add RD6018 Lab PSU via ESPhome WiFi. --- esphome/riden-labornetzteil.yaml | 505 +++++++++++++++++++++++++++++++ 1 file changed, 505 insertions(+) create mode 100644 esphome/riden-labornetzteil.yaml diff --git a/esphome/riden-labornetzteil.yaml b/esphome/riden-labornetzteil.yaml new file mode 100644 index 0000000..2f6a09d --- /dev/null +++ b/esphome/riden-labornetzteil.yaml @@ -0,0 +1,505 @@ +substitutions: + name: "riden-labornetzteil" + friendly_name: "Riden Labornetzteil" + # Change this model to fit your particular one. + # You can find it in Home Assistant as the device diagnostic "Model Name". + model: "RD6018" + device_name: "rd6018-controller" + device_friendly_name: "Riden RD6018" + device_description: "Labornetzteil" + time_timezone: "Europe/Berlin" + + # 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: $device_name + friendly_name: $device_friendly_name + comment: $device_description + name_add_mac_suffix: false + project: + name: "wildekek.rd6006-controller" + version: "1.4.1" + +esp8266: + board: esp12e + +wifi: + ssid: "Voltage-legacy" + password: !secret voltage_legacy_psk + use_address: riden-labornetzteil.home + power_save_mode: high + fast_connect: on + + # Enable fallback hotspot (captive portal) in case wifi connection fails + ap: + ssid: "RD6018 Fallback Hotspot" + password: !secret fallback_psk + +captive_portal: + +# Enable logging +logger: + level: INFO + # Disable logging via UART, since we're using this for modbus communication + baud_rate: 0 + +# Enable Home Assistant API +api: + encryption: + key: !secret apikey + +ota: + password: !secret ota + +# Enable status LED +status_led: + pin: + number: GPIO2 + inverted: true + +uart: + id: mod_bus + tx_pin: GPIO1 + rx_pin: GPIO3 + baud_rate: 115200 + data_bits: 8 + stop_bits: 1 + parity: none + +modbus: + id: modbus1 + +modbus_controller: + - id: powersupply + ## This address should be set to the "Address" value in the config menu + address: 0x01 + modbus_id: modbus1 + setup_priority: -10 + update_interval: 5s + +time: + # Get the time from HA, so we can use it for uptime + - platform: homeassistant + id: time_homeassistant + timezone: "${time_timezone}" + on_time_sync: + - logger.log: Time has been set and is valid! + - component.update: sensor_uptime_timestamp + - number.set: + id: date_year + value: !lambda return id(time_homeassistant).now().year; + - number.set: + id: date_month + value: !lambda return id(time_homeassistant).now().month; + - number.set: + id: date_day + value: !lambda return id(time_homeassistant).now().day_of_month; + - number.set: + id: date_hour + value: !lambda return id(time_homeassistant).now().hour; + - number.set: + id: date_minute + value: !lambda return id(time_homeassistant).now().minute; + - number.set: + id: date_second + value: !lambda return id(time_homeassistant).now().second; + +sensor: + - platform: modbus_controller + id: model_number + name: "Model Number" + entity_category: diagnostic + disabled_by_default: True + modbus_controller_id: powersupply + 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 + modbus_controller_id: powersupply + address: 1 + skip_updates: 10 + register_type: holding + value_type: U_DWORD + accuracy_decimals: 0 + + - platform: modbus_controller + modbus_controller_id: powersupply + 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 + modbus_controller_id: powersupply + 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 + modbus_controller_id: powersupply + 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 + modbus_controller_id: powersupply + 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 + modbus_controller_id: powersupply + 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 + modbus_controller_id: powersupply + address: 38 + name: "Battery charge" + device_class: "energy_storage" + state_class: measurement + unit_of_measurement: "Ah" + icon: "mdi:battery-60" + register_type: holding + value_type: U_DWORD + accuracy_decimals: 3 + filters: + - multiply: 0.001 + + - platform: modbus_controller + modbus_controller_id: powersupply + 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 + modbus_controller_id: powersupply + 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: "Temperature" + device_class: temperature + state_class: measurement + modbus_controller_id: powersupply + register_type: holding + address: 4 + value_type: S_DWORD + unit_of_measurement: "°C" + + - platform: modbus_controller + name: "Temperature external" + state_class: measurement + modbus_controller_id: powersupply + 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 + # This sensor is an alternative for the uptime sensor, which only sends the + # startup timestamp of the device to home assistant once + - platform: template + id: sensor_uptime_timestamp + name: "Uptime" + entity_category: diagnostic + device_class: "timestamp" + accuracy_decimals: 0 + update_interval: never + lambda: |- + static float timestamp = ( + id(time_homeassistant).utcnow().timestamp - id(sensor_uptime).state + ); + return timestamp; + +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 + modbus_controller_id: powersupply + name: "Keypad lock" + entity_category: diagnostic + device_class: lock + address: 15 + register_type: holding + bitmask: 0x1 + filters: + - invert: + - platform: modbus_controller + modbus_controller_id: powersupply + address: 32 + name: "Battery mode" + device_class: connectivity + register_type: holding + bitmask: 0x1 + - platform: modbus_controller + modbus_controller_id: powersupply + name: "Over Voltage Protection" + device_class: problem + address: 16 + register_type: holding + bitmask: 0x1 + - platform: modbus_controller + modbus_controller_id: powersupply + name: "Over Current Protection" + device_class: problem + address: 16 + register_type: holding + bitmask: 0x2 + - platform: modbus_controller + modbus_controller_id: powersupply + name: "Constant Voltage" + address: 17 + register_type: holding + bitmask: 0x1 + filters: + - invert: + - platform: modbus_controller + modbus_controller_id: powersupply + name: "Constant Current" + address: 17 + register_type: holding + bitmask: 0x1 + +number: + - platform: modbus_controller + modbus_controller_id: powersupply + name: "Backlight" + icon: "mdi:lightbulb" + entity_category: config + address: 72 + value_type: U_WORD + min_value: 0 + max_value: 5 + + - platform: modbus_controller + modbus_controller_id: powersupply + 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 + modbus_controller_id: powersupply + 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 + modbus_controller_id: powersupply + 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 + modbus_controller_id: powersupply + 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 + modbus_controller_id: powersupply + entity_category: diagnostic + register_type: holding + address: 48 + value_type: U_WORD + - platform: modbus_controller + id: date_month + modbus_controller_id: powersupply + entity_category: diagnostic + register_type: holding + address: 49 + value_type: U_WORD + - platform: modbus_controller + id: date_day + modbus_controller_id: powersupply + entity_category: diagnostic + register_type: holding + address: 50 + value_type: U_WORD + - platform: modbus_controller + id: date_hour + modbus_controller_id: powersupply + entity_category: diagnostic + register_type: holding + address: 51 + value_type: U_WORD + - platform: modbus_controller + id: date_minute + modbus_controller_id: powersupply + entity_category: diagnostic + register_type: holding + address: 52 + value_type: U_WORD + - platform: modbus_controller + id: date_second + modbus_controller_id: powersupply + entity_category: diagnostic + register_type: holding + address: 53 + value_type: U_WORD + +switch: + - platform: modbus_controller + modbus_controller_id: powersupply + name: "Output" + address: 18 + register_type: holding + bitmask: 0x1 + entity_category: config + +button: + - platform: safe_mode + name: "Safe mode"