tekstitv_401:
  sensor:
    - platform: rest
      name: tekstitv_401_p1a
      resource: https://yle.fi/tekstitv/txt/401_0001.htm
      headers:
        User-Agent: "Mozilla/5.0"
        Accept-Language: "fi-FI, fi;q=0.9"
      timeout: 20
      scan_interval: 900
      value_template: >-
        {% set raw = value | default('', true) %}
        {% set pre = raw | regex_findall_index('(?is)<pre[^>]*>(.*?)</pre>', 0) | default('', true) %}
        {% set t = pre
          | regex_replace('-\\s*\\n', '')
          | regex_replace('&nbsp;', ' ')
          | regex_replace('&auml;', 'ä') | regex_replace('&Auml;', 'Ä')
          | regex_replace('&ouml;', 'ö') | regex_replace('&Ouml;', 'Ö')
          | regex_replace('&aring;', 'å') | regex_replace('&Aring;', 'Å')
          | regex_replace('&amp;', '&')
          | regex_replace('\\r', '')
          | regex_replace('[ \\t]+', ' ')
          | regex_replace('\\n\\s*\\n', '\n')
          | trim %}
        {% set low = t | lower %}
        {% set starts = [
          'koillismaalla ja lapissa:', 'koillismaalla sekä lapissa:',
          'lapissa:', 'lapissa',
          'meri-lapissa:', 'meri-lapissa',
          'merilapissa:', 'merilapissa',
          'pohjoisessa:', 'pohjoisessa',
          'maan pohjoisosassa:', 'maan pohjoisosassa'
        ] %}
        {% set s = -1 %}
        {% for k in starts %}
          {% set i = low.find(k) %}
          {% if i != -1 and (s == -1 or i < s) %}
            {% set s = i %}
          {% endif %}
        {% endfor %}
        {% set e = low.find('liikennesää', s if s!=-1 else 0) %}
        {% set picked = s!=-1 and e!=-1 and e>s and t[s:e] or s!=-1 and t[s:] or '' %}
        {{ picked[:200] | trim }}

    - platform: rest
      name: tekstitv_401_p1b
      resource: https://yle.fi/tekstitv/txt/401_0001.htm
      headers:
        User-Agent: "Mozilla/5.0"
        Accept-Language: "fi-FI, fi;q=0.9"
      timeout: 20
      scan_interval: 900
      value_template: >-
        {% set raw = value | default('', true) %}
        {% set pre = raw | regex_findall_index('(?is)<pre[^>]*>(.*?)</pre>', 0) | default('', true) %}
        {% set t = pre
          | regex_replace('-\\s*\\n', '')
          | regex_replace('&nbsp;', ' ')
          | regex_replace('&auml;', 'ä') | regex_replace('&Auml;', 'Ä')
          | regex_replace('&ouml;', 'ö') | regex_replace('&Ouml;', 'Ö')
          | regex_replace('&aring;', 'å') | regex_replace('&Aring;', 'Å')
          | regex_replace('&amp;', '&')
          | regex_replace('\\r', '')
          | regex_replace('[ \\t]+', ' ')
          | regex_replace('\\n\\s*\\n', '\n')
          | trim %}
        {% set low = t | lower %}
        {% set starts = [
          'koillismaalla ja lapissa:', 'koillismaalla sekä lapissa:',
          'lapissa:', 'lapissa',
          'meri-lapissa:', 'meri-lapissa',
          'merilapissa:', 'merilapissa',
          'pohjoisessa:', 'pohjoisessa',
          'maan pohjoisosassa:', 'maan pohjoisosassa'
        ] %}
        {% set s = -1 %}
        {% for k in starts %}
          {% set i = low.find(k) %}
          {% if i != -1 and (s == -1 or i < s) %}
            {% set s = i %}
          {% endif %}
        {% endfor %}
        {% set e = low.find('liikennesää', s if s!=-1 else 0) %}
        {% set picked = s!=-1 and e!=-1 and e>s and t[s:e] or s!=-1 and t[s:] or '' %}
        {{ picked[200:400] | trim }}

    - platform: rest
      name: tekstitv_401_p1c
      resource: https://yle.fi/tekstitv/txt/401_0001.htm
      headers:
        User-Agent: "Mozilla/5.0"
        Accept-Language: "fi-FI, fi;q=0.9"
      timeout: 20
      scan_interval: 900
      value_template: >-
        {% set raw = value | default('', true) %}
        {% set pre = raw | regex_findall_index('(?is)<pre[^>]*>(.*?)</pre>', 0) | default('', true) %}
        {% set t = pre
          | regex_replace('-\\s*\\n', '')
          | regex_replace('&nbsp;', ' ')
          | regex_replace('&auml;', 'ä') | regex_replace('&Auml;', 'Ä')
          | regex_replace('&ouml;', 'ö') | regex_replace('&Ouml;', 'Ö')
          | regex_replace('&aring;', 'å') | regex_replace('&Aring;', 'Å')
          | regex_replace('&amp;', '&')
          | regex_replace('\\r', '')
          | regex_replace('[ \\t]+', ' ')
          | regex_replace('\\n\\s*\\n', '\n')
          | trim %}
        {% set low = t | lower %}
        {% set starts = [
          'koillismaalla ja lapissa:', 'koillismaalla sekä lapissa:',
          'lapissa:', 'lapissa',
          'meri-lapissa:', 'meri-lapissa',
          'merilapissa:', 'merilapissa',
          'pohjoisessa:', 'pohjoisessa',
          'maan pohjoisosassa:', 'maan pohjoisosassa'
        ] %}
        {% set s = -1 %}
        {% for k in starts %}
          {% set i = low.find(k) %}
          {% if i != -1 and (s == -1 or i < s) %}
            {% set s = i %}
          {% endif %}
        {% endfor %}
        {% set e = low.find('liikennesää', s if s!=-1 else 0) %}
        {% set picked = s!=-1 and e!=-1 and e>s and t[s:e] or s!=-1 and t[s:] or '' %}
        {{ picked[400:600] | trim }}

    - platform: rest
      name: tekstitv_401_p2a
      resource: https://yle.fi/tekstitv/txt/401_0002.htm
      headers:
        User-Agent: "Mozilla/5.0"
        Accept-Language: "fi-FI, fi;q=0.9"
      timeout: 20
      scan_interval: 900
      value_template: >-
        {% set raw = value | default('', true) %}
        {% set pre = raw | regex_findall_index('(?is)<pre[^>]*>(.*?)</pre>', 0) | default('', true) %}
        {% set t = pre
          | regex_replace('-\\s*\\n', '')
          | regex_replace('&nbsp;', ' ')
          | regex_replace('&auml;', 'ä') | regex_replace('&Auml;', 'Ä')
          | regex_replace('&ouml;', 'ö') | regex_replace('&Ouml;', 'Ö')
          | regex_replace('&aring;', 'å') | regex_replace('&Aring;', 'Å')
          | regex_replace('&amp;', '&')
          | regex_replace('\\r', '')
          | regex_replace('[ \\t]+', ' ')
          | regex_replace('\\n\\s*\\n', '\n')
          | trim %}
        {% set low = t | lower %}
        {% set starts = [
          'koillismaalla ja lapissa:', 'koillismaalla sekä lapissa:',
          'lapissa:', 'lapissa',
          'meri-lapissa:', 'meri-lapissa',
          'merilapissa:', 'merilapissa',
          'pohjoisessa:', 'pohjoisessa',
          'maan pohjoisosassa:', 'maan pohjoisosassa'
        ] %}
        {% set s = -1 %}
        {% for k in starts %}
          {% set i = low.find(k) %}
          {% if i != -1 and (s == -1 or i < s) %}
            {% set s = i %}
          {% endif %}
        {% endfor %}
        {% set e = low.find('liikennesää', 0) %}
        {% set picked = s!=-1 and e!=-1 and e>s and t[s:e]
                        or s!=-1 and t[s:]
                        or e!=-1 and t[:e]
                        or '' %}
        {{ picked[:200] | trim }}

    - platform: rest
      name: tekstitv_401_p2b
      resource: https://yle.fi/tekstitv/txt/401_0002.htm
      headers:
        User-Agent: "Mozilla/5.0"
        Accept-Language: "fi-FI, fi;q=0.9"
      timeout: 20
      scan_interval: 900
      value_template: >-
        {% set raw = value | default('', true) %}
        {% set pre = raw | regex_findall_index('(?is)<pre[^>]*>(.*?)</pre>', 0) | default('', true) %}
        {% set t = pre
          | regex_replace('-\\s*\\n', '')
          | regex_replace('&nbsp;', ' ')
          | regex_replace('&auml;', 'ä') | regex_replace('&Auml;', 'Ä')
          | regex_replace('&ouml;', 'ö') | regex_replace('&Ouml;', 'Ö')
          | regex_replace('&aring;', 'å') | regex_replace('&Aring;', 'Å')
          | regex_replace('&amp;', '&')
          | regex_replace('\\r', '')
          | regex_replace('[ \\t]+', ' ')
          | regex_replace('\\n\\s*\\n', '\n')
          | trim %}
        {% set low = t | lower %}
        {% set starts = [
          'koillismaalla ja lapissa:', 'koillismaalla sekä lapissa:',
          'lapissa:', 'lapissa',
          'meri-lapissa:', 'meri-lapissa',
          'merilapissa:', 'merilapissa',
          'pohjoisessa:', 'pohjoisessa',
          'maan pohjoisosassa:', 'maan pohjoisosassa'
        ] %}
        {% set s = -1 %}
        {% for k in starts %}
          {% set i = low.find(k) %}
          {% if i != -1 and (s == -1 or i < s) %}
            {% set s = i %}
          {% endif %}
        {% endfor %}
        {% set e = low.find('liikennesää', 0) %}
        {% set picked = s!=-1 and e!=-1 and e>s and t[s:e]
                        or s!=-1 and t[s:]
                        or e!=-1 and t[:e]
                        or '' %}
        {{ picked[200:400] | trim }}

    - platform: rest
      name: tekstitv_401_p2c
      resource: https://yle.fi/tekstitv/txt/401_0002.htm
      headers:
        User-Agent: "Mozilla/5.0"
        Accept-Language: "fi-FI, fi;q=0.9"
      timeout: 20
      scan_interval: 900
      value_template: >-
        {% set raw = value | default('', true) %}
        {% set pre = raw | regex_findall_index('(?is)<pre[^>]*>(.*?)</pre>', 0) | default('', true) %}
        {% set t = pre
          | regex_replace('-\\s*\\n', '')
          | regex_replace('&nbsp;', ' ')
          | regex_replace('&auml;', 'ä') | regex_replace('&Auml;', 'Ä')
          | regex_replace('&ouml;', 'ö') | regex_replace('&Ouml;', 'Ö')
          | regex_replace('&aring;', 'å') | regex_replace('&Aring;', 'Å')
          | regex_replace('&amp;', '&')
          | regex_replace('\\r', '')
          | regex_replace('[ \\t]+', ' ')
          | regex_replace('\\n\\s*\\n', '\n')
          | trim %}
        {% set low = t | lower %}
        {% set starts = [
          'koillismaalla ja lapissa:', 'koillismaalla sekä lapissa:',
          'lapissa:', 'lapissa',
          'meri-lapissa:', 'meri-lapissa',
          'merilapissa:', 'merilapissa',
          'pohjoisessa:', 'pohjoisessa',
          'maan pohjoisosassa:', 'maan pohjoisosassa'
        ] %}
        {% set s = -1 %}
        {% for k in starts %}
          {% set i = low.find(k) %}
          {% if i != -1 and (s == -1 or i < s) %}
            {% set s = i %}
          {% endif %}
        {% endfor %}
        {% set e = low.find('liikennesää', 0) %}
        {% set picked = s!=-1 and e!=-1 and e>s and t[s:e]
                        or s!=-1 and t[s:]
                        or e!=-1 and t[:e]
                        or '' %}
        {{ picked[400:600] | trim }}

    - platform: rest
      name: tekstitv_401_p3a
      resource: https://yle.fi/tekstitv/txt/401_0003.htm
      headers:
        User-Agent: "Mozilla/5.0"
        Accept-Language: "fi-FI, fi;q=0.9"
      timeout: 20
      scan_interval: 900
      value_template: >-
        {% set raw = value | default('', true) %}
        {% set pre = raw | regex_findall_index('(?is)<pre[^>]*>(.*?)</pre>', 0) | default('', true) %}
        {% set t = pre
          | regex_replace('-\\s*\\n', '')
          | regex_replace('&nbsp;', ' ')
          | regex_replace('&auml;', 'ä') | regex_replace('&Auml;', 'Ä')
          | regex_replace('&ouml;', 'ö') | regex_replace('&Ouml;', 'Ö')
          | regex_replace('&aring;', 'å') | regex_replace('&Aring;', 'Å')
          | regex_replace('&amp;', '&')
          | regex_replace('\\r', '')
          | regex_replace('[ \\t]+', ' ')
          | regex_replace('\\n\\s*\\n', '\n')
          | trim %}
        {% set low = t | lower %}
        {% set starts = [
          'koillismaalla ja lapissa:', 'koillismaalla sekä lapissa:',
          'lapissa:', 'lapissa',
          'meri-lapissa:', 'meri-lapissa',
          'merilapissa:', 'merilapissa',
          'pohjoisessa:', 'pohjoisessa',
          'maan pohjoisosassa:', 'maan pohjoisosassa'
        ] %}
        {% set s = -1 %}
        {% for k in starts %}
          {% set i = low.find(k) %}
          {% if i != -1 and (s == -1 or i < s) %}
            {% set s = i %}
          {% endif %}
        {% endfor %}
        {% set e = low.find('liikennesää', 0) %}
        {% set picked = s!=-1 and e!=-1 and e>s and t[s:e]
                        or e!=-1 and t[:e]
                        or '' %}
        {{ picked[:200] | trim }}

    - platform: rest
      name: tekstitv_401_p3b
      resource: https://yle.fi/tekstitv/txt/401_0003.htm
      headers:
        User-Agent: "Mozilla/5.0"
        Accept-Language: "fi-FI, fi;q=0.9"
      timeout: 20
      scan_interval: 900
      value_template: >-
        {% set raw = value | default('', true) %}
        {% set pre = raw | regex_findall_index('(?is)<pre[^>]*>(.*?)</pre>', 0) | default('', true) %}
        {% set t = pre
          | regex_replace('-\\s*\\n', '')
          | regex_replace('&nbsp;', ' ')
          | regex_replace('&auml;', 'ä') | regex_replace('&Auml;', 'Ä')
          | regex_replace('&ouml;', 'ö') | regex_replace('&Ouml;', 'Ö')
          | regex_replace('&aring;', 'å') | regex_replace('&Aring;', 'Å')
          | regex_replace('&amp;', '&')
          | regex_replace('\\r', '')
          | regex_replace('[ \\t]+', ' ')
          | regex_replace('\\n\\s*\\n', '\n')
          | trim %}
        {% set low = t | lower %}
        {% set starts = [
          'koillismaalla ja lapissa:', 'koillismaalla sekä lapissa:',
          'lapissa:', 'lapissa',
          'meri-lapissa:', 'meri-lapissa',
          'merilapissa:', 'merilapissa',
          'pohjoisessa:', 'pohjoisessa',
          'maan pohjoisosassa:', 'maan pohjoisosassa'
        ] %}
        {% set s = -1 %}
        {% for k in starts %}
          {% set i = low.find(k) %}
          {% if i != -1 and (s == -1 or i < s) %}
            {% set s = i %}
          {% endif %}
        {% endfor %}
        {% set e = low.find('liikennesää', 0) %}
        {% set picked = s!=-1 and e!=-1 and e>s and t[s:e]
                        or e!=-1 and t[:e]
                        or '' %}
        {{ picked[200:400] | trim }}

    - platform: rest
      name: tekstitv_401_p3c
      resource: https://yle.fi/tekstitv/txt/401_0003.htm
      headers:
        User-Agent: "Mozilla/5.0"
        Accept-Language: "fi-FI, fi;q=0.9"
      timeout: 20
      scan_interval: 900
      value_template: >-
        {% set raw = value | default('', true) %}
        {% set pre = raw | regex_findall_index('(?is)<pre[^>]*>(.*?)</pre>', 0) | default('', true) %}
        {% set t = pre
          | regex_replace('-\\s*\\n', '')
          | regex_replace('&nbsp;', ' ')
          | regex_replace('&auml;', 'ä') | regex_replace('&Auml;', 'Ä')
          | regex_replace('&ouml;', 'ö') | regex_replace('&Ouml;', 'Ö')
          | regex_replace('&aring;', 'å') | regex_replace('&Aring;', 'Å')
          | regex_replace('&amp;', '&')
          | regex_replace('\\r', '')
          | regex_replace('[ \\t]+', ' ')
          | regex_replace('\\n\\s*\\n', '\n')
          | trim %}
        {% set low = t | lower %}
        {% set starts = [
          'koillismaalla ja lapissa:', 'koillismaalla sekä lapissa:',
          'lapissa:', 'lapissa',
          'meri-lapissa:', 'meri-lapissa',
          'merilapissa:', 'merilapissa',
          'pohjoisessa:', 'pohjoisessa',
          'maan pohjoisosassa:', 'maan pohjoisosassa'
        ] %}
        {% set s = -1 %}
        {% for k in starts %}
          {% set i = low.find(k) %}
          {% if i != -1 and (s == -1 or i < s) %}
            {% set s = i %}
          {% endif %}
        {% endfor %}
        {% set e = low.find('liikennesää', 0) %}
        {% set picked = s!=-1 and e!=-1 and e>s and t[s:e]
                        or e!=-1 and t[:e]
                        or '' %}
        {{ picked[400:600] | trim }}

  template:
    - sensor:
        - name: saa_pohjoisosat_tekstitv_osa1
          state: >-
            {% set parts = [
              states('sensor.tekstitv_401_p1a'), states('sensor.tekstitv_401_p1b'), states('sensor.tekstitv_401_p1c'),
              states('sensor.tekstitv_401_p2a'), states('sensor.tekstitv_401_p2b'), states('sensor.tekstitv_401_p2c'),
              states('sensor.tekstitv_401_p3a'), states('sensor.tekstitv_401_p3b'), states('sensor.tekstitv_401_p3c')
            ] %}
            {% set cleaned = parts | reject('in', ['unknown','unavailable','ei tilaa','']) | list %}
            {% set raw = cleaned | join('') %}
            {% if not raw %} ei saatavilla {% else %}
              {% set t = raw
                 | regex_replace('(?i)\\b\\d+/\\d+\\b', '')
                 | regex_replace('(?i)ilmatieteen\\s+laitos\\s+\\d{1,2}\\.\\d{1,2}\\.?', '')
                 | regex_replace('(?i)säätiedotus\\s+klo\\s*\\d{1,2}', '')
              %}
              {% set low = t | lower %}
              {% set e = low.find('liikennesää') %}
              {% set upto = (t[:e] if e != -1 else t) %}
              {% set low2 = upto | lower %}
              {% set starts = [
                'koillismaalla ja lapissa:', 'koillismaalla sekä lapissa:',
                'lapissa:', 'lapissa',
                'meri-lapissa:', 'meri-lapissa', 'merilapissa:', 'merilapissa',
                'pohjoisessa:', 'pohjoisessa',
                'maan pohjoisosassa:', 'maan pohjoisosassa'
              ] %}
              {% set s = -1 %}
              {% for k in starts %}
                {% set i = low2.find(k) %}
                {% if i != -1 and (s == -1 or i < s) %}{% set s = i %}{% endif %}
              {% endfor %}
              {% set text = (upto[s:] if s != -1 else upto)
                 | regex_replace('\\s+',' ')
                 | trim %}
              {% set p1 = text[:200] | trim %}
              {% set p2 = text[200:400] | trim %}
              {{ p1 ~ (' (jatkuu...)' if p2 else '') if p1 else 'ei saatavilla' }}
            {% endif %}

        - name: saa_pohjoisosat_tekstitv_osa2
          state: >-
            {% set parts = [
              states('sensor.tekstitv_401_p1a'), states('sensor.tekstitv_401_p1b'), states('sensor.tekstitv_401_p1c'),
              states('sensor.tekstitv_401_p2a'), states('sensor.tekstitv_401_p2b'), states('sensor.tekstitv_401_p2c'),
              states('sensor.tekstitv_401_p3a'), states('sensor.tekstitv_401_p3b'), states('sensor.tekstitv_401_p3c')
            ] %}
            {% set cleaned = parts | reject('in', ['unknown','unavailable','ei tilaa','']) | list %}
            {% set raw = cleaned | join('') %}
            {% if not raw %} '' {% else %}
              {% set t = raw
                 | regex_replace('(?i)\\b\\d+/\\d+\\b', '')
                 | regex_replace('(?i)ilmatieteen\\s+laitos\\s+\\d{1,2}\\.\\d{1,2}\\.?', '')
                 | regex_replace('(?i)säätiedotus\\s+klo\\s*\\d{1,2}', '')
              %}
              {% set low = t | lower %}
              {% set e = low.find('liikennesää') %}
              {% set upto = (t[:e] if e != -1 else t) %}
              {% set low2 = upto | lower %}
              {% set starts = [
                'koillismaalla ja lapissa:', 'koillismaalla sekä lapissa:',
                'lapissa:', 'lapissa',
                'meri-lapissa:', 'meri-lapissa', 'merilapissa:', 'merilapissa',
                'pohjoisessa:', 'pohjoisessa',
                'maan pohjoisosassa:', 'maan pohjoisosassa'
              ] %}
              {% set s = -1 %}
              {% for k in starts %}
                {% set i = low2.find(k) %}
                {% if i != -1 and (s == -1 or i < s) %}{% set s = i %}{% endif %}
              {% endfor %}
              {% set text = (upto[s:] if s != -1 else upto)
                 | regex_replace('\\s+',' ')
                 | trim %}
              {% if text | length <= 200 %} '' {% else %} {{ text[200:400] | trim }} {% endif %}
            {% endif %}
