Support for Hewalex MiniSOL

Hello. Firstly, I hope I used the right category. I have got this controller MiniSOL controller - ATRIA Europe that regulates solar heater (for hot water). It connects to circulation pump and 2 temperature sensors. I would like to be able to somehow poll data from it. It basically connects to my local network and listens on port tcp/80 (http). I also registered it to talk to cloud (that is to hewalex.pl on https).
But locally, I used wireshark to sniff the data traffic and it looks like it is only pushing data to client once client connects, it doesn’t look like I can poll/scrape any data.
Would someone have an idea hof or if at all this could be achieved in any way?

hello, I diddn t even get here, when trying to setup wifi app crashes :slight_smile: did this also happen to you?

Had same issues myself. Tried various things, multiple older versions of apk too. What I think what helped finally was the fact that I unplugged controller from power, plugged it back in and paired it within first few minutes after boot. That worked, after I registered it to cloud and did not touch it ever since.
I also asked Hewalex if they have any plans opening it up to 3rd parties - they mentioned potentially supporting restapi, but stated that it would not be soon (more like 2+ years I suppose).
So I ended up installing temperature sensor in the tank and am monitoring the temperature only.

Hello, I have opened a support ticket, talked only to the IT guy, said from his side all good so he transferred my ticket to another support group which i think did something remote because today device started working properly out of nowhere. Funny enough just as I finished the code to control the system, 2 dallas temp sensors for feedback pid controlled pwm pump and a boiler thermostat. Just need to get the display working, board is a lilypad.

I have the same device. Did a teardown and (as expected) this device contains an ESP32. Looking to reverse engineer the controller and reimplement it with esphome.

1 Like

Did not open it yet due to other ongoing projects (diy heat pump integrated in esphome) but now that you mentioned it has a esp32 inside I will definetely open it up and have a look :slight_smile:

Hello, just finished reverse engineering this piece of s***t file system is encrypted, gave up after a couple of hours instead desoldered the esp module and soldered wires to my own:) code:
esphome:
name: solarheater
friendly_name: solarheater

esp32:
board: nodemcu-32s

wifi:
ssid: ************
password: “****************”

logger:
level: VERBOSE
logs:
climate: none
sensor: verbose

time:

  • platform: homeassistant
    id: esptime
    on_time:
    • seconds: 0
      minutes: 30
      hours: 0
      then:
      • switch.turn_on: console_restart

api:
encryption:
key: “****************”

ota:

number:

  • platform: template
    name: kp
    icon: mdi:chart-bell-curve
    restore_value: true
    initial_value: 0.3
    min_value: 0
    max_value: 50
    step: 0.001
    set_action:
    lambda: |-
    id(pid_thermostat).set_kp(x);

  • platform: template
    name: ki
    icon: mdi:chart-bell-curve
    restore_value: true
    initial_value: 0.0015
    min_value: 0
    max_value: 50
    step: 0.0001
    set_action:
    lambda: |-
    id(pid_thermostat).set_ki(x);

  • platform: template
    name: kd
    icon: mdi:chart-bell-curve
    restore_value: true
    initial_value: 0.0
    min_value: -50
    max_value: 50
    step: 0.001
    set_action:
    lambda: |-
    id(pid_thermostat).set_kd(x);

  • platform: template
    name: Deadband Threshold Low
    icon: mdi:chart-bell-curve
    restore_value: true
    initial_value: -1.0
    min_value: -20
    max_value: 0
    step: 0.1
    set_action:
    lambda: |-
    id(pid_thermostat).set_threshold_low(x);

  • platform: template
    name: Deadband Threshold High
    icon: mdi:chart-bell-curve
    restore_value: true
    initial_value: 0.4
    min_value: 0
    max_value: 20
    step: 0.1
    set_action:
    lambda: |-
    id(pid_thermostat).set_threshold_high(x);

  • platform: template
    name: Deadband ki Multiplier
    icon: mdi:chart-bell-curve
    restore_value: true
    initial_value: 0.04
    min_value: 0
    max_value: .2
    step: 0.01
    set_action:
    lambda: |-
    id(pid_thermostat).set_ki_multiplier(x);

  • platform: template
    name: “Heater Temp”
    id: desired_panel_temp
    min_value: 30
    max_value: 75
    step: 1
    initial_value: 50
    set_action:

    • climate.control:
      id: pid_thermostat
      target_temperature: !lambda ‘return x;’

binary_sensor:

  • platform: template
    name: “Run Pump”
    lambda: |-
    float panel_temp = id(heater_temp_filter).state; // Assuming you have a sensor with this ID
    float target_temp = id(desired_panel_temp).state;
    if (panel_temp >= target_temp) {
    return false; // Stop or don’t run the pump if panel is at or above target
    } else {
    return true; // Run the pump if panel is below target
    }
    on_press:
    then:
    - output.turn_on: pump_pwm
    on_release:
    then:
    - output.turn_off: pump_pwm

  • platform: status
    name: “System Status”
    id: system_status

