Theoretically the only rules that you need to read the data from blue connect is teh rules called “piscina lettura” and “piscina graph”
There is also a rule to controll a dosing pump, i shared maybe you have some improvements
var Number pump_calibration = 50 // [ml al minuto] valore di calibrazione della pompa peristaltica *******da tarare*********
var Number concentrazione = 150 // [ml per ogni m3 per abbassare 1 di PH] [Aggiungere 3 lt. di prodotto ogni 100 m3 d'acqua per abbassare di 0,2 unitĂ il valore di pH]
var Timer pump = null // timer
var Timer ble = null // timer
var Number cap = 14 // [mc] volume piscina
var Number hyst = 0 // valore di isteresi sul setpoint impostato
var Number ble_on = 180 // [secondi] di attivazione bluetooth
var Number pump_off = 6.8 // valore pump grafico
var Number pump_on = 8 // valore pump grafico
var Number max_time = 15 // [minuti] - valore massimo dosabile per proteggere il sistema
var Number ph_offset = -0.07 // [pH] offset misura ph
/////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////
rule "piscina"
when
Time cron "0 0 10,12,14,16 * * ?"
then
var Number ph = esphome_blueconnect_pH.state as Number
var Number level = ph_level.state as Number
var Number level_h = level + hyst
if (ph > level_h){
pump_dosing_controll.sendCommand(ON)
}else{
if(pump !== null) {
pump.cancel
pump = null
}
dosing_pump_status.postUpdate("Livello ph corretto " + (esphome_blueconnect_pH.state).format("%.2f pH"))
}
end
rule "piscina 1"
when
Item pump_dosing_controll received command ON
then
var Number ph = esphome_blueconnect_pH.state as Number
var Number level = ph_level.state as Number
var Number ml = concentrazione*cap*(ph - level)
var time = (ml/pump_calibration).intValue
ph_minu_dosaggio.postUpdate(ml)
if (time >= max_time) {
pump_dosing_time.postUpdate(max_time)
dosing_pump_status.postUpdate("Livello pH Troppo Alto - Controllo Sonde")
pump = createTimer(now.plusMinutes(max_time), [ |
pump_dosing_controll.sendCommand(OFF)
])
} else {
pump_dosing_time.postUpdate(time)
dosing_pump_status.postUpdate("Livello pH Alto - Pompa Dosaggio Accesa")
pump = createTimer(now.plusMinutes(time), [ |
pump_dosing_controll.sendCommand(OFF)
])
}
end
rule "piscina 2"
when
Item pump_dosing_controll received command OFF
then
dosing_pump_status.postUpdate("Pompa Dosaggio Spenta")
pump_dosing_time.postUpdate(0)
ph_minu_dosaggio.postUpdate(0)
if(pump !== null) {
pump.cancel
pump = null
}
end
rule "piscina graph"
when
Item pump_dosing_controll received command or
Item ph_level received update or
Item esphome_blueconnect_pH_raw received update or
Item esphome_blueconnect_temperature received update
then
if(receivedCommand == ON) g_pump.postUpdate(pump_on)
else g_pump.postUpdate(pump_off)
g_set.postUpdate(ph_level.state)
var Number ph_raw = esphome_blueconnect_pH_raw.state as Number
var Number temp = esphome_blueconnect_temperature.state as Number
var Number slope = 54.2 + temp * 0.1984
var Number ph_calc = ph_raw / (slope * 4) + 7 + ph_offset
g_ph.postUpdate(ph_calc)
ph_ave.postUpdate(ph_calc)
esphome_blueconnect_pH.postUpdate(ph_calc)
end
rule "piscina lettura"
when
Time cron "0 50 * * * ?"
then
esphome_blueconnect_switch.sendCommand(ON)
ble = createTimer(now.plusSeconds(ble_on), [ |
esphome_blueconnect_switch.sendCommand(OFF)
])
end