import asyncio from aiohttp import ClientSession from time import sleep from typing import NamedTuple, List from datetime import datetime import xml.etree.ElementTree as ET from colorama import init, Fore from csv import writer from async_retrying import retry screen = False csvfn = './deps.csv' class Departure(NamedTuple): stop: str countdown: int linenum: str direction: str plantime: tuple isrealtime: bool delay: int rtstatus: str genattr: List[str] @retry(attempts=10) async def dmreq(session, ifopt, limit=20): payload = {'name_dm':ifopt, 'type_dm':'any', 'mode':'direct', 'useRealtime':'1', 'limit':str(limit)}#, 'includedMeans':['5', '6', '7']} #payload['itdTime']='1200' #payload['itdDate']='180109' async with session.get('http://openservice-test.vrr.de/vrr/XML_DM_REQUEST', params=payload) as r: content = await r.read() root = ET.fromstring(content) #tree = ET.parse(...) #root = tree.getroot() return (ifopt, root) sem = asyncio.Semaphore(10) # https://stackoverflow.com/a/48486557 async def safe_dmreq(*args, **kwa): async with sem: return await dmreq(*args, **kwa) def deps(root): departures = [] for departure in root.iter('itdDeparture'): stop = "".join(root.find('itdDepartureMonitorRequest').find('itdOdv').find('itdOdvName').find('odvNameElem').itertext()) servingline = departure.find('itdServingLine') countdown = int(departure.attrib['countdown']) linenum = servingline.attrib['number'] direction = servingline.attrib['direction'] realtime = bool(int(servingline.attrib['realtime'])) delay = 0 rtstatus = "" itdtime = departure.find('itdDateTime').find('itdTime') plantime = (int(itdtime.attrib['hour']), int(itdtime.attrib['minute'])) #if countdown > 59: # realtime = False if realtime: delay = int(servingline.find('itdNoTrain').attrib['delay']) rtstatus = departure.attrib.get('realtimeStatus', "") genattr = [] ga = departure.find('genAttrList') if ga: for gae in ga: gaename = gae.findtext('name', default="") gaevalue = gae.findtext('value', default="") genattr.append(gaename+"="+gaevalue) departures.append(Departure(stop=stop, countdown=countdown, linenum=linenum, direction=direction, plantime=plantime, isrealtime=realtime, delay=delay, rtstatus=rtstatus, genattr=genattr)) return departures def depstrings(departures, directionwidth=30): strings = [] for dep in departures: color = Fore.RESET currentstring = "" if not dep.isrealtime: color = Fore.WHITE elif dep.delay > 5 or dep.delay == -9999: color = Fore.RED elif dep.delay > 1: color = Fore.YELLOW else: color = Fore.GREEN currentstring += ('{:>4}'.format(dep.linenum) + " " + ('{:<'+str(directionwidth)+'}').format(dep.direction[:directionwidth]) + " ") currentstring += color if dep.countdown == 0: currentstring += "jetzt" elif dep.delay == -9999: currentstring +=" xxx " elif dep.countdown > 59: currentstring += tt(dep.plantime) elif dep.countdown > 9: currentstring += (str(dep.countdown) + "min") else: currentstring += (" " + str(dep.countdown) + "min") if dep.isrealtime and dep.delay != -9999: currentstring += (color + "(+" + str(dep.delay) + ")" + Fore.RESET) else: currentstring += Fore.RESET strings.append([dep.countdown, currentstring]) strings.sort(key=lambda x: x[0]) return strings def tt(timetuple): return str(timetuple[0]).zfill(2) + ":" + str(timetuple[1]).zfill(2) async def loopreqs(ifopts): alldeps = {} tasks = [] async with ClientSession() as session: for ifopt in ifopts: #try: task = asyncio.ensure_future(safe_dmreq(session, ifopt, 25)) tasks.append(task) responses = await asyncio.gather(*tasks) for ifopt, root in responses: alldeps[ifopt] = deps(root) return alldeps if __name__ == "__main__": init() # colorama # alle HST ifopts = ['de:05913:111', 'de:05913:218', 'de:05913:232', 'de:05913:276', 'de:05913:277', 'de:05913:278', 'de:05913:372', 'de:05913:423', 'de:05913:458', 'de:05913:460', 'de:05913:586', 'de:05913:761', 'de:05913:1649', 'de:05913:1652', 'de05913:1686', 'de:05914:2001', 'de:05914:2002', 'de:05914:2003', 'de:05914:2004', 'de:05914:2005', 'de:05914:2006', 'de:05914:2007', 'de:05914:2008', 'de:05914:2009', 'de:05914:2010', 'de:05914:2011', 'de:05914:2012', 'de:05914:2013', 'de:05914:2014', 'de:05914:2015', 'de:05914:2016', 'de:05914:2017', 'de:05914:2018', 'de:05914:2019', 'de:05914:2020', 'de:05914:2021', 'de:05914:2022', 'de:05914:2023', 'de:05914:2024', 'de:05914:2025', 'de:05914:2026', 'de:05914:2027', 'de:05914:2028', 'de:05914:2029', 'de:05914:2030', 'de:05914:2032', 'de:05914:2033', 'de:05914:2035', 'de:05914:2036', 'de:05914:2037', 'de:05914:2038', 'de:05914:2039', 'de:05914:2040', 'de:05914:2041', 'de:05914:2042', 'de:05914:2043', 'de:05914:2044', 'de:05914:2045', 'de:05914:2046', 'de:05914:2047', 'de:05914:2048', 'de:05914:2049', 'de:05914:2050', 'de:05914:2051', 'de:05914:2052', 'de:05914:2053', 'de:05914:2054', 'de:05914:2055', 'de:05914:2056', 'de:05914:2057', 'de:05914:2058', 'de:05914:2059', 'de:05914:2060', 'de:05914:2061', 'de:05914:2062', 'de:05914:2063', 'de:05914:2064', 'de:05914:2065', 'de:05914:2066', 'de:05914:2067', 'de:05914:2068', 'de:05914:2069', 'de:05914:2070', 'de:05914:2073', 'de:05914:2074', 'de:05914:2075', 'de:05914:2076', 'de:05914:2077', 'de:05914:2078', 'de:05914:2079', 'de:05914:2080', 'de:05914:2081', 'de:05914:2082', 'de:05914:2083', 'de:05914:2084', 'de:05914:2085', 'de:05914:2086', 'de:05914:2087', 'de:05914:2088', 'de:05914:2089', 'de:05914:2091', 'de:05914:2092', 'de:05914:2093', 'de:05914:2094', 'de:05914:2095', 'de:05914:2096', 'de:05914:2097', 'de:05914:2098', 'de:05914:2099', 'de:05914:2100', 'de:05914:2101', 'de:05914:2103', 'de:05914:2104', 'de:05914:2105', 'de:05914:2106', 'de:05914:2107', 'de:05914:2108', 'de:05914:2109', 'de:05914:2111', 'de:05914:2112', 'de:05914:2113', 'de:05914:2114', 'de:05914:2115', 'de:05914:2116', 'de:05914:2117', 'de:05914:2118', 'de:05914:2121', 'de:05914:2122', 'de:05914:2123', 'de:05914:2124', 'de:05914:2125', 'de:05914:2126', 'de:05914:2127', 'de:05914:2128', 'de:05914:2129', 'de:05914:2130', 'de:05914:2131', 'de:05914:2132', 'de:05914:2133', 'de:05914:2134', 'de:05914:2135', 'de:05914:2136', 'de:05914:2137', 'de:05914:2138', 'de:05914:2139', 'de:05914:2141', 'de:05914:2142', 'de:05914:2143', 'de:05914:2144', 'de:05914:2145', 'de:05914:2146', 'de:05914:2147', 'de:05914:2148', 'de:05914:2149', 'de:05914:2150', 'de:05914:2151', 'de:05914:2152', 'de:05914:2153', 'de:05914:2154', 'de:05914:2155', 'de:05914:2157', 'de:05914:2158', 'de:05914:2159', 'de:05914:2160', 'de:05914:2161', 'de:05914:2162', 'de:05914:2163', 'de:05914:2164', 'de:05914:2165', 'de:05914:2166', 'de:05914:2168', 'de:05914:2172', 'de:05914:2173', 'de:05914:2174', 'de:05914:2175', 'de:05914:2176', 'de:05914:2177', 'de:05914:2178', 'de:05914:2179', 'de:05914:2180', 'de:05914:2181', 'de:05914:2182', 'de:05914:2183', 'de:05914:2185', 'de:05914:2186', 'de:05914:2187', 'de:05914:2188', 'de:05914:2189', 'de:05914:2190', 'de:05914:2193', 'de:05914:2194', 'de:05914:2195', 'de:05914:2196', 'de:05914:2197', 'de:05914:2198', 'de:05914:2199', 'de:05914:2200', 'de:05914:2201', 'de:05914:2202', 'de:05914:2204', 'de:05914:2205', 'de:05914:2206', 'de:05914:2207', 'de:05914:2208', 'de:05914:2209', 'de:05914:2210', 'de:05914:2211', 'de:05914:2212', 'de:05914:2213', 'de:05914:2214', 'de:05914:2215', 'de:05914:2216', 'de:05914:2217', 'de:05914:2218', 'de:05914:2219', 'de:05914:2221', 'de:05914:2222', 'de:05914:2223', 'de:05914:2224', 'de:05914:2228', 'de:05914:2229', 'de:05914:2230', 'de:05914:2232', 'de:05914:2233', 'de:05914:2234', 'de:05914:2235', 'de:05914:2236', 'de:05914:2238', 'de:05914:2239', 'de:05914:2241', 'de:05914:2242', 'de:05914:2243', 'de:05914:2244', 'de:05914:2245', 'de:05954:2252', 'de:05954:2253', 'de:05954:2254', 'de:05914:2258', 'de:05914:2259', 'de:05914:2260', 'de:05914:2261', 'de:05914:2262', 'de:05914:2263', 'de:05914:2264', 'de:05914:2265', 'de:05914:2266', 'de:05954:2268', 'de:05954:2269', 'de:05954:2270', 'de:05954:2271', 'de:05954:2272', 'de:05954:2273', 'de:05954:2274', 'de:05954:2275', 'de:05954:2276', 'de:05954:2277', 'de:05954:2278', 'de:05914:2279', 'de:05914:2280', 'de:05954:2281', 'de:05914:2282', 'de:05914:2283', 'de:05954:2284', 'de:05954:2285', 'de:05954:2286', 'de:05954:2287', 'de:05954:2288', 'de:05914:2289', 'de:05914:2290', 'de:05914:2291', 'de:05914:2293', 'de:05914:2294', 'de:05914:2295', 'de:05914:2296', 'de:05914:2298', 'de:05914:2299', 'de:05914:2300', 'de:05914:2301', 'de:05914:2302', 'de:05914:2303', 'de:05914:2304', 'de:05914:2305', 'de:05914:2306', 'de:05914:2307', 'de:05914:2308', 'de:05914:2309', 'de:05914:2310', 'de:05914:2311', 'de:05914:2312', 'de:05914:2316', 'de:05914:2317', 'de:05914:2318', 'de:05914:2321', 'de:05914:2322', 'de:05914:2323', 'de:05914:2324', 'de:05914:2325', 'de:05914:2326', 'de:05914:2327', 'de:05914:2328', 'de:05914:2329', 'de:05914:2330', 'de:05914:2331', 'de:05914:2333', 'de:05914:2334', 'de:05914:2335', 'de:05914:2336', 'de:05914:2337', 'de:05914:2338', 'de:05914:2339', 'de:05914:2340', 'de:05914:2341', 'de:05914:2342', 'de:05914:2343', 'de:05914:2344', 'de:05914:2345', 'de:05914:2347', 'de:05914:2348', 'de:05914:2349', 'de:05914:2350', 'de:05914:2351', 'de:05914:2352', 'de:05914:2353', 'de:05914:2354', 'de:05914:2355', 'de:05914:2356', 'de:05914:2357', 'de:05914:2358', 'de:05914:2359', 'de:05914:2360', 'de:05914:2361', 'de:05914:2362', 'de:05914:2363', 'de:05914:2364', 'de:05914:2365', 'de:05914:2366', 'de:05914:2367', 'de:05914:2368', 'de:05914:2369', 'de:05914:2370', 'de:05914:2371', 'de:05914:2372', 'de:05914:2373', 'de:05914:2374', 'de:05914:2375', 'de:05914:2377', 'de:05914:2378', 'de:05914:2379', 'de:05914:2383', 'de:05914:2384', 'de:05954:2386', 'de:05914:2387', 'de:05914:2388', 'de:05914:2390', 'de:05914:2393', 'de:05914:2395', 'de:05914:2398', 'de:05914:2399', 'de:05914:2400', 'de:05914:2403', 'de:05914:2404', 'de:05914:2407', 'de:05914:2408', 'de:05914:2409', 'de:05914:2410', 'de:05914:2411', 'de:05914:2412', 'de:05914:2414', 'de:05914:2415', 'de:05914:2417', 'de:05914:2422', 'de:05914:2423', 'de:05962:2424', 'de:05962:3347', 'de:05962:3317', 'de:05962:3318', 'de:05962:3320', 'de:05962:3319', 'de:05914:2430', 'de:05914:2431', 'de:05914:2432', 'de:05914:2433', 'de:05914:2435', 'de:05914:2437', 'de:05914:2438', 'de:05914:2439', 'de:05914:2440', 'de:05914:2441', 'de:05914:2442', 'de:05914:2444', 'de:05914:2445', 'de:05914:2446', 'de:05914:2447', 'de:05914:2448', 'de:05914:2449', 'de:05914:2450', 'de:05914:2451', 'de:05914:2452', 'de:05914:2453', 'de:05914:2454', 'de:05914:2455', 'de:05914:2456', 'de:05914:2458', 'de:05914:2461', 'de:05914:2462', 'de:05914:2463', 'de:05914:2464', 'de:05914:2465', 'de:05914:2466', 'de:05914:2467', 'de:05914:2468', 'de:05914:2469', 'de:05914:2470', 'de:05914:2471', 'de:05914:2472', 'de:05914:2473', 'de:05914:2474', 'de:05914:2475', 'de:05914:2476', 'de:05914:2478', 'de:05914:2479', 'de:05914:2481', 'de:05914:2482', 'de:05914:2484', 'de:05914:2485', 'de:05914:2488', 'de:05914:2489', 'de:05914:2490', 'de:05914:2491', 'de:05914:2492', 'de:05914:2493', 'de:05914:2494', 'de:05914:2495', 'de:05914:2496', 'de:05914:2497', 'de:05914:2498', 'de:05914:2499', 'de:05914:2500', 'de:05914:2501', 'de:05914:2502', 'de:05914:2503', 'de:05914:2506', 'de:05914:2507', 'de:05914:2508', 'de:05914:2509', 'de:05914:2510', 'de:05914:2511', 'de:05914:2515', 'de:05914:2516', 'de:05914:2517', 'de:05914:2518', 'de:05914:2520', 'de:05914:2521', 'de:05914:2522', 'de:05914:2523', 'de:05914:2524', 'de:05914:2525', 'de:05914:2526', 'de:05914:2528', 'de:05914:2539', 'de:05914:2540', 'de:05914:2542', 'de:05914:2543', 'de:05914:2545', 'de:05914:2547', 'de:05914:2549', 'de:05914:2550', 'de:05914:2551', 'de:05914:2557', 'de:05914:2559', 'de:05914:2560', 'de:05914:2561', 'de:05914:2562', 'de:05962:3348', 'de:05914:2565', 'de:05914:2566', 'de:05914:2613', 'de:05914:2618', 'de:05914:2619', 'de:05914:2620', 'de:05914:2740', 'de:05914:2741', 'de:05914:2743', 'de:05914:2744', 'de:05914:2749', 'de:05914:2753', 'de:05914:2755', 'de:05914:2756', 'de:05914:2757', 'de:05914:2758', 'de:05914:2761', 'de:05914:2762', 'de:05914:2763', 'de:05914:2772', 'de:05914:2773', 'de:05914:2774', 'de:05914:2870', 'de:05914:2871', 'de:05914:2879', 'de:05914:2937', 'de:05914:2985', 'de:05962:1150', 'de:05914:2992', 'de:05954:8025', 'de:05954:8026', 'de:05954:8072', 'de:05954:8080', 'de:05954:8087', 'de:05954:8088', 'de:05954:8217', 'de:05954:8218', 'de:05954:8219', 'de:05954:8220', 'de:05954:8221', 'de:05954:8222', 'de:05954:8282', 'de:05954:8283', 'de:05954:8284', 'de:05954:8285', 'de:05954:8286', 'de:05954:8287', 'de:05954:8288', 'de:05954:8289', 'de:05954:8293', 'de:05954:8294', 'de:05954:8299', 'de:05954:8300', 'de:05954:8301', 'de:05954:8304', 'de:05954:8307', 'de:05954:8309', 'de:05954:8312', 'de:05954:8313', 'de:05954:8332', 'de:05954:8371', 'de:05954:8372', 'de:05954:8373', 'de:05954:8374', 'de:05954:8375', 'de:05954:8376', 'de:05954:8621'] # HST, Hagen # ifopts = ['de:05914:2001', 'de:05914:2002', 'de:05914:2003', 'de:05914:2004', 'de:05914:2005', 'de:05914:2006', 'de:05914:2007', 'de:05914:2008', 'de:05914:2009', 'de:05914:2010', 'de:05914:2011', 'de:05914:2012', 'de:05914:2013', 'de:05914:2014', 'de:05914:2015', 'de:05914:2016', 'de:05914:2017', 'de:05914:2018', 'de:05914:2019', 'de:05914:2020', 'de:05914:2021', 'de:05914:2022', 'de:05914:2023', 'de:05914:2024', 'de:05914:2025', 'de:05914:2026', 'de:05914:2027', 'de:05914:2028', 'de:05914:2029', 'de:05914:2030', 'de:05914:2032', 'de:05914:2033', 'de:05914:2035', 'de:05914:2036', 'de:05914:2037', 'de:05914:2038', 'de:05914:2039', 'de:05914:2040', 'de:05914:2041', 'de:05914:2042', 'de:05914:2043', 'de:05914:2044', 'de:05914:2045', 'de:05914:2046', 'de:05914:2047', 'de:05914:2048', 'de:05914:2049', 'de:05914:2050', 'de:05914:2051', 'de:05914:2052', 'de:05914:2053', 'de:05914:2054', 'de:05914:2055', 'de:05914:2056', 'de:05914:2057', 'de:05914:2058', 'de:05914:2059', 'de:05914:2060', 'de:05914:2061', 'de:05914:2062', 'de:05914:2063', 'de:05914:2064', 'de:05914:2065', 'de:05914:2066', 'de:05914:2067', 'de:05914:2068', 'de:05914:2069', 'de:05914:2070', 'de:05914:2073', 'de:05914:2074', 'de:05914:2075', 'de:05914:2076', 'de:05914:2077', 'de:05914:2078', 'de:05914:2079', 'de:05914:2080', 'de:05914:2081', 'de:05914:2082', 'de:05914:2083', 'de:05914:2084', 'de:05914:2085', 'de:05914:2086', 'de:05914:2087', 'de:05914:2088', 'de:05914:2089', 'de:05914:2091', 'de:05914:2092', 'de:05914:2093', 'de:05914:2094', 'de:05914:2095', 'de:05914:2096', 'de:05914:2097', 'de:05914:2098', 'de:05914:2099', 'de:05914:2100', 'de:05914:2101', 'de:05914:2103', 'de:05914:2104', 'de:05914:2105', 'de:05914:2106', 'de:05914:2107', 'de:05914:2108', 'de:05914:2109', 'de:05914:2111', 'de:05914:2112', 'de:05914:2113', 'de:05914:2114', 'de:05914:2115', 'de:05914:2116', 'de:05914:2117', 'de:05914:2118', 'de:05914:2121', 'de:05914:2122', 'de:05914:2123', 'de:05914:2124', 'de:05914:2125', 'de:05914:2126', 'de:05914:2127', 'de:05914:2128', 'de:05914:2129', 'de:05914:2130', 'de:05914:2131', 'de:05914:2132', 'de:05914:2133', 'de:05914:2134', 'de:05914:2135', 'de:05914:2136', 'de:05914:2137', 'de:05914:2138', 'de:05914:2139', 'de:05914:2141', 'de:05914:2142', 'de:05914:2143', 'de:05914:2144', 'de:05914:2145', 'de:05914:2146', 'de:05914:2147', 'de:05914:2148', 'de:05914:2149', 'de:05914:2150', 'de:05914:2151', 'de:05914:2152', 'de:05914:2153', 'de:05914:2154', 'de:05914:2155', 'de:05914:2157', 'de:05914:2158', 'de:05914:2159', 'de:05914:2160', 'de:05914:2161', 'de:05914:2162', 'de:05914:2163', 'de:05914:2164', 'de:05914:2165', 'de:05914:2166', 'de:05914:2168', 'de:05914:2172', 'de:05914:2173', 'de:05914:2174', 'de:05914:2175', 'de:05914:2176', 'de:05914:2177', 'de:05914:2178', 'de:05914:2179', 'de:05914:2180', 'de:05914:2181', 'de:05914:2182', 'de:05914:2183', 'de:05914:2185', 'de:05914:2186', 'de:05914:2187', 'de:05914:2188', 'de:05914:2189', 'de:05914:2190', 'de:05914:2193', 'de:05914:2194', 'de:05914:2195', 'de:05914:2196', 'de:05914:2197', 'de:05914:2198', 'de:05914:2199', 'de:05914:2200', 'de:05914:2201', 'de:05914:2202', 'de:05914:2204', 'de:05914:2205', 'de:05914:2206', 'de:05914:2207', 'de:05914:2208', 'de:05914:2209', 'de:05914:2210', 'de:05914:2211', 'de:05914:2212', 'de:05914:2213', 'de:05914:2214', 'de:05914:2215', 'de:05914:2216', 'de:05914:2217', 'de:05914:2218', 'de:05914:2219', 'de:05914:2221', 'de:05914:2222', 'de:05914:2223', 'de:05914:2224', 'de:05914:2228', 'de:05914:2229', 'de:05914:2230', 'de:05914:2232', 'de:05914:2233', 'de:05914:2234', 'de:05914:2235', 'de:05914:2236', 'de:05914:2238', 'de:05914:2239', 'de:05914:2241', 'de:05914:2242', 'de:05914:2243', 'de:05914:2244', 'de:05914:2245', 'de:05914:2258', 'de:05914:2259', 'de:05914:2260', 'de:05914:2261', 'de:05914:2262', 'de:05914:2263', 'de:05914:2264', 'de:05914:2265', 'de:05914:2266', 'de:05914:2279', 'de:05914:2280', 'de:05914:2282', 'de:05914:2283', 'de:05914:2289', 'de:05914:2290', 'de:05914:2291', 'de:05914:2293', 'de:05914:2294', 'de:05914:2295', 'de:05914:2296', 'de:05914:2298', 'de:05914:2299', 'de:05914:2300', 'de:05914:2301', 'de:05914:2302', 'de:05914:2303', 'de:05914:2304', 'de:05914:2305', 'de:05914:2306', 'de:05914:2307', 'de:05914:2308', 'de:05914:2309', 'de:05914:2310', 'de:05914:2311', 'de:05914:2312', 'de:05914:2316', 'de:05914:2317', 'de:05914:2318', 'de:05914:2321', 'de:05914:2322', 'de:05914:2323', 'de:05914:2324', 'de:05914:2325', 'de:05914:2326', 'de:05914:2327', 'de:05914:2328', 'de:05914:2329', 'de:05914:2330', 'de:05914:2331', 'de:05914:2333', 'de:05914:2334', 'de:05914:2335', 'de:05914:2336', 'de:05914:2337', 'de:05914:2338', 'de:05914:2339', 'de:05914:2340', 'de:05914:2341', 'de:05914:2342', 'de:05914:2343', 'de:05914:2344', 'de:05914:2345', 'de:05914:2347', 'de:05914:2348', 'de:05914:2349', 'de:05914:2350', 'de:05914:2351', 'de:05914:2352', 'de:05914:2353', 'de:05914:2354', 'de:05914:2355', 'de:05914:2356', 'de:05914:2357', 'de:05914:2358', 'de:05914:2359', 'de:05914:2360', 'de:05914:2361', 'de:05914:2362', 'de:05914:2363', 'de:05914:2364', 'de:05914:2365', 'de:05914:2366', 'de:05914:2367', 'de:05914:2368', 'de:05914:2369', 'de:05914:2370', 'de:05914:2371', 'de:05914:2372', 'de:05914:2373', 'de:05914:2374', 'de:05914:2375', 'de:05914:2377', 'de:05914:2378', 'de:05914:2379', 'de:05914:2383', 'de:05914:2384', 'de:05914:2387', 'de:05914:2388', 'de:05914:2390', 'de:05914:2393', 'de:05914:2395', 'de:05914:2398', 'de:05914:2399', 'de:05914:2400', 'de:05914:2403', 'de:05914:2404', 'de:05914:2407', 'de:05914:2408', 'de:05914:2409', 'de:05914:2410', 'de:05914:2411', 'de:05914:2412', 'de:05914:2414', 'de:05914:2415', 'de:05914:2417', 'de:05914:2422', 'de:05914:2423', 'de:05914:2430', 'de:05914:2431', 'de:05914:2432', 'de:05914:2433', 'de:05914:2435', 'de:05914:2437', 'de:05914:2438', 'de:05914:2439', 'de:05914:2440', 'de:05914:2441', 'de:05914:2442', 'de:05914:2444', 'de:05914:2445', 'de:05914:2446', 'de:05914:2447', 'de:05914:2448', 'de:05914:2449', 'de:05914:2450', 'de:05914:2451', 'de:05914:2452', 'de:05914:2453', 'de:05914:2454', 'de:05914:2455', 'de:05914:2456', 'de:05914:2458', 'de:05914:2461', 'de:05914:2462', 'de:05914:2463', 'de:05914:2464', 'de:05914:2465', 'de:05914:2466', 'de:05914:2467', 'de:05914:2468', 'de:05914:2469', 'de:05914:2470', 'de:05914:2471', 'de:05914:2472', 'de:05914:2473', 'de:05914:2474', 'de:05914:2475', 'de:05914:2476', 'de:05914:2478', 'de:05914:2479', 'de:05914:2481', 'de:05914:2482', 'de:05914:2484', 'de:05914:2485', 'de:05914:2488', 'de:05914:2489', 'de:05914:2490', 'de:05914:2491', 'de:05914:2492', 'de:05914:2493', 'de:05914:2494', 'de:05914:2495', 'de:05914:2496', 'de:05914:2497', 'de:05914:2498', 'de:05914:2499', 'de:05914:2500', 'de:05914:2501', 'de:05914:2502', 'de:05914:2503', 'de:05914:2506', 'de:05914:2507', 'de:05914:2508', 'de:05914:2509', 'de:05914:2510', 'de:05914:2511', 'de:05914:2515', 'de:05914:2516', 'de:05914:2517', 'de:05914:2518', 'de:05914:2520', 'de:05914:2521', 'de:05914:2522', 'de:05914:2523', 'de:05914:2524', 'de:05914:2525', 'de:05914:2526', 'de:05914:2528', 'de:05914:2539', 'de:05914:2540', 'de:05914:2542', 'de:05914:2543', 'de:05914:2545', 'de:05914:2547', 'de:05914:2549', 'de:05914:2550', 'de:05914:2551', 'de:05914:2557', 'de:05914:2559', 'de:05914:2560', 'de:05914:2561', 'de:05914:2562', 'de:05914:2565', 'de:05914:2566', 'de:05914:2613', 'de:05914:2618', 'de:05914:2619', 'de:05914:2620', 'de:05914:2740', 'de:05914:2741', 'de:05914:2743', 'de:05914:2744', 'de:05914:2749', 'de:05914:2753', 'de:05914:2755', 'de:05914:2756', 'de:05914:2757', 'de:05914:2758', 'de:05914:2761', 'de:05914:2762', 'de:05914:2763', 'de:05914:2772', 'de:05914:2773', 'de:05914:2774', 'de:05914:2870', 'de:05914:2871', 'de:05914:2879', 'de:05914:2937', 'de:05914:2985', 'de:05914:2992'] # test #ifopts = ['de:05914:2020', 'de:05914:2003', 'de:05914:2435'] rtmax = 35 ausfaelle = [] ausfalldeps = [] rtabfahrtenmax = {} loop = asyncio.get_event_loop() future = asyncio.ensure_future(loopreqs(ifopts)) alldeps = loop.run_until_complete(future) for ifopt in alldeps: departures = alldeps[ifopt] newausfall = False for departure in departures: if departure.countdown <= rtmax: if departure.linenum not in rtabfahrtenmax: rtabfahrtenmax[departure.linenum] = {} if departure.direction not in rtabfahrtenmax[departure.linenum]: rtabfahrtenmax[departure.linenum][departure.direction] = [] rtabfahrtenmax[departure.linenum][departure.direction].append(departure.isrealtime) if departure.delay == -9999: newausfall = True ausfaelle.append(f"{departure.stop} ({ifopt}): {departure.linenum} => {departure.direction} ({tt(departure.plantime)})") ausfalldeps.append((ifopt, departure)) # Bildschirmausgabe if screen: if departures: print(f"=== {departures[0].stop} ({ifopt}) ===") else: print(f"Keine Abfahrten für {ifopt} gefunden") strs = depstrings(departures) for s in strs: print(s[1]) print("") if newausfall: print("==== Ausfälle ====", "\n".join(ausfaelle), "", sep="\n") # sleep(0.1) if screen: print("Sammlung beendet\n") print(f"Echtzeitabfahrten (<= {rtmax} min) nach Linie und Richtung:") for linenum, directions in sorted(rtabfahrtenmax.items()): print(linenum) for direction, rta in sorted(directions.items()): rtabfahrten = rta.count(True) alleabfahrten = len(rta) print(f" - {direction}: {rtabfahrten}/{alleabfahrten} ({round((rtabfahrten/alleabfahrten)*100)} %)") print("") nowtimestr = datetime.now().strftime("%Y-%m-%d %H:%M") if screen: print(f"Gefundene Ausfälle ~{nowtimestr}:", ("\n"+"\n".join(ausfaelle)) if ausfaelle else " keine", sep="") else: with open(csvfn, 'a') as f: writer(f).writerows(sorted(list([(nowtimestr, dep.stop, ifopt, dep.linenum, dep.direction, tt(dep.plantime), dep.rtstatus, "|".join(dep.genattr)) for ifopt, dep in ausfalldeps]), key=lambda x: (x[3], x[4], x[5])))