sensor:

  • platform: pid
    id: pump_output
    name: “Pump Speed PWM”
    climate_id: pid_thermostat
    type: COOL

  • platform: adc
    pin: GPIO34 # Example ADC pin, adjust based on your actual setup
    id: pump_pwm_feedback
    update_interval: 1s
    attenuation: 11db # Adjust based on your expected voltage range
    filters:

    • lambda: |-
      // Convert voltage to a percentage or interpret directly
      // This example assumes a linear relationship for simplicity
      float pwm_percentage = x * 100.0 / 3.3; // Example conversion, adjust based on your setup
      return pwm_percentage;
  • platform: template
    name: “Pump status”
    lambda: |-
    float pwm_feedback = id(pump_pwm_feedback).state;
    if (pwm_feedback >= 90) {
    // Rotor locked alarm
    ESP_LOGD(“Pump”, “Rotor locked alarm”);
    return 2; // Example value, adjust according to your needs
    } else if (pwm_feedback == 75) {
    // Warning
    ESP_LOGD(“Pump”, “Warning”);
    return 1; // Example value for warning
    } else if (pwm_feedback <= 70) {
    // Normal operation, map PWM to power consumption or RPM
    // Assuming linear mapping here as an example
    ESP_LOGD(“Pump”, “Normal operation”);
    return pwm_feedback * (2236 / 70.0); // Adjust formula as needed
    } else {
    // Other conditions based on datasheet
    ESP_LOGD(“Pump”, “Other condition”);
    return 0; // Default or unknown status
    }
    unit_of_measurement: “RPM” # Adjust based on what you’re measuring
    update_interval: 1s

  • platform: wifi_signal
    name: WiFi Strength
    update_interval: 60s

  • platform: adc
    pin: GPIO39
    id: heater_temp
    update_interval: 5s
    unit_of_measurement: ‘V’
    accuracy_decimals: 1
    filters:

    • multiply: 2.0
      attenuation: 0db
  • platform: adc
    pin: GPIO36
    id: boiler_temp
    update_interval: 5s
    unit_of_measurement: ‘V’
    accuracy_decimals: 1
    filters:

    • multiply: 2.0
      attenuation: 0db
  • platform: resistance
    sensor: heater_temp
    configuration: DOWNSTREAM
    resistor: 10kOhm
    reference_voltage: 6V
    id: heater_temp_filter

  • platform: ntc
    id: heater
    sensor: heater_temp_filter
    calibration:
    b_constant: 3380
    reference_temperature: 25°C
    reference_resistance: 10kOhm
    name: “|Heater Temperature|”

  • platform: resistance
    sensor: boiler_temp
    configuration: DOWNSTREAM
    resistor: 10kOhm
    reference_voltage: 6V
    id: boiler_temp_filter

  • platform: ntc
    id: tank
    sensor: boiler_temp_filter
    calibration:
    b_constant: 3380
    reference_temperature: 25°C
    reference_resistance: 10kOhm
    name: “|Tank Temperature|”

switch:

  • platform: restart
    name: Controller Restart
    id: console_restart

  • platform: template
    id: pid_controller_switch
    icon: “mdi:power”
    turn_on_action:

    • climate.control:
      id: pid_thermostat
    • logger.log: “PID Controller is ON”
      turn_off_action:
    • climate.control:
      id: pid_thermostat
      target_temperature: 0°C
    • logger.log: “PID Controller is OFF”

climate:

  • platform: pid
    id: pid_thermostat
    sensor: heater
    default_target_temperature: 60°C
    cool_output: pump_pwm
    visual:
    min_temperature: 30 °C
    max_temperature: 90 °C
    control_parameters:
    kp: 0.3
    ki: 0.0015
    kd: 0
    max_integral: 0.0
    output_averaging_samples: 1
    derivative_averaging_samples: 5
    deadband_parameters:
    threshold_high: 4.0°C
    threshold_low: -4.0°C
    kp_multiplier: 0.0
    ki_multiplier: 0.04
    kd_multiplier: 0.0
    deadband_output_averaging_samples: 15

  • platform: thermostat
    name: “Storage Tank”
    sensor: tank
    min_idle_time: 0s
    min_heating_off_time: 0s
    min_heating_run_time: 300s
    default_preset: Summer
    preset:

    • name: Summer
      default_target_temperature_low: 65 °C
      heat_action:
    • switch.turn_on: pid_controller_switch
      idle_action:
    • switch.turn_off: pid_controller_switch
      visual:
      min_temperature: 30 °C
      max_temperature: 73 °C

button:

  • platform: template
    name: “PID Climate Autotune”
    on_press:
    • climate.pid.autotune: pid_thermostat

output:

  • platform: ledc
    id: pump_pwm
    pin: GPIO16
    frequency: “1500 Hz”
    min_power: 3%
    max_power: 100%

***with pump error handling included (Grundfos UPM3 solar)

Hello Wout,

Did you got the esp32 working with the Hewalex? aAnd if so, can you adjust settings with HA?

partially even dough the 2 sensors have different adc pins they somehow interfere with each other, I have ordered parts when they arrive I will test and keep you posted