I think I have finished the project. I just have to test it to see if it is acurate now.
The amount of water sample is determined with “input_number.khcontroller_watersamplepump_dosage”.
khcontroller_watersamplepump_dosage:
friendly_name: "KH Controller Volume échantillon ajouté"
unique_id: khcontroller_volume_watersample
value_template: "{{ states('input_number.khcontroller_watersamplepump_dosage') | float }}"
unit_of_measurement: "mL"
The amount of citric acid is calculated with the following template & sensor :
The template :
# Calcul du temps de fonctionnement de la pompe acide du KH controller
- unique_id: khcontroller_acidpump_runtime
device_class: duration
state: "{% set hours = states('sensor.khcontroller_acidpump_runtime') | float %}
{% set minutes = ((hours % 1) * 60) | int %}
{{ '%02ih %02im'%(hours // 1, minutes) }}"
name: Acid pump runtime
The sensor :
# Calcul de la durée de fonctionnement de la pompe acide
- platform: history_stats
name: khcontroller_acidpump_runtime
entity_id: fan.kh_controller_dosing_pump2_forward
state: "on"
type: time
start: "{{ now().replace(hour=0, minute=0, second=0) }}"
end: "{{ now() }}"
The name of the sensor has to be the same in the template for the sensor to work.
And the you are able to calculate the amount of poured acid :
khcontroller_acidpump_dosage:
value_template: >
{% set runtime = states('sensor.khcontroller_acidpump_runtime') | float(0) %}
{% set calibration_dosage = states('input_number.khcontroller_acidpump_calibration_dosage') | float(0) %}
{% set calibration_time = states('input_number.khcontroller_acidpump_calibration_time') | float(0) %}
{{ (runtime * (calibration_dosage / calibration_time))*100 | round(2) }}
unit_of_measurement: "mL"
friendly_name: 'KH controller Qté ajout acide'
The result has to be multiplied by 100 to get the right value.
And for the KH value calculation, here is the calculation with a sensor :
# Affichage de la valeur dKH
kh_controller_kh_value:
value_template: >
{% set water_dosage = states('sensor.khcontroller_watersamplepump_dosage') | float(0) %}
{% set acid_dosage = states('sensor.khcontroller_acidpump_dosage') | float(0) %}
{% if water_dosage > 0 %}
{{ (acid_dosage / water_dosage) * 280 | round(2) }}
{% else %}
0
{% endif %}
unit_of_measurement: "°KH"
friendly_name: 'Valeur KH'
Here is the final code for the lovelace card :
type: vertical-stack
cards:
- type: custom:vertical-stack-in-card
cards:
- type: custom:mushroom-chips-card
chips:
- type: back
- cards:
- card:
entities:
- entity: sensor.kh_controller_reef_ph_khcontroller
name: Valeur mV
- entity: sensor.reef_ph
- entity: sensor.kh_controller_kh_value
- entity: input_boolean.kh_test
- entity: input_boolean.calib_ph
- entity: input_boolean.calib_watersamplepump
- entity: input_boolean.calib_acidpump
show_header_toggle: false
title: KH Controller
type: entities
conditions:
- entity: input_boolean.calib_ph
state: "off"
- entity: input_boolean.calib_acidpump
state: "off"
- entity: input_boolean.calib_watersamplepump
state: "off"
- entity: input_boolean.kh_test
state: "off"
type: conditional
- card:
entities:
- entity: sensor.kh_controller_reef_ph_khcontroller
name: Valeur mV
- entity: sensor.reef_ph
- entity: sensor.kh_controller_kh_value
- entity: input_boolean.kh_test
- entity: input_number.khcontroller_watersamplepump_dosage
name: Dosage water sample
- entity: sensor.khcontroller_watersamplepump_runtime
name: Durée ajout water sample
- entity: sensor.khcontroller_watersamplepump_dosage
name: Quantité ajout water sample
- entity: sensor.khcontroller_acidpump_runtime
name: Durée ajout acide
- entity: sensor.khcontroller_acidpump_dosage
name: Quantité ajout acide
- entity: input_boolean.calib_ph
- entity: input_boolean.calib_watersamplepump
- entity: input_boolean.calib_acidpump
show_header_toggle: false
title: KH Controller
type: entities
conditions:
- entity: input_boolean.kh_test
state: "on"
type: conditional
- card:
entities:
- entity: sensor.kh_controller_reef_ph_khcontroller
- entity: sensor.reef_ph
- entity: sensor.kh_controller_kh_value
- entity: input_boolean.kh_test
- entity: input_boolean.calib_ph
- entity: input_select.c_calib_ph4
- entity: input_number.v_calib_mv4
- entity: input_select.c_calib_ph7
- entity: input_number.v_calib_mv7
- entity: input_select.c_calib_ph9_10
- entity: input_number.v_calib_mv9
show_header_toggle: false
title: Reef pH (KH Controller) Calib mode
type: entities
conditions:
- entity: input_boolean.calib_ph
state: "on"
type: conditional
- card:
entities:
- entity: sensor.kh_controller_reef_ph_khcontroller
name: Valeur mV
- entity: sensor.reef_ph
- entity: sensor.kh_controller_kh_value
- entity: input_boolean.kh_test
- entity: input_boolean.calib_watersamplepump
- entity: input_number.khcontroller_watersamplepump_calibration_time
- entity: input_boolean.calib_watersamplepump_start
- entity: input_number.khcontroller_watersamplepump_calibration_dosage
show_header_toggle: false
title: Calibration Water sample pump
type: entities
conditions:
- entity: input_boolean.calib_watersamplepump
state: "on"
type: conditional
- card:
entities:
- entity: sensor.kh_controller_reef_ph_khcontroller
name: Valeur mV
- entity: sensor.reef_ph
- entity: sensor.kh_controller_kh_value
- entity: input_boolean.kh_test
- entity: input_boolean.calib_acidpump
- entity: input_number.khcontroller_acidpump_calibration_time
- entity: input_boolean.calib_acidpump_start
- entity: input_number.khcontroller_acidpump_calibration_dosage
show_header_toggle: false
title: Calibration Acid pump
type: entities
conditions:
- entity: input_boolean.calib_acidpump
state: "on"
type: conditional
type: vertical-stack
Maybe there will need improvements, of some adjustements when testing for accuracy, is there something more accurate than history_stats to get the pump runtime?