- id: dryback_completed alias: Dryback Completed description: Records a completed dryback cycle in the history trigger: - platform: state entity_id: sensor.dryback_last_valley_time condition: - condition: template value_template: '{{ trigger.to_state.state != ''unknown'' and trigger.to_state.state != trigger.from_state.state }}' - condition: template value_template: '{{ states(''sensor.dryback_last_percentage'') | float >= states(''input_number.cs_dryback_min_percentage'') | float }}' - condition: template value_template: '{{ states(''sensor.dryback_last_duration'') | float >= states(''input_number.cs_dryback_min_duration'') | float }}' action: - variables: timestamp: '{{ as_timestamp(now()) }}' peak_time: '{{ states(''sensor.dryback_last_peak_time'') }}' valley_time: '{{ states(''sensor.dryback_last_valley_time'') }}' peak_vwc: '{{ states(''sensor.dryback_last_peak_vwc'') }}' valley_vwc: '{{ states(''sensor.dryback_last_valley_vwc'') }}' percentage: '{{ states(''sensor.dryback_last_percentage'') }}' duration: '{{ states(''sensor.dryback_last_duration'') }}' phase: '{{ states(''input_select.crop_steering_phase'') }}' current_history: '{{ states(''input_text.dryback_history_json'') }}' - service: input_text.set_value target: entity_id: input_text.dryback_history_json data: value: "{% if current_history is string and current_history|first == '[' %}\n\ \ {% set history = current_history | from_json(default=[]) %}\n {% set new_entry\ \ = {\n 'timestamp': timestamp | float(0),\n 'peak_time': peak_time,\n\ \ 'valley_time': valley_time,\n 'peak_vwc': peak_vwc | float(0),\n \ \ 'valley_vwc': valley_vwc | float(0),\n 'percentage': percentage | float(0),\n\ \ 'duration': duration | float(0),\n 'phase': phase\n } %}\n {% set\ \ updated = [new_entry] + history %}\n {% if updated | length > 100 %}\n\ \ {% set updated = updated[:100] %}\n {% endif %}\n {{ updated | to_json\ \ }}\n{% else %}\n {% set new_entry = {\n 'timestamp': as_timestamp(now()),\n\ \ 'peak_time': peak_time,\n 'valley_time': valley_time,\n 'peak_vwc':\ \ peak_vwc | float(0),\n 'valley_vwc': valley_vwc | float(0),\n 'percentage':\ \ percentage | float(0),\n 'duration': duration | float(0),\n 'phase':\ \ phase\n } %}\n {{ [new_entry] | to_json }}\n{% endif %}\n" - service: persistent_notification.create data: title: Dryback Cycle Completed message: 'A dryback cycle has been completed: Start: {{ peak_time }} End: {{ valley_time }} Duration: {{ duration }} minutes Dryback: {{ percentage }}% Phase: {{ phase }} Peak VWC: {{ peak_vwc }}% Valley VWC: {{ valley_vwc }}% ' notification_id: dryback_completed - id: dryback_reset_potential_peak alias: Reset Potential Peak description: Resets the potential peak detection after irrigation trigger: - platform: state entity_id: switch.cs_configured_pump_switch from: 'on' to: 'off' action: - service: homeassistant.update_entity target: entity_id: sensor.dryback_potential_peak - delay: seconds: 300 - service: homeassistant.update_entity target: entity_id: sensor.dryback_potential_peak - id: improved_crop_steering_change_to_p0 alias: Crop Steering - Change to P0 at lights-on description: Changes the crop steering phase to P0 when lights turn on trigger: - platform: time at: input_datetime.cs_lights_on_time action: - service: input_select.select_option data: option: P0 target: entity_id: input_select.cs_crop_steering_phase - service: input_number.set_value target: entity_id: input_number.cs_p1_shot_count data: value: 0 - service: input_number.set_value target: entity_id: input_number.cs_p2_shot_count data: value: 0 - service: input_number.set_value target: entity_id: input_number.cs_p3_shot_count data: value: 0 mode: single - id: improved_crop_steering_p0_to_p1 alias: Crop Steering - P0 to P1 Transition description: Transitions from P0 to P1 based on dryback target or maximum wait time trigger: - platform: state entity_id: - sensor.cs_configured_avg_vwc - platform: template value_template: '{{ states(''sensor.cs_minutes_since_lights_on'') | int % 5 == 0 }}' condition: - condition: state entity_id: input_select.cs_crop_steering_phase state: P0 - condition: template value_template: '{{ states(''sensor.cs_minutes_since_lights_on'') | int >= states(''input_number.cs_p0_min_wait_time'') | int }}' action: - choose: - conditions: - condition: template value_template: '{{ states(''sensor.cs_configured_avg_vwc'') | float <= states(''sensor.cs_dynamic_p0_dryback'') | float }}' sequence: - service: input_select.select_option data: option: P1 target: entity_id: input_select.cs_crop_steering_phase - service: notify.mobile_app_notify data: title: Crop Steering Phase Change message: 'Transitioned to P1 (Ramp-Up Phase) after reaching dryback target of {{ states(''sensor.cs_dynamic_p0_dryback'') }}%. Current VWC: {{ states(''sensor.cs_configured_avg_vwc'') }}% # Use configured entity ' data: tag: crop_steering_phase_change - conditions: - condition: template value_template: '{{ states(''sensor.cs_minutes_since_lights_on'') | int >= states(''input_number.cs_p0_max_wait_time'') | int }}' sequence: - service: input_select.select_option data: option: P1 target: entity_id: input_select.cs_crop_steering_phase - service: notify.mobile_app_notify data: title: Crop Steering Phase Change message: 'Transitioned to P1 (Ramp-Up Phase) after reaching maximum wait time of {{ states(''input_number.cs_p0_max_wait_time'') }} minutes. Current VWC: {{ states(''sensor.cs_configured_avg_vwc'') }}% # Use configured entity ' data: tag: crop_steering_phase_change mode: single - id: improved_crop_steering_p1_to_p2 alias: Crop Steering - P1 to P2 Transition description: Transitions from P1 to P2 based on shot count, VWC, or EC trigger: - platform: state entity_id: input_number.cs_p1_shot_count - platform: numeric_state entity_id: - sensor.cs_configured_avg_vwc above: input_number.cs_substrate_field_capacity - platform: numeric_state entity_id: - sensor.cs_configured_avg_ec below: input_number.cs_ec_target_flush condition: - condition: state entity_id: input_select.cs_crop_steering_phase state: P1 action: - choose: - conditions: - condition: template value_template: '{{ states(''input_number.cs_p1_shot_count'') | float >= states(''input_number.cs_p1_max_shots'') | float }}' sequence: - service: input_select.select_option target: entity_id: input_select.cs_crop_steering_phase data: option: P2 - service: notify.mobile_app_notify data: title: Crop Steering Phase Change message: 'Transitioned to P2 (Maintenance Phase) after reaching maximum shot count of {{ states(''input_number.cs_p1_max_shots'') }}. Current VWC: {{ states(''sensor.cs_configured_avg_vwc'') }}% # Use configured entity ' data: tag: crop_steering_phase_change - conditions: - condition: numeric_state entity_id: sensor.cs_configured_avg_vwc above: '{{ states(''input_number.cs_p1_target_vwc'') }}' sequence: - service: input_select.select_option target: entity_id: input_select.cs_crop_steering_phase data: option: P2 - service: notify.mobile_app_notify data: title: Crop Steering Phase Change message: 'Transitioned to P2 (Maintenance Phase) after reaching target VWC of {{ states(''input_number.cs_p1_target_vwc'') }}%. Current VWC: {{ states(''sensor.cs_configured_avg_vwc'') }}% # Use configured entity ' data: tag: crop_steering_phase_change - conditions: - condition: numeric_state entity_id: sensor.cs_configured_avg_ec below: input_number.cs_ec_target_flush - condition: numeric_state entity_id: sensor.cs_configured_avg_vwc above: input_number.cs_p1_target_vwc - condition: numeric_state entity_id: input_number.cs_p1_shot_count above: '{{ states(''input_number.cs_p1_min_shots'') | int -1 }}' sequence: - service: input_select.select_option target: entity_id: input_select.cs_crop_steering_phase data: option: P2 - service: notify.mobile_app_notify data: title: Crop Steering Phase Change message: 'Transitioned to P2 (Maintenance Phase) after reaching EC target. Current EC: {{ states(''sensor.cs_configured_avg_ec'') }} mS/cm # Use configured entity Current VWC: {{ states(''sensor.cs_configured_avg_vwc'') }}% # Use configured entity ' data: tag: crop_steering_phase_change mode: single - id: improved_crop_steering_to_p3 alias: Crop Steering - P2 to P3 Transition description: Transitions from P2 to P3 based on calculated time before lights-off trigger: - platform: template value_template: '{% set current_timestamp = as_timestamp(now()) %} {% set p3_start = as_timestamp(today_at(states(''sensor.cs_p3_start_time_calculated''))) %} # Renamed sensor dependency {% set diff_seconds = current_timestamp - p3_start %} {{ diff_seconds >= 0 and diff_seconds < 60 }} ' condition: - condition: state entity_id: input_select.cs_crop_steering_phase state: P2 action: - service: input_select.select_option data: option: P3 target: entity_id: input_select.cs_crop_steering_phase - service: notify.mobile_app_notify data: title: Crop Steering Phase Change message: 'Transitioned to P3 (Overnight Dry Back Phase). {% if is_state(''input_select.cs_steering_mode'', ''Vegetative'') %} # Renamed Using vegetative dry back strategy ({{ states(''input_number.cs_p3_veg_last_irrigation'') }} min before lights-off). # Renamed {% else %} Using generative dry back strategy ({{ states(''input_number.cs_p3_gen_last_irrigation'') }} min before lights-off). # Renamed {% endif %} ' data: tag: crop_steering_phase_change mode: single - id: improved_crop_steering_p1_irrigation alias: Crop Steering - P1 Ramp-Up Irrigation description: Controls irrigation during P1 with gradually increasing shot sizes trigger: - platform: time_pattern minutes: /1 condition: - condition: state entity_id: input_select.cs_crop_steering_phase state: P1 - condition: template value_template: '{% set current_minute = now().minute | int %} {% set interval = states(''input_number.cs_p1_time_between_shots'') | int %} # Renamed {{ current_minute % interval == 0 }} ' - condition: template value_template: '{{ states(''input_number.cs_p1_shot_count'') | int < states(''input_number.cs_p1_max_shots'') | int }}' - condition: state entity_id: switch.cs_configured_pump_switch state: 'off' action: - variables: shot_duration: '{{ states(''sensor.cs_p1_shot_duration_seconds'') | float }}' shot_count: '{{ states(''input_number.cs_p1_shot_count'') | int }}' shot_size_percent: '{{ states(''sensor.cs_p1_current_shot_size_percent'') | float }}' - service: switch.turn_on target: entity_id: switch.cs_configured_pump_switch - delay: seconds: '{{ shot_duration }}' - service: switch.turn_off target: entity_id: switch.cs_configured_pump_switch - service: input_number.set_value target: entity_id: input_number.cs_p1_shot_count data: value: '{{ shot_count + 1 }}' - service: logbook.log data: name: P1 Irrigation message: 'Ramp-Up Shot {{ shot_count + 1 }}: {{ shot_duration }}s ({{ shot_size_percent }}% of substrate volume) VWC Before: {{ states(''sensor.cs_configured_avg_vwc'') }}% # Use configured entity EC: {{ states(''sensor.cs_configured_avg_ec'') }} mS/cm # Use configured entity ' mode: single - id: improved_crop_steering_p2_irrigation_on alias: Crop Steering - P2 EC-Adjusted Irrigation On description: Turns on irrigation during P2 based on EC-adjusted VWC threshold trigger: - platform: state entity_id: - sensor.cs_configured_avg_vwc - platform: state entity_id: - sensor.cs_p2_vwc_threshold_ec_adjusted condition: - condition: numeric_state entity_id: sensor.cs_configured_avg_vwc below: sensor.cs_p2_vwc_threshold_ec_adjusted - condition: state entity_id: input_select.cs_crop_steering_phase state: P2 - condition: state entity_id: switch.cs_configured_pump_switch state: 'off' action: - variables: threshold: '{{ states(''sensor.cs_p2_vwc_threshold_ec_adjusted'') | float }}' current_vwc: '{{ states(''sensor.cs_configured_avg_vwc'') | float }}' ec_ratio: '{{ states(''sensor.cs_ec_ratio'') | float }}' shot_duration: '{{ states(''sensor.cs_p2_shot_duration_seconds'') | float }}' - service: switch.turn_on target: entity_id: switch.cs_configured_pump_switch - service: logbook.log data: name: P2 Irrigation Started message: 'Maintenance Irrigation: {{ shot_duration }}s VWC Before: {{ current_vwc }}% EC Ratio: {{ ec_ratio }} Adjusted Threshold: {{ threshold }}% ' mode: single - id: improved_crop_steering_p2_irrigation_off_timed alias: Crop Steering - P2 Timed Irrigation Off description: Turns off irrigation during P2 after calculated duration trigger: - platform: state entity_id: switch.cs_configured_pump_switch from: 'off' to: 'on' condition: - condition: state entity_id: input_select.cs_crop_steering_phase state: P2 action: - variables: shot_duration: '{{ states(''sensor.cs_p2_shot_duration_seconds'') | float }}' - delay: seconds: '{{ shot_duration if shot_duration > 0 else 1 }}' - service: switch.turn_off target: entity_id: switch.cs_configured_pump_switch - service: input_number.set_value target: entity_id: input_number.cs_p2_shot_count data: value: '{{ (states(''input_number.cs_p2_shot_count'') | int) + 1 }}' - service: logbook.log data: name: P2 Irrigation Completed message: 'Maintenance Irrigation Completed Duration: {{ shot_duration }}s VWC After: {{ states(''sensor.cs_configured_avg_vwc'') }}% # Use configured entity EC: {{ states(''sensor.cs_configured_avg_ec'') }} mS/cm # Use configured entity ' mode: single - id: improved_crop_steering_p2_irrigation_off_capacity alias: Crop Steering - P2 Irrigation Off at Field Capacity description: Turns off irrigation during P2 when field capacity is reached trigger: - platform: numeric_state entity_id: - sensor.cs_configured_avg_vwc above: input_number.cs_substrate_field_capacity condition: - condition: state entity_id: input_select.cs_crop_steering_phase state: P2 - condition: state entity_id: switch.cs_configured_pump_switch state: 'on' action: - service: switch.turn_off target: entity_id: switch.cs_configured_pump_switch - service: logbook.log data: name: P2 Irrigation Stopped message: 'Maintenance Irrigation Stopped - Field Capacity Reached VWC: {{ states(''sensor.cs_configured_avg_vwc'') }}% # Use configured entity Field Capacity: {{ states(''input_number.cs_substrate_field_capacity'') }}% # Renamed ' mode: single - id: improved_crop_steering_p3_emergency_irrigation alias: Crop Steering - P3 Emergency Irrigation description: Provides emergency irrigation during P3 if VWC drops too low trigger: - platform: numeric_state entity_id: - sensor.cs_configured_min_vwc below: sensor.cs_dynamic_p3_dryback condition: - condition: state entity_id: input_select.cs_crop_steering_phase state: P3 - condition: state entity_id: switch.cs_configured_pump_switch state: 'off' action: - variables: shot_duration: '{{ states(''sensor.cs_p3_emergency_shot_duration_seconds'') | float }}' current_vwc: '{{ states(''sensor.cs_configured_min_vwc'') | float }}' threshold: '{{ states(''sensor.cs_dynamic_p3_dryback'') | float }}' - service: switch.turn_on target: entity_id: switch.cs_configured_pump_switch - delay: seconds: '{{ shot_duration }}' - service: switch.turn_off target: entity_id: switch.cs_configured_pump_switch - service: input_number.set_value target: entity_id: input_number.cs_p3_shot_count data: value: '{{ (states(''input_number.cs_p3_shot_count'') | int) + 1 }}' - service: logbook.log data: name: P3 Emergency Irrigation message: 'Emergency Irrigation During P3 Duration: {{ shot_duration }}s VWC Before: {{ current_vwc }}% Emergency Threshold: {{ threshold }}% ' - service: notify.mobile_app_notify data: title: Emergency Irrigation message: 'Emergency irrigation triggered during P3 phase. VWC dropped to {{ current_vwc }}% (below threshold of {{ threshold }}%). ' data: tag: emergency_irrigation mode: single - id: improved_steering_mode_changed alias: Improved Steering Mode Changed description: Updates parameters when steering mode changes trigger: - platform: state entity_id: input_select.cs_steering_mode action: - service: homeassistant.update_entity target: entity_id: - sensor.cs_dynamic_p0_dryback - sensor.cs_p3_start_time_calculated - sensor.cs_current_ec_target - service: notify.mobile_app_notify data: title: Growth Steering Mode Changed message: '{% if is_state(''input_select.cs_steering_mode'', ''Vegetative'') %} # Renamed Switched to Vegetative steering mode. P0 Dryback: {{ states(''input_number.cs_p0_veg_dryback_target'') }}% # Renamed P3 Start: {{ states(''input_number.cs_p3_veg_last_irrigation'') }} min before lights-off # Renamed {% else %} Switched to Generative steering mode. P0 Dryback: {{ states(''input_number.cs_p0_gen_dryback_target'') }}% # Renamed P3 Start: {{ states(''input_number.cs_p3_gen_last_irrigation'') }} min before lights-off # Renamed {% endif %} ' data: tag: steering_mode_update mode: single - id: update_zone_status_from_selector alias: Update Zone Status from Selector description: Updates the individual zone enabled states based on the zone selector trigger: - platform: state entity_id: input_select.active_irrigation_zones action: - choose: - conditions: - condition: state entity_id: input_select.active_irrigation_zones state: All Zones sequence: - service: input_boolean.turn_on target: entity_id: - input_boolean.zone_1_enabled - input_boolean.zone_2_enabled - input_boolean.zone_3_enabled - conditions: - condition: state entity_id: input_select.active_irrigation_zones state: Zone 1 Only sequence: - service: input_boolean.turn_on target: entity_id: input_boolean.zone_1_enabled - service: input_boolean.turn_off target: entity_id: - input_boolean.zone_2_enabled - input_boolean.zone_3_enabled - conditions: - condition: state entity_id: input_select.active_irrigation_zones state: Zone 2 Only sequence: - service: input_boolean.turn_on target: entity_id: input_boolean.zone_2_enabled - service: input_boolean.turn_off target: entity_id: - input_boolean.zone_1_enabled - input_boolean.zone_3_enabled - conditions: - condition: state entity_id: input_select.active_irrigation_zones state: Zone 3 Only sequence: - service: input_boolean.turn_on target: entity_id: input_boolean.zone_3_enabled - service: input_boolean.turn_off target: entity_id: - input_boolean.zone_1_enabled - input_boolean.zone_2_enabled - conditions: - condition: state entity_id: input_select.active_irrigation_zones state: Zones 1 & 2 sequence: - service: input_boolean.turn_on target: entity_id: - input_boolean.zone_1_enabled - input_boolean.zone_2_enabled - service: input_boolean.turn_off target: entity_id: input_boolean.zone_3_enabled - conditions: - condition: state entity_id: input_select.active_irrigation_zones state: Zones 1 & 3 sequence: - service: input_boolean.turn_on target: entity_id: - input_boolean.zone_1_enabled - input_boolean.zone_3_enabled - service: input_boolean.turn_off target: entity_id: input_boolean.zone_2_enabled - conditions: - condition: state entity_id: input_select.active_irrigation_zones state: Zones 2 & 3 sequence: - service: input_boolean.turn_on target: entity_id: - input_boolean.zone_2_enabled - input_boolean.zone_3_enabled - service: input_boolean.turn_off target: entity_id: input_boolean.zone_1_enabled - conditions: - condition: state entity_id: input_select.active_irrigation_zones state: No Zones (Disabled) sequence: - service: input_boolean.turn_off target: entity_id: - input_boolean.zone_1_enabled - input_boolean.zone_2_enabled - input_boolean.zone_3_enabled default: [] - id: turn_on_irrigation_pump_zones alias: Turn On Irrigation Pump and Zones description: Turns on the mainline valve and selected zone valves based on configured entities trigger: - platform: state entity_id: switch.cs_configured_pump_switch to: 'on' action: - variables: pump_entity: '{{ states(''input_text.cs_config_pump_switch_entity'') }}' zone_switches: '{{ states(''input_text.cs_config_zone_switch_entities'').split('','') | map(''trim'') | reject(''=='', '''') | list }}' waste_switch: '{{ states(''input_text.cs_config_waste_switch_entity'') }}' zone1_switch: '{{ zone_switches[0] if zone_switches | length > 0 else none }}' zone2_switch: '{{ zone_switches[1] if zone_switches | length > 1 else none }}' zone3_switch: '{{ zone_switches[2] if zone_switches | length > 2 else none }}' - if: - '{{ waste_switch | length > 0 }}' then: - service: switch.turn_off target: entity_id: '{{ waste_switch }}' - service: switch.turn_on target: entity_id: '{{ pump_entity }}' - if: - '{{ zone1_switch is not none and is_state(''input_boolean.zone_1_enabled'', ''on'') }}' then: - service: switch.turn_on target: entity_id: '{{ zone1_switch }}' - if: - '{{ zone2_switch is not none and is_state(''input_boolean.zone_2_enabled'', ''on'') }}' then: - service: switch.turn_on target: entity_id: '{{ zone2_switch }}' - if: - '{{ zone3_switch is not none and is_state(''input_boolean.zone_3_enabled'', ''on'') }}' then: - service: switch.turn_on target: entity_id: '{{ zone3_switch }}' - id: turn_off_irrigation_pump_zones alias: Turn Off Irrigation Pump and Zones description: Turns off all configured valves when the configured pump switch is turned off trigger: - platform: state entity_id: switch.cs_configured_pump_switch to: 'off' action: - variables: pump_entity: '{{ states(''input_text.cs_config_pump_switch_entity'') }}' zone_switches: '{{ states(''input_text.cs_config_zone_switch_entities'').split('','') | map(''trim'') | reject(''=='', '''') | list }}' zone1_switch: '{{ zone_switches[0] if zone_switches | length > 0 else none }}' zone2_switch: '{{ zone_switches[1] if zone_switches | length > 1 else none }}' zone3_switch: '{{ zone_switches[2] if zone_switches | length > 2 else none }}' - service: switch.turn_off target: entity_id: '{% set entities = [] %} {% if zone1_switch is not none %}{% set entities = entities + [zone1_switch] %}{% endif %} {% if zone2_switch is not none %}{% set entities = entities + [zone2_switch] %}{% endif %} {% if zone3_switch is not none %}{% set entities = entities + [zone3_switch] %}{% endif %} {{ entities }} ' - service: switch.turn_off target: entity_id: '{{ pump_entity }}' - id: zone_specific_p2_irrigation_trigger alias: Zone-Specific P2 Irrigation Trigger description: Sets active zones and triggers main pump if any enabled zone needs P2 irrigation trigger: - platform: template value_template: "{% set phase = states('input_select.cs_crop_steering_phase')\ \ %} {% if phase == 'P2' %}\n {% set zone1_enabled = is_state('input_boolean.zone_1_enabled',\ \ 'on') %}\n {% set zone2_enabled = is_state('input_boolean.zone_2_enabled',\ \ 'on') %}\n {% set zone3_enabled = is_state('input_boolean.zone_3_enabled',\ \ 'on') %}\n \n {% set zone1_vwc = states('sensor.zone_1_vwc') | float(999)\ \ %} {# Use local zone sensor #}\n {% set zone2_vwc = states('sensor.zone_2_vwc')\ \ | float(999) %} {# Use local zone sensor #}\n {% set zone3_vwc = states('sensor.zone_3_vwc')\ \ | float(999) %} {# Use local zone sensor #}\n \n {% set dryback_target =\ \ states('sensor.cs_dynamic_p2_dryback') | float(0) %} {# Use dynamic target\ \ #}\n \n {% if (zone1_enabled and zone1_vwc <= dryback_target) or\n \ \ (zone2_enabled and zone2_vwc <= dryback_target) or\n (zone3_enabled\ \ and zone3_vwc <= dryback_target) %}\n true\n {% else %}\n false\n \ \ {% endif %}\n{% else %}\n false\n{% endif %}\n" condition: - condition: state entity_id: switch.cs_configured_pump_switch state: 'off' - condition: state entity_id: input_select.cs_crop_steering_phase state: P2 action: - variables: dryback_target: '{{ states(''sensor.cs_dynamic_p2_dryback'') | float(0) }}' zone1_needs_irrigation: '{% set zone1_enabled = is_state(''input_boolean.zone_1_enabled'', ''on'') %} {% set zone1_vwc = states(''sensor.zone_1_vwc'') | float(999) %} {{ zone1_enabled and zone1_vwc <= dryback_target }} ' zone2_needs_irrigation: '{% set zone2_enabled = is_state(''input_boolean.zone_2_enabled'', ''on'') %} {% set zone2_vwc = states(''sensor.zone_2_vwc'') | float(999) %} {{ zone2_enabled and zone2_vwc <= dryback_target }} ' zone3_needs_irrigation: '{% set zone3_enabled = is_state(''input_boolean.zone_3_enabled'', ''on'') %} {% set zone3_vwc = states(''sensor.zone_3_vwc'') | float(999) %} {{ zone3_enabled and zone3_vwc <= dryback_target }} ' - choose: - conditions: '{{ zone1_needs_irrigation and zone2_needs_irrigation and zone3_needs_irrigation }}' sequence: - service: input_select.select_option target: entity_id: input_select.active_irrigation_zones data: option: All Zones - conditions: '{{ zone1_needs_irrigation and zone2_needs_irrigation }}' sequence: - service: input_select.select_option target: entity_id: input_select.active_irrigation_zones data: option: Zones 1 & 2 - conditions: '{{ zone1_needs_irrigation and zone3_needs_irrigation }}' sequence: - service: input_select.select_option target: entity_id: input_select.active_irrigation_zones data: option: Zones 1 & 3 - conditions: '{{ zone2_needs_irrigation and zone3_needs_irrigation }}' sequence: - service: input_select.select_option target: entity_id: input_select.active_irrigation_zones data: option: Zones 2 & 3 - conditions: '{{ zone1_needs_irrigation }}' sequence: - service: input_select.select_option target: entity_id: input_select.active_irrigation_zones data: option: Zone 1 Only - conditions: '{{ zone2_needs_irrigation }}' sequence: - service: input_select.select_option target: entity_id: input_select.active_irrigation_zones data: option: Zone 2 Only - conditions: '{{ zone3_needs_irrigation }}' sequence: - service: input_select.select_option target: entity_id: input_select.active_irrigation_zones data: option: Zone 3 Only default: [] - service: switch.turn_on target: entity_id: switch.cs_configured_pump_switch - id: zone_specific_p3_irrigation_trigger alias: Zone-Specific P3 Emergency Irrigation Trigger description: Sets active zones and triggers main pump if any enabled zone needs P3 emergency irrigation trigger: - platform: template value_template: "{% set phase = states('input_select.cs_crop_steering_phase')\ \ %} {% if phase == 'P3' %}\n {% set zone1_enabled = is_state('input_boolean.zone_1_enabled',\ \ 'on') %}\n {% set zone2_enabled = is_state('input_boolean.zone_2_enabled',\ \ 'on') %}\n {% set zone3_enabled = is_state('input_boolean.zone_3_enabled',\ \ 'on') %}\n \n {% set zone1_vwc = states('sensor.zone_1_vwc') | float(999)\ \ %} {# Use local zone sensor #}\n {% set zone2_vwc = states('sensor.zone_2_vwc')\ \ | float(999) %} {# Use local zone sensor #}\n {% set zone3_vwc = states('sensor.zone_3_vwc')\ \ | float(999) %} {# Use local zone sensor #}\n \n {% set dryback_target =\ \ states('sensor.cs_dynamic_p3_dryback') | float(0) %} {# Use dynamic target\ \ #}\n \n {% if (zone1_enabled and zone1_vwc <= dryback_target) or\n \ \ (zone2_enabled and zone2_vwc <= dryback_target) or\n (zone3_enabled\ \ and zone3_vwc <= dryback_target) %}\n true\n {% else %}\n false\n \ \ {% endif %}\n{% else %}\n false\n{% endif %}\n" condition: - condition: state entity_id: switch.cs_configured_pump_switch state: 'off' - condition: state entity_id: input_select.cs_crop_steering_phase state: P3 action: - variables: dryback_target: '{{ states(''sensor.cs_dynamic_p3_dryback'') | float(0) }}' zone1_needs_irrigation: '{% set zone1_enabled = is_state(''input_boolean.zone_1_enabled'', ''on'') %} {% set zone1_vwc = states(''sensor.zone_1_vwc'') | float(999) %} {{ zone1_enabled and zone1_vwc <= dryback_target }} ' zone2_needs_irrigation: '{% set zone2_enabled = is_state(''input_boolean.zone_2_enabled'', ''on'') %} {% set zone2_vwc = states(''sensor.zone_2_vwc'') | float(999) %} {{ zone2_enabled and zone2_vwc <= dryback_target }} ' zone3_needs_irrigation: '{% set zone3_enabled = is_state(''input_boolean.zone_3_enabled'', ''on'') %} {% set zone3_vwc = states(''sensor.zone_3_vwc'') | float(999) %} {{ zone3_enabled and zone3_vwc <= dryback_target }} ' - choose: - conditions: '{{ zone1_needs_irrigation and zone2_needs_irrigation and zone3_needs_irrigation }}' sequence: - service: input_select.select_option target: entity_id: input_select.active_irrigation_zones data: option: All Zones - conditions: '{{ zone1_needs_irrigation and zone2_needs_irrigation }}' sequence: - service: input_select.select_option target: entity_id: input_select.active_irrigation_zones data: option: Zones 1 & 2 - conditions: '{{ zone1_needs_irrigation and zone3_needs_irrigation }}' sequence: - service: input_select.select_option target: entity_id: input_select.active_irrigation_zones data: option: Zones 1 & 3 - conditions: '{{ zone2_needs_irrigation and zone3_needs_irrigation }}' sequence: - service: input_select.select_option target: entity_id: input_select.active_irrigation_zones data: option: Zones 2 & 3 - conditions: '{{ zone1_needs_irrigation }}' sequence: - service: input_select.select_option target: entity_id: input_select.active_irrigation_zones data: option: Zone 1 Only - conditions: '{{ zone2_needs_irrigation }}' sequence: - service: input_select.select_option target: entity_id: input_select.active_irrigation_zones data: option: Zone 2 Only - conditions: '{{ zone3_needs_irrigation }}' sequence: - service: input_select.select_option target: entity_id: input_select.active_irrigation_zones data: option: Zone 3 Only default: [] - service: switch.turn_on target: entity_id: switch.cs_configured_pump_switch - alias: F1 Light Acclimation description: Linear increase from 50% to 90% over 21 days, then disable itself mode: single trigger: - platform: time at: input_datetime.f1_lights_on_time action: - service: light.turn_on target: entity_id: light.f1_light_group data: brightness: '{{ states(''input_number.f1_target_brightness'') | float | round }}' - service: input_number.set_value target: entity_id: input_number.f1_target_brightness data: value: '{{ [states(''input_number.f1_target_brightness'') | float + 5.1, 229.5] | min }}' - choose: - conditions: - condition: numeric_state entity_id: input_number.f1_target_brightness above: 229.4 sequence: - service: notify.mobile_app_s23ultra data: message: '✅ F1 Light Acclimation complete: reached 90% brightness.' - service: automation.turn_off target: entity_id: automation.f1_light_acclimation - alias: Tank Low Level Refill and Dose description: Manages tank refill and dosing process when water level drops below 0.6 or manual button press. Checks pH and EC values after dosing and alerts if out of range. mode: single trigger: - platform: numeric_state entity_id: sensor.aqua_pro_water_level below: 5 for: minutes: 1 id: water_level enabled: false - platform: state entity_id: input_button.manual_tank_fill id: manual_button enabled: true - platform: state entity_id: binary_sensor.tank_sensor_tank_level from: 'on' to: 'off' - platform: numeric_state entity_id: sensor.aqua_pro_water_level below: 0.06 condition: - condition: state entity_id: input_boolean.tank_fill_safety_switch state: 'on' - condition: numeric_state entity_id: sensor.aqua_pro_water_level below: 0.06 action: - service: notify.mobile_app_s23ultra data: message: Starting tank fill sequence - Turning off irrigation data: tag: tank_fill_process - service: input_boolean.turn_on target: entity_id: input_boolean.nutrient_dosing_active - service: switch.turn_off target: entity_id: - switch.f1_irrigation_relays_relay_1 - switch.f1_irrigation_relays_relay_2 - switch.f1_irrigation_relays_relay_3 - switch.f1_irrigation_relays_relay_4 - switch.waste_valve - delay: 00:00:05 - service: switch.turn_off target: entity_id: - switch.espoe_irrigation_relay_1_2 - switch.espoe_irrigation_relay_2_4 - delay: 00:00:05 - service: notify.mobile_app_s23ultra data: message: Turning on tank fill valve data: tag: tank_fill_process - service: switch.turn_on target: entity_id: switch.espoe_irrigation_relay_1_4 - service: notify.mobile_app_s23ultra data: message: Starting tank fill - Running for 10 minutes data: tag: tank_fill_process - delay: 00:10:00 - service: notify.mobile_app_s23ultra data: title: Tank Fill Progress message: Tank fill complete - Starting circulation data: tag: tank_fill_process - service: switch.turn_off target: entity_id: - switch.pump_power_switch - switch.f1_irrigation_pump_master_switch - service: switch.turn_on target: entity_id: - switch.espoe_irrigation_relay_2_4 - switch.espoe_irrigation_relay_1_1 - delay: 00:00:03 - service: switch.turn_on target: entity_id: switch.pump_power_switch - delay: 00:00:02 - service: switch.turn_on target: entity_id: switch.f1_irrigation_pump_master_switch - delay: 00:00:15 - condition: numeric_state entity_id: sensor.pump_power_switch_power above: 100 - service: notify.mobile_app_s23ultra data: title: Tank Fill Progress message: Starting nutrient dosing data: tag: tank_fill_process - choose: - conditions: - condition: numeric_state entity_id: sensor.pump_power_switch_power below: 100 sequence: - service: switch.turn_off target: entity_id: switch.f1_irrigation_pump_master_switch - delay: 00:00:05 - service: switch.turn_on target: entity_id: switch.f1_irrigation_pump_master_switch - delay: 00:00:10 - service: notify.mobile_app_s23ultra data: message: 'URGENT: Pump power below 100W after reset. Stopping automation.' priority: high data: tag: tank_fill_error - stop - delay: 00:00:30 - service: mqtt.publish data: topic: AQU1AD04A42/ctr payload: '{"cmd": "setNutrient", "msgid": "start_dose", "sn": "AQU1AD04A42", "monitor": 0}' - delay: 00:03:00 - service: notify.mobile_app_s23ultra data: message: Dosing complete - Starting mixing period data: tag: tank_fill_process - service: mqtt.publish data: topic: AQU1AD04A42/ctr payload: '{"cmd": "setNutrient", "msgid": "force_stop", "sn": "AQU1AD04A42", "monitor": 1}' - service: notify.mobile_app_s23ultra data: message: Mixing complete - Shutting down pumps data: tag: tank_fill_process - service: switch.turn_off target: entity_id: - switch.espoe_irrigation_relay_1_4 - delay: 00:01:00 - service: switch.turn_off target: entity_id: - switch.espoe_irrigation_relay_1_1 - delay: 00:00:01 - service: switch.turn_off target: entity_id: - switch.espoe_irrigation_relay_2_4 - delay: 00:05:00 - service: notify.mobile_app_s23ultra data: message: Checking pH and EC levels... data: tag: tank_fill_process - choose: - conditions: - condition: or conditions: - condition: numeric_state entity_id: sensor.atlas_legacy_1_ph_res1 below: 5.8 - condition: numeric_state entity_id: sensor.atlas_legacy_1_ph_res1 above: 6.2 sequence: - service: notify.mobile_app_s23ultra data: title: pH Value Out of Range message: 'CRITICAL ALERT: pH out of range! Current pH: {{ states(''sensor.atlas_legacy_1_ph_res1'') }}. Should be between 5.80-6.20.' data: ttl: 0 priority: high channel: critical_alerts importance: high vibrationPattern: - 100 - 1000 - 100 - 1000 - 100 tag: ph_ec_alert - conditions: - condition: or conditions: - condition: numeric_state entity_id: sensor.atlas_legacy_1_ec_res1 below: 2.8 - condition: numeric_state entity_id: sensor.atlas_legacy_1_ec_res1 above: 3.2 sequence: - service: notify.mobile_app_s23ultra data: title: EC Value Out of Range message: 'CRITICAL ALERT: EC out of range! Current EC: {{ states(''sensor.atlas_legacy_1_ec_res1'') }}. Should be between 2.80-3.20.' data: ttl: 0 priority: high channel: critical_alerts importance: high vibrationPattern: - 100 - 1000 - 100 - 1000 - 100 tag: ph_ec_alert - service: notify.mobile_app_s23ultra data: message: 'Process complete - pH: {{ states(''sensor.atlas_legacy_1_ph_res1'') }}, EC: {{ states(''sensor.atlas_legacy_1_ec_res1'') }}' data: tag: tank_fill_process - choose: - conditions: - condition: time after: 06:00:00 before: 02:00:00 sequence: - service: automation.turn_on target: entity_id: automation.f1_irrigation_irrigate_5_minutes_every_45_minutes - service: notify.mobile_app_s23ultra data: message: Irrigation schedule resumed after tank fill (daytime) data: tag: tank_fill_process default: - service: notify.mobile_app_s23ultra data: message: Tank fill complete, but irrigation remains disabled (nighttime) data: tag: tank_fill_process - service: notify.mobile_app_s23ultra data: message: Tank fill and dose sequence complete - Starting cooldown period data: tag: tank_fill_process - service: input_boolean.turn_off target: entity_id: input_boolean.nutrient_dosing_active - delay: 01:30:00 - service: input_boolean.turn_on target: entity_id: input_boolean.nutrient_dosing_active