Rainwater Harvesting: What is it and is it beneficial? - Keep Nature Wild

What are you looking for?

Rainwater Harvesting: What is it and is it beneficial?

  • 3 min read

Rainwater Harvesting: What is it and is it beneficial?

Have you ever heard of Rainwater Harvesting? It's a simple process designed to conserve rainwater by collecting, storing, conveying, and purifying rainwater that has run off rooftops, parks, roads, open grounds, etc. Once stored and purified, this water can be used for other purposes!

As quality water quantities continue to become a focal point in the conversation for conservation, climate change, and environmental groups, rainwater harvesting and recycling is a possible option for conservation. Pure rainwater can be used for irrigation, washing, flushing toilets, washing clothes, cleaning, watering the garden, bathing, cooking, and other livestock requirements. 

According to Purewater2000, "harvesting can potentially save 60,000 gallons of water on an annual basis for a family of four using 300 gallons of water per day!"

Considering this method, you can take stressors off of already overly demanded systems. As Blue Barrel Systems shares, "Aging water infrastructure is expensive to update; and groundwater and reservoirs are often overdrawn. When you supply a portion of your own water from the rain that falls on your roof, you reduce your draw on these stressed systems."

In a natural landscape, approximately 50% of stormwater infiltrates the ground, hydrating soils, and recharging groundwater. About 40% evaporates, and only 10% runs off.

In developed landscapes, by contrast (e.g., our neighborhoods), only 15% infiltrates, and a whopping 55% runs off! This is because water can't penetrate hardscape (roads, rooftops, parking lots, etc...).

When you collect rainwater, you support the Hydrologic Cycle by reducing stormwater impacts by holding water on-site rather than letting it run off. As you release it later (when the ground is no longer saturated), you allow that water to sink back into the ground where it belongs, hydrating soils, nourishing plants, and recharging the groundwater beneath us. (Blue Barrel Systems)

A few other environmentally positive points Blue Barrel Systems shares are: 

The urban heat island effect: Temperatures in urban areas are significantly warmer than in immediately surrounding natural areas. Why? Because dark rooftops and pavement absorb extra heat that radiates back into the environment. The more we can vegetate our towns and cities, the more we will regulate temperatures. Vegetation in urban areas also helps to improve air quality.

Precipitation regulation: Believe it or not, a lush garden will actually make rain. Get this: plants evapotranspirate, meaning they uptake water from the soils and emit water vapor into the sky, which contributes to cloud formation. Plants also release bacteria that form "water nuclei" that attract water molecules to form raindrops. Plants ask mother nature for a drink, and she provides. Between adding more moisture to the atmosphere and sending up water nuclei to ask for rain, a landscape of lush gardens will summon more rainfall than a parched one.

If this sounds like something you may be interested in, harvesting requires a few items to get started: 

  • Catchment- Used to collect and store the captured rainwater.
  • Conveyance system – Used to transport the harvested water from the catchment to the recharge zone.
  • Flush- It is used to flush out the first spell of rain.
  • Filter – Used for filtering the collected rainwater and removing pollutants.
  • Tanks and the recharge structures: Used to store the filtered water, which is ready to use.

Does this sound like something you may want to do? Here are 23 Rain Water systems to find inspiration from.

What are some of the pros of harvesting rainwater? 

  • Less cost.
  • Can protect your local watershed
  • Helps in reducing the water bill.
  • Decreases the demand for water.
  • Reduces the need for imported water.
  • Promotes both water and energy conservation.
  • Improves the quality and quantity of groundwater.
  • Does not require a filtration system for landscape irrigation.
  • This technology is relatively simple and easy to install and operate.
  • It reduces soil erosion, stormwater runoff, flooding, and surface water pollution with fertilizers, pesticides, metals, and other sediments.
  • It is an excellent water source for landscape irrigation with no chemicals or dissolved salts. It is also free from all minerals.
  • Make your garden more resilient in the face of droughts, floods, and fire;
  • Restore the hydrologic cycle;
  • Recharge groundwater;
  • Reduce your carbon footprint;
  • Maintain healthy soils;
  • Keep your garden lush and healthy (which, in turn, enriches habitat and helps to regulate local temperatures and precipitation);
  • Lessen the effects of wet and dry spells;
  • Mitigate impacts of climate change;
  • Utilize recycled materials

