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 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.
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
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
- seconds: 0
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;â
- climate.control:
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;
- lambda: |-
-
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
- multiply: 2.0
-
platform: adc
pin: GPIO36
id: boiler_temp
update_interval: 5s
unit_of_measurement: âVâ
accuracy_decimals: 1
filters:- multiply: 2.0
attenuation: 0db
- multiply: 2.0
-
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.control:
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
- name: Summer
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