substitutions:
  ph400_raw: '2.06785'
  ph686_raw: '1.57897'
  ph700_raw: '1.54883'
  ph918_raw: '1.21447'

globals:
  - id: ph400_raw  # raw V value from probe using pH 4.0 calibration solution.
    type: float
    restore_value: yes
    initial_value: ${ph400_raw}
  - id: ph700_raw  # raw V value from probe using pH 7.0 calibration solution.
    type: float
    restore_value: yes
    initial_value: ${ph700_raw}
  - id: ph686_raw  # raw V value from probe using pH 6.86 calibration solution.
    type: float
    restore_value: yes
    initial_value: ${ph686_raw}
  - id: ph918_raw # raw V value from probe using pH 9.18 calibration solution.
    type: float
    restore_value: yes
    initial_value: ${ph918_raw}

sensor:
  - platform: ads1115
    id: analog_ph
    name: "pH: Analog Voltage"
    multiplexer: 'A0_GND'
    gain: 4.096 # max: 3.0V
    update_interval: 5s
    accuracy_decimals: 5
    <<: !include filter.yaml
  # - platform: template
  #   name: "pH: 4.00 Calibration Value"
  #   unit_of_measurement: "V"
  #   accuracy_decimals: 5
  #   update_interval: 5s
  #   lambda: !lambda return id(ph400_raw);
  # - platform: template
  #   name: "pH: 6.86 Calibration Value"
  #   unit_of_measurement: "V"
  #   accuracy_decimals: 5
  #   update_interval: 5s
  #   lambda: !lambda return id(ph686_raw);
  # - platform: template
  #   name: "pH: 7.00 Calibration Value"
  #   unit_of_measurement: "V"
  #   accuracy_decimals: 5
  #   update_interval: 5s
  #   lambda: !lambda return id(ph700_raw);
  # - platform: template
  #   name: "pH: 9.18 Calibration Value"
  #   unit_of_measurement: "V"
  #   accuracy_decimals: 5
  #   update_interval: 5s
  #   lambda: !lambda return id(ph918_raw);
  - platform: template
    name: "pH"
    id: ph
    unit_of_measurement: "pH"
    accuracy_decimals: 2
    update_interval: 5s
    lambda: |-
      float slope;
      if (id(ph_slope_points).active_index() == 1) {
        slope = (id(ph918_raw) - id(ph400_raw)) / (9.18 - 4.00);
      } else {
        slope = (id(ph700_raw) - id(ph400_raw)) / (7.00 - 4.00);
      }
      float intersect = id(ph686_raw) - (slope * 6.86);
      return (id(analog_ph).state - intersect) / slope;

select:
  - platform: template
    id: ph_slope_points
    name: "pH: Calibration Points"
    options: ["4.00/7.00", "4.00/9.18"]
    initial_option: "4.00/7.00"
    optimistic: true
    restore_value: true

button:
  - platform: template
    name: "pH: Calibrate 4.00"
    on_press:
      - globals.set:
          id: ph400_raw
          value: !lambda return id(analog_ph).state;
  - platform: template
    name: "pH: Calibrate 6.86"
    on_press:
      - globals.set:
          id: ph686_raw
          value: !lambda return id(analog_ph).state;
  - platform: template
    name: "pH: Calibrate 7.00"
    on_press:
      - globals.set:
          id: ph700_raw
          value: !lambda return id(analog_ph).state;
  - platform: template
    name: "pH: Calibrate 9.18"
    on_press:
      - globals.set:
          id: ph918_raw
          value: !lambda return id(analog_ph).state;