What are some of the downsides of harvesting rainwater? 

  • Regular maintenance is required.
  • Requires some technical skills for installation.
  • Limited and no rainfall can limit the supply of rainwater.
  • If not installed correctly, it may attract mosquitoes and other waterborne diseases.
  • One of the significant drawbacks of the rainwater harvesting system is storage limits.

*Consider looking into your state's rules and regulations around collecting rainwater. 

class Campaign def initialize(condition, *qualifiers) @condition = (condition.to_s + '?').to_sym @qualifiers = PostCartAmountQualifier ? [] : [] rescue qualifiers.compact @line_item_selector = qualifiers.last unless @line_item_selector qualifiers.compact.each do |qualifier| is_multi_select = qualifier.instance_variable_get(:@conditions).is_a?(Array) if is_multi_select qualifier.instance_variable_get(:@conditions).each do |nested_q| @post_amount_qualifier = nested_q if nested_q.is_a?(PostCartAmountQualifier) @qualifiers << qualifier end else @post_amount_qualifier = qualifier if qualifier.is_a?(PostCartAmountQualifier) @qualifiers << qualifier end end if @qualifiers.empty? end def qualifies?(cart) return true if @qualifiers.empty? @unmodified_line_items = cart.line_items.map do |item| new_item = item.dup new_item.instance_variables.each do |var| val = item.instance_variable_get(var) new_item.instance_variable_set(var, val.dup) if val.respond_to?(:dup) end new_item end if @post_amount_qualifier @qualifiers.send(@condition) do |qualifier| is_selector = false if qualifier.is_a?(Selector) || qualifier.instance_variable_get(:@conditions).any? { |q| q.is_a?(Selector) } is_selector = true end rescue nil if is_selector raise "Missing line item match type" if @li_match_type.nil? cart.line_items.send(@li_match_type) { |item| qualifier.match?(item) } else qualifier.match?(cart, @line_item_selector) end end end def run_with_hooks(cart) before_run(cart) if respond_to?(:before_run) run(cart) after_run(cart) end def after_run(cart) @discount.apply_final_discount if @discount && @discount.respond_to?(:apply_final_discount) revert_changes(cart) unless @post_amount_qualifier.nil? || @post_amount_qualifier.match?(cart) end def revert_changes(cart) cart.instance_variable_set(:@line_items, @unmodified_line_items) end end class ConditionalDiscount < Campaign def initialize(condition, customer_qualifier, cart_qualifier, line_item_selector, discount, max_discounts) super(condition, customer_qualifier, cart_qualifier) @line_item_selector = line_item_selector @discount = discount @items_to_discount = max_discounts == 0 ? nil : max_discounts end def run(cart) raise "Campaign requires a discount" unless @discount return unless qualifies?(cart) applicable_items = cart.line_items.select { |item| @line_item_selector.nil? || @line_item_selector.match?(item) } applicable_items = applicable_items.sort_by { |item| item.variant.price } applicable_items.each do |item| break if @items_to_discount == 0 if (!@items_to_discount.nil? && item.quantity > @items_to_discount) discounted_items = item.split(take: @items_to_discount) @discount.apply(discounted_items) cart.line_items << discounted_items @items_to_discount = 0 else @discount.apply(item) @items_to_discount -= item.quantity if !@items_to_discount.nil? end end end end class Qualifier def partial_match(match_type, item_info, possible_matches) match_type = (match_type.to_s + '?').to_sym if item_info.kind_of?(Array) possible_matches.any? do |possibility| item_info.any? do |search| search.send(match_type, possibility) end end else possible_matches.any? do |possibility| item_info.send(match_type, possibility) end end end def compare_amounts(compare, comparison_type, compare_to) case comparison_type when :greater_than return compare > compare_to when :greater_than_or_equal return compare >= compare_to when :less_than return compare < compare_to when :less_than_or_equal return compare <= compare_to when :equal_to return compare == compare_to else raise "Invalid comparison type" end end end class CountryCodeQualifier < Qualifier def initialize(match_type, country_codes) @invert = match_type == :not_one @country_codes = country_codes.map(&:upcase) end def match?(cart, selector = nil) shipping_address = cart.shipping_address return false if shipping_address&.country_code.nil? @invert ^ @country_codes.include?(shipping_address.country_code.upcase) end end class CartAmountQualifier < Qualifier def initialize(behaviour, comparison_type, amount) @behaviour = behaviour @comparison_type = comparison_type @amount = Money.new(cents: amount * 100) end def match?(cart, selector = nil) total = cart.subtotal_price if @behaviour == :item || @behaviour == :diff_item total = cart.line_items.reduce(Money.zero) do |total, item| total + (selector&.match?(item) ? item.line_price : Money.zero) end end case @behaviour when :cart, :item compare_amounts(total, @comparison_type, @amount) when :diff_cart compare_amounts(cart.subtotal_price_was - @amount, @comparison_type, total) when :diff_item original_line_total = cart.line_items.reduce(Money.zero) do |total, item| total + (selector&.match?(item) ? item.original_line_price : Money.zero) end compare_amounts(original_line_total - @amount, @comparison_type, total) end end end class AndSelector def initialize(*conditions) @conditions = conditions.compact end def match?(item, selector = nil) @conditions.all? do |condition| if selector condition.match?(item, selector) else condition.match?(item) end end end end class Selector def partial_match(match_type, item_info, possible_matches) match_type = (match_type.to_s + '?').to_sym if item_info.kind_of?(Array) possible_matches.any? do |possibility| item_info.any? do |search| search.send(match_type, possibility) end end else possible_matches.any? do |possibility| item_info.send(match_type, possibility) end end end end class LineItemPropertiesSelector < Selector def initialize(target_properties) @target_properties = target_properties end def match?(line_item) line_item_props = line_item.properties @target_properties.all? do |key, value| next unless line_item_props.has_key?(key) true if line_item_props[key].downcase == value.downcase end end end class VariantIdSelector < Selector def initialize(match_type, variant_ids) @invert = match_type == :not_one @variant_ids = variant_ids.map { |id| id.to_i } end def match?(line_item) @invert ^ @variant_ids.include?(line_item.variant.id) end end class PercentageDiscount def initialize(percent, message) @discount = (100 - percent) / 100.0 @message = message end def apply(line_item) line_item.change_line_price(line_item.line_price * @discount, message: @message) end end CAMPAIGNS = [ ConditionalDiscount.new( :all, nil, AndSelector.new( CountryCodeQualifier.new( :is_one, ["US"] ), CartAmountQualifier.new( :cart, :greater_than_or_equal, 50 ), nil ), AndSelector.new( LineItemPropertiesSelector.new( {"_attribution" => "Rebuy Tiered Progress Bar"} ), VariantIdSelector.new( :is_one, ["37457563648191"] ), nil ), PercentageDiscount.new( 100, "Free Gift for spending 50 ".gsub("", Input.cart.presentment_currency) ), 1 ), ConditionalDiscount.new( :all, nil, AndSelector.new( CountryCodeQualifier.new( :not_one, ["US"] ), CartAmountQualifier.new( :cart, :greater_than_or_equal, 50 ), nil ), AndSelector.new( LineItemPropertiesSelector.new( {"_attribution" => "Rebuy Tiered Progress Bar"} ), VariantIdSelector.new( :is_one, ["37457563648191"] ), nil ), PercentageDiscount.new( 100, "Free Gift for spending 50 ".gsub("", Input.cart.presentment_currency) ), 1 ) ].freeze CAMPAIGNS.each do |campaign| campaign.run_with_hooks(Input.cart) end Output.cart = Input.cart