Sčítání hmotnosti použitého filamentu se mi podařilo opravit tím, že jsem si vytvořil proměnnou souborů, které odpovídaly datu, které jsem zadal a poté s nimi provedl součet hmotností. K tomu jsem použil už funkci, kterou jsem používal již dříve.
def calculate_total_filament(data):
total = sum(item.get('filament_used_g', 0) for item in data)
return total
Předtím jsem tedy nepoužíval hodnotu calculate_total_filament a tak program počítal se všemi soubory.
filtered_files = [file for file in files if 'uploadedOn' in file and
datetime.strptime(file['uploadedOn'], "%Y-%m-%dT%H:%M:%S.%fZ") >= cutoff_date]
total_material_used += calculate_total_filament(filtered_files)
Po přidání těchto tří řádků už vše běželo tak jak tomu bylo původně zamýšleno
Implementace druhého API
K tomu abych byl schopen spočítat všechny vytištěné soubory je potřeba použít druhé API (print-jobs), které ale neobsahuje hmotnost filamentu.
Mojí strategií tedy bylo vzít tisky za danou dobu a přidat k nim přes file-id, které sdílí soubor s tiskem hmotnost filamentu, případně i další informace a poté je sečíst a sdělit uživateli.
Sice na tom stále pracuji, ale již se mi podařilo narazit na pár problémů, po napsání prvního kódu a spuštění programu se nezobrazovali žádné tisky ani po upravení zadané doby. Napadlo mě, že se nejspíše špatně čte file-id, protože kromě relevantních informací vše fungovalo správně. Zobrazil jsem si tedy data z API souborů a zjistil jsem, že každý soubor obsahuje hned několik různých id, každé v jiném listu.
Poté jsem se podíval i do json souboru z API tisků a přišel jsem na to, že v něm je sice napsané “file_id” jenže v souborech je pouze “id”, implementoval jsem tedy funkci, která tuto situaci řeší, bohužel to celkovému problému ale nepomohlo.
def match_and_rename_file_id(print_jobs, files):
matched_print_jobs = []
for print_job in print_jobs:
file_id_in_job = print_job.get('file_id')
for file in files:
file_id_in_file = file.get('id')
if file_id_in_job == file_id_in_file:
# Rename the IDs as 'file_is' in both matched entries
print_job['file_is'] = file_id_in_job
file['file_is'] = file_id_in_file
matched_print_jobs.append((print_job, file))
break
return matched_print_jobs
Neustále se mi zobrazovalo 0g využito a 0 souborů vytisknuto i za dlouhou dobu. Rozhodl jsem se tedy rozebrat jednotlivé funkce, abych přišel na to v které je problém, ukázalo se že získávání dat z print-jobs API se mi nepovedlo udělat správně a můj program selhává při získávání časových údajů, i poté co jsem se snažil získat pouhý list časů kdy byly jednotlivé výtisky spuštěny.
Patrik