{"id":526,"date":"2026-03-12T15:27:11","date_gmt":"2026-03-12T14:27:11","guid":{"rendered":"https:\/\/pcgsm.nl\/ohh\/?p=526"},"modified":"2026-04-15T15:17:54","modified_gmt":"2026-04-15T13:17:54","slug":"slim-irrigatiesysteem","status":"publish","type":"post","link":"https:\/\/pcgsm.nl\/ohh\/2026\/03\/12\/slim-irrigatiesysteem\/","title":{"rendered":"Slim Irrigatiesysteem"},"content":{"rendered":"<h2>&#x1f331; Slim Irrigatiesysteem met ESPHome, KC868\u2011A6 en Dynamische Energieprijzen<\/h2>\n<p>Water geven is niet moeilijk \u2014 maar het effici\u00ebnt, energiezuinig en volledig geautomatiseerd doen, dat is een ander verhaal. In dit project bouwde ik een compleet irrigatiesysteem op basis van:<\/p>\n<ul>\n<li><strong>ESPHome<\/strong><\/li>\n<li><strong>Kincony KC868\u2011A6<\/strong><\/li>\n<li><strong>Home Assistant<\/strong><\/li>\n<li><strong>Dynamische energieprijzen<\/strong> via cheapest_energy_hours.jinja (TheFes)<\/li>\n<\/ul>\n<p>Het resultaat is een systeem dat:<\/p>\n<ul>\n<li>vijf irrigatiezones aanstuurt<\/li>\n<li>een pomp schakelt<\/li>\n<li>lokaal bedienbaar is via hardware\u2011knoppen<\/li>\n<li>volledig integreert met Home Assistant<\/li>\n<li>automatisch draait op de goedkoopste uren van de dag<\/li>\n<li>en zelfs na een reboot weet wanneer elke zone voor het laatst actief was<\/li>\n<li>irrigatie duur wordt in de ESP geregeld, zodat een zone niet per ongeluk aan blijft als Home Assistant in de tussentijd herstart<\/li>\n<\/ul>\n<hr \/>\n<h2>&#x1f527; Hardware: Kincony KC868\u2011A6<\/h2>\n<p><a href=\"http:\/\/pcgsm.nl\/ohh\/wp-content\/uploads\/2026\/03\/a6-title.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-528\" src=\"http:\/\/pcgsm.nl\/ohh\/wp-content\/uploads\/2026\/03\/a6-title-300x208.jpg\" alt=\"\" width=\"300\" height=\"208\" srcset=\"https:\/\/pcgsm.nl\/ohh\/wp-content\/uploads\/2026\/03\/a6-title-300x208.jpg 300w, https:\/\/pcgsm.nl\/ohh\/wp-content\/uploads\/2026\/03\/a6-title-768x531.jpg 768w, https:\/\/pcgsm.nl\/ohh\/wp-content\/uploads\/2026\/03\/a6-title-390x270.jpg 390w, https:\/\/pcgsm.nl\/ohh\/wp-content\/uploads\/2026\/03\/a6-title.jpg 1000w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>De KC868\u2011A6 is een veelzijdige controller die ideaal is voor irrigatieprojecten.<\/p>\n<table>\n<tbody>\n<tr>\n<th>Eigenschap<\/th>\n<th>Beschrijving<\/th>\n<\/tr>\n<tr>\n<td>MCU<\/td>\n<td>ESP32 (WiFi + Bluetooth)<\/td>\n<\/tr>\n<tr>\n<td>Relais<\/td>\n<td>6 kanalen, 10A, optisch ge\u00efsoleerd<\/td>\n<\/tr>\n<tr>\n<td>Ingangen<\/td>\n<td>6 digitale ingangen (PCF8574)<\/td>\n<\/tr>\n<tr>\n<td>Uitgangen<\/td>\n<td>8 digitale uitgangen (PCF8574)<\/td>\n<\/tr>\n<tr>\n<td>I\u00b2C\u2011bus<\/td>\n<td>Voor displays, sensoren, uitbreidingen<\/td>\n<\/tr>\n<tr>\n<td>Voeding<\/td>\n<td>12V input, interne 5V\/3.3V conversie<\/td>\n<\/tr>\n<tr>\n<td>Extra\u2019s<\/td>\n<td>RS485, IR, RF, uitbreidingsheaders<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Meer info:<br \/>\n<a href=\"https:\/\/www.kincony.com\/kc868-a6-hardware-design-details.html\" target=\"_blank\" rel=\"noopener\">KC868\u2011A6 hardware details<\/a><\/p>\n<hr \/>\n<h2>&#x1f4a7; Irrigatiecontroller met ESPHome<\/h2>\n<p><a href=\"http:\/\/pcgsm.nl\/ohh\/wp-content\/uploads\/2026\/03\/IMG_20260312_142750-Copy.webp\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-529\" src=\"http:\/\/pcgsm.nl\/ohh\/wp-content\/uploads\/2026\/03\/IMG_20260312_142750-Copy-300x142.webp\" alt=\"\" width=\"300\" height=\"142\" srcset=\"https:\/\/pcgsm.nl\/ohh\/wp-content\/uploads\/2026\/03\/IMG_20260312_142750-Copy-300x142.webp 300w, https:\/\/pcgsm.nl\/ohh\/wp-content\/uploads\/2026\/03\/IMG_20260312_142750-Copy-768x364.webp 768w, https:\/\/pcgsm.nl\/ohh\/wp-content\/uploads\/2026\/03\/IMG_20260312_142750-Copy-570x270.webp 570w, https:\/\/pcgsm.nl\/ohh\/wp-content\/uploads\/2026\/03\/IMG_20260312_142750-Copy.webp 1024w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>De configuratie bevat:<\/p>\n<ul>\n<li>5 irrigatiezones<\/li>\n<li>pompbeveiliging<\/li>\n<li>OLED\u2011display<\/li>\n<li>lokale bediening via knoppen<\/li>\n<li>persistent \u201clast run\u201d geheugen<\/li>\n<li>Home Assistant integratie<\/li>\n<\/ul>\n<hr \/>\n<h2>&#x26a1; Slimme automatisering: irrigeren op de goedkoopste uren<\/h2>\n<p>Met dynamische energieprijzen is het zonde om de pomp te laten draaien op dure uren. Daarom gebruik ik de <strong>cheapest_energy_hours.jinja<\/strong> template van TheFes.<\/p>\n<p>Repo:<br \/>\n<a href=\"https:\/\/github.com\/TheFes\/cheapest-energy-hours\" target=\"_blank\" rel=\"noopener\">https:\/\/github.com\/TheFes\/cheapest-energy-hours<\/a><\/p>\n<hr \/>\n<h2>&#x1f9e0; template sensor: \u201cenergy low 1 hour daytime\u201d<\/h2>\n<pre><code class=\"language-yaml\">\n# template sensor\n- trigger:\n    - platform: time\n      at:\n        - \"8:00\"\n#        - \"14:16\"\n    - platform: homeassistant\n      event: start\n  #  - platform: state\n  #    entity_id:\n  #          - binary_sensor.dishwasher_door\n  #          - binary_sensor.dishwasher_remote_active\n  sensor:\n    - unique_id: f8853830-bf81-46d4-85a9-379c25c37c23\n      name: Vijver bijvullen Start Time\n      device_class: timestamp\n      state: &gt;\n        {%- set sensor = 'zonneplan' -%}\n        {% from \"cheapest_energy_hours.jinja\" import cheapest_energy_hours %}\n        {{ cheapest_energy_hours(sensor=sensor, hours=1, start='8:00', end='17:00', include_tomorrow=false) }}\n\n<\/code><\/pre>\n<hr \/>\n<h2>&#x1f9e0; Automation: \u201cVijver bijvullen op goedkoopste uur\u201d<\/h2>\n<pre><code class=\"language-yaml\">\nalias: \"irrigatie: Lowest price vijver bijvullen\"\ndescription: \"\"\ntriggers:\n  - trigger: time\n    at: sensor.vijver_bijvullen_start_time\n  - value_template: \"{{ states('sensor.zonneplan_cheapest_time') == now().strftime('%H:%M') }}\"\n    trigger: template\n    enabled: false\nconditions:\n  - condition: and\n    conditions:\n      - condition: template\n        value_template: |-\n          {{ \n            states('sensor.irrigation_vijver_laatst_gestart') not in ['unknown', 'unavailable', '', 'Nog nooit']\n            and\n            (now() - (states('sensor.irrigation_vijver_laatst_gestart') | as_datetime | as_local)).total_seconds() &gt; 18 * 3600\n          }}\n      - condition: numeric_state\n        entity_id: sensor.cmx_temp\n        above: 5\nactions:\n  - choose:\n      - conditions:\n          - condition: state\n            entity_id: switch.irrigation_serre_switch\n            state:\n              - \"on\"\n        sequence:\n          - wait_for_trigger:\n              - entity_id:\n                  - switch.irrigation_serre_switch\n                to:\n                  - \"off\"\n                trigger: state\n            continue_on_timeout: false\n          - delay:\n              hours: 0\n              minutes: 0\n              seconds: 30\n              milliseconds: 0\n  - action: number.set_value\n    target:\n      entity_id: number.irrigation_vijver\n    data:\n      value: \"5\"\n  - action: switch.turn_on\n    target:\n      entity_id: switch.irrigation_vijver_switch\n    data: {}\nmode: single\n\n<\/code><\/pre>\n<hr \/>\n<h2>&#x1f4c4; Volledige ESPHome\u2011configuratie<\/h2>\n<p>Hieronder staat de volledige YAML\u2011configuratie van het irrigatiesysteem.<\/p>\n<pre><code class=\"language-yaml\">\n# https:\/\/www.kincony.com\/kc868-a6-hardware-design-details.html\n# https:\/\/www.kincony.com\/forum\/showthread.php?tid=1963\n# Based on ESPHome Sprinkler Controller - https:\/\/esphome.io\/components\/sprinkler.html\n# https:\/\/community.home-assistant.io\/t\/sprinkler-automation-with-esphome-a-complete-project\/565077\n# Change Log\n# 2023 01 XX\n  # Initial version\n  \n# 2023 04 09 V03\n  # fix run duration to seconds \n# 2023 04 22 V04\n  # fix GPIO order to match relay 1- 4\n  # added % at the lambda return for progress sensor return value\n# 2023 04 25 V05\n  # added nodemcu as sensor to display in HA ui\n  # added includes for api key en ota password\n# 2023 05 07 V06\n  # added a NTC temp sensor to  watch the enclosure temperature\n# 2023 05 10 V07\n  # addjusted settings reference voltage to adjust to actual temp (default 3.3)\n# 2023 06 06 V08\n  # adjusted settings for valves corresponding to switches\n  # added repeat function\n# 2024 04 04 V09\n  # Corrected the value of KEY ESPHOME_PROJECT_VERSION due to compiling error esphome v2024.3.1\n  # initializer-string for 'char [30]' is too long\n  # changed 2023 06 06 V08 to 20240404_V09\n  # removed the text \"Irrigation Controller.,\"  \n# 20260312_V01Peterpc\n  # Wanneer laatst actief toegevoegd.\n# 20260314_V01Peterpc\n  # Bij reboot laatst actief weer naar HA sturen.\n# 20260331_V06Peterpc\n  # sprinkler tijden bij reboot terug zetten naar bewaarde waarden in flash.\n  # laatst gestart waarde bij install op huidige tijd zetten in plaats van unknown\n# 20260401_V01Peterpc\n  # de switch in HA gaat bij inschakelen via HA aan, even uit en weer aan, omdat het de status van de valve switch in de esp bij houdt.\n  # dat is niet handig als je die in een automation als trigger wil gebruiken.\n  # daarom is er een HA switch toegevoegd, die aan blijft en een status sensor voor de zone.\n  # de valve switch is ook nog zichtbaar met zijn aan, uit, aan eigenschap, omdat je die niet op internal kan zetten in ESPHome.  \n###############################################################\n# KC868-A6 HARDWARE MAP \u2014 Irrigation Controller Reference\n# \n# I2C BUS (ESSENTIEEL \u2014 HARD-WIRED):\n#   SDA = GPIO4\n#   SCL = GPIO15\n#\n# I2C DEVICES:\n#   PCF8574 OUT  \u2192 0x24  (Relays)\n#   PCF8574 IN   \u2192 0x22  (Buttons)\n#   SSD1306 OLED \u2192 0x3C  (Display)\n#\n# PCF8574 OUT (0x24) \u2014 RELAYS:\n#   Pin 0 \u2192 Relay 1 \u2192 Zone 1\n#   Pin 1 \u2192 Relay 2 \u2192 Zone 2\n#   Pin 2 \u2192 Relay 3 \u2192 Zone 3\n#   Pin 3 \u2192 Relay 4 \u2192 Zone 4\n#   Pin 4 \u2192 Relay 5 \u2192 Zone 5\n#   Pin 5 \u2192 Relay 6 \u2192 Pump\n#   Pin 6 \u2192 Relay 7 \u2192 Free\n#   Pin 7 \u2192 Relay 8 \u2192 Free\n#\n# PCF8574 IN (0x22) \u2014 BUTTONS:\n#   Pin 0 \u2192 Button 1 \u2192 Start Zone 1\n#   Pin 1 \u2192 Button 2 \u2192 Start Zone 2\n#   Pin 2 \u2192 Button 3 \u2192 Start Zone 3\n#   Pin 3 \u2192 Button 4 \u2192 Start Zone 4\n#   Pin 4 \u2192 Button 5 \u2192 Start Zone 5\n#   Pin 5 \u2192 Button 6 \u2192 Shutdown All\n#   Pin 6 \u2192 Free\n#   Pin 7 \u2192 Free\n#\n# DISPLAY (SSD1306 128x64):\n#   I2C Address: 0x3C\n#   Shared bus with both PCF8574 chips\n#\n# POWER:\n#   ESP32 \u2192 5V input \u2192 onboard regulator \u2192 3.3V logic\n#   Relays \u2192 5V\n#   PCF8574 \u2192 3.3V\n#   Display \u2192 3.3V\n#\n# NOTE:\n#   - I2C pins MUST be SDA=4, SCL=15 for KC868-A6.\n#   - Wrong pins = no relays, no buttons, no display.\n#   - This map is hardware-accurate for your irrigation setup.\n###############################################################\n\n\n###############################################\n# V06-FULL-CLEAN \u2014 Irrigation Controller\n# Universeel, persistent, substitutions-driven\n###############################################\n\n\n\n################################################################################\n# WAARSCHUWING:                                                                #\n#   Bij een firmware-installatie worden alle opgeslagen waarden                #\n#   (globals, sprinkler settings, durations) teruggezet naar deze defaults.    #\n#   Pas deze waarden hier aan als je andere standaardtijden wilt.              #\n################################################################################  \nsubstitutions:\n  friendly_name: \"Irrigation Controller\"\n\n  zone_1_name: Voortuin\n  zone_1_last_run_id: voortuin_last_run\n  zone_1_valve_id: zone1_duration\n  default_zone_1_duration: \"30\"\n\n  zone_2_name: Achtertuin\n  zone_2_last_run_id: achtertuin_last_run\n  zone_2_valve_id: zone2_duration\n  default_zone_2_duration: \"3\"\n\n  zone_3_name: Serre\n  zone_3_last_run_id: serre_last_run\n  zone_3_valve_id: zone3_duration\n  default_zone_3_duration: \"3\"\n\n  zone_4_name: Vijver\n  zone_4_last_run_id: vijver_last_run\n  zone_4_valve_id: zone4_duration\n  default_zone_4_duration: \"5\"\n\n  zone_5_name: Spare\n  zone_5_last_run_id: zone5_last_run\n  zone_5_valve_id: zone5_duration\n  default_zone_5_duration: \"15\"\n\n# hieronder niets meer aanpassen!\n  software_version: 20260401_V01Peterpc\n  sensor_update_frequency: 1s\n  log_level: debug\n  esphome_name: irrigation\n  esphome_platform: ESP32\n  esphome_board: esp32dev\n  esphome_comment: Five Valve Irrigation Controller\n  esphome_project_name: jaya.IrrigationController\n  esphome_project_version: ${software_version}\n  devicename: irrigation_controller\n  upper_devicename: \"Irrigation Controller\"\n  uom: Min\n\n###############################################\n# ESPHome Core\n# Define Project Details and ESP Board Type\n###############################################\n\nesphome:\n  name: ${esphome_name}\n  comment: ${esphome_comment}\n  project:\n    name: ${esphome_project_name}\n    version: ${esphome_project_version}\n\n  on_boot:\n    priority: -100\n    then:\n      # Reset status\n      - text_sensor.template.publish:\n          id: valve_status\n          state: \"Idle\"\n\n      # Convert seconds \u2192 minutes\n      - sprinkler.set_multiplier:\n          id: ${devicename}\n          multiplier: 60\n\n      # Restore persistent durations into sprinkler\n      - lambda: |-\n          id(${devicename}).set_valve_run_duration(0, id(dur_0));\n          id(${devicename}).set_valve_run_duration(1, id(dur_1));\n          id(${devicename}).set_valve_run_duration(2, id(dur_2));\n          id(${devicename}).set_valve_run_duration(3, id(dur_3));\n          id(${devicename}).set_valve_run_duration(4, id(dur_4));\n\n    # --- Last-run timestamps initialiseren ---\n      - lambda: |-\n          auto now = id(homeassistant_time).now();\n          if (now.is_valid()) {\n            std::string ts = now.strftime(\"%Y-%m-%d %H:%M:%S\");\n\n            if (id(zone1_last_run_global).empty())\n              id(zone1_last_run_global) = ts;\n\n            if (id(zone2_last_run_global).empty())\n              id(zone2_last_run_global) = ts;\n\n            if (id(zone3_last_run_global).empty())\n              id(zone3_last_run_global) = ts;\n\n            if (id(zone4_last_run_global).empty())\n              id(zone4_last_run_global) = ts;\n\n            if (id(zone5_last_run_global).empty())\n              id(zone5_last_run_global) = ts;\n          }\n    # --- Last-run sensors publiceren ---\n      - text_sensor.template.publish:\n          id: ${zone_1_last_run_id}\n          state: !lambda 'return id(zone1_last_run_global);'\n\n      - text_sensor.template.publish:\n          id: ${zone_2_last_run_id}\n          state: !lambda 'return id(zone2_last_run_global);'\n\n      - text_sensor.template.publish:\n          id: ${zone_3_last_run_id}\n          state: !lambda 'return id(zone3_last_run_global);'\n\n      - text_sensor.template.publish:\n          id: ${zone_4_last_run_id}\n          state: !lambda 'return id(zone4_last_run_global);'\n\n      - text_sensor.template.publish:\n          id: ${zone_5_last_run_id}\n          state: !lambda 'return id(zone5_last_run_global);'\n\n###############################################\n# ESP32 Hardware\n###############################################\n\nesp32:\n  board: ${esphome_board}\n  framework:\n    type: esp-idf\n\n###############################################\n# WiFi\n###############################################\n\nwifi:\n  ssid: !secret wifi_ssid24\n  password: !secret wifi_password\n\n  ap:\n    ssid: \"${esphome_name} Fallback Hotspot\"\n    password: !secret esphome_ap_password\n\nlogger:\n  level: ${log_level}\n\n&lt;&lt;: !include common\/ota.yaml\n\n# Enable Web server.\nweb_server:\n  port: 80\n\n###############################################\n# Time Sync + Auto Restart\n###############################################\n\ntime:\n  - platform: homeassistant\n    id: homeassistant_time\n###############################################\n# restart device at 4 at night so if a wifi\n# problem is there it will solve\n###############################################    \n    on_time:\n      - seconds: 0\n        minutes: 0\n        hours: 4\n        days_of_week: MON-SUN\n        then:\n          - switch.toggle: restartit\n\n###############################################\n# Enable Home Assistant API\n###############################################\n\napi:\n  encryption:\n    key: !secret encryption_key\n  reboot_timeout: 0s\n\n###############################################\n# GLOBALS \u2014 Persistent Durations + Last Run to flash\n###############################################\n\nglobals:\n  # Last run text sensors\n  - id: zone1_last_run_global\n    type: std::string\n    restore_value: true\n    initial_value: \"\\\"Nog nooit\\\"\"\n\n  - id: zone2_last_run_global\n    type: std::string\n    restore_value: true\n    initial_value: \"\\\"Nog nooit\\\"\"\n\n  - id: zone3_last_run_global\n    type: std::string\n    restore_value: true\n    initial_value: \"\\\"Nog nooit\\\"\"\n\n  - id: zone4_last_run_global\n    type: std::string\n    restore_value: true\n    initial_value: \"\\\"Nog nooit\\\"\"\n\n  - id: zone5_last_run_global\n    type: std::string\n    restore_value: true\n    initial_value: \"\\\"Nog nooit\\\"\"\n\n  # Persistent run durations (G1)\n  - id: dur_0\n    type: int\n    restore_value: true\n    initial_value: ${default_zone_1_duration}\n\n  - id: dur_1\n    type: int\n    restore_value: true\n    initial_value: ${default_zone_2_duration}\n\n  - id: dur_2\n    type: int\n    restore_value: true\n    initial_value: ${default_zone_3_duration}\n\n  - id: dur_3\n    type: int\n    restore_value: true\n    initial_value: ${default_zone_4_duration}\n\n  - id: dur_4\n    type: int\n    restore_value: true\n    initial_value: ${default_zone_5_duration}\n###############################################\n# TEXT SENSORS \u2014 General Info + Last Run\n###############################################\n\ntext_sensor:\n  - platform: version\n    name: \"${esphome_name} ESPHome Version\"\n    hide_timestamp: false\n\n  - platform: wifi_info\n    ip_address:\n      name: \"${esphome_name} IP\"\n    ssid:\n      name: \"${esphome_name} SSID\"\n    bssid:\n      name: \"${esphome_name} BSSID\"\n\n  ###############################################\n  # Time Remaining (dynamic)\n  ###############################################\n  - platform: template\n    id: time_remaining\n    name: \"${upper_devicename} Time Remaining\"\n    update_interval: ${sensor_update_frequency}\n    icon: \"mdi:timer-sand\"\n    lambda: |-\n      int seconds = round(id(${devicename}).time_remaining_active_valve().value_or(0));\n      int days = seconds \/ 86400;\n      seconds %= 86400;\n      int hours = seconds \/ 3600;\n      seconds %= 3600;\n      int minutes = seconds \/ 60;\n      seconds %= 60;\n\n      std::string result;\n      if (days &gt; 0) result += std::to_string(days) + \"d \";\n      if (hours &gt; 0) result += std::to_string(hours) + \"h \";\n      if (minutes &gt; 0) result += std::to_string(minutes) + \"m \";\n      result += std::to_string(seconds) + \"s\";\n      return result;\n\n  ###############################################\n  # Progress %\n  ###############################################\n  - platform: template\n    id: progress_percent\n    name: \"${upper_devicename} Progress %\"\n    update_interval: ${sensor_update_frequency}\n    icon: \"mdi:progress-clock\"\n    lambda: |-\n      int valve = id(${devicename}).active_valve().value_or(0);\n      int total = id(${devicename}).valve_run_duration_adjusted(valve);\n      int remaining = id(${devicename}).time_remaining_active_valve().value_or(0);\n      if (total == 0) return std::string(\"0%\");\n      int pct = round((total - remaining) * 100 \/ total);\n      return std::to_string(pct) + \"%\";\n\n  ###############################################\n  # Valve Status\n  ###############################################\n  - platform: template\n    id: valve_status\n    name: \"${upper_devicename} Status\"\n    update_interval: never\n    icon: \"mdi:information-variant\"\n\n  ###############################################\n  # Board Type\n  ###############################################\n  - platform: template\n    id: espboard_type\n    icon: \"mdi:developer-board\"\n    name: \"${esphome_name} ESPBoard\"\n    lambda: |-\n      return esphome::optional(std::string(\"${esphome_board}\"));\n\n  ###############################################\n  # Last Run Sensors (dynamic via substitutions)\n  ###############################################\n\n  - platform: template\n    id: ${zone_1_last_run_id}\n    name: \"${zone_1_name} Laatst Gestart\"\n    icon: \"mdi:clock-start\"\n    update_interval: never\n    lambda: |-\n      return id(zone1_last_run_global);\n\n  - platform: template\n    id: ${zone_2_last_run_id}\n    name: \"${zone_2_name} Laatst Gestart\"\n    icon: \"mdi:clock-start\"\n    update_interval: never\n    lambda: |-\n      return id(zone2_last_run_global);\n\n  - platform: template\n    id: ${zone_3_last_run_id}\n    name: \"${zone_3_name} Laatst Gestart\"\n    icon: \"mdi:clock-start\"\n    update_interval: never\n    lambda: |-\n      return id(zone3_last_run_global);\n\n  - platform: template\n    id: ${zone_4_last_run_id}\n    name: \"${zone_4_name} Laatst Gestart\"\n    icon: \"mdi:clock-start\"\n    update_interval: never\n    lambda: |-\n      return id(zone4_last_run_global);\n\n  - platform: template\n    id: ${zone_5_last_run_id}\n    name: \"${zone_5_name} Laatst Gestart\"\n    icon: \"mdi:clock-start\"\n    update_interval: never\n    lambda: |-\n      return id(zone5_last_run_global);\n\n\n###############################################\n# SENSORS \u2014 Uptime + WiFi Signal\n###############################################\n\nsensor:\n  - platform: uptime\n    name: \"${upper_devicename} Uptime\"\n\n  - platform: wifi_signal\n    name: \"${upper_devicename} WiFi Signal\"\n    update_interval: 60s\n###############################################\n# NUMBER ENTITIES \u2014 Persistent Run Durations\n###############################################\n\nnumber:\n\n  ###############################################\n  # Zone 1 \u2014 ${zone_1_name}\n  ###############################################\n  - platform: template\n    id: ${zone_1_valve_id}\n    name: \"${zone_1_name}\"\n    min_value: 1\n    max_value: 60\n    step: 1\n    unit_of_measurement: ${uom}\n    icon: \"mdi:timer-outline\"\n    mode: box\n    lambda: |-\n      return float(id(dur_0));\n    set_action:\n      - lambda: |-\n          id(dur_0) = int(x);\n          id(${devicename}).set_valve_run_duration(0, id(dur_0));\n\n  ###############################################\n  # Zone 2 \u2014 ${zone_2_name}\n  ###############################################\n  - platform: template\n    id: ${zone_2_valve_id}\n    name: \"${zone_2_name}\"\n    min_value: 1\n    max_value: 60\n    step: 1\n    unit_of_measurement: ${uom}\n    icon: \"mdi:timer-outline\"\n    mode: box\n    lambda: |-\n      return float(id(dur_1));\n    set_action:\n      - lambda: |-\n          id(dur_1) = int(x);\n          id(${devicename}).set_valve_run_duration(1, id(dur_1));\n\n  ###############################################\n  # Zone 3 \u2014 ${zone_3_name}\n  ###############################################\n  - platform: template\n    id: ${zone_3_valve_id}\n    name: \"${zone_3_name}\"\n    min_value: 1\n    max_value: 60\n    step: 1\n    unit_of_measurement: ${uom}\n    icon: \"mdi:timer-outline\"\n    mode: box\n    lambda: |-\n      return float(id(dur_2));\n    set_action:\n      - lambda: |-\n          id(dur_2) = int(x);\n          id(${devicename}).set_valve_run_duration(2, id(dur_2));\n\n  ###############################################\n  # Zone 4 \u2014 ${zone_4_name}\n  ###############################################\n  - platform: template\n    id: ${zone_4_valve_id}\n    name: \"${zone_4_name}\"\n    min_value: 1\n    max_value: 60\n    step: 1\n    unit_of_measurement: ${uom}\n    icon: \"mdi:timer-outline\"\n    mode: box\n    lambda: |-\n      return float(id(dur_3));\n    set_action:\n      - lambda: |-\n          id(dur_3) = int(x);\n          id(${devicename}).set_valve_run_duration(3, id(dur_3));\n\n  ###############################################\n  # Zone 5 \u2014 ${zone_5_name}\n  ###############################################\n  - platform: template\n    id: ${zone_5_valve_id}\n    name: \"${zone_5_name}\"\n    min_value: 1\n    max_value: 60\n    step: 1\n    unit_of_measurement: ${uom}\n    icon: \"mdi:timer-outline\"\n    mode: box\n    lambda: |-\n      return float(id(dur_4));\n    set_action:\n      - lambda: |-\n          id(dur_4) = int(x);\n          id(${devicename}).set_valve_run_duration(4, id(dur_4));\n\n  ###############################################\n  # Repeat Cycles\n  ###############################################\n  - platform: template\n    id: sprinkler_ctrlr_repeat_cycles\n    name: \"Sprinkler Repeat Cycles\"\n    min_value: 0\n    max_value: 4\n    step: 1\n    mode: box\n    icon: \"mdi:water-sync\"\n    lambda: |-\n      return id(${devicename}).repeat();\n    set_action:\n      - sprinkler.set_repeat:\n          id: ${devicename}\n          repeat: !lambda 'return x;'\n###############################################\n# SPRINKLER CONTROLLER \u2014 Persistent + Clean\n###############################################\n\nsprinkler:\n  - id: ${devicename}\n    pump_start_pump_delay: 3s\n    pump_stop_valve_delay: 3s\n\n    main_switch:\n      name: \"Start-Stop-Resume\"\n      id: main_switch\n\n    auto_advance_switch: \"Auto Advance\"\n    valve_open_delay: 2s\n    repeat_number: \"Repeat\"\n\n    ###############################################\n    # Valves \u2014 Dynamic via substitutions\n    ###############################################\n    valves:\n      - valve_switch: ${zone_1_name}\n        enable_switch: \"Enable ${zone_1_name}\"\n        pump_switch_id: sprinkler_pump_sw\n        run_duration: 60s\n        valve_switch_id: ${devicename}_1\n\n      - valve_switch: ${zone_2_name}\n        enable_switch: \"Enable ${zone_2_name}\"\n        pump_switch_id: sprinkler_pump_sw\n        run_duration: 60s\n        valve_switch_id: ${devicename}_2\n\n      - valve_switch: ${zone_3_name}\n        enable_switch: \"Enable ${zone_3_name}\"\n        pump_switch_id: sprinkler_pump_sw\n        run_duration: 60s\n        valve_switch_id: ${devicename}_3\n\n      - valve_switch: ${zone_4_name}\n        enable_switch: \"Enable ${zone_4_name}\"\n        pump_switch_id: sprinkler_pump_sw\n        run_duration: 60s\n        valve_switch_id: ${devicename}_4\n\n      - valve_switch: ${zone_5_name}\n        enable_switch: \"Enable ${zone_5_name}\"\n        pump_switch_id: sprinkler_pump_sw\n        run_duration: 60s\n        valve_switch_id: ${devicename}_5\n\n###############################################\n# SWITCHES voor valves\n###############################################\n\nswitch:\n  - platform: template\n    name: \"${zone_1_name} switch\"\n    id: zone_1_switch\n    #internal: true\n    optimistic: true\n    restore_mode: DISABLED\n    turn_on_action:\n      - sprinkler.start_single_valve:\n          id: ${devicename}\n          valve_number: 0\n    turn_off_action:\n      - sprinkler.shutdown:\n          id: ${devicename}\n\n  - platform: template\n    name: \"${zone_2_name} switch\"\n    id: zone_2_switch\n    #internal: true\n    optimistic: true\n    restore_mode: DISABLED\n    turn_on_action:\n      - sprinkler.start_single_valve:\n          id: ${devicename}\n          valve_number: 1\n    turn_off_action:\n      - sprinkler.shutdown:\n          id: ${devicename}\n\n  - platform: template\n    name: \"${zone_3_name} switch\"\n    id: zone_3_switch\n    #internal: true\n    optimistic: true\n    restore_mode: DISABLED\n    turn_on_action:\n      - sprinkler.start_single_valve:\n          id: ${devicename}\n          valve_number: 2\n    turn_off_action:\n      - sprinkler.shutdown:\n          id: ${devicename}\n\n  - platform: template\n    name: \"${zone_4_name} switch\"\n    id: zone_4_switch\n    #internal: true\n    optimistic: true\n    restore_mode: DISABLED\n    turn_on_action:\n      - sprinkler.start_single_valve:\n          id: ${devicename}\n          valve_number: 3\n    turn_off_action:\n      - sprinkler.shutdown:\n          id: ${devicename}\n\n  - platform: template\n    name: \"${zone_5_name} switch\"\n    id: zone_5_switch\n    #internal: true\n    optimistic: true\n    restore_mode: DISABLED\n    turn_on_action:\n      - sprinkler.start_single_valve:\n          id: ${devicename}\n          valve_number: 4\n    turn_off_action:\n      - sprinkler.shutdown:\n          id: ${devicename}\n\n###############################################\n# SWITCHES \u2014 Restart Device\n###############################################\n\n  - platform: restart\n    name: \"Restart ${devicename}\"\n    id: restartit\n\n\n\n###############################################\n# RELAY OUTPUTS \u2014 Hidden Valve Controls\n# All dynamic via substitutions\n###############################################\n\n  ###############################################\n  # Zone 1 Relay\n  ###############################################\n  - platform: gpio\n    id: ${devicename}_1\n    internal: true\n    restore_mode: RESTORE_DEFAULT_OFF\n    pin:\n      pcf8574: pcf8574_hub_out_1\n      number: 0\n      mode: OUTPUT\n      inverted: true\n    on_turn_on:\n      - lambda: |-\n          auto now = id(homeassistant_time).now();\n          if (now.is_valid()) {\n            id(zone1_last_run_global) = now.strftime(\"%Y-%m-%d %H:%M:%S\");\n          }\n      - text_sensor.template.publish:\n          id: ${zone_1_last_run_id}\n          state: !lambda 'return id(zone1_last_run_global);'\n      - text_sensor.template.publish:\n          id: valve_status\n          state: \"${zone_1_name} Active\"\n    on_turn_off:\n      - text_sensor.template.publish:\n          id: valve_status\n          state: \"Idle\"\n\n\n  ###############################################\n  # Zone 2 Relay\n  ###############################################\n  - platform: gpio\n    id: ${devicename}_2\n    internal: true\n    restore_mode: RESTORE_DEFAULT_OFF\n    pin:\n      pcf8574: pcf8574_hub_out_1\n      number: 1\n      mode: OUTPUT\n      inverted: true\n    on_turn_on:\n      - lambda: |-\n          auto now = id(homeassistant_time).now();\n          if (now.is_valid()) {\n            id(zone2_last_run_global) = now.strftime(\"%Y-%m-%d %H:%M:%S\");\n          }\n      - text_sensor.template.publish:\n          id: ${zone_2_last_run_id}\n          state: !lambda 'return id(zone2_last_run_global);'\n      - text_sensor.template.publish:\n          id: valve_status\n          state: \"${zone_2_name} Active\"\n    on_turn_off:\n      - text_sensor.template.publish:\n          id: valve_status\n          state: \"Idle\"\n\n  ###############################################\n  # Zone 3 Relay\n  ###############################################\n\n\n  - platform: gpio\n    id: ${devicename}_3\n    internal: true\n    restore_mode: RESTORE_DEFAULT_OFF\n    pin:\n      pcf8574: pcf8574_hub_out_1\n      number: 2\n      mode: OUTPUT\n      inverted: true\n    on_turn_on:\n      - lambda: |-\n          auto now = id(homeassistant_time).now();\n          if (now.is_valid()) {\n            id(zone3_last_run_global) = now.strftime(\"%Y-%m-%d %H:%M:%S\");\n          }\n      - text_sensor.template.publish:\n          id: ${zone_3_last_run_id}\n          state: !lambda 'return id(zone3_last_run_global);'\n      - text_sensor.template.publish:\n          id: valve_status\n          state: \"${zone_3_name} Active\"\n    on_turn_off:\n      - text_sensor.template.publish:\n          id: valve_status\n          state: \"Idle\"\n\n\n  ###############################################\n  # Zone 4 Relay\n  ###############################################\n  - platform: gpio\n    id: ${devicename}_4\n    internal: true\n    restore_mode: RESTORE_DEFAULT_OFF\n    pin:\n      pcf8574: pcf8574_hub_out_1\n      number: 3\n      mode: OUTPUT\n      inverted: true\n    on_turn_on:\n      - lambda: |-\n          auto now = id(homeassistant_time).now();\n          if (now.is_valid()) {\n            id(zone4_last_run_global) = now.strftime(\"%Y-%m-%d %H:%M:%S\");\n          }\n      - text_sensor.template.publish:\n          id: ${zone_4_last_run_id}\n          state: !lambda 'return id(zone4_last_run_global);'\n      - text_sensor.template.publish:\n          id: valve_status\n          state: \"${zone_4_name} Active\"\n    on_turn_off:\n      - text_sensor.template.publish:\n          id: valve_status\n          state: \"Idle\"\n\n\n  ###############################################\n  # Zone 5 Relay\n  ###############################################\n  - platform: gpio\n    id: ${devicename}_5\n    internal: true\n    restore_mode: RESTORE_DEFAULT_OFF\n    pin:\n      pcf8574: pcf8574_hub_out_1\n      number: 4\n      mode: OUTPUT\n      inverted: true\n    on_turn_on:\n      - lambda: |-\n          auto now = id(homeassistant_time).now();\n          if (now.is_valid()) {\n            id(zone5_last_run_global) = now.strftime(\"%Y-%m-%d %H:%M:%S\");\n          }\n      - text_sensor.template.publish:\n          id: ${zone_5_last_run_id}\n          state: !lambda 'return id(zone5_last_run_global);'\n      - text_sensor.template.publish:\n          id: valve_status\n          state: \"${zone_5_name} Active\"\n    on_turn_off:\n      - text_sensor.template.publish:\n          id: valve_status\n          state: \"Idle\"\n\n  ###############################################\n  # Pump Relay\n  ###############################################\n  - platform: gpio\n    id: sprinkler_pump_sw\n    name: \"Sprinkler Pump\"\n    internal: true\n    restore_mode: RESTORE_DEFAULT_OFF\n    pin:\n      pcf8574: pcf8574_hub_out_1\n      number: 5\n      mode: OUTPUT\n      inverted: true\n    on_turn_on:\n      - text_sensor.template.publish:\n          id: valve_status\n          state: \"Pump Active\"\n    on_turn_off:\n      - text_sensor.template.publish:\n          id: valve_status\n          state: \"Idle\"\n\n###############################################\n# BUTTONS \u2014 Pause\n###############################################\n\nbutton:\n  - platform: template\n    id: sprinkler_pause\n    name: \"Pause\"\n    icon: \"mdi:pause\"\n    on_press:\n      then:\n        - text_sensor.template.publish:\n            id: valve_status\n            state: \"Paused\"\n        - sprinkler.pause: ${devicename}\n\n###############################################\n# PCF8574 I\/O Expanders\n###############################################\n\npcf8574:\n  - id: pcf8574_hub_out_1\n    address: 0x24\n\n  - id: pcf8574_hub_in_1\n    address: 0x22\n\n\n###############################################\n# BINARY SENSORS \u2014 Local Manual Inputs\n###############################################\n\nbinary_sensor:\n\n  - platform: homeassistant\n    id: prevent_deep_sleep\n    name: \"${upper_devicename} Prevent Deep Sleep\"\n    entity_id: input_boolean.prevent_deep_sleep\n\n  ###############################################\n  # Local Button 1 \u2192 Start Zone 1\n  ###############################################\n  - platform: gpio\n    name: \"a6-input1\"\n    internal: true\n    pin:\n      pcf8574: pcf8574_hub_in_1\n      number: 0\n      mode: INPUT\n      inverted: true\n    on_press:\n      - sprinkler.start_single_valve:\n          id: ${devicename}\n          valve_number: 0\n\n  ###############################################\n  # Local Button 2 \u2192 Start Zone 2\n  ###############################################\n  - platform: gpio\n    name: \"a6-input2\"\n    internal: true\n    pin:\n      pcf8574: pcf8574_hub_in_1\n      number: 1\n      mode: INPUT\n      inverted: true\n    on_press:\n      - sprinkler.start_single_valve:\n          id: ${devicename}\n          valve_number: 1\n\n  ###############################################\n  # Local Button 3 \u2192 Start Zone 3\n  ###############################################\n  - platform: gpio\n    name: \"a6-input3\"\n    internal: true\n    pin:\n      pcf8574: pcf8574_hub_in_1\n      number: 2\n      mode: INPUT\n      inverted: true\n    on_press:\n      - sprinkler.start_single_valve:\n          id: ${devicename}\n          valve_number: 2\n\n  ###############################################\n  # Local Button 4 \u2192 Start Zone 4\n  ###############################################\n  - platform: gpio\n    name: \"a6-input4\"\n    internal: true\n    pin:\n      pcf8574: pcf8574_hub_in_1\n      number: 3\n      mode: INPUT\n      inverted: true\n    on_press:\n      - sprinkler.start_single_valve:\n          id: ${devicename}\n          valve_number: 3\n\n  ###############################################\n  # Local Button 5 \u2192 Start Zone 5\n  ###############################################\n  - platform: gpio\n    name: \"a6-input5\"\n    internal: true\n    pin:\n      pcf8574: pcf8574_hub_in_1\n      number: 4\n      mode: INPUT\n      inverted: true\n    on_press:\n      - sprinkler.start_single_valve:\n          id: ${devicename}\n          valve_number: 4\n\n  ###############################################\n  # Local Button 6 \u2192 Shutdown All\n  ###############################################\n  - platform: gpio\n    name: \"a6-input6\"\n    internal: true\n    pin:\n      pcf8574: pcf8574_hub_in_1\n      number: 5\n      mode: INPUT\n      inverted: true\n    on_press:\n      - sprinkler.shutdown: ${devicename}\n\n###############################################\n# status\u2011sensor voor de zone\n###############################################\n\n  - platform: template\n    id: zone_1_active\n    name: \"${zone_1_name} Actief\"\n    device_class: running\n    lambda: |-\n      return id(${devicename}_1).state;\n    #update_interval: 1s\n  - platform: template\n    id: zone_2_active\n    name: \"${zone_2_name} Actief\"\n    device_class: running\n    lambda: |-\n      return id(${devicename}_2).state;\n    #update_interval: 1s\n  - platform: template\n    id: zone_3_active\n    name: \"${zone_3_name} Actief\"\n    device_class: running\n    lambda: |-\n      return id(${devicename}_3).state;\n    #update_interval: 1s\n  - platform: template\n    id: zone_4_active\n    name: \"${zone_4_name} Actief\"\n    device_class: running\n    lambda: |-\n      return id(${devicename}_4).state;\n    #update_interval: 1s\n  - platform: template\n    id: zone_5_active\n    name: \"${zone_5_name} Actief\"\n    device_class: running\n    lambda: |-\n      return id(${devicename}_5).state;\n    #update_interval: 1s\n\n###############################################\n# I2C BUS\n###############################################\n\ni2c:\n  sda: 4\n  scl: 15\n  scan: true\n  id: bus_a\n\n\n###############################################\n# FONTS\n###############################################\n\nfont:\n  - file: \"common\/fonts\/Roboto-Regular.ttf\"\n    id: font_small\n    size: 12\n\n  - file: \"common\/fonts\/Roboto-Regular.ttf\"\n    id: font_medium\n    size: 16\n\n  - file: \"common\/fonts\/Roboto-Regular.ttf\"\n    id: font_large\n    size: 20\n\n\n###############################################\n# DISPLAY \u2014 SSD1306 128x64\n###############################################\n\ndisplay:\n  - platform: ssd1306_i2c\n    model: \"SSD1306 128x64\"\n    id: irrigation_display\n    address: 0x3C\n    rotation: 0\n    lambda: |-\n      \/\/ Tijd bovenaan\n      auto now = id(homeassistant_time).now();\n      if (now.is_valid()) {\n        it.strftime(0, 0, id(font_medium), \"%H:%M:%S\", now);\n      } else {\n        it.printf(0, 0, id(font_medium), \"--:--:--\");\n      }\n\n      \/\/ Active valve\n      auto active = id(${devicename}).active_valve().value_or(-1);\n      if (active &gt;= 0) {\n        std::string zone_name;\n        if (active == 0) zone_name = \"${zone_1_name}\";\n        if (active == 1) zone_name = \"${zone_2_name}\";\n        if (active == 2) zone_name = \"${zone_3_name}\";\n        if (active == 3) zone_name = \"${zone_4_name}\";\n        if (active == 4) zone_name = \"${zone_5_name}\";\n\n        it.printf(0, 18, id(font_small), \"Active: %s\", zone_name.c_str());\n      } else {\n        it.printf(0, 18, id(font_small), \"Active: None\");\n      }\n\n      \/\/ Time remaining\n      it.printf(0, 32, id(font_small), \"Remaining: %s\",\n        id(time_remaining).state.c_str());\n\n      \/\/ Progress %\n      it.printf(0, 46, id(font_small), \"Progress: %s\",\n        id(progress_percent).state.c_str());\n# -----------------------------end---------------------------------------------------\n<\/code><\/pre>\n<hr \/>\n<h2>&#x1f4c4; automation:alle 5 zones automatisch UIT<\/h2>\n<p>Hij werkt op basis van:<br \/>\nsensor.irrigation_controller_time_remaining<br \/>\nzodra die 0 seconden bereikt<br \/>\nzet hij alle stateless zone\u2011switches uit<\/p>\n<pre><code class=\"language-yaml\">\nalias: \"Irrigatie : Zet zones uit wanneer sproeien klaar is\"\ndescription: \"\"\ntriggers:\n  - trigger: state\n    entity_id:\n      - binary_sensor.irrigation_voortuin_actief\n    to:\n      - \"off\"\n    for:\n      hours: 0\n      minutes: 0\n      seconds: 30\n    from:\n      - \"on\"\n    id: voortuin\n  - trigger: state\n    entity_id:\n      - binary_sensor.irrigation_achtertuin_actief\n    to:\n      - \"off\"\n    for:\n      hours: 0\n      minutes: 0\n      seconds: 30\n    from:\n      - \"on\"\n    id: achtertuin\n  - trigger: state\n    entity_id:\n      - binary_sensor.irrigation_serre_actief\n    to:\n      - \"off\"\n    for:\n      hours: 0\n      minutes: 0\n      seconds: 30\n    from:\n      - \"on\"\n    id: serre\n  - trigger: state\n    entity_id:\n      - binary_sensor.irrigation_vijver_actief\n    to:\n      - \"off\"\n    for:\n      hours: 0\n      minutes: 0\n      seconds: 30\n    from:\n      - \"on\"\n    id: vijver\n  - trigger: state\n    entity_id:\n      - binary_sensor.irrigation_spare_actief\n    to:\n      - \"off\"\n    for:\n      hours: 0\n      minutes: 0\n      seconds: 30\n    from:\n      - \"on\"\n    id: spare\nconditions: []\nactions:\n  - if:\n      - condition: trigger\n        id:\n          - voortuin\n    then:\n      - target:\n          entity_id:\n            - switch.irrigation_voortuin_switch\n        action: switch.turn_off\n        data: {}\n    alias: voortuin\n  - if:\n      - condition: trigger\n        id:\n          - achtertuin\n    then:\n      - target:\n          entity_id:\n            - switch.irrigation_achtertuin_switch\n        action: switch.turn_off\n        data: {}\n    alias: achtertuin\n  - alias: serre\n    if:\n      - condition: trigger\n        id:\n          - serre\n    then:\n      - target:\n          entity_id:\n            - switch.irrigation_serre_switch\n        action: switch.turn_off\n        data: {}\n  - if:\n      - condition: trigger\n        id:\n          - vijver\n    then:\n      - target:\n          entity_id:\n            - switch.irrigation_vijver_switch\n        action: switch.turn_off\n        data: {}\n    alias: vijver\n  - if:\n      - condition: trigger\n        id:\n          - spare\n    then:\n      - target:\n          entity_id: switch.irrigation_spare_switch\n        action: switch.turn_off\n        data: {}\n    alias: spare\nmode: restart\n\n\n<\/code><\/pre>\n<hr \/>\n<h2>&#x1f3af; Conclusie<\/h2>\n<p>Dit project combineert krachtige hardware, flexibele software en slimme automatisering. Het resultaat is een irrigatiesysteem dat volledig autonoom werkt, energie bespaart en perfect integreert in een moderne smart home\u2011omgeving.<\/p>\n<div class=\"pvc_clear\"><\/div>\n<p id=\"pvc_stats_526\" class=\"pvc_stats all  \" data-element-id=\"526\" style=\"\"><i class=\"pvc-stats-icon medium\" aria-hidden=\"true\"><svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"far\" data-icon=\"chart-bar\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\" class=\"svg-inline--fa fa-chart-bar fa-w-16 fa-2x\"><path fill=\"currentColor\" d=\"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\" class=\"\"><\/path><\/svg><\/i> <img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"16\" alt=\"Loading\" src=\"https:\/\/pcgsm.nl\/ohh\/wp-content\/plugins\/page-views-count\/ajax-loader-2x.gif\" border=0 \/><\/p>\n<div class=\"pvc_clear\"><\/div>\n","protected":false},"excerpt":{"rendered":"<p>&#x1f331; Slim Irrigatiesysteem met ESPHome, KC868\u2011A6 en Dynamische Energieprijzen Water geven is niet moeilijk \u2014 maar het effici\u00ebnt, energiezuinig en volledig geautomatiseerd doen, dat is een ander verhaal. In dit project bouwde ik een compleet irrigatiesysteem op basis van: ESPHome Kincony KC868\u2011A6 Home Assistant Dynamische energieprijzen via cheapest_energy_hours.jinja (TheFes) Het resultaat is een systeem dat: &hellip; <\/p>\n<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/pcgsm.nl\/ohh\/2026\/03\/12\/slim-irrigatiesysteem\/\"> Read More<span class=\"screen-reader-text\">  Read More<\/span><\/a><\/p>\n<div class=\"pvc_clear\"><\/div>\n<p id=\"pvc_stats_526\" class=\"pvc_stats all  \" data-element-id=\"526\" style=\"\"><i class=\"pvc-stats-icon medium\" aria-hidden=\"true\"><svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"far\" data-icon=\"chart-bar\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\" class=\"svg-inline--fa fa-chart-bar fa-w-16 fa-2x\"><path fill=\"currentColor\" d=\"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\" class=\"\"><\/path><\/svg><\/i> <img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"16\" alt=\"Loading\" src=\"https:\/\/pcgsm.nl\/ohh\/wp-content\/plugins\/page-views-count\/ajax-loader-2x.gif\" border=0 \/><\/p>\n<div class=\"pvc_clear\"><\/div>\n","protected":false},"author":4,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[23,17,26,27],"class_list":["post-526","post","type-post","status-publish","format-standard","hentry","category-geen-categorie","tag-esphome","tag-home-assistant","tag-kc868-a6","tag-kincony"],"a3_pvc":{"activated":true,"total_views":138,"today_views":0},"_links":{"self":[{"href":"https:\/\/pcgsm.nl\/ohh\/wp-json\/wp\/v2\/posts\/526","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pcgsm.nl\/ohh\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pcgsm.nl\/ohh\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pcgsm.nl\/ohh\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/pcgsm.nl\/ohh\/wp-json\/wp\/v2\/comments?post=526"}],"version-history":[{"count":12,"href":"https:\/\/pcgsm.nl\/ohh\/wp-json\/wp\/v2\/posts\/526\/revisions"}],"predecessor-version":[{"id":553,"href":"https:\/\/pcgsm.nl\/ohh\/wp-json\/wp\/v2\/posts\/526\/revisions\/553"}],"wp:attachment":[{"href":"https:\/\/pcgsm.nl\/ohh\/wp-json\/wp\/v2\/media?parent=526"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pcgsm.nl\/ohh\/wp-json\/wp\/v2\/categories?post=526"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pcgsm.nl\/ohh\/wp-json\/wp\/v2\/tags?post=526"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}