From 267402e5e469288f930248f7c28f8f43e80e3f41 Mon Sep 17 00:00:00 2001 From: TheRealFalseReality Date: Thu, 13 Feb 2025 12:06:24 -0500 Subject: [PATCH] updates --- EZO Calibration Configs/README.md | 7 - .../aquapi-calibration-all.yaml | 641 ------------------ EZO Calibration Configs/calibration_do.yaml | 156 ----- EZO Calibration Configs/calibration_ec.yaml | 268 -------- EZO Calibration Configs/calibration_ph.yaml | 172 ----- EZO Calibration Configs/calibration_rtd.yaml | 141 ---- ...42.stl => OpticalBracket - Holder v44.stl} | Bin 700084 -> 699884 bytes 7 files changed, 1385 deletions(-) delete mode 100644 EZO Calibration Configs/README.md delete mode 100644 EZO Calibration Configs/aquapi-calibration-all.yaml delete mode 100644 EZO Calibration Configs/calibration_do.yaml delete mode 100644 EZO Calibration Configs/calibration_ec.yaml delete mode 100644 EZO Calibration Configs/calibration_ph.yaml delete mode 100644 EZO Calibration Configs/calibration_rtd.yaml rename assests/STLModels/WaterLevelBracket/{OpticalBracket - Holder v42.stl => OpticalBracket - Holder v44.stl} (61%) diff --git a/EZO Calibration Configs/README.md b/EZO Calibration Configs/README.md deleted file mode 100644 index 14883e6d..00000000 --- a/EZO Calibration Configs/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Calibration - -## Calibrate EZO Circuits & Probes - -Here are provided Calibration Configs for a number of EZO Circuits and their respective probes. It is recommended to only use the configuration for the specific probe to calibrate. - -***NOTE: Do not mix up EZO circuit and probes once calibrated!!!*** The EZO circuit saves the calibration for the probe it was calibrated with. diff --git a/EZO Calibration Configs/aquapi-calibration-all.yaml b/EZO Calibration Configs/aquapi-calibration-all.yaml deleted file mode 100644 index 5d958a78..00000000 --- a/EZO Calibration Configs/aquapi-calibration-all.yaml +++ /dev/null @@ -1,641 +0,0 @@ -substitutions: - # names - name: "aquapi" - friendly_name: "AquaPi" - - # App Version - Updated: 8/2023 - appVersion: "0.1c" - - # pins - sdaPin: "21" - sclPin: "22" - - # EZO Circuit Addresses - # pH circuit, who's address is 99 - addPH: "99" - # EC circuit, who's address is 100 - addEC: "100" - # DO circuit, who's address is 97 - addDO: "97" - # RTD circuit, who's address is 102 - addRTD: "102" - # PMP circuit, who's address is 103 - addPMP: "103" - # HUM circuit, who's address is 111 - addHUM: "111" - # CO2 circuit, who's address is 105 - addCO2: "105" - -esphome: - name: "${name}" - friendly_name: "${friendly_name}" - # Automatically add the mac address to the name - name_add_mac_suffix: true - project: - name: TheRealFalseReality.aquapi - version: "${appVersion}" - -esp32: - board: esp32dev - framework: - type: arduino - -# Enable logging -logger: - level: verbose - -# Enable Home Assistant API -api: - -ota: - -wifi: - ap: - -captive_portal: - -web_server: - -# Sets up Bluetooth LE (Only on ESP32) to allow the user -# to provision wifi credentials to the device. -esp32_improv: - authorizer: none - -improv_serial: - -# i2c Pins -i2c: - sda: ${sdaPin} - scl: ${sclPin} - scan: true - id: bus_a - -# Internal Blue LED -light: - - platform: status_led - # name: "Internal LED" - pin: GPIO2 - id: internal_led - # entity_category: "Config" - -sensor: - # Internal Temp. - - platform: internal_temperature - name: "Internal Temperature" - - # Wifi Signal - - platform: wifi_signal # Reports the WiFi signal strength/RSSI in dB - name: "WiFi Signal dB" - id: wifi_signal_db - update_interval: 60s - entity_category: "diagnostic" - - # Wifi % - - platform: copy # Reports the WiFi signal strength in % - source_id: wifi_signal_db - name: "WiFi Signal Percent" - filters: - - lambda: return min(max(2 * (x + 100.0), 0.0), 100.0); - unit_of_measurement: "Signal %" - entity_category: "diagnostic" - - # Uptime sensor - - platform: uptime - name: Uptime - - # EZO Circuits (yellow - SCL/RX, blue - SDA/TX) - # EZO Circuit - pH - - platform: ezo - icon: mdi:ph - name: "pH" - id: ph_ezo - address: ${addPH} - unit_of_measurement: "" - accuracy_decimals: 2 - update_interval: 1s - state_class: "measurement" - - # EZO Circuit - EC - # Salinity - - platform: ezo - icon: mdi:shaker-outline - name: "Salinity" - id: ec_ezo - address: ${addEC} - unit_of_measurement: "ppt" - accuracy_decimals: 2 - update_interval: 1s - state_class: "measurement" - - # Specific Gravity - - platform: copy - source_id: ec_ezo - name: "Specific Gravity" - filters: - - lambda: return x; - unit_of_measurement: "" - accuracy_decimals: 3 - state_class: "measurement" - - # Conductivity - - platform: copy - source_id: ec_ezo - name: "Specific Gravity" - icon: mdi:flash - filters: - - lambda: return x; - unit_of_measurement: "μS/cm" - accuracy_decimals: 3 - state_class: "measurement" - - # EZO Circuit - RTD - # Temperature - - platform: ezo - icon: mdi:thermometer-lines - name: "Temperature" - id: rtd_ezo - address: ${addRTD} - # unit_of_measurement: "°C" - accuracy_decimals: 2 - update_interval: 1s - state_class: "measurement" - device_class: "temperature" - - # EZO Circuit - HUM - # Humidity - - platform: ezo - icon: mdi:water-percent - name: "Humidity" - id: hum_ezo - address: ${addHUM} - # unit_of_measurement: "%" - accuracy_decimals: 2 - update_interval: 1s - state_class: "measurement" - device_class: "humidity" - - # EZO Circuit - CO2 - # Cardbon Dioxide - - platform: ezo - icon: mdi:molecule-co2 - name: "Cardbon Dioxide" - id: co2_ezo - address: ${addCO2} - # unit_of_measurement: "ppm" - accuracy_decimals: 2 - update_interval: 1s - state_class: "measurement" - device_class: "carbon_dioxide" - - # EZO Circuit - Dissolved Oxygen - - platform: ezo - icon: mdi:molecule - name: "Dissolved Oxygen" - id: do_ezo - address: ${addDO} - unit_of_measurement: "mg/L" - accuracy_decimals: 2 - update_interval: 1s - state_class: "measurement" - - # EZO Circuit - Pump - - platform: ezo - icon: mdi:pump - name: "Pump" - id: pmp_ezo - address: ${addPMP} - unit_of_measurement: "" - accuracy_decimals: 2 - update_interval: 1s - state_class: "measurement" - -binary_sensor: - -text_sensor: - # AquaPi Version - - platform: template - name: "AquaPi Version" - id: aquapi_version - icon: mdi:cellphone-arrow-down - update_interval: 600s - lambda: |- - return {"${appVersion}"}; - entity_category: "diagnostic" - - - platform: wifi_info - ip_address: - name: IP Address - icon: mdi:ip-network - ssid: - name: Connected SSID - icon: mdi:wifi-star - bssid: - name: Connected BSSID - icon: mdi:wifi-star - mac_address: - name: Mac Address - icon: mdi:chip - -button: - # Soft Restart - - platform: restart - name: "Restart" - - # EC - # Output Parameters - # Output Salinity - - platform: template - name: "EC - Output - Salinity" - id: ec_sal - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ec_ezo).send_custom("O,EC,0"); - id(ec_ezo).send_custom("O,TDS,0"); - id(ec_ezo).send_custom("O,S,1"); - id(ec_ezo).send_custom("O,SG,0"); - entity_category: "Config" - - # Output Specific Gravity - - platform: template - name: "EC - Output - Specific Gravity" - id: ec_sg - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ec_ezo).send_custom("O,EC,0"); - id(ec_ezo).send_custom("O,TDS,0"); - id(ec_ezo).send_custom("O,S,0"); - id(ec_ezo).send_custom("O,SG,1"); - entity_category: "Config" - - # Output Conductivity - - platform: template - name: "EC - Output - Conductivity" - id: ec_cond - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ec_ezo).send_custom("O,EC,1"); - id(ec_ezo).send_custom("O,TDS,0"); - id(ec_ezo).send_custom("O,S,0"); - id(ec_ezo).send_custom("O,SG,0"); - entity_category: "Config" - - # Calibrate the DO probe to Air - - platform: template - name: "DO - Calibration - Air" - id: do_cal_air - entity_category: "Config" - on_press: - then: - - lambda: |- - id(do_ezo).send_custom("cal"); - - # Calibrate the DO probe to 0 - - platform: template - name: "DO - Calibration - 0" - id: do_cal_0 - entity_category: "Config" - on_press: - then: - - lambda: |- - id(do_ezo).send_custom("cal,0"); - - # Perform Calibration CLEAR - - platform: template - name: "DO - Calibration Clear" - id: do_cal_clear - entity_category: "Config" - on_press: - then: - - lambda: |- - id(do_ezo).clear_calibration(); - - # Perform Calibration Check - - platform: template - name: "DO - Calibration - check" - id: do_cal_check - entity_category: "Config" - on_press: - then: - - lambda: |- - id(do_ezo).get_calibration(); - - # Perform Status Check - - platform: template - name: "DO - Staus Check" - id: do_status - entity_category: "Config" - on_press: - then: - - lambda: |- - id(do_ezo).send_custom("Status"); - - # Get Device Firmware Version - - platform: template - name: "DO - Get Information" - id: do_info - entity_category: "Config" - on_press: - then: - - lambda: |- - id(do_ezo).get_device_information(); - - # Manual Read - - platform: template - name: "DO - Manual Read" - id: do_read - entity_category: "Config" - on_press: - then: - - lambda: |- - id(do_ezo).get_state(); - - # Output TDS - - platform: template - name: "EC - Output - TDS" - id: ec_tds - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ec_ezo).send_custom("O,EC,0"); - id(ec_ezo).send_custom("O,TDS,1"); - id(ec_ezo).send_custom("O,S,0"); - id(ec_ezo).send_custom("O,SG,0"); - - # Get Device Firmware Version - - platform: template - name: "EC - Get Information" - id: ec_info - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ec_ezo).get_device_information(); - - # Set Probe Type K1 - - platform: template - name: "EC - Set Probe Type K1" - id: ec_probe_type - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ec_ezo).send_custom("K,1"); - - # Get Probe Value - - platform: template - name: "EC - Get Probe Value" - id: ec_probe_value - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ec_ezo).send_custom("K,?"); - - # Manual Read - - platform: template - name: "EC - Manual Read" - id: ec_read - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ec_ezo).get_state(); - - # Perform Calibration 0.00 - - platform: template - name: "EC - Calibration - 0" - id: ec_cal_0 - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ec_ezo).set_calibration_generic(0.00); - - # Perform Calibration low 12880 - - platform: template - name: "EC - Calibration - low 12880" - id: ec_cal_low - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ec_ezo).set_calibration_point_low(12880.00); - - # Perform Calibration high 80000 - - platform: template - name: "EC - Calibration - high 80000" - id: ec_cal_high - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ec_ezo).set_calibration_point_high(80000.00); - - # Perform Calibration CLEAR - - platform: template - name: "EC - Calibration Clear" - id: ec_cal_clear - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ec_ezo).clear_calibration(); - - # Perform Calibration Check - - platform: template - name: "EC - Calibration - check" - id: ec_cal_check - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ec_ezo).get_calibration(); - - # Perform Status Check - - platform: template - name: "EC - Staus Check" - id: ec_status - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ec_ezo).send_custom("Status"); - - # Get TDS Value - - platform: template - name: "EC - TDS Value" - id: ec_tds_value - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ec_ezo).send_custom("TDS,?"); - - # Output Values - # Get Enabled Parameter(s) - - platform: template - name: "EC - Get Enabled Parameter(s)" - id: ec_param - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ec_ezo).send_custom("O,?"); - - # pH - # Get Device Firmware Version - - platform: template - name: "pH - Get Information" - id: ph_info - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ph_ezo).get_device_information(); - - # Get Slope - - platform: template - name: "pH - Get Slope" - id: ph_slope - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ph_ezo).get_slope(); - - # Manual Read - - platform: template - name: "pH - Manual Read" - id: ph_read - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ph_ezo).get_state(); - - # Perform Calibration - mid 7 - - platform: template - name: "pH - Calibration - mid 7" - id: ph_cal_mid - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ph_ezo).set_calibration_point_mid(7.00); - - # Perform Calibration low 4 - - platform: template - name: "pH - Calibration - low 4" - id: ph_cal_low - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ph_ezo).set_calibration_point_low(4.00); - - # Perform Calibration high 10 - - platform: template - name: "pH - Calibration - high 10" - id: ph_cal_high - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ph_ezo).set_calibration_point_high(10.00); - - # Perform Calibration CLEAR - - platform: template - name: "pH - Calibration Clear" - id: ph_cal_clear - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ph_ezo).clear_calibration(); - - # Perform Calibration Check - - platform: template - name: "pH - Calibration - check" - id: ph_cal_check - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ph_ezo).get_calibration(); - - # Perform Status Check - - platform: template - name: "pH - Staus Check" - id: ph_status - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ph_ezo).send_custom("Status"); - - # Calibrate the temp probe to 100C or Boiling - - platform: template - name: "RTD - Calibration - 100C (Boiling)" - id: rtd_cal_100 - entity_category: "Config" - on_press: - then: - - lambda: |- - id(rtd_ezo).send_custom("cal,100"); - - # Perform Calibration CLEAR - - platform: template - name: "RTD - Calibration Clear" - id: rtd_cal_clear - entity_category: "Config" - on_press: - then: - - lambda: |- - id(rtd_ezo).clear_calibration(); - - # Perform Calibration Check - - platform: template - name: "RTD - Calibration - check" - id: rtd_cal_check - entity_category: "Config" - on_press: - then: - - lambda: |- - id(rtd_ezo).get_calibration(); - - # Perform Status Check - - platform: template - name: "RTD - Staus Check" - id: rtd_status - entity_category: "Config" - on_press: - then: - - lambda: |- - id(rtd_ezo).send_custom("Status"); - - # Get Device Firmware Version - - platform: template - name: "RTD - Get Information" - id: rtd_info - entity_category: "Config" - on_press: - then: - - lambda: |- - id(rtd_ezo).get_device_information(); - - # Manual Read - - platform: template - name: "RTD - Manual Read" - id: rtd_read - entity_category: "Config" - on_press: - then: - - lambda: |- - id(rtd_ezo).get_state(); diff --git a/EZO Calibration Configs/calibration_do.yaml b/EZO Calibration Configs/calibration_do.yaml deleted file mode 100644 index ca01cba4..00000000 --- a/EZO Calibration Configs/calibration_do.yaml +++ /dev/null @@ -1,156 +0,0 @@ -# Enable logging -substitutions: - # names - name: "aquapi" - friendly_name: "AquaPi" - - # App Version - Updated: 8/2023 - appVersion: "0.1c" - - # pins - sdaPin: "21" - sclPin: "22" - - # EZO Circuit Addresses - # DO circuit, who's address is 97 - addDO: "97" - -esphome: - name: "${name}" - friendly_name: "${friendly_name}" - # Automatically add the mac address to the name - name_add_mac_suffix: true - project: - name: TheRealFalseReality.aquapi - version: "${appVersion}" - -esp32: - board: esp32dev - framework: - type: arduino - -# Enable logging -logger: - level: verbose - -# Enable Home Assistant API -api: - -ota: - -# dashboard_import: -# package_import_url: github://TheRealFalseReality/aquapi/aquapi_config.yaml@main -# import_full_config: true - -wifi: - ap: - -captive_portal: - -web_server: - -# Sets up Bluetooth LE (Only on ESP32) to allow the user -# to provision wifi credentials to the device. -esp32_improv: - authorizer: none - -improv_serial: - -# i2c Pins -i2c: - sda: ${sdaPin} - scl: ${sclPin} - scan: true - id: bus_a - -# Internal Blue LED -light: - - platform: status_led - # name: "Internal LED" - pin: GPIO2 - id: internal_led - # entity_category: "Config" - -sensor: - # EZO Circuit - EC - # Conductivity - - platform: ezo - icon: mdi:shaker-outline - name: "Conductivity" - id: do_ezo - address: 97 - unit_of_measurement: "" - accuracy_decimals: 2 - update_interval: 1s - state_class: "measurement" - -button: - # Calibrate the DO probe to Air - - platform: template - name: "DO - Calibration - Air" - id: do_cal_air - entity_category: "Config" - on_press: - then: - - lambda: |- - id(do_ezo).send_custom("cal"); - - # Calibrate the DO probe to 0 - - platform: template - name: "DO - Calibration - 0" - id: do_cal_0 - entity_category: "Config" - on_press: - then: - - lambda: |- - id(do_ezo).send_custom("cal,0"); - - # Perform Calibration CLEAR - - platform: template - name: "DO - Calibration Clear" - id: do_cal_clear - entity_category: "Config" - on_press: - then: - - lambda: |- - id(do_ezo).clear_calibration(); - - # Perform Calibration Check - - platform: template - name: "DO - Calibration - check" - id: do_cal_check - entity_category: "Config" - on_press: - then: - - lambda: |- - id(do_ezo).get_calibration(); - - # Perform Status Check - - platform: template - name: "DO - Staus Check" - id: do_status - entity_category: "Config" - on_press: - then: - - lambda: |- - id(do_ezo).send_custom("Status"); - - # Get Device Firmware Version - - platform: template - name: "DO - Get Information" - id: do_info - entity_category: "Config" - on_press: - then: - - lambda: |- - id(do_ezo).get_device_information(); - - # Manual Read - - platform: template - name: "DO - Manual Read" - id: do_read - entity_category: "Config" - on_press: - then: - - lambda: |- - id(do_ezo).get_state(); \ No newline at end of file diff --git a/EZO Calibration Configs/calibration_ec.yaml b/EZO Calibration Configs/calibration_ec.yaml deleted file mode 100644 index d9455929..00000000 --- a/EZO Calibration Configs/calibration_ec.yaml +++ /dev/null @@ -1,268 +0,0 @@ -# Enable logging -substitutions: - # names - name: "aquapi" - friendly_name: "AquaPi" - - # App Version - Updated: 8/2023 - appVersion: "0.1c" - - # pins - sdaPin: "21" - sclPin: "22" - - # EZO Circuit Addresses - # EC circuit, who's address is 100 - addEC: "100" - -esphome: - name: "${name}" - friendly_name: "${friendly_name}" - # Automatically add the mac address to the name - name_add_mac_suffix: true - project: - name: TheRealFalseReality.aquapi - version: "${appVersion}" - -esp32: - board: esp32dev - framework: - type: arduino - -# Enable logging -logger: - level: verbose - -# Enable Home Assistant API -api: - -ota: - -wifi: - ap: - -captive_portal: - -web_server: - -# Sets up Bluetooth LE (Only on ESP32) to allow the user -# to provision wifi credentials to the device. -esp32_improv: - authorizer: none - -improv_serial: - -# i2c Pins -i2c: - sda: ${sdaPin} - scl: ${sclPin} - scan: true - id: bus_a - -# Internal Blue LED -light: - - platform: status_led - # name: "Internal LED" - pin: GPIO2 - id: internal_led - # entity_category: "Config" - -sensor: - # EZO Circuit - EC - # Conductivity - - platform: ezo - icon: mdi:shaker-outline - name: "Conductivity" - id: ec_ezo - address: 100 - unit_of_measurement: "" - accuracy_decimals: 2 - update_interval: 1s - state_class: "measurement" - -button: - # Output All - - platform: template - name: "EC - Output - All" - id: ec_out_all - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ec_ezo).send_custom("O,EC,1"); - id(ec_ezo).send_custom("O,TDS,1"); - id(ec_ezo).send_custom("O,S,1"); - id(ec_ezo).send_custom("O,SG,1"); - - # Output Conductivity - - platform: template - name: "EC - Output - Conductivity" - id: ec_out_cond - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ec_ezo).send_custom("O,EC,1"); - id(ec_ezo).send_custom("O,TDS,0"); - id(ec_ezo).send_custom("O,S,0"); - id(ec_ezo).send_custom("O,SG,0"); - - # Output Salinity - - platform: template - name: "EC - Output - Salinity" - id: ec_out_sal - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ec_ezo).send_custom("O,EC,0"); - id(ec_ezo).send_custom("O,TDS,0"); - id(ec_ezo).send_custom("O,S,1"); - id(ec_ezo).send_custom("O,SG,0"); - - # Output Specfic Gravity - - platform: template - name: "EC - Output - Specfic Gravity" - id: ec_out_sg - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ec_ezo).send_custom("O,EC,0"); - id(ec_ezo).send_custom("O,TDS,0"); - id(ec_ezo).send_custom("O,S,0"); - id(ec_ezo).send_custom("O,SG,1"); - - # Output TDS - - platform: template - name: "EC - Output - TDS" - id: ec_out_tds - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ec_ezo).send_custom("O,EC,0"); - id(ec_ezo).send_custom("O,TDS,1"); - id(ec_ezo).send_custom("O,S,0"); - id(ec_ezo).send_custom("O,SG,0"); - - # Get Device Firmware Version - - platform: template - name: "EC - Get Information" - id: ec_info - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ec_ezo).get_device_information(); - - # Set Probe Type K1 - - platform: template - name: "EC - Set Probe Type K1" - id: ec_probe_type - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ec_ezo).send_custom("K,1"); - - # Get Probe K Value - - platform: template - name: "EC - Get Probe Value" - id: ec_probe_value - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ec_ezo).send_custom("K,?"); - - # Manual Read - - platform: template - name: "EC - Manual Read" - id: ec_read - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ec_ezo).get_state(); - - # Perform Calibration 0.00 - - platform: template - name: "EC - Calibration - 0" - id: ec_cal_0 - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ec_ezo).set_calibration_generic(0.00); - - # Perform Calibration low 12880 - - platform: template - name: "EC - Calibration - low 12880" - id: ec_cal_low - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ec_ezo).set_calibration_point_low(12880.00); - - # Perform Calibration high 80000 - - platform: template - name: "EC - Calibration - high 80000" - id: ec_cal_high - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ec_ezo).set_calibration_point_high(80000.00); - - # Perform Calibration CLEAR - - platform: template - name: "EC - Calibration Clear" - id: ec_cal_clear - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ec_ezo).clear_calibration(); - - # Perform Calibration Check - - platform: template - name: "EC - Calibration - check" - id: ec_cal_check - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ec_ezo).get_calibration(); - - # Perform Status Check - - platform: template - name: "EC - Staus Check" - id: ec_status - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ec_ezo).send_custom("Status"); - - # Get TDS Value - - platform: template - name: "EC - TDS Value" - id: ec_tds_value - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ec_ezo).send_custom("TDS,?"); - - # Output Values - # Get Enabled Parameter(s) - - platform: template - name: "EC - Get Enabled Parameter(s)" - entity_category: "Config" - id: ec_param - on_press: - then: - - lambda: |- - id(ec_ezo).send_custom("O,?"); diff --git a/EZO Calibration Configs/calibration_ph.yaml b/EZO Calibration Configs/calibration_ph.yaml deleted file mode 100644 index f8ef877c..00000000 --- a/EZO Calibration Configs/calibration_ph.yaml +++ /dev/null @@ -1,172 +0,0 @@ -substitutions: - # names - name: "aquapi" - friendly_name: "AquaPi" - - # App Version - Updated: 8/2023 - appVersion: "0.1c" - - # pins - sdaPin: "21" - sclPin: "22" - - # EZO Circuit Addresses - # pH circuit, who's address is 99 - addPH: "99" - -esphome: - name: "${name}" - friendly_name: "${friendly_name}" - # Automatically add the mac address to the name - name_add_mac_suffix: true - project: - name: TheRealFalseReality.aquapi - version: "${appVersion}" - -esp32: - board: esp32dev - framework: - type: arduino - -# Enable logging -logger: - level: verbose - -# Enable Home Assistant API -api: - -ota: - -wifi: - ap: - -captive_portal: - -web_server: - -# Sets up Bluetooth LE (Only on ESP32) to allow the user -# to provision wifi credentials to the device. -esp32_improv: - authorizer: none - -improv_serial: - -# i2c Pins -i2c: - sda: ${sdaPin} - scl: ${sclPin} - scan: true - id: bus_a - -# Internal Blue LED -light: - - platform: status_led - # name: "Internal LED" - pin: GPIO2 - id: internal_led - # entity_category: "Config" - -sensor: - # EZO Circuits (yellow - SCL/RX, blue - SDA/TX) - # EZO Circuit - pH - - platform: ezo - icon: mdi:ph - name: "pH" - id: ph_ezo - address: 99 - unit_of_measurement: "" - accuracy_decimals: 2 - update_interval: 1s - state_class: "measurement" - -button: - # pH - # Get Device Firmware Version - - platform: template - name: "pH - Get Information" - id: ph_info - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ph_ezo).get_device_information(); - - # Get Slope - - platform: template - name: "pH - Get Slope" - id: ph_slope - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ph_ezo).get_slope(); - - # Manual Read - - platform: template - name: "pH - Manual Read" - id: ph_read - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ph_ezo).get_state(); - - # Perform Calibration - mid 7 - - platform: template - name: "pH - Calibration - mid 7" - id: ph_cal_mid - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ph_ezo).set_calibration_point_mid(7.00); - - # Perform Calibration low 4 - - platform: template - name: "pH - Calibration - low 4" - id: ph_cal_low - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ph_ezo).set_calibration_point_low(4.00); - - # Perform Calibration high 10 - - platform: template - name: "pH - Calibration - high 10" - id: ph_cal_high - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ph_ezo).set_calibration_point_high(10.00); - - # Perform Calibration CLEAR - - platform: template - name: "pH - Calibration Clear" - id: ph_cal_clear - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ph_ezo).clear_calibration(); - - # Perform Calibration Check - - platform: template - name: "pH - Calibration - check" - id: ph_cal_check - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ph_ezo).get_calibration(); - - # Perform Status Check - - platform: template - name: "pH - Staus Check" - id: ph_status - entity_category: "Config" - on_press: - then: - - lambda: |- - id(ph_ezo).send_custom("Status"); diff --git a/EZO Calibration Configs/calibration_rtd.yaml b/EZO Calibration Configs/calibration_rtd.yaml deleted file mode 100644 index f3344b32..00000000 --- a/EZO Calibration Configs/calibration_rtd.yaml +++ /dev/null @@ -1,141 +0,0 @@ -substitutions: - # names - name: "aquapi" - friendly_name: "AquaPi" - - # App Version - Updated: 8/2023 - appVersion: "0.1c" - - # pins - sdaPin: "21" - sclPin: "22" - - # EZO Circuit Addresses - # RTD circuit, who's address is 102 - addRTD: "102" - -esphome: - name: "${name}" - friendly_name: "${friendly_name}" - # Automatically add the mac address to the name - name_add_mac_suffix: true - project: - name: TheRealFalseReality.aquapi - version: "${appVersion}" - -esp32: - board: esp32dev - framework: - type: arduino - -# Enable logging -logger: - level: verbose - -# Enable Home Assistant API -api: - -ota: - -wifi: - ap: - -captive_portal: - -web_server: - -# Sets up Bluetooth LE (Only on ESP32) to allow the user -# to provision wifi credentials to the device. -esp32_improv: - authorizer: none - -improv_serial: - -# i2c Pins -i2c: - sda: ${sdaPin} - scl: ${sclPin} - scan: true - id: bus_a - -# Internal Blue LED -light: - - platform: status_led - # name: "Internal LED" - pin: GPIO2 - id: internal_led - # entity_category: "Config" - -sensor: - # EZO Circuit - EC - # Conductivity - - platform: ezo - icon: mdi:shaker-outline - name: "Conductivity" - id: rtd_ezo - address: 102 - unit_of_measurement: "" - accuracy_decimals: 2 - update_interval: 1s - state_class: "measurement" - -button: - # Calibrate the temp probe to 100C or Boiling - - platform: template - name: "RTD - Calibration - 100C (Boiling)" - id: rtd_cal_100 - entity_category: "Config" - on_press: - then: - - lambda: |- - id(rtd_ezo).send_custom("cal,100"); - - # Perform Calibration CLEAR - - platform: template - name: "RTD - Calibration Clear" - id: rtd_cal_clear - entity_category: "Config" - on_press: - then: - - lambda: |- - id(rtd_ezo).clear_calibration(); - - # Perform Calibration Check - - platform: template - name: "RTD - Calibration - check" - id: rtd_cal_check - entity_category: "Config" - on_press: - then: - - lambda: |- - id(rtd_ezo).get_calibration(); - - # Perform Status Check - - platform: template - name: "RTD - Staus Check" - id: rtd_status - entity_category: "Config" - on_press: - then: - - lambda: |- - id(rtd_ezo).send_custom("Status"); - - # Get Device Firmware Version - - platform: template - name: "RTD - Get Information" - id: rtd_info - entity_category: "Config" - on_press: - then: - - lambda: |- - id(rtd_ezo).get_device_information(); - - # Manual Read - - platform: template - name: "RTD - Manual Read" - id: rtd_read - entity_category: "Config" - on_press: - then: - - lambda: |- - id(rtd_ezo).get_state(); \ No newline at end of file diff --git a/assests/STLModels/WaterLevelBracket/OpticalBracket - Holder v42.stl b/assests/STLModels/WaterLevelBracket/OpticalBracket - Holder v44.stl similarity index 61% rename from assests/STLModels/WaterLevelBracket/OpticalBracket - Holder v42.stl rename to assests/STLModels/WaterLevelBracket/OpticalBracket - Holder v44.stl index 556323acab24f5364608d525a70d71b9c918960f..d5a683c5929c1316e6ff1b1b09bee88f18c8d587 100644 GIT binary patch delta 27831 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 delta 30784 zcmZ{t4_r<6|Hu2M?oE-h8gJ$~P(*Ll6(@6YG_yXTyHYG`Sk^n!(JTlKrX7Oc|K)5HJ#)OLfeQ2SHw zGnuUVY{Vd8tCvCNPR~jtd*4cZ8)4=5`byzxw!X38ovq(2oKDa;E3{6~AKy`Ul8R*K za(#3CV4-li{viBuOY=wf72?vnnm-aXe|)d`o$EKjTfFPc`I@y zuSw@QZr6Gy-!AO0`pnx+=($6`zmT>aO)(tkE|itehp(&t9Oy3Yu$a-#DpQvsn!1sB z`qo0^5`9ZeaUE8|>igkNs@De(6^oAz>!ULA@)U~;<9FzL?h*FCX<#O7{6=5Vp1WLi zVY2GUhhD<_f9hKo7Jj3jXjXV&tihu0;@(tfQ={hVfC8^{jIbMVxXrN zq1wEA=(CY=WjM8+H{|1sa%}{P*`{)f96NVa{sQ z|L@#n)v3qsntJVmSbuGTRKL1(vdU$SyYS~K)F-Z0$CHl%jpU({3X9+v=aI(ajxB878*;{!3 zGlTxRg+aMEb9gQZkvM4zWB)Wb5m@M9uW+- z?HHNZ9xHVa|2w`zPtP8IUQl`EY-nF^*V{I&Z+cZwA9lzSdB@@qW7VN{KdHK|yT7B} zu6F7VPPM^5Ilb6{s@HU7M}qZKKW;sudhhiIX!#`9xVOn6p+N<}`}R#Y zx}L|ukO=peDSLOshg$Ey|3>xInuWd7mG9{%?wp$8wB7NPIIn#8-5wA8Vvm)m9_(m- zVcW*XeC+huocfp6RNnE%z8ijK(@Rx9nzdj>zlnBs%E&PkXO`~`R3+-lj!yi;@5?XB zROjD&gqEM*DCx6fKsT{Pp5&}P=6ABCOf_~!>kF&(&+Y$m-r6(brAg!+%Xa?gH{xoU zN)h@G=HL!VJXY=fQj5IIv{xFApmba-O1EwIUat^4#?kM{ated=hz!o}ROxp59K??m0Yz`#zcAe7kRV@d_aCkXKcj9W41c@Pg{d z(=2qPMX0wselbg2EqNmE7&3QHVoCbq&u}r}=lRyZ7Tfhl&VH!{WxA@I73WJ@I?YxY zO>08O_h$|{r*!&!C$~giC7*jid@xjn}?Xh zB(W&Z%H@KtMe2}OamS}SWvfy)b3?rEZ_fKHp>rN5ktaNe3u88__E|RJ!z->msp3N)j3IoPW~o8&&+fe@W}5U9Iz0L-N{tX1+9uyn`RIBWG5r_8h;1NoF0k$=lGj z@1+iT6+hJDl`B>6OuU_lmIIv{wjY^MDYnR>9lS&w`fa)D?GCqISgj|!mv3)>*+A<) zJHGM`UXp(9xm;CuvmSHsT9>qa;7c8e@-oe}SvpmUvRry?`$lTv-A$9oJ9u$*Q!ZC6 zzf*@vrs(bNv;1od?Ih1Swjr!u`aN7c6BB06HiJ^P+` zRN=(Wlsu6-4Dswzxa}L|aQ(!}-yWb$JW=@2fVI@DDIV)Y%_kd;PSbum#)P!%6Sy_{ zr3;q)B2^bqS7P4tqUy@wby%I&KLfX4O_(lr$P;u3?|!XRas|{23udZL#qptNZ{oXs z%x+J5sXX&*rEOxp-A@OSxBqi*ycqv4Q=$GSzFM{KhxOQ@&jz^^V5yE-9IYCfz>CKG z>Xm(#eLD7~4tdq+P2JT`#@47}t2dw{`oBF+wudH*9rEN-qHJL7U3J;N*H!UPd6Wj2 zyw*2=o_=5Mb9sxr>gclm>fviIs}4JDLPz#*kDLrPEE12BJdt~LwmGZlTR)EMJOG>)e_>rQrd>GmN^nUv!*=kwcWDH zL_E3V`=g|TgZkj=X{uir{moNVwxMH_1GZ0_f4?_JlqZ7STBWVvw^r#coJ>__7A}oZ zdYkC~B>eJ)a-h*0Pa>BJkH1j57jXQBT*}CF6y67Agnnn+y9EDmx1q3zgjrJMNv#rGZB2m)w_Widz;c_ZwwiGffwE z#bcD^A5^s$YT}hgjc^+23AtY?U4*9z*q+;8DsSMs^Qi=^OU5$6JrTuencbEaMkOkH z80ya}T#~F@sc&G=Ua(0~Mi?5@J{0DsD5n^9DytMOrC>^qS7@H2|F+OOVD-XTw3)xm32z1`UxeM_dQRN@@+4(LSPrA)fS zX(o|c{Hyfxw0>{5C8qrH}Se&lB2vu(kzqinVLzYmW#W0 z^_C~E>d@SadoTLY`}W_7zA5^#Ir0ukqbhNSbSu|PBDL^zlqa$lU5DnW!ujiNkTk2LXA;dEQio+qUGGGB^r{v<_|)6Y+qK2#((wQJj=nz5QQjeGR!NUdnn|RN zhQ1C?^5lh%MCl<6lU$v7(`SCoG~Xu~w$HUl?RZq%Aw9xrCXqVUHrZ~MC$H+zJR1II zYvtRJ^1ko5UL(bhL_RfgFsYqo(vziT5?M>GJb6_IpI+@hid6LT(cok$58W?eWWCj z(W_cC5BTrrPVzld*yfY|mA9^i9a1~1q^}2>Nu-WtpRUQ3C$H+jcMv{%d;B)rchlDg zeH`7kJl7(%^Q(&V6-G0O)WJ`QJb6`z=IhYGviZIveu(gSu_IAxXPNYEN;8Sna(a*fE3TH5umi_m^ZiyWxx#m^Yu<7noPI<6&tX52>} zy{bj?>PLG~DY?+$j-$Lo(yZdug723!lSmy!6Sr)aC-RO&DbT!<(q8LIrkwiyxfXd9 zuX}t2rkO)*?JVOJoNwbalW4E=XtC`hPhQob zd4H$9{gjNpe$G+eA!%0eR+PxMgqlgD7Jjf8Ny&>X&)zF)Z=@wJc1YcP`^bALUw3Ne zkUDtl6_Z45^r{xk8&d5PK?xor9OQ#ZnpJ!{;2T-ZB+ojU9OTKXIuiL3x86?sY*TV^ zcfVYDi=BdULMMYX*8K2nr(poc#)bix7 z>D%SWt2#8VxwVg*CBwSzeXc|5W)&Yj`C6TG;2W&ef}@xuk6zWnH}Um$+DC03_vbpK zZdUObntx58*${b$JlUNnd&MsWn!j1leghCEkrECjX;$&u0RQ?zGl|rJ?+i}zAJWZ3{(uX(yp(#?)+5Y zrJ`nQwF_dv&oo|2YPMFpAO^gm;Qgk!$E>sqVj%5&?6{s*+Wjg9ye;6lUUO8m3u3^V z5?(TEj*50c40ub#OKQy=+66J-{TT1NHA86^#DGr&c#p0bO1mHiJU{RnUNe+-K@4~j z;f=mH)G+OW7|2gM=``g>CCOKMuHk;xK7MGJX42B&kqcw`#kmY^s z?R`Y}{#`{+PwA$@cIn!$n;mAp(aQ%z)HH1vqO7{7Ka@sU9TBP7s;20 zl_%P(oVdE;M+#S8VfYyB$B+xF2jX*`G)7^oi?_(*GguHm|How2w_k+{?}RJtg@I9ub{#anUUHIZ!&_5?uHo1tlY4xw zdVj#@VuPMuHvUW(zK>E^_0%qifxPIALt9k+|5_y$3414E?+7+ir%JK3+=*7Ma!cy zRsYW3p()ZXyi`IBZnrQcL}6v6U62x;SP(>#m zVbk`0O@4D4R*EwUD;RObt)8U&_-P(m6#j2`)c93(ULlMK#om?&OAUVU6AmsDdzCf$ zen+d)#2sm+T@ZsYEnEE5Un~*0HqQ+!1)n2ulMnm*q7{Ava~Fx-Cw}hkm+Ge3_If+j zd(C~_A6@5PIFtypKfub`e4yxNCNC0PX*Z6;HZ0iR*crZ*+@OF#8*3xw~+DSDd8 z1EFFZ>eIz~y?wrgWrxIhS9nbEi(WZLcpLRr3uM8WJAr-%yFV7XAn19ve7tYbYkb;O z_-g}EuR7rFcWdZJ!u_!dtGDDu+CVJI+WLdf`Sbj0tnjb5+n-&u>w8zjUEDNzA`P`@ zEDq+Lu~^q}W3kC!57jS@yHhMS3$tPOs<#u`{G3b1y(R9Q&8MwOa>wyoi^6})QAfY} z;1Hox6#n_I^&yH(!E=JbOt1)1EES?d6t;yvA1U%og{SfOhoWlZ^&^DTwaP}#-*YU; z#9wFdUMB3(snbXCcPUMo`0Exiun?pYf1R2uC^Lj}g3>~;$x=FK>b$e0y4gCForS-u z5l8V@C#BIkwO*$xbn2;2xvrNwB6VtwPL=Cat4{UXAa#W6)C!$a>r|6YIc}6XLUk%l zr;4D2Zkw=`ts9l8n(av5By}9vgneMW8ENQdX&=OImeRdCbycS7Iu)Z+IXZPtr;N8MUGSH-dV1$acJ=$a(a<^K6pZ<4a#N*RI9lk<3J)run!|J=UoK+oW`o zPOZ|ZGM#GHDW_biBTT23>eOMKx~Eh2+og^Wol4QE0-b8mscv~vN03e>=+u6ls?{m$ z9a2YtPR-M)T{=~xQ!(doBpr5Yj%1SHw^JG*R;!YPT%A{?^Az7obzWMPB+Sxzn|0pl zZ>1v@wM)~HBxGroo^V3vwdp*U-BMkIR_O^DI`62?Ytebmd!%)lpjAmiy3Q-sd5t>H z;X7%Lao;Hq3#r`|(*%d^ifEy%8`P?93R5Avn__}6fXav}vnv8O0K!zbU<+%bE!12p zV_SqdU4WP_@B+KQGo!j;0~Ke3z>>Jy8Q#Ip@Zzb)QPo)^NG5`<;W=BwyK4n?)Cwxp z3PF=4ptgjUWeG2w%AKmb6M{&>wG%u=CwLVWP`MUR9u^2HI|A7q;mzx)7%wQfxZPYa zUGO)Dy4(R+K-hFpL>*o|;4mUQe-D z^)C=h`2CAIyMIx)s|||*ZK$hzg1Uq!P{B`3u;ZT~ZFr2jqmNCn;~yiv_YYF_KS;Cw zK^pcCQulw5mbYS*NW!%hsiGBL#UrTPM^GM*5LC7R*)8zqwZJoNF_|K4duZ~p;QtUK zS2ttiJr7h>na# zsPIMx(-p+d%)Psvve<7It7nC_w-d&9BPgvZ=D0lCm zZqFU4v^yB3+Z~kT-$puyxP1#acnj&8Tc~s3VsQg7fpBg>VAOyhqaMS%)tgMqtjF9J z>M+vAI;go+#&sBT^G#I5+=Lf+6Ae{2&>wpPp5+asHPTdL-ZC`rADz=3GIfVSfo z;H6VdqiQ*iAcKfF56|;FytXQ+b5&4LRR|1-(|^F*`3F3&KQLwGIe4=P?{k>Q_8g|X za2D#oS(F5vMNnIbx&@U`HbnjzAn6QB!q1@O-f5(%r?G8LRK=%|P9R!N0vUu0apHF% ziZCEfS73lW6&S#$0&P{lVSu>bpv-?my6XfM<4<5s$DP0m)&2@E;a7OUzru6=6<)(} z3~=-~1_(WlwtK%IUGWQ)6IFRR)TDB#r^lc&kKvOsB|s?AR1B;j`Vr+vfXE{l#o!1=S$`PH>oB~kpMY4x zoY+-_)V~O6?IEZIhv3-|`3He9#O*>Lm2e=63xEkk%a1_DkLY##5xpl4K+QM+WpDt& z<{z-=^8*&E@}c7L;aL)UzXwJWb^DPf>_^&zs$d_y5aQlmU@755lzj(GA|CHS@%lX| zcH4uUcxE?t;>O+B_w#mR-+S-I@vx@K+l3OJUFfL(7KkG(iM>04(L~)2Aerbv+|9!% z$MbM3)2OE9VU(8b7-hwFOzA>Zo{PFj;^{VE{Wb)%wqeSV+t5~-18+8AO5|+?{I{Z{ zHXFSQvax7GbqFk}c4Z+AAZi65f#@b6Ey_e1k_pwc7V7X?Y--k83=qB+L%CCxuR(Dn z@$?&%WPXEU52}+H@MaLkM9yl!hp1i!#1WRn-jzW7N{k$~602Lc0*lE+529!}5K1(q z11pGrMENoxl6bllSWkEmm0tt12~#334e%!}e+4WcY>50+U<`4432<-;)?m#NtbxN4 zY(iNIyj3aK%IFkqqG!SzKxIUgIRk+k0D;5%39OBuK+UBx{sdu8G!PRF zFEARO8P$!Cq2fM9U`bq!f_E?qUOd$}s=Db2l8NBy@SLZ^yE_f)=rpL%X$YF80_v&o zvZlfdr*fw%k30+l-j%3}(G$_OAk0^Ym`c-~ajRC$vT_!AbB;WbQx zw`USm3YEEWE>Gq1I42jYUuv0;~#w7aam`0F@C{=KBcT00a=@QWyE z41!7yLP>BC0%tDXeFy63J5ZtTAZQv5s7J%g8qGE;cdGKY5kwNMZ^Ki(4X+{)DmM_y zBM?F5C?I`a3N0k0a1hjvDp{!BC33VSi+pxH3A4AYQ2F3q8m{#90(!qc>zla zC!%Z^Fo}5V31kv(#L1yp)0snYZW#~7VvYykLsSm|;s{G(uRAcBs2dC<6FrC`Hz1T~ z8U(B$`Vr->KqT>WAh4eBASzve*@P*P_XglkTpj={AZ&>I{=gXGc0VAMa3G3b2PP0L z&Oip?LY(LeL=gtWW+%XlsOkg666VA%M<9Tx?F}Rl-G~AQAcVNr3s_1x5oPwkB;s*T zAd_$-PWAw15XMB#Yk&_?Z3n~=mc-ufz-Xeb8<0%&Ad0#Ip+u7{u!87ki{o*u3)GY@ zI6SUhaB?ZS;9RS)fy%Xk@~}Z#*%`?03~yd%c-~ajRC(42{0R$dcnwzY_E6i60p2XCkyKS?2x198GkCUU@M_va9cT{~&>lgpDX`xZUYaSqASy?y0wsbF z!d?llRRQm?0%{GFlLA4R39!lpUbG3k0aQj*nZ^j*00>-$+QHh`4r(ryaXW-LMnH@a zyg(y(W>hx}q2de?SQ1wa;2ku87f&^gs!kt4G7+o~&spDO!rHqgrfZMlPhM1;{ximv z=RadydHyrTm50ims{AQ}NW%3gJjGLZ75_rz{tM;tFM`T8AiE9Tyf%2=RMu2^PZ0PM z7Ej43ErwS8)H*PPu|Be&nSOw0F$O;6m z6*y@W6*zq=euK*W4a(y;1eGU%>=W?joq*>}Wlfd$D*}JQ;#YVL$KmZc4wXWcJ`T52 zd#e0jP?Gcug0Nq(Xh+pt4wYJtz=3Ey2JiSWwoy%^YB`D^gNQf^&+{m}wx6NS{R~y} z9)^#hGWZ!Kr^^uREW_d~s*zMxr3hjPzfyR%rEF6}9Z*9Bs1ekb0Q*berIo-7qH?4v zC`J%M*cZcVJp%9W5vVm(PDc=w9R^k%h8KMp-T*2is?47dxB(EjI2FO#SOhhf%D4z& z&LJS?5WK)c@XV-g9E6HHh`^G#S_to8A-s61aa45$2$G550(i~^@b3Nyb@WH5&>s;r z9RSn^;AI_v7f$6)RsI8lNW%38c#0q3RpdkE=0kbpBdGiy$o?MQyzk+8Q(05x?ML8G zSnP+_un*pzeNZV>Hv16d?*)?f!VB9A&yK43JE+v}5I7Kxd*B`4123Iw8db|~1Q|rc zZg`%%;kE68I=2fdY8L_n;`F!hc76+Q7S%|qs+|a83BR52Y)}BE*6m@Z*LRo%_x?QuN0*Km~K*CHMh3+$PPzq*1jhz8? z?-O*a_yomHpP-~H8kj^p{usz4+&)H0WfV$gL_wKG!ONSDMW5+V)zg4D!jjlK6&Ov_ zMWQ%05_LTyu~;+(2ql^#fE5u)T_TW{Plk$`4E1ypg7t(4QTY)tn=mEv!U6wq6xU8f z@q&p^-Kg>>AQ(g39uK4v4n%PnN+yM&q~${_W)LpKiBKSlFd#O60C*8qOwF|LI@VS5e4r9A%y+=#^yp>Fiv@OFi!p~s&FcIs`B?x68Ro_ACJK(>&HO3 zje&RaU0?=bOymRsK1B69KpbI7Tpf+!505qu72>JFMq^OB(HOq@ZK%|@QQ|-p2V&&V zK+MrH3Q9c+#T!SVBw`ebJ*nCPpw0zAMFpV4fH?gYyq#~sn?*H}s%j(#m^~6h`Hh5U zI}(%Uy@_J~H{sR#Bi-YV;nVz4+>ML*Dg+@aC_5E`RzC!X{m{FH%E=GCWxl{9UzD`? zpg7Y9$^{An*Y^>aB5MR%=Z-*w@d$*Qy-^n9jWp03Y1MG_#}0>QIUH$?7m5#hp?I_x z7HfwgO(24XA#fgsjs{Ptqn;=U^+d_Nq3Bf)#dujmk%kRL>OK@{xd+-J30DuK3J-V{ zL!fepKzR&7Q0a~VX1GHc6FGx{n86qzXfR4F2BWya4QhcK>MY%m?i~cg4?;=UAk0?h zip6B22T?Q-NE?WB+CZdDE?Bh;7kCja7|PQHL!Ed7Lq)y;@96+wJ>fxA_6M^2qc^@k zdQG{Q*AD{(^h1Y5KLmGQ#{dbhW6|by1O?7eNzMquoe|hOV~*CoP)qwFaOjJYGAF1B zP8h1C50F8)5N(cVyWoh4vZ&@dqRrS5#hZJh&8Ih1l>_Qx2|ovv*g2qhS1&9E^g>CU zJxUVnvDl4h=!ue}Jy8yI)<7ij)CyQnco3DAz-+?Q5~J+u zgi-uEVezsBuz;{3@;d@!h}-5sD&asBcK{|3EoMLl;X<5f4@40L#A#FPl0Bx_u`#AN zGJ#ZPR5z4RaY~d}5?2-Q4l3ZqQ;nmlGeM9{1e?HfHi38780x4oRH!k6rgnh39lWe| z@WQFwsmhHIL=vt>@DxVyDh#1=4WT>?5mXug*#_|D8NlOMv=nN`$kbh6!(oVT_aR( zBa}xYg37;v?7!j7`x~A&l{Hn~Jp}%Q#XWcpf5F@H7gP$B&0h%e?*d78;f39WXGhh1 z2P*Xr0tce;HoW7v;iXeeqiVT@AcKgw1<&&qytW3Ya}7{Y4G0W~)AjIn*29}cHIk~T z4nZv8R|n6w4qnYor~@~l0&XIxy#egM0Wa+aydWw^s)FkXLJ0fo@LFr(9j=91L*-P9 zpzIp3>KeT0Yw!k88Bt|kMc@WN;M#cw*2XJPbE%B4Ak4W8#9W3Kcp07<)s0I~ahDKS z5?5>B9jt*DPc@FJ?oR~CMDU;Rod1L;zED0|4Ha6Apy?u@<{RX!i}1vE$?jC;7Z5}e zt{0FhF2Jie50!f!%HuqO$|@kc3f{abc-~ajRC#|O@Fy((fY)#i-kx(%DO5J+5agc) zlKApC>?}O-HF9$$RB9yxhf1TV!jUsjAqqlvmQAerbv6qN#@M3Wj=LG&ZaOMpn?X)&;#@E|IW0J8~GBJVKZPh9>9 zSU}hi`9;7O;`SjRm2e=64+0a2mO>zda3M|<08xYivH3^9i>NvP#1iJjt{;E^qBb8$ zAi5C+-vc4Uz5T#a!igx`2TUR!?*%dmH{#@Xzzo8e$k_w<5Y@YZIKqK~&}fvvYBR49_)cFIeXqjTg3W!%5@64S~fr zo|rj2F>`ogQrYAn$lnSiZRLr%l_w@ub2d-RYy=KO;}&?wx4=uMnnu;K89@dSu^FD{ zW_WFzpw4ZAirR$0fH=Jo-p-BiW>Jl#s@i}cmhjsE&vpa6n)Ofz)EJFP>@~RoyBC$wcrfc+RWf-CYTF zbR|^iN(4FGmnbxGsmMSPriu9V#~+$|D^? zhXP5V@WMjj*- zPQMRt=lk$xQH`Xk3Puo1_yxnW4TdMaKR)mtRKR-(YR3Tk#~@7`122fmk*eTb1R;d| zyYO0r;2jQvT0`X&grMvlVAVVDqThixfXav}b2I`s00LK~w_$C38)`0<@!JS<0)d!7 zc!7cN%&2aRf{Gi3z>>Hc0PkP`ym+c{RCRA5NG5{cg6I4eyt^Zzj*f&19f_dnO+fu7 zysS6jg;TjxmHQ)zBwYRBDg5D8sGxFHP#!7-m3~0BAG~>f@Vu$4sq%ag_!Abs@EUyJ z?eT$1p|bHokUs)Q8UZhC1Ux&cW^breZv+lR<8XM#hr>&!nnu;)g&>27@Pg;*1+Q%w z)VX0$QNs`z5T`xi?ev57;6Qk0R5x6p;#?3|5?9}Vckm5(@l@le>INW4CV~gRa~=TiZhxqw{h>np zBWUUesQbao>IW~J%AKnGbp(-w>+A3oufwZwhRSt@@^D5_*%!#}3vXUuc-~ajRC!Ja z{0R#ucny8v?db!RLS@qjLB1o927 z=mpQS7rZumsB`vEQT7N7h|@jc?d%C}7S%|qsvZbp3BMljYV}}KE3m37yy&j*22dGMW!fTe10ZmC zyTIDm1!^vpaTkO+Hb9IGyg(bHi9!b(Bc*VoGt#)u2rP-K)<_Rp!;7aHM^$HqAejiZ zg6C`n@2(}(QA?;$O9V}w0CgvLS)Jg8Q@K->TOf!eTrJ=!EZ|jigv#v*<ctCQv?n~qY~b6 zCA@U1X;du=1Q|qx0-mP=UYiNjITNTT69fjtX=8Xhjp5Cr8c9{v4nZv8*AAX-J9srl zPzQ{l0*nyU8Up(b;iVbE3!-wQDlkA0Lf9L?Yt@H$SRZN)m6N{Fw6$gUAD-OSMjK67 zix1OU4x0I&A&x8nfg}6W5J&bY)Lbg#rwDWY1!De%7x*tcGpZYHP;qStEQza6;2nGd zFP>@~Ro!C*$wcsDc+QXE-TepZ=s!@Q{~%~;1=OwZvRdJVQ@K->KSB^mxITiXcm%Ja z1uC}%%A*BA~3H=*WI8Q(;ha|4LE0Wa_dJTs~r*P-IB zBd{c{*1|hj3oo8(997*l1j$73HF(a~;N86nb@VD!=v4$wR{-@Dcv)BAg;Tjxm0v~> zNw{8yr??ES;u2KuB`A+e2r6rU>>7CUYT$WOSyScxiNK$*_!C}3HM~95P$^V4)d=!0 z0!bI)g@UA^eRt3r;d5iTld$sp>ZR(^qImv}{p1uVg z-Y8Pq4=Rx-vJT;vyRy4rF+^z_#GfDK3f9;gqj&I^PQHEKb@W>Dg@4JSpS!5XeAuY& zceb6syegoZxw_@`8|t$kvg5=bmcCof9e+Ch!}}$|9(Sd!_`9+kam!!K9d}y!1{(PM zbfV|`CGt*THfr&+JZ;sFd^+7K@$9M}QS!}ahU$m`7u1hV8soo-p(m~vNAX9&dC-M&dEH2j}A%z_~2mj)8`1|jQ#-E${Tt`l#tgO%U zs**vM)ao5e*^d*hDpd@yZocqPsrt+@~XwVTS^v=tx#3jaHG7g8~Co8-@j;;L3oKgk#{&In5c8I zPO5I?@Pw=833k3XtM`4SLvWt^=_F^S8=eXBf-F#avjy#zAPEd)w6@LMROF+Hd zuK!$oH|9_BTzA2%#6Q7OedN|@)uY#p{RJ1~!o4??=3Oei?bK&SoK>|f(|$BGgA4oK zPTs zw{Y?J;OIuLYq)p_`}<3mD~ztW9QFTUqOZ}S)I;N=4NHUsL#t{8A z)2I7xi)tM9@yP4N@&tb=CT{l;T<$W@=Xy=SewYiNIx*^s>NPWV*n5~J_%?578a8p){UgG?*Rk)fzU`~tn0Q6C?Ytfe zF5gb@9oe|V>s+tHN92jHAGJ8=mi#Z#cYnfNucxg`j(oe`SN*|PS5yzO_5ATSnM&J8 zoYWPGzIMAkhTomm>&Rbcebq+sS5$5@^!(+kH0`0UI%3ilRd;vJcwzimpWyEYdzJM6 z6k+s01+t+dlPnd_dzUd_dzUoQ9p8Qo9R+U^HB5Dcp0# zek~%Mr|T&9)PXN8-}eqhh5P{ zyo)2_69enGCozI>$`!kn&nXO8!~j~@grKAJ0HY0rQZJlcRc^`%7x@!}I5s}<(%9_c z+C7_7h#Ic+D74tC3>{E-<736#BZYavib?u~QPs*lhYL@?sfBI!I~u zTq^xe*QZmI{Y|t#!6lrJz&RivLkg5rUI?_m&LvD)fWceeePM9vH@YrO#s_d!n9@kd ziBMXbNWaQ8B?$Kk(T;&F1VkvE@Xyv^8}3b3nu|e4&ChAs`%AyMb!HysDW0q}5qDb8 zXTO?d@Bi#aw(R|-U&P`JR@wz|A4xyUH6LsAT%i4#En(DTWq+$@KacfnDDLj(IFL}Ly3^Go)HgM*ZlEep-FO;g(!Hpc1CYbT_~ z;as<#1L@PY!ST?8oOUIDjh|3*9q0O$zfYFlFnJFjYCrY0#*?L6yT9kVxavE#^ORGi z4^MsQi~pR?nf+c9&vYt@_#^}m@3X{ja(?RG?a!8uX}=bETmMZ(<-M&-Rvr&7k#`Dv zQ7g=zh38`0p&y?ubr;r&6KR`;fwPp|ZC?zBR8*CA{q9#^;pt3eH!&UD`F!bAx07P4 zF0DW+4lGX#`c{|Tj5H9|&BT38JriGDxLxZkFO`P<>VRKC%+L=iT8s5Of%WCQb(5+~ zZPJYVJWa($xeUC7_Wn4CztGf`*E=ljuCM|^i%sTzEbMENU!qR!FRp3h zrP|W2RcYeDQWdu#_516kg{Lhv6smHfoFV)lAk9^_E z-cEH{i6!>CrXP`aat}#WdV2FpC5=bu+b8-+9r8p7$LK@r?fNc1-bcQU(z>u#(ws?J z_j>Y`OP;*Y z(OY)~ski$tvC`8Q|s-%7;W2! zhk=KK{nEvdwUVa4spD^@-+a~{7s0*O!9VT8C1An}9rCI_9emU-cYZJ3v442sZ=Whl z3=$_NcXd2}d;bx`_K78LeX!2w!wp5H@BG`-n_Ve450@6_br``pC5`j0+M=ijK5jSg zv6FYmtEk7f7UDzdnpbbPT3wqfZHs*Up*xgH8^8&LRnwI=7V;HlxsWs)$NtlQmpJlN z=P6HD>JxQRd1;{WW*@OrtMQ}whC6%nY*}gPVfPL`cq4c#*HP+_S3wI_ z)0Lg^b$Fr5%8{2ZULrWC)GS<{CLZ@sd!N+h9731xL0)J+Rq3MdQ(HT~=