diff --git a/aquapi_config.yaml b/aquapi_config.yaml index a34b1ac..7e9a8de 100644 --- a/aquapi_config.yaml +++ b/aquapi_config.yaml @@ -3,7 +3,7 @@ substitutions: name: "aquapi" friendly_name: "AquaPi" # App Version - Updated: 11/2023 - app_version: "1.5.1" + app_version: "1.6" packages: device_base: !include common/device_base.yaml @@ -16,4 +16,7 @@ packages: # ezo_rtd: !include common/ezo_rtd.yaml # ezo_co2: !include common/ezo_co2.yaml # ezo_do: !include common/ezo_do.yaml - # debug: !include common/debug.yaml + ezo_pmp: !include common/ezo_pmp.yaml + ezo_pmp_change: !include common/ezo_pmp_change.yaml + # ezo_commands: !include common/ezo_commands.yaml + debug: !include common/debug.yaml \ No newline at end of file diff --git a/common/device_base.yaml b/common/device_base.yaml index 0bdb165..951e355 100644 --- a/common/device_base.yaml +++ b/common/device_base.yaml @@ -37,6 +37,8 @@ ota: wifi: ap: + +web_server: captive_portal: diff --git a/common/ezo_commands.yaml b/common/ezo_commands.yaml new file mode 100644 index 0000000..8df7c06 --- /dev/null +++ b/common/ezo_commands.yaml @@ -0,0 +1,40 @@ +substitutions: + # PMP circuit, who's address is 103 + addPMP_default: "103" + addPMP_alt1: "108" + addPMP_alt2: "109" + addPMP_alt3: "110" + +button: + # Change I2C Address of EZO-PMP + - platform: template + name: "Pump(Blue) -> ${addPMP_default} - Change I2C Address" + on_press: + then: + - ezo_pmp.change_i2c_address: + id: ezo_pump + address: ${addPMP_default} + + - platform: template + name: "Pump(Red) -> ${addPMP_alt1} - Change I2C Address" + on_press: + then: + - ezo_pmp.change_i2c_address: + id: ezo_pump + address: ${addPMP_alt1} + + - platform: template + name: "Pump(Green) -> ${addPMP_alt2} - Change I2C Address" + on_press: + then: + - ezo_pmp.change_i2c_address: + id: ezo_pump + address: ${addPMP_alt2} + + - platform: template + name: "Pump(Orange) -> ${addPMP_alt3} - Change I2C Address" + on_press: + then: + - ezo_pmp.change_i2c_address: + id: ezo_pump + address: ${addPMP_alt3} \ No newline at end of file diff --git a/common/ezo_pmp.yaml b/common/ezo_pmp.yaml new file mode 100644 index 0000000..0c8dac9 --- /dev/null +++ b/common/ezo_pmp.yaml @@ -0,0 +1,252 @@ +substitutions: + # PMP circuit, who's address is 103 + addPMP: "103" # White + update_pmp: "60s" + +ezo_pmp: + - id: ezo_pump + address: ${addPMP} + update_interval: "${update_pmp}" + +api: + services: + - service: pump_dose_volume + variables: + dose_volume: float + then: + - ezo_pmp.dose_volume: + id: ezo_pump + volume: !lambda 'return dose_volume;' + - service: pump_dose_volume_time + variables: + dose_volume: float + dose_time: float + then: + - ezo_pmp.dose_volume_over_time: + id: ezo_pump + volume: !lambda |- + return dose_volume; + duration: !lambda |- + return dose_time; + - service: pump_dose_flow_rate_time + variables: + dose_rate: float + dose_time: float + then: + - ezo_pmp.dose_with_constant_flow_rate: + id: ezo_pump + volume_per_minute: !lambda |- + return dose_rate; + duration: !lambda |- + return dose_time; + - service: pump_dose_set_calibration + variables: + actual_volume: float + then: + - ezo_pmp.set_calibration_volume: + id: ezo_pump + volume: !lambda |- + return actual_volume; + - service: pump_change_address + variables: + address: int + then: + - ezo_pmp.change_i2c_address: + id: ezo_pump + address: !lambda |- + return address; + +sensor: + - platform: ezo_pmp + id: ezo_pump + current_volume_dosed: + id: current_volume_dosed + name: Pump - Current Volume Dosed + icon: mdi:cube-scan + device_class: 'volume' + unit_of_measurement: 'mL' + - platform: ezo_pmp + id: ezo_pump + total_volume_dosed: + id: total_volume_dosed + name: Pump - Total Volume Dosed + icon: mdi:timer-sand-empty + device_class: 'volume' + unit_of_measurement: 'mL' + disabled_by_default: true + - platform: ezo_pmp + id: ezo_pump + absolute_total_volume_dosed: + id: absolute_total_volume_dosed + name: Pump - Absolute Total Volume Dosed + icon: mdi:timer-sand-full + device_class: 'volume' + unit_of_measurement: 'mL' + - platform: ezo_pmp + id: ezo_pump + last_volume_requested: + id: last_volume_requested + name: Pump - Last Volume Requested + icon: mdi:history + device_class: 'volume' + unit_of_measurement: 'mL' + - platform: ezo_pmp + id: ezo_pump + max_flow_rate: + id: max_flow_rate + name: Pump - Max Volume/Time Flow Rate + icon: mdi:car-speed-limiter + unit_of_measurement: 'mL/min' + - platform: ezo_pmp + id: ezo_pump + pump_voltage: + id: pump_voltage + name: Pump - Voltage + disabled_by_default: true + device_class: 'voltage' + +binary_sensor: + - platform: ezo_pmp + id: ezo_pump + pump_state: + id: pump_state + name: Pump - State + icon: mdi:pump + - platform: ezo_pmp + id: ezo_pump + is_paused: + id: is_paused + name: Pump - Paused Status + disabled_by_default: true + +text_sensor: + - platform: ezo_pmp + id: ezo_pump + dosing_mode: + id: dosing_mode + name: Pump - Dosing Mode + icon: mdi:auto-mode + - platform: ezo_pmp + id: ezo_pump + calibration_status: + id: calibration_status + name: Pump - Calibration Status + # disabled_by_default: true + icon: mdi:tape-measure + +number: + - platform: template + id: volume + icon: mdi:pump + name: Pump - Volume to Dose + device_class: 'volume' + unit_of_measurement: 'mL' + optimistic: true + initial_value: 10 # cannot be less than +/-0.1mL + min_value: -378541 + max_value: 378541 # 100 gal + mode: box + step: 0.1 + - platform: template + id: duration + icon: mdi:timer + name: Pump - Time to Dose + device_class: 'duration' + unit_of_measurement: 'min' + optimistic: true + initial_value: 1 + min_value: 1 + max_value: 1440 # 24 hours + mode: box + step: 0.1 + - platform: template + id: flow_rate + icon: mdi:waves-arrow-right + name: Pump - Volume/Time Flow Rate + unit_of_measurement: 'mL/min' + optimistic: true + initial_value: 10 + min_value: .5 + max_value: 105 # may need to lower to 40 + mode: box + step: 0.1 + +button: + # TODO Make UI + - platform: template + name: Pump - Dose Volume for Time + icon: mdi:clock-time-two-outline + id: dose_over_time + on_press: + - ezo_pmp.dose_volume_over_time: + id: ezo_pump + volume: !lambda |- + return id(volume).state; + duration: !lambda |- + return id(duration).state; + - platform: template + name: Pump - Dose Continuously + icon: mdi:infinity + id: dose_continuously + on_press: + - ezo_pmp.dose_continuously: + id: ezo_pump + - platform: template + name: Pump - Dose Volume + icon: mdi:pump + id: dose_volume + on_press: + - ezo_pmp.dose_volume: + id: ezo_pump + volume: !lambda |- + return id(volume).state; + - platform: template + name: Pump - Dose at Volume/Time Flow Rate for Time + icon: mdi:format-text-wrapping-overflow + id: dose_flow_rate + on_press: + - ezo_pmp.dose_with_constant_flow_rate: + id: ezo_pump + volume_per_minute: !lambda |- + return id(flow_rate).state; + duration: !lambda |- + return id(duration).state; + - platform: template + name: Pump - Pause Dosing + icon: mdi:pause + id: dose_pause + on_press: + - ezo_pmp.pause_dosing: + id: ezo_pump + - platform: template + name: Pump - Stop Dosing + icon: mdi:stop + id: dose_stop + on_press: + - ezo_pmp.stop_dosing: + id: ezo_pump + - platform: template + name: Pump - Clear Total Volume Dosed + icon: mdi:backspace + id: dose_clear + on_press: + - ezo_pmp.clear_total_volume_dosed: + id: ezo_pump + + # Calibrate + - platform: template + name: Pump - Set Calibration Volume + icon: mdi:tape-measure + id: dose_calibrate_volume + on_press: + - ezo_pmp.set_calibration_volume: + id: ezo_pump + volume: !lambda |- + return id(volume).state; + - platform: template + name: Pump - Clear Calibration Volume + icon: mdi:cancel + id: dose_calibrate_volume_clear + on_press: + - ezo_pmp.clear_calibration: + id: ezo_pump \ No newline at end of file diff --git a/common/ezo_pmp_change.yaml b/common/ezo_pmp_change.yaml new file mode 100644 index 0000000..65f71d9 --- /dev/null +++ b/common/ezo_pmp_change.yaml @@ -0,0 +1,504 @@ +substitutions: + # PMP circuit, who's address is 103 + addPMPWaste: "108" # Red - Waste Water + addPMPClean: "109" # Green - Clean Water + update_pmp: "60s" + +ezo_pmp: + - id: ezo_pump_waste + address: ${addPMPWaste} + update_interval: "${update_pmp}" + - id: ezo_pump_clean + address: ${addPMPClean} + update_interval: "${update_pmp}" + +api: + services: + - service: pump_waste_volume + variables: + dose_volume: float + then: + - ezo_pmp.dose_volume: + id: ezo_pump_waste + volume: !lambda 'return dose_volume;' + - service: pump_waste_volume_time + variables: + dose_volume: float + dose_time: float + then: + - ezo_pmp.dose_volume_over_time: + id: ezo_pump_waste + volume: !lambda |- + return dose_volume; + duration: !lambda |- + return dose_time; + - service: pump_waste_flow_rate_time + variables: + dose_rate: float + dose_time: float + then: + - ezo_pmp.dose_with_constant_flow_rate: + id: ezo_pump_waste + volume_per_minute: !lambda |- + return dose_rate; + duration: !lambda |- + return dose_time; + - service: pump_waste_set_calibration + variables: + actual_volume: float + then: + - ezo_pmp.set_calibration_volume: + id: ezo_pump_waste + volume: !lambda |- + return actual_volume; + - service: pump_clean_volume + variables: + dose_volume: float + then: + - ezo_pmp.dose_volume: + id: ezo_pump_clean + volume: !lambda 'return dose_volume;' + - service: pump_clean_volume_time + variables: + dose_volume: float + dose_time: float + then: + - ezo_pmp.dose_volume_over_time: + id: ezo_pump_clean + volume: !lambda |- + return dose_volume; + duration: !lambda |- + return dose_time; + - service: pump_clean_flow_rate_time + variables: + dose_rate: float + dose_time: float + then: + - ezo_pmp.dose_with_constant_flow_rate: + id: ezo_pump_clean + volume_per_minute: !lambda |- + return dose_rate; + duration: !lambda |- + return dose_time; + - service: pump_clean_set_calibration + variables: + actual_volume: float + then: + - ezo_pmp.set_calibration_volume: + id: ezo_pump_clean + volume: !lambda |- + return actual_volume; + - service: pump_water_change + variables: + volume: float + duration: float + then: + - ezo_pmp.dose_volume_over_time: + id: ezo_pump_clean + volume: !lambda |- + return volume; + duration: !lambda |- + return duration; + - ezo_pmp.dose_volume_over_time: + id: ezo_pump_waste + volume: !lambda |- + return volume; + duration: !lambda |- + return duration; + - service: pump_waste_change_address + variables: + address: int + then: + - ezo_pmp.change_i2c_address: + id: ezo_pump_waste + address: !lambda |- + return address; + - service: pump_clean_change_address + variables: + address: int + then: + - ezo_pmp.change_i2c_address: + id: ezo_pump_clean + address: !lambda |- + return address; + +sensor: + - platform: ezo_pmp + id: ezo_pump_waste + current_volume_dosed: + id: current_volume_dosed_waste + name: Pump Waste - Current Volume Dosed + icon: mdi:cube-scan + device_class: 'volume' + unit_of_measurement: 'mL' + - platform: ezo_pmp + id: ezo_pump_waste + total_volume_dosed: + id: total_volume_dosed_waste + name: Pump Waste - Total Volume Dosed + icon: mdi:timer-sand-empty + device_class: 'volume' + unit_of_measurement: 'mL' + disabled_by_default: true + - platform: ezo_pmp + id: ezo_pump_waste + absolute_total_volume_dosed: + id: absolute_total_volume_dosed_waste + name: Pump Waste - Absolute Total Volume Dosed + icon: mdi:timer-sand-full + device_class: 'volume' + unit_of_measurement: 'mL' + - platform: ezo_pmp + id: ezo_pump_waste + last_volume_requested: + id: last_volume_requested_waste + name: Pump Waste - Last Volume Requested + icon: mdi:history + device_class: 'volume' + unit_of_measurement: 'mL' + - platform: ezo_pmp + id: ezo_pump_waste + max_flow_rate: + id: max_flow_rate_waste + name: Pump Waste - Max Volume/Time Flow Rate + icon: mdi:car-speed-limiter + unit_of_measurement: 'mL/min' + - platform: ezo_pmp + id: ezo_pump_waste + pump_voltage: + id: pump_voltage_waste + name: Pump Waste - Voltage + disabled_by_default: true + device_class: 'voltage' + - platform: ezo_pmp + id: ezo_pump_clean + current_volume_dosed: + id: current_volume_dosed_clean + name: Pump Clean - Current Volume Dosed + icon: mdi:cube-scan + device_class: 'volume' + unit_of_measurement: 'mL' + - platform: ezo_pmp + id: ezo_pump_clean + total_volume_dosed: + id: total_volume_dosed_clean + name: Pump Clean - Total Volume Dosed + icon: mdi:timer-sand-empty + disabled_by_default: true + device_class: 'volume' + unit_of_measurement: 'mL' + - platform: ezo_pmp + id: ezo_pump_clean + absolute_total_volume_dosed: + id: absolute_total_volume_dosed_clean + name: Pump Clean - Absolute Total Volume Dosed + icon: mdi:timer-sand-full + device_class: 'volume' + unit_of_measurement: 'mL' + - platform: ezo_pmp + id: ezo_pump_clean + last_volume_requested: + id: last_volume_requested_clean + name: Pump Clean - Last Volume Requested + icon: mdi:history + device_class: 'volume' + unit_of_measurement: 'mL' + - platform: ezo_pmp + id: ezo_pump_clean + max_flow_rate: + id: max_flow_rate_clean + name: Pump Clean - Max Volume/Time Flow Rate + icon: mdi:car-speed-limiter + unit_of_measurement: 'mL/min' + - platform: ezo_pmp + id: ezo_pump_clean + pump_voltage: + id: pump_voltage_clean + name: Pump Clean - Voltage + disabled_by_default: true + device_class: 'voltage' + +binary_sensor: + - platform: ezo_pmp + id: ezo_pump_waste + pump_state: + id: pump_state_waste + icon: mdi:pump + name: Pump Waste - State + - platform: ezo_pmp + id: ezo_pump_waste + is_paused: + id: is_paused_waste + name: Pump Waste - Paused Status + disabled_by_default: true + - platform: ezo_pmp + id: ezo_pump_clean + pump_state: + id: pump_state_clean + icon: mdi:pump + name: Pump Clean - State + - platform: ezo_pmp + id: ezo_pump_clean + is_paused: + id: is_paused_clean + name: Pump Clean - Paused Status + disabled_by_default: true + + +text_sensor: + - platform: ezo_pmp + id: ezo_pump_waste + dosing_mode: + id: dosing_mode_waste + name: Pump Waste - Dosing Mode + icon: mdi:auto-mode + - platform: ezo_pmp + id: ezo_pump_waste + calibration_status: + id: calibration_status_waste + name: Pump Waste - Calibration Status + # disabled_by_default: true + icon: mdi:tape-measure + - platform: ezo_pmp + id: ezo_pump_clean + dosing_mode: + id: dosing_mode_clean + name: Pump Clean - Dosing Mode + icon: mdi:auto-mode + - platform: ezo_pmp + id: ezo_pump_clean + calibration_status: + id: calibration_status_clean + name: Pump Clean - Calibration Status + # disabled_by_default: true + icon: mdi:tape-measure + +number: + - platform: template + id: volume_waste + icon: mdi:pump + name: Pump Waste - Volume to Dose + device_class: 'volume' + unit_of_measurement: 'mL' + optimistic: true + initial_value: 10 # cannot be less than +/-0.1mL + min_value: -378541 + max_value: 378541 # 100 gal + mode: box + step: 0.1 + - platform: template + id: duration_waste + icon: mdi:timer + name: Pump Waste - Time to Dose + device_class: 'duration' + unit_of_measurement: 'min' + optimistic: true + initial_value: 1 + min_value: 1 + max_value: 1440 # 24 hours + mode: box + step: 0.1 + - platform: template + id: flow_rate_waste + icon: mdi:waves-arrow-left + name: Pump Waste - Volume/Time Flow Rate + unit_of_measurement: 'mL/min' + optimistic: true + initial_value: 10 + min_value: .5 + max_value: 105 # may need to lower to 40 + mode: box + step: 0.1 + - platform: template + id: volume_clean + icon: mdi:pump + name: Pump Clean - Volume to Dose + device_class: 'volume' + unit_of_measurement: 'mL' + optimistic: true + initial_value: 10 # cannot be less than +/-0.1mL + min_value: -378541 + max_value: 378541 # 100 gal + mode: box + step: 0.1 + - platform: template + id: duration_clean + icon: mdi:timer + name: Pump Clean - Time to Dose + device_class: 'duration' + unit_of_measurement: 'min' + optimistic: true + initial_value: 1 + min_value: 1 + max_value: 1440 # 24 hours + mode: box + step: 0.1 + - platform: template + id: flow_rate_clean + icon: mdi:waves-arrow-right + name: Pump Clean - Volume/Time Flow Rate + unit_of_measurement: 'mL/min' + optimistic: true + initial_value: 10 + min_value: .5 + max_value: 105 # may need to lower to 40 + mode: box + step: 0.1 + +button: + # TODO Make UI + - platform: template + name: Pump Waste - Dose Volume for Time + icon: mdi:clock-time-two-outline + id: dose_over_time_waste + on_press: + - ezo_pmp.dose_volume_over_time: + id: ezo_pump_waste + volume: !lambda |- + return id(volume_waste).state; + duration: !lambda |- + return id(duration_waste).state; + - platform: template + name: Pump Waste - Dose Continuously + icon: mdi:infinity + id: dose_continuously_waste + on_press: + - ezo_pmp.dose_continuously: + id: ezo_pump_waste + - platform: template + name: Pump Waste - Dose Volume + icon: mdi:pump + id: dose_volume_waste + on_press: + - ezo_pmp.dose_volume: + id: ezo_pump_waste + volume: !lambda |- + return id(volume_waste).state; + - platform: template + name: Pump Waste - Dose at Volume/Time Flow Rate for Time + icon: mdi:format-text-wrapping-overflow + id: dose_flow_rate_waste + on_press: + - ezo_pmp.dose_with_constant_flow_rate: + id: ezo_pump_waste + volume_per_minute: !lambda |- + return id(flow_rate_waste).state; + duration: !lambda |- + return id(duration_waste).state; + - platform: template + name: Pump Waste - Pause Dosing + icon: mdi:pause + id: dose_pause_waste + on_press: + - ezo_pmp.pause_dosing: + id: ezo_pump_waste + - platform: template + name: Pump Waste - Stop Dosing + icon: mdi:stop + id: dose_stop_waste + on_press: + - ezo_pmp.stop_dosing: + id: ezo_pump_waste + - platform: template + name: Pump Waste - Clear Total Volume Dosed + icon: mdi:backspace + id: dose_clear_waste + on_press: + - ezo_pmp.clear_total_volume_dosed: + id: ezo_pump_waste + + # Calibrate + - platform: template + name: Pump Waste - Set Calibration Volume + icon: mdi:tape-measure + id: dose_calibrate_volume_waste + on_press: + - ezo_pmp.set_calibration_volume: + id: ezo_pump_waste + volume: !lambda |- + return id(volume_waste).state; + - platform: template + name: Pump Waste - Clear Calibration Volume + icon: mdi:cancel + id: dose_calibrate_volume_clear_waste + on_press: + - ezo_pmp.clear_calibration: + id: ezo_pump_waste + + - platform: template + name: Pump Clean - Dose Volume for Time + icon: mdi:clock-time-two-outline + id: dose_over_time_clean + on_press: + - ezo_pmp.dose_volume_over_time: + id: ezo_pump_clean + volume: !lambda |- + return id(volume_clean).state; + duration: !lambda |- + return id(duration_clean).state; + - platform: template + name: Pump Clean - Dose Continuously + icon: mdi:infinity + id: dose_continuously_clean + on_press: + - ezo_pmp.dose_continuously: + id: ezo_pump_clean + - platform: template + name: Pump Clean - Dose Volume + icon: mdi:pump + id: dose_volume_clean + on_press: + - ezo_pmp.dose_volume: + id: ezo_pump_clean + volume: !lambda |- + return id(volume_clean).state; + - platform: template + name: Pump Clean - Dose at Volume/Time Flow Rate for Time + icon: mdi:format-text-wrapping-overflow + id: dose_flow_rate_clean + on_press: + - ezo_pmp.dose_with_constant_flow_rate: + id: ezo_pump_clean + volume_per_minute: !lambda |- + return id(flow_rate_clean).state; + duration: !lambda |- + return id(duration_clean).state; + - platform: template + name: Pump Clean - Pause Dosing + icon: mdi:pause + id: dose_pause_clean + on_press: + - ezo_pmp.pause_dosing: + id: ezo_pump_clean + - platform: template + name: Pump Clean - Stop Dosing + icon: mdi:stop + id: dose_stop_clean + on_press: + - ezo_pmp.stop_dosing: + id: ezo_pump_clean + - platform: template + name: Pump Clean - Clear Total Volume Dosed + icon: mdi:backspace + id: dose_clear_clean + on_press: + - ezo_pmp.clear_total_volume_dosed: + id: ezo_pump_clean + + # Calibrate + - platform: template + name: Pump Clean - Set Calibration Volume + icon: mdi:tape-measure + id: dose_calibrate_volume_clean + on_press: + - ezo_pmp.set_calibration_volume: + id: ezo_pump_clean + volume: !lambda |- + return id(volume_clean).state; + - platform: template + name: Pump Clean - Clear Calibration Volume + icon: mdi:cancel + id: dose_calibrate_volume_clear_clean + on_press: + - ezo_pmp.clear_calibration: + id: ezo_pump_clean \ No newline at end of file