Hello LagaV,
This version is actually outdated, as the KVB website is now dynamic and very difficult to scrape, I have not been able to do it yet.
But: I got behind it in the last days and found out that the Verkehrsverbund Rhein-Sieg (VRS) provides the data via HTML 
transport.yaml
rest:
- resource: https://www.vrs.de/index.php?eID=tx_vrsinfo_departuremonitor&i=ccf18ded5585169c2bc1ac8d07693055
scan_interval: 120
timeout: 20
headers:
User-Agent: Mozilla/5.0
sensor:
- name: "KVB Abfahrt 1 Line"
value_template: '{{ value_json.events[0].line.number }}'
json_attributes_path: $.events[0].line
json_attributes:
- direction
- product
- name: "KVB Abfahrt 1 Departure"
value_template: '{{ iif(value_json.events[0].departure.estimate is defined, value_json.events[0].departure.estimate, value_json.events[0].departure.timetable) }}'
json_attributes_path: $.events[0].departure
json_attributes:
- timetable
- timestamp
- estimate
- delayed
- day
- name: "KVB Abfahrt 2 Line"
value_template: '{{ value_json.events[1].line.number }}'
json_attributes_path: $.events[1].line
json_attributes:
- direction
- product
- name: "KVB Abfahrt 2 Departure"
value_template: '{{ iif(value_json.events[1].departure.estimate is defined, value_json.events[1].departure.estimate, value_json.events[1].departure.timetable) }}'
json_attributes_path: $.events[1].departure
json_attributes:
- timetable
- timestamp
- estimate
- delayed
- day
- name: "KVB Abfahrt 3 Line"
value_template: '{{ value_json.events[2].line.number }}'
json_attributes_path: $.events[2].line
json_attributes:
- direction
- product
- name: "KVB Abfahrt 3 Departure"
value_template: '{{ iif(value_json.events[2].departure.estimate is defined, value_json.events[2].departure.estimate, value_json.events[2].departure.timetable) }}'
json_attributes_path: $.events[2].departure
json_attributes:
- timetable
- timestamp
- estimate
- delayed
- day
homeassistant:
customize_glob:
"sensor.kvb_abfahrt_*_line":
icon: mdi:train
"sensor.kvb_abfahrt_*_departure":
icon: mdi:clock-outline
The first thing you need to do is to create a personal request here:
The generated ID (https://www.vrs.de/am/s/<ID>
) you put into the URL (https://www.vrs.de/index.php?eID=tx_vrsinfo_ass2_departuremonitor&i=<ID>
). In my example, the query is for the stop Chlodwigplatz in Südstadt.
Lovelace:
cards:
- type: custom:config-template-card
variables:
- states['sensor.kvb_abfahrt_1_line'].state
- states['sensor.kvb_abfahrt_1_line'].attributes.direction
- states['sensor.kvb_abfahrt_2_line'].state
- states['sensor.kvb_abfahrt_2_line'].attributes.direction
- states['sensor.kvb_abfahrt_3_line'].state
- states['sensor.kvb_abfahrt_3_line'].attributes.direction
entities:
- ${vars[0]}
- ${vars[2]}
- ${vars[4]}
card:
type: entities
entities:
- entity: sensor.kvb_abfahrt_1_departure
icon: mdi:train
name: ${vars[0] + "\xa0".repeat(5) + vars[1]}
type: custom:multiple-entity-row
- entity: sensor.kvb_abfahrt_2_departure
icon: mdi:train
name: ${vars[2] + "\xa0".repeat(5) + vars[3]}
type: custom:multiple-entity-row
- entity: sensor.kvb_abfahrt_3_departure
icon: mdi:train
name: ${vars[4] + "\xa0".repeat(5) + vars[5]}
type: custom:multiple-entity-row
gridcol: 1
gridrow: 1
type: vertical-stack
title: Abfahrt Chlodwigplatz

Please let me know if the instructions were comprehensible and work!
Many greetings from the Südstadt!