diff --git a/.gitignore b/.gitignore index 4984f45a..bbdeec4e 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ .vscode/launch.json .vscode/ipch .dependencies -.venv \ No newline at end of file +.venv +.backend\module\__pycache__ \ No newline at end of file diff --git a/20240217.txt b/backend/data/20240217.csv similarity index 100% rename from 20240217.txt rename to backend/data/20240217.csv diff --git a/20240321.txt b/backend/data/20240321.txt similarity index 99% rename from 20240321.txt rename to backend/data/20240321.txt index d348e55c..dbb10782 100644 --- a/20240321.txt +++ b/backend/data/20240321.txt @@ -1,18 +1,18 @@ -received_at application_id device_id f_port f_cnt rssi snr data_rate_index consumed_airtime frm_payload decoded_payload -2024-03-22T01:34:09.089808776Z firework eui-70b3d57ed005de4f 1 603 -34 13.3 - 0.051456s UnR7bA== {'degreesC': 27.002, 'humidity': 14.0015} -2024-03-22T01:34:30.244679982Z firework eui-70b3d57ed005de4f 1 604 -38 13.5 - 0.051456s UnR7bA== {'degreesC': 27.002, 'humidity': 14.0015} -2024-03-22T01:34:56.931611974Z firework eui-70b3d57ed005de4f 1 606 -39 9 - 0.051456s UnR7bA== {'degreesC': 27.002, 'humidity': 14.0015} -2024-03-22T01:35:18.084203425Z firework eui-70b3d57ed005de4f 1 607 -39 12.8 - 0.051456s UnR7bA== {'degreesC': 27.002, 'humidity': 14.0015} -2024-03-22T01:35:39.247520378Z firework eui-70b3d57ed005de4f 1 608 -42 13.5 - 0.051456s UnR7bA== {'degreesC': 27.002, 'humidity': 14.0015} -2024-03-22T01:36:00.381748334Z firework eui-70b3d57ed005de4f 1 609 -40 14 - 0.051456s UnR7bA== {'degreesC': 27.002, 'humidity': 14.0015} -2024-03-22T01:36:21.530597867Z firework eui-70b3d57ed005de4f 1 610 -41 13.3 - 0.051456s UnR7bA== {'degreesC': 27.002, 'humidity': 14.0015} -2024-03-22T01:37:03.822230643Z firework eui-70b3d57ed005de4f 1 612 -39 13.3 - 0.051456s UnR7bA== {'degreesC': 27.002, 'humidity': 14.0015} -2024-03-22T01:37:24.987025935Z firework eui-70b3d57ed005de4f 1 613 -40 13.8 - 0.051456s UnR7bA== {'degreesC': 27.002, 'humidity': 14.0015} -2024-03-22T01:37:46.126436730Z firework eui-70b3d57ed005de4f 1 614 -38 13.3 - 0.051456s UnR7bA== {'degreesC': 27.002, 'humidity': 14.0015} -2024-03-22T01:38:07.294680897Z firework eui-70b3d57ed005de4f 1 615 -40 13.8 - 0.051456s UnR7bA== {'degreesC': 27.002, 'humidity': 14.0015} -2024-03-22T01:38:28.422297233Z firework eui-70b3d57ed005de4f 1 616 -34 13.5 - 0.051456s UnR7bA== {'degreesC': 27.002, 'humidity': 14.0015} -2024-03-22T01:38:49.567996070Z firework eui-70b3d57ed005de4f 1 617 -34 13.3 - 0.051456s UnR7bA== {'degreesC': 27.002, 'humidity': 14.0015} -2024-03-22T01:39:10.713545944Z firework eui-70b3d57ed005de4f 1 618 -48 13.5 - 0.051456s UnR7bA== {'degreesC': 27.002, 'humidity': 14.0015} -2024-03-22T01:39:31.874464669Z firework eui-70b3d57ed005de4f 1 619 -49 12.3 - 0.051456s UnR7bA== {'degreesC': 27.002, 'humidity': 14.0015} -2024-03-22T01:40:14.200578459Z firework eui-70b3d57ed005de4f 1 621 -48 11.5 - 0.051456s UnR7bA== {'degreesC': 27.002, 'humidity': 14.0015} -2024-03-22T01:40:35.319163490Z firework eui-70b3d57ed005de4f 1 622 -46 13.8 - 0.051456s UnR7bA== {'degreesC': 27.002, 'humidity': 14.0015} +received_at application_id device_id f_port f_cnt rssi snr data_rate_index consumed_airtime frm_payload decoded_payload +2024-03-22T01:34:09.089808776Z firework eui-70b3d57ed005de4f 1 603 -34 13.3 - 0.051456s UnR7bA== {'degreesC': 27.002, 'humidity': 14.0015} +2024-03-22T01:34:30.244679982Z firework eui-70b3d57ed005de4f 1 604 -38 13.5 - 0.051456s UnR7bA== {'degreesC': 27.002, 'humidity': 14.0015} +2024-03-22T01:34:56.931611974Z firework eui-70b3d57ed005de4f 1 606 -39 9 - 0.051456s UnR7bA== {'degreesC': 27.002, 'humidity': 14.0015} +2024-03-22T01:35:18.084203425Z firework eui-70b3d57ed005de4f 1 607 -39 12.8 - 0.051456s UnR7bA== {'degreesC': 27.002, 'humidity': 14.0015} +2024-03-22T01:35:39.247520378Z firework eui-70b3d57ed005de4f 1 608 -42 13.5 - 0.051456s UnR7bA== {'degreesC': 27.002, 'humidity': 14.0015} +2024-03-22T01:36:00.381748334Z firework eui-70b3d57ed005de4f 1 609 -40 14 - 0.051456s UnR7bA== {'degreesC': 27.002, 'humidity': 14.0015} +2024-03-22T01:36:21.530597867Z firework eui-70b3d57ed005de4f 1 610 -41 13.3 - 0.051456s UnR7bA== {'degreesC': 27.002, 'humidity': 14.0015} +2024-03-22T01:37:03.822230643Z firework eui-70b3d57ed005de4f 1 612 -39 13.3 - 0.051456s UnR7bA== {'degreesC': 27.002, 'humidity': 14.0015} +2024-03-22T01:37:24.987025935Z firework eui-70b3d57ed005de4f 1 613 -40 13.8 - 0.051456s UnR7bA== {'degreesC': 27.002, 'humidity': 14.0015} +2024-03-22T01:37:46.126436730Z firework eui-70b3d57ed005de4f 1 614 -38 13.3 - 0.051456s UnR7bA== {'degreesC': 27.002, 'humidity': 14.0015} +2024-03-22T01:38:07.294680897Z firework eui-70b3d57ed005de4f 1 615 -40 13.8 - 0.051456s UnR7bA== {'degreesC': 27.002, 'humidity': 14.0015} +2024-03-22T01:38:28.422297233Z firework eui-70b3d57ed005de4f 1 616 -34 13.5 - 0.051456s UnR7bA== {'degreesC': 27.002, 'humidity': 14.0015} +2024-03-22T01:38:49.567996070Z firework eui-70b3d57ed005de4f 1 617 -34 13.3 - 0.051456s UnR7bA== {'degreesC': 27.002, 'humidity': 14.0015} +2024-03-22T01:39:10.713545944Z firework eui-70b3d57ed005de4f 1 618 -48 13.5 - 0.051456s UnR7bA== {'degreesC': 27.002, 'humidity': 14.0015} +2024-03-22T01:39:31.874464669Z firework eui-70b3d57ed005de4f 1 619 -49 12.3 - 0.051456s UnR7bA== {'degreesC': 27.002, 'humidity': 14.0015} +2024-03-22T01:40:14.200578459Z firework eui-70b3d57ed005de4f 1 621 -48 11.5 - 0.051456s UnR7bA== {'degreesC': 27.002, 'humidity': 14.0015} +2024-03-22T01:40:35.319163490Z firework eui-70b3d57ed005de4f 1 622 -46 13.8 - 0.051456s UnR7bA== {'degreesC': 27.002, 'humidity': 14.0015} diff --git a/backend/data/20240610.csv b/backend/data/20240610.csv new file mode 100644 index 00000000..89f33e8b --- /dev/null +++ b/backend/data/20240610.csv @@ -0,0 +1,177 @@ +received_at,application_id,device_id,f_port,f_cnt,rssi,snr,data_rate_index,consumed_airtime,frm_payload,decoded_payload +2024-06-11T01:57:19.102405669Z,firework,eui-70b3d57ed005de4f,1,160,-35,13.5,-,0.051456s,AHQfbQ==,"{'degreesC': 25, 'humidity': 16.0034}" +2024-06-11T01:57:40.239834323Z,firework,eui-70b3d57ed005de4f,1,161,-40,13.3,-,0.051456s,AHQfbQ==,"{'degreesC': 25, 'humidity': 16.0034}" +2024-06-11T01:59:04.849703278Z,firework,eui-70b3d57ed005de4f,1,165,-38,13.5,-,0.051456s,AHQfbQ==,"{'degreesC': 25, 'humidity': 16.0034}" +2024-06-11T01:59:25.981624132Z,firework,eui-70b3d57ed005de4f,1,166,-38,13.8,-,0.051456s,AHQfbQ==,"{'degreesC': 25, 'humidity': 16.0034}" +2024-06-11T01:59:47.121204828Z,firework,eui-70b3d57ed005de4f,1,167,-40,9.3,-,0.051456s,AHQfbQ==,"{'degreesC': 25, 'humidity': 16.0034}" +2024-06-11T02:00:08.273196858Z,firework,eui-70b3d57ed005de4f,1,168,-40,13.3,-,0.051456s,AHQfbQ==,"{'degreesC': 25, 'humidity': 16.0034}" +2024-06-11T02:00:29.417581296Z,firework,eui-70b3d57ed005de4f,1,169,-36,13.3,-,0.051456s,AHQfbQ==,"{'degreesC': 25, 'humidity': 16.0034}" +2024-06-11T02:00:50.569672642Z,firework,eui-70b3d57ed005de4f,1,170,-29,13.8,-,0.051456s,AHQfbQ==,"{'degreesC': 25, 'humidity': 16.0034}" +2024-06-11T02:01:11.719341072Z,firework,eui-70b3d57ed005de4f,1,171,-28,13.3,-,0.051456s,AHQfbQ==,"{'degreesC': 25, 'humidity': 16.0034}" +2024-06-11T02:01:32.862537717Z,firework,eui-70b3d57ed005de4f,1,172,-29,10.8,-,0.051456s,AHQfbQ==,"{'degreesC': 25, 'humidity': 16.0034}" +2024-06-11T02:01:54.019183453Z,firework,eui-70b3d57ed005de4f,1,173,-28,13.3,-,0.051456s,AHQfbQ==,"{'degreesC': 25, 'humidity': 16.0034}" +2024-06-11T02:02:15.160968802Z,firework,eui-70b3d57ed005de4f,1,174,-29,13.3,-,0.051456s,AHQfbQ==,"{'degreesC': 25, 'humidity': 16.0034}" +2024-06-11T02:02:36.326186585Z,firework,eui-70b3d57ed005de4f,1,175,-29,13.3,-,0.051456s,AHQfbQ==,"{'degreesC': 25, 'humidity': 16.0034}" +2024-06-11T02:02:57.474483658Z,firework,eui-70b3d57ed005de4f,1,176,-28,12.8,-,0.051456s,AHQfbQ==,"{'degreesC': 25, 'humidity': 16.0034}" +2024-06-11T02:03:18.614813884Z,firework,eui-70b3d57ed005de4f,1,177,-28,13.8,-,0.051456s,AHQfbQ==,"{'degreesC': 25, 'humidity': 16.0034}" +2024-06-11T02:03:39.755253249Z,firework,eui-70b3d57ed005de4f,1,178,-29,13.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:04:00.900596276Z,firework,eui-70b3d57ed005de4f,1,179,-28,14,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:04:22.076301927Z,firework,eui-70b3d57ed005de4f,1,180,-28,13,-,0.051456s,AHQfbQ==,"{'degreesC': 25, 'humidity': 16.0034}" +2024-06-11T02:04:43.204251326Z,firework,eui-70b3d57ed005de4f,1,181,-28,14.3,-,0.051456s,AHQfbQ==,"{'degreesC': 25, 'humidity': 16.0034}" +2024-06-11T02:05:04.380296170Z,firework,eui-70b3d57ed005de4f,1,182,-28,13.5,-,0.051456s,AHQfbQ==,"{'degreesC': 25, 'humidity': 16.0034}" +2024-06-11T02:05:25.505070611Z,firework,eui-70b3d57ed005de4f,1,183,-28,13.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:05:46.653269664Z,firework,eui-70b3d57ed005de4f,1,184,-28,13.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:06:07.802782748Z,firework,eui-70b3d57ed005de4f,1,185,-28,13,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:06:28.954196451Z,firework,eui-70b3d57ed005de4f,1,186,-29,10.3,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:06:50.109663779Z,firework,eui-70b3d57ed005de4f,1,187,-29,13.3,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:07:11.249617072Z,firework,eui-70b3d57ed005de4f,1,188,-28,13.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:07:32.395820366Z,firework,eui-70b3d57ed005de4f,1,189,-29,10.3,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:07:53.537790567Z,firework,eui-70b3d57ed005de4f,1,190,-29,14.3,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:08:14.689844865Z,firework,eui-70b3d57ed005de4f,1,191,-29,13.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:08:35.846498563Z,firework,eui-70b3d57ed005de4f,1,192,-28,13.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:08:57.000166220Z,firework,eui-70b3d57ed005de4f,1,193,-28,13.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:09:18.166406573Z,firework,eui-70b3d57ed005de4f,1,194,-28,13.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:09:39.288106234Z,firework,eui-70b3d57ed005de4f,1,195,-29,13.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:10:00.575226050Z,firework,eui-70b3d57ed005de4f,1,196,-29,13,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:10:21.578671801Z,firework,eui-70b3d57ed005de4f,1,197,-28,12.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:10:42.734524013Z,firework,eui-70b3d57ed005de4f,1,198,-29,13.3,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:11:03.891959815Z,firework,eui-70b3d57ed005de4f,1,199,-29,12.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:11:25.023734855Z,firework,eui-70b3d57ed005de4f,1,200,-29,13.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:11:46.175411070Z,firework,eui-70b3d57ed005de4f,1,201,-29,10,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:12:12.870562843Z,firework,eui-70b3d57ed005de4f,1,203,-28,14,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:12:34.030479904Z,firework,eui-70b3d57ed005de4f,1,204,-28,13,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:12:55.183229732Z,firework,eui-70b3d57ed005de4f,1,205,-29,14,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:13:16.324240315Z,firework,eui-70b3d57ed005de4f,1,206,-29,10,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:13:37.470853127Z,firework,eui-70b3d57ed005de4f,1,207,-28,14,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:13:58.645616678Z,firework,eui-70b3d57ed005de4f,1,208,-28,14.3,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:14:19.767743520Z,firework,eui-70b3d57ed005de4f,1,209,-29,14,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:14:40.928393503Z,firework,eui-70b3d57ed005de4f,1,210,-28,13.3,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:15:02.074385762Z,firework,eui-70b3d57ed005de4f,1,211,-28,13.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:15:23.215089205Z,firework,eui-70b3d57ed005de4f,1,212,-28,13.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:15:44.365571282Z,firework,eui-70b3d57ed005de4f,1,213,-29,13.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:16:05.515383406Z,firework,eui-70b3d57ed005de4f,1,214,-29,9.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:16:26.661604637Z,firework,eui-70b3d57ed005de4f,1,215,-28,13.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:16:47.816457993Z,firework,eui-70b3d57ed005de4f,1,216,-28,13.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:17:08.955959483Z,firework,eui-70b3d57ed005de4f,1,217,-29,13.3,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:17:30.103496878Z,firework,eui-70b3d57ed005de4f,1,218,-29,13.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:17:51.259529378Z,firework,eui-70b3d57ed005de4f,1,219,-28,13.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:18:12.403327463Z,firework,eui-70b3d57ed005de4f,1,220,-29,13.3,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:18:33.566312730Z,firework,eui-70b3d57ed005de4f,1,221,-28,13.3,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:18:54.702948861Z,firework,eui-70b3d57ed005de4f,1,222,-28,13.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:19:15.857343074Z,firework,eui-70b3d57ed005de4f,1,223,-28,13.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:19:37.019049109Z,firework,eui-70b3d57ed005de4f,1,224,-29,10.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:19:58.154965995Z,firework,eui-70b3d57ed005de4f,1,225,-29,13.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:20:19.301395388Z,firework,eui-70b3d57ed005de4f,1,226,-28,13,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:20:40.450710751Z,firework,eui-70b3d57ed005de4f,1,227,-29,13.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:21:01.596969018Z,firework,eui-70b3d57ed005de4f,1,228,-28,14,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:21:22.748194433Z,firework,eui-70b3d57ed005de4f,1,229,-28,13,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:21:43.900819346Z,firework,eui-70b3d57ed005de4f,1,230,-28,13.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:22:05.070848756Z,firework,eui-70b3d57ed005de4f,1,231,-29,10.3,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:22:26.200390493Z,firework,eui-70b3d57ed005de4f,1,232,-29,13.3,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:22:47.343575947Z,firework,eui-70b3d57ed005de4f,1,233,-28,14,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:23:08.488419544Z,firework,eui-70b3d57ed005de4f,1,234,-28,13.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:23:29.632034492Z,firework,eui-70b3d57ed005de4f,1,235,-28,13.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:23:50.790414934Z,firework,eui-70b3d57ed005de4f,1,236,-29,13.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:24:11.974659806Z,firework,eui-70b3d57ed005de4f,1,237,-28,14,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:24:33.091958161Z,firework,eui-70b3d57ed005de4f,1,238,-28,13.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:24:54.238966655Z,firework,eui-70b3d57ed005de4f,1,239,-29,14.3,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:25:15.398540940Z,firework,eui-70b3d57ed005de4f,1,240,-30,11.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:25:36.530680878Z,firework,eui-70b3d57ed005de4f,1,241,-29,13.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:25:57.689990038Z,firework,eui-70b3d57ed005de4f,1,242,-28,14,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:26:18.849838530Z,firework,eui-70b3d57ed005de4f,1,243,-28,14,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:26:39.996910139Z,firework,eui-70b3d57ed005de4f,1,244,-28,13,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:27:01.117281143Z,firework,eui-70b3d57ed005de4f,1,245,-28,13.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:27:22.278300535Z,firework,eui-70b3d57ed005de4f,1,246,-29,13.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:27:43.414647523Z,firework,eui-70b3d57ed005de4f,1,247,-28,13.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:28:04.570141118Z,firework,eui-70b3d57ed005de4f,1,248,-29,14,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:28:25.725350744Z,firework,eui-70b3d57ed005de4f,1,249,-29,13.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:28:46.868902486Z,firework,eui-70b3d57ed005de4f,1,250,-28,13.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:29:08.023584260Z,firework,eui-70b3d57ed005de4f,1,251,-29,11.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:29:29.181175131Z,firework,eui-70b3d57ed005de4f,1,252,-28,14,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:29:50.319321378Z,firework,eui-70b3d57ed005de4f,1,253,-28,13.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:30:11.461298830Z,firework,eui-70b3d57ed005de4f,1,254,-28,14,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:30:32.609599828Z,firework,eui-70b3d57ed005de4f,1,255,-29,10.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:30:53.769570509Z,firework,eui-70b3d57ed005de4f,1,256,-28,13.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:31:14.912428061Z,firework,eui-70b3d57ed005de4f,1,257,-28,14.3,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:31:36.057076752Z,firework,eui-70b3d57ed005de4f,1,258,-28,14,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:31:57.202521979Z,firework,eui-70b3d57ed005de4f,1,259,-29,13.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:32:18.355238950Z,firework,eui-70b3d57ed005de4f,1,260,-29,13.3,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:32:39.516447534Z,firework,eui-70b3d57ed005de4f,1,261,-28,13.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:33:00.654075985Z,firework,eui-70b3d57ed005de4f,1,262,-28,14.3,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:33:21.823874245Z,firework,eui-70b3d57ed005de4f,1,263,-29,13.3,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:33:42.954613869Z,firework,eui-70b3d57ed005de4f,1,264,-29,13.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:34:04.099229350Z,firework,eui-70b3d57ed005de4f,1,265,-29,10,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:34:25.250045938Z,firework,eui-70b3d57ed005de4f,1,266,-28,14,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:34:46.396776040Z,firework,eui-70b3d57ed005de4f,1,267,-28,13.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:35:07.557647975Z,firework,eui-70b3d57ed005de4f,1,268,-29,13.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:35:28.699718219Z,firework,eui-70b3d57ed005de4f,1,269,-28,13.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:35:49.840934854Z,firework,eui-70b3d57ed005de4f,1,270,-28,13.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:36:10.993924592Z,firework,eui-70b3d57ed005de4f,1,271,-28,13.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:36:32.177513568Z,firework,eui-70b3d57ed005de4f,1,272,-28,13.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:36:53.290946349Z,firework,eui-70b3d57ed005de4f,1,273,-28,13.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:37:14.439765440Z,firework,eui-70b3d57ed005de4f,1,274,-29,10,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:37:35.585700676Z,firework,eui-70b3d57ed005de4f,1,275,-28,13.3,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:37:56.726569021Z,firework,eui-70b3d57ed005de4f,1,276,-28,13.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:38:17.918210917Z,firework,eui-70b3d57ed005de4f,1,277,-28,13.3,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:38:39.036967485Z,firework,eui-70b3d57ed005de4f,1,278,-29,10.3,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:39:00.184024173Z,firework,eui-70b3d57ed005de4f,1,279,-28,13,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:39:21.321516523Z,firework,eui-70b3d57ed005de4f,1,280,-28,13.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:39:42.473431126Z,firework,eui-70b3d57ed005de4f,1,281,-29,13.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:40:03.623772221Z,firework,eui-70b3d57ed005de4f,1,282,-28,13.3,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:40:24.777136892Z,firework,eui-70b3d57ed005de4f,1,283,-28,14,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:40:45.915498309Z,firework,eui-70b3d57ed005de4f,1,284,-28,14,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:41:07.080765519Z,firework,eui-70b3d57ed005de4f,1,285,-28,14,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:41:28.215414949Z,firework,eui-70b3d57ed005de4f,1,286,-29,14,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:41:49.371780048Z,firework,eui-70b3d57ed005de4f,1,287,-32,12.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:42:10.514664611Z,firework,eui-70b3d57ed005de4f,1,288,-34,12.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:42:31.674558633Z,firework,eui-70b3d57ed005de4f,1,289,-36,11,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:42:52.807728622Z,firework,eui-70b3d57ed005de4f,1,290,-34,13.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:43:13.965162524Z,firework,eui-70b3d57ed005de4f,1,291,-39,13.5,-,0.051456s,rm/DbQ==,"{'degreesC': 23.999, 'humidity': 18.0054}" +2024-06-11T02:43:35.112934709Z,firework,eui-70b3d57ed005de4f,1,292,-36,13,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:43:56.262290899Z,firework,eui-70b3d57ed005de4f,1,293,-36,13,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:44:17.409316494Z,firework,eui-70b3d57ed005de4f,1,294,-36,13,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:44:38.558946986Z,firework,eui-70b3d57ed005de4f,1,295,-38,13,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:44:59.702324891Z,firework,eui-70b3d57ed005de4f,1,296,-34,13.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:45:20.856818916Z,firework,eui-70b3d57ed005de4f,1,297,-35,11.3,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:45:42.010656681Z,firework,eui-70b3d57ed005de4f,1,298,-36,13,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:46:03.158517026Z,firework,eui-70b3d57ed005de4f,1,299,-35,13.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:46:24.305444726Z,firework,eui-70b3d57ed005de4f,1,300,-36,12.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:46:45.461540948Z,firework,eui-70b3d57ed005de4f,1,301,-34,13,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:47:06.620469077Z,firework,eui-70b3d57ed005de4f,1,302,-35,13,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:47:27.742223049Z,firework,eui-70b3d57ed005de4f,1,303,-36,13.3,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:47:48.909075830Z,firework,eui-70b3d57ed005de4f,1,304,-36,12.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:48:10.047016379Z,firework,eui-70b3d57ed005de4f,1,305,-37,13.3,-,0.051456s,rm/DbQ==,"{'degreesC': 23.999, 'humidity': 18.0054}" +2024-06-11T02:48:31.217717630Z,firework,eui-70b3d57ed005de4f,1,306,-36,13.5,-,0.051456s,rm/DbQ==,"{'degreesC': 23.999, 'humidity': 18.0054}" +2024-06-11T02:48:52.351320011Z,firework,eui-70b3d57ed005de4f,1,307,-35,11,-,0.051456s,rm/DbQ==,"{'degreesC': 23.999, 'humidity': 18.0054}" +2024-06-11T02:49:13.556266826Z,firework,eui-70b3d57ed005de4f,1,308,-34,13,-,0.051456s,rm/DbQ==,"{'degreesC': 23.999, 'humidity': 18.0054}" +2024-06-11T02:49:34.665342968Z,firework,eui-70b3d57ed005de4f,1,309,-39,13,-,0.051456s,rm/DbQ==,"{'degreesC': 23.999, 'humidity': 18.0054}" +2024-06-11T02:49:55.799753232Z,firework,eui-70b3d57ed005de4f,1,310,-35,13.3,-,0.051456s,rm/DbQ==,"{'degreesC': 23.999, 'humidity': 18.0054}" +2024-06-11T02:50:16.937589552Z,firework,eui-70b3d57ed005de4f,1,311,-34,10.3,-,0.051456s,rm/DbQ==,"{'degreesC': 23.999, 'humidity': 18.0054}" +2024-06-11T02:50:38.089073795Z,firework,eui-70b3d57ed005de4f,1,312,-36,13.3,-,0.051456s,rm/DbQ==,"{'degreesC': 23.999, 'humidity': 18.0054}" +2024-06-11T02:50:59.230705452Z,firework,eui-70b3d57ed005de4f,1,313,-35,13.3,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:51:20.387456994Z,firework,eui-70b3d57ed005de4f,1,314,-35,13.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:51:41.537071338Z,firework,eui-70b3d57ed005de4f,1,315,-35,13.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:52:02.679717369Z,firework,eui-70b3d57ed005de4f,1,316,-34,13.8,-,0.051456s,rm/DbQ==,"{'degreesC': 23.999, 'humidity': 18.0054}" +2024-06-11T02:52:23.838069782Z,firework,eui-70b3d57ed005de4f,1,317,-34,12.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:52:44.985827797Z,firework,eui-70b3d57ed005de4f,1,318,-38,12.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:53:06.124496976Z,firework,eui-70b3d57ed005de4f,1,319,-36,13,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:53:27.277719571Z,firework,eui-70b3d57ed005de4f,1,320,-37,13.3,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:53:48.434437961Z,firework,eui-70b3d57ed005de4f,1,321,-37,9.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:54:09.575833944Z,firework,eui-70b3d57ed005de4f,1,322,-37,13.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:54:30.720433044Z,firework,eui-70b3d57ed005de4f,1,323,-36,13,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:54:51.871637504Z,firework,eui-70b3d57ed005de4f,1,324,-34,13.3,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:55:13.029173297Z,firework,eui-70b3d57ed005de4f,1,325,-34,13.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:55:34.163277918Z,firework,eui-70b3d57ed005de4f,1,326,-34,13.3,-,0.051456s,rm/DbQ==,"{'degreesC': 23.999, 'humidity': 18.0054}" +2024-06-11T02:55:55.322539705Z,firework,eui-70b3d57ed005de4f,1,327,-34,13.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:56:16.466641802Z,firework,eui-70b3d57ed005de4f,1,328,-34,14,-,0.051456s,rm/DbQ==,"{'degreesC': 23.999, 'humidity': 18.0054}" +2024-06-11T02:56:37.615401139Z,firework,eui-70b3d57ed005de4f,1,329,-34,11.3,-,0.051456s,rm/DbQ==,"{'degreesC': 23.999, 'humidity': 18.0054}" +2024-06-11T02:56:58.766752316Z,firework,eui-70b3d57ed005de4f,1,330,-43,13,-,0.051456s,rm/DbQ==,"{'degreesC': 23.999, 'humidity': 18.0054}" +2024-06-11T02:57:19.913986979Z,firework,eui-70b3d57ed005de4f,1,331,-41,13.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:57:41.068740547Z,firework,eui-70b3d57ed005de4f,1,332,-41,13.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:58:02.210507076Z,firework,eui-70b3d57ed005de4f,1,333,-41,13.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:58:23.357691649Z,firework,eui-70b3d57ed005de4f,1,334,-42,13.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:58:44.514263499Z,firework,eui-70b3d57ed005de4f,1,335,-35,13.3,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:59:05.657408301Z,firework,eui-70b3d57ed005de4f,1,336,-35,11.3,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T02:59:26.806498515Z,firework,eui-70b3d57ed005de4f,1,337,-39,13,-,0.051456s,rm/DbQ==,"{'degreesC': 23.999, 'humidity': 18.0054}" +2024-06-11T02:59:47.958609589Z,firework,eui-70b3d57ed005de4f,1,338,-36,13.3,-,0.051456s,rm/DbQ==,"{'degreesC': 23.999, 'humidity': 18.0054}" +2024-06-11T03:00:09.125734213Z,firework,eui-70b3d57ed005de4f,1,339,-34,13.5,-,0.051456s,rm/DbQ==,"{'degreesC': 23.999, 'humidity': 18.0054}" diff --git a/backend/data/20240611.csv b/backend/data/20240611.csv new file mode 100644 index 00000000..95711bc2 --- /dev/null +++ b/backend/data/20240611.csv @@ -0,0 +1,40 @@ +received_at,application_id,device_id,f_port,f_cnt,rssi,snr,data_rate_index,consumed_airtime,frm_payload,decoded_payload +2024-06-11T03:00:30.260993519Z,firework,eui-70b3d57ed005de4f,1,340,-35,13.5,-,0.051456s,rm/DbQ==,"{'degreesC': 23.999, 'humidity': 18.0054}" +2024-06-11T03:00:51.402019368Z,firework,eui-70b3d57ed005de4f,1,341,-35,13,-,0.051456s,rm/DbQ==,"{'degreesC': 23.999, 'humidity': 18.0054}" +2024-06-11T03:01:12.557823562Z,firework,eui-70b3d57ed005de4f,1,342,-35,13.5,-,0.051456s,rm/DbQ==,"{'degreesC': 23.999, 'humidity': 18.0054}" +2024-06-11T03:01:33.706432027Z,firework,eui-70b3d57ed005de4f,1,343,-37,13.3,-,0.051456s,rm/DbQ==,"{'degreesC': 23.999, 'humidity': 18.0054}" +2024-06-11T03:01:54.850827097Z,firework,eui-70b3d57ed005de4f,1,344,-35,12.8,-,0.051456s,rm/DbQ==,"{'degreesC': 23.999, 'humidity': 18.0054}" +2024-06-11T03:02:15.992911840Z,firework,eui-70b3d57ed005de4f,1,345,-33,13.5,-,0.051456s,rm/DbQ==,"{'degreesC': 23.999, 'humidity': 18.0054}" +2024-06-11T03:02:37.195389285Z,firework,eui-70b3d57ed005de4f,1,346,-46,10,-,0.051456s,rm/DbQ==,"{'degreesC': 23.999, 'humidity': 18.0054}" +2024-06-11T03:02:58.291214961Z,firework,eui-70b3d57ed005de4f,1,347,-43,13,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T03:03:19.437834077Z,firework,eui-70b3d57ed005de4f,1,348,-37,12.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T03:03:40.593024722Z,firework,eui-70b3d57ed005de4f,1,349,-35,13.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T03:04:01.738718339Z,firework,eui-70b3d57ed005de4f,1,350,-34,13.3,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T03:04:22.887353151Z,firework,eui-70b3d57ed005de4f,1,351,-40,13,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T03:04:44.041644395Z,firework,eui-70b3d57ed005de4f,1,352,-38,13.3,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T03:05:05.196857233Z,firework,eui-70b3d57ed005de4f,1,353,-37,13.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T03:05:26.331494211Z,firework,eui-70b3d57ed005de4f,1,354,-37,10,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T03:05:47.480718530Z,firework,eui-70b3d57ed005de4f,1,355,-37,13.3,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T03:06:08.630155871Z,firework,eui-70b3d57ed005de4f,1,356,-37,13.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T03:06:29.827005763Z,firework,eui-70b3d57ed005de4f,1,357,-37,13.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T03:06:50.963499901Z,firework,eui-70b3d57ed005de4f,1,358,-37,13.3,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T03:07:12.079286571Z,firework,eui-70b3d57ed005de4f,1,359,-38,13.3,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T03:07:33.220416320Z,firework,eui-70b3d57ed005de4f,1,360,-37,13.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T03:07:54.563506373Z,firework,eui-70b3d57ed005de4f,1,361,-37,13.3,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T03:08:15.527035152Z,firework,eui-70b3d57ed005de4f,1,362,-38,13.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T03:08:36.763219619Z,firework,eui-70b3d57ed005de4f,1,363,-38,10.3,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T03:08:57.810479487Z,firework,eui-70b3d57ed005de4f,1,364,-38,13.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T03:09:18.968800580Z,firework,eui-70b3d57ed005de4f,1,365,-37,13.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T03:09:40.123959014Z,firework,eui-70b3d57ed005de4f,1,366,-28,13.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T03:10:01.267048178Z,firework,eui-70b3d57ed005de4f,1,367,-27,13.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T03:10:22.410000387Z,firework,eui-70b3d57ed005de4f,1,368,-27,13.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T03:10:43.576003280Z,firework,eui-70b3d57ed005de4f,1,369,-28,9.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T03:11:04.710384678Z,firework,eui-70b3d57ed005de4f,1,370,-27,13.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T03:11:25.868806698Z,firework,eui-70b3d57ed005de4f,1,371,-27,13.3,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T03:11:47.008137015Z,firework,eui-70b3d57ed005de4f,1,372,-28,13,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T03:12:08.158102020Z,firework,eui-70b3d57ed005de4f,1,373,-28,13.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T03:12:29.304734707Z,firework,eui-70b3d57ed005de4f,1,374,-28,13.8,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T03:12:50.454546996Z,firework,eui-70b3d57ed005de4f,1,375,-27,13.5,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T03:13:11.602743696Z,firework,eui-70b3d57ed005de4f,1,376,-28,10.3,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T03:13:32.753616358Z,firework,eui-70b3d57ed005de4f,1,377,-34,13.3,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" +2024-06-11T03:13:53.926598925Z,firework,eui-70b3d57ed005de4f,1,378,-35,13.3,-,0.051456s,rm9xbQ==,"{'degreesC': 23.999, 'humidity': 17.0044}" diff --git a/backend/main.py b/backend/main.py new file mode 100644 index 00000000..9d329261 --- /dev/null +++ b/backend/main.py @@ -0,0 +1,3 @@ +from module import mqtt + +mqtt.run_client() \ No newline at end of file diff --git a/backend/module/__init__.py b/backend/module/__init__.py new file mode 100644 index 00000000..139597f9 --- /dev/null +++ b/backend/module/__init__.py @@ -0,0 +1,2 @@ + + diff --git a/backend/module/__pycache__/__init__.cpython-312.pyc b/backend/module/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 00000000..e6ae0e8d Binary files /dev/null and b/backend/module/__pycache__/__init__.cpython-312.pyc differ diff --git a/backend/module/__pycache__/mqtt.cpython-312.pyc b/backend/module/__pycache__/mqtt.cpython-312.pyc new file mode 100644 index 00000000..523e349f Binary files /dev/null and b/backend/module/__pycache__/mqtt.cpython-312.pyc differ diff --git a/backend/module/mqtt.py b/backend/module/mqtt.py new file mode 100644 index 00000000..53624715 --- /dev/null +++ b/backend/module/mqtt.py @@ -0,0 +1,187 @@ +def run_client(): + import os + import sys + import logging + import paho.mqtt.client as mqtt + import json + import csv + import random + from datetime import datetime + + # Procedure to get the USER, PASSWORD, PUBLIC_TLS_ADDRESS and PUBLIC_TLS_ADDRESS_PORT: + # 1. Login to The Things Stack Community Edition console + # https://console.cloud.thethings.network/ + # 2. Select Go to applications + # 3. Select your application + # 4. On the left hand side menu, select Integrations | MQTT + # 5. See Connection credentials + # 6. For the password press button: Generate new API key + # Each time you press this button a new password is generated! + # The password looks like: + # NNSXS.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + # + + + USER = "firework@ttn" + PASSWORD = "NNSXS.FMGMPBTMKXQ5ZRB3LKWMH7X7PWYN34VQ3VTVUCA.SE35UDJS6X4CF5N2CAXVMLLYEBUOFBBK5JEIOQCQ4EIN3DNYLVFQ" + PUBLIC_TLS_ADDRESS = "nam1.cloud.thethings.network" + PUBLIC_TLS_ADDRESS_PORT = 8883 + DEVICE_ID = "eui-70b3d57ed005de4f" + ALL_DEVICES = False + + # Meaning Quality of Service (QoS) + # QoS = 0 - at most once + # The client publishes the message, and there is no acknowledgement by the broker. + # QoS = 1 - at least once + # The broker sends an acknowledgement back to the client. + # The client will re-send until it gets the broker's acknowledgement. + # QoS = 2 - exactly once + # Both sender and receiver are sure that the message was sent exactly once, using a kind of handshake + QOS = 0 + + DEBUG = True + + + def get_value_from_json_object(obj, key): + try: + return obj[key] + except KeyError: + return '-' + + + def stop(client): + client.disconnect() + print("\nExit") + sys.exit(0) + + + # Write uplink to tab file + def save_to_file(some_json): + end_device_ids = some_json["end_device_ids"] + device_id = end_device_ids["device_id"] + application_id = end_device_ids["application_ids"]["application_id"] + received_at = some_json["received_at"] + + if 'uplink_message' in some_json: + uplink_message = some_json["uplink_message"] + f_port = get_value_from_json_object(uplink_message, "f_port") + + # check if f_port is found + if f_port != '-': + + f_cnt = get_value_from_json_object(uplink_message, "f_cnt") + frm_payload = uplink_message["frm_payload"] + + # If decoded_payload is a json object or a string "-" it will be converted to string + decoded_payload = str(get_value_from_json_object(uplink_message, "decoded_payload")) + rssi = get_value_from_json_object(uplink_message["rx_metadata"][0], "rssi") + snr = get_value_from_json_object(uplink_message["rx_metadata"][0], "snr") + data_rate_index = get_value_from_json_object(uplink_message["settings"], "data_rate_index") + consumed_airtime = get_value_from_json_object(uplink_message, "consumed_airtime") + + # Daily log of uplinks + now = datetime.now() + path_data_folder = r'./data/' + if not os.path.exists(path_data_folder): + os.mkdir(path_data_folder) + path_n_file = path_data_folder + now.strftime("%Y%m%d") + ".csv" + print(path_n_file) + if not os.path.isfile(path_n_file): + with open(path_n_file, 'a', newline='') as csvFile: + fw = csv.writer(csvFile) + fw.writerow(["received_at", "application_id", "device_id", "f_port", "f_cnt", "rssi", "snr", + "data_rate_index", "consumed_airtime", "frm_payload", "decoded_payload"]) + + with open(path_n_file, 'a', newline='') as csvFile: + fw = csv.writer(csvFile) + fw.writerow([received_at, application_id, device_id, f_port, f_cnt, rssi, snr, + data_rate_index, consumed_airtime, frm_payload, decoded_payload]) + + + # The callback for when the client receives a CONNACK response from the server. + def on_connect(client, userdata, flags, rc): + if rc == 0: + print("\nConnected successfully to MQTT broker") + else: + print("\nFailed to connect, return code = " + str(rc)) + + + # The callback for when a PUBLISH message is received from the server. + def on_message(client, userdata, message): + print("\nMessage received on topic '" + message.topic + "' with QoS = " + str(message.qos)) + + parsed_json = json.loads(message.payload) + + if DEBUG: + print("Payload (Collapsed): " + str(message.payload)) + print("Payload (Expanded): \n" + json.dumps(parsed_json, indent=4)) + + save_to_file(parsed_json) + + + # mid = message ID + # It is an integer that is a unique message identifier assigned by the client. + # If you use QoS levels 1 or 2 then the client loop will use the mid to identify messages that have not been sent. + def on_subscribe(client, userdata, mid, granted_qos): + print("\nSubscribed with message id (mid) = " + str(mid) + " and QoS = " + str(granted_qos)) + + + def on_disconnect(client, userdata, rc): + print("\nDisconnected with result code = " + str(rc)) + + + def on_log(client, userdata, level, buf): + print("\nLog: " + buf) + logging_level = client.LOGGING_LEVEL[level] + logging.log(logging_level, buf) + + + # Generate client ID with pub prefix randomly + client_id = f'python-mqtt-{random.randint(0, 1000)}' + + print("Create new mqtt client instance") + mqttc = mqtt.Client(callback_api_version=mqtt.CallbackAPIVersion.VERSION1, + client_id=client_id) + + print("Assign callback functions") + mqttc.on_connect = on_connect + mqttc.on_subscribe = on_subscribe + mqttc.on_message = on_message + mqttc.on_disconnect = on_disconnect + mqttc.on_log = on_log # Logging for debugging OK, waste + + # Setup authentication from settings above + mqttc.username_pw_set(USER, PASSWORD) + + # IMPORTANT - this enables the encryption of messages + mqttc.tls_set() # default certification authority of the system + + # mqttc.tls_set(ca_certs="mqtt-ca.pem") # Use this if you get security errors + # It loads the TTI security certificate. Download it from their website from this page: + # https://www.thethingsnetwork.org/docs/applications/mqtt/api/index.html + # This is normally required if you are running the script on Windows + + print("Connecting to broker: " + PUBLIC_TLS_ADDRESS + ":" + str(PUBLIC_TLS_ADDRESS_PORT)) + mqttc.connect(PUBLIC_TLS_ADDRESS, PUBLIC_TLS_ADDRESS_PORT, 60) + + + if ALL_DEVICES: + print("Subscribe to all topics (#) with QoS = " + str(QOS)) + mqttc.subscribe("#", QOS) + elif len(DEVICE_ID) != 0: + topic = "v3/" + USER + "/devices/" + DEVICE_ID + "/up" + print("Subscribe to topic " + topic + " with QoS = " + str(QOS)) + mqttc.subscribe(topic, QOS) + else: + print("Can not subscribe to any topic") + stop(mqttc) + + + print("And run forever") + try: + run = True + while run: + mqttc.loop(10) # seconds timeout / blocking time + print(".", end="", flush=True) # feedback to the user that something is actually happening + except KeyboardInterrupt: + stop(mqttc) \ No newline at end of file diff --git a/requirements.txt b/backend/requirements.txt similarity index 100% rename from requirements.txt rename to backend/requirements.txt diff --git a/mqtt.py b/mqtt.py deleted file mode 100644 index a76137ca..00000000 --- a/mqtt.py +++ /dev/null @@ -1,180 +0,0 @@ - -import os -import sys -import logging -import paho.mqtt.client as mqtt -import json -import csv -import random -from datetime import datetime - -# Procedure to get the USER, PASSWORD, PUBLIC_TLS_ADDRESS and PUBLIC_TLS_ADDRESS_PORT: -# 1. Login to The Things Stack Community Edition console -# https://console.cloud.thethings.network/ -# 2. Select Go to applications -# 3. Select your application -# 4. On the left hand side menu, select Integrations | MQTT -# 5. See Connection credentials -# 6. For the password press button: Generate new API key -# Each time you press this button a new password is generated! -# The password looks like: -# NNSXS.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -# -USER = "firework@ttn" -PASSWORD = "NNSXS.FMGMPBTMKXQ5ZRB3LKWMH7X7PWYN34VQ3VTVUCA.SE35UDJS6X4CF5N2CAXVMLLYEBUOFBBK5JEIOQCQ4EIN3DNYLVFQ" -PUBLIC_TLS_ADDRESS = "nam1.cloud.thethings.network" -PUBLIC_TLS_ADDRESS_PORT = 8883 -DEVICE_ID = "eui-70b3d57ed005de4f" -ALL_DEVICES = False - -# Meaning Quality of Service (QoS) -# QoS = 0 - at most once -# The client publishes the message, and there is no acknowledgement by the broker. -# QoS = 1 - at least once -# The broker sends an acknowledgement back to the client. -# The client will re-send until it gets the broker's acknowledgement. -# QoS = 2 - exactly once -# Both sender and receiver are sure that the message was sent exactly once, using a kind of handshake -QOS = 0 - -DEBUG = True - - -def get_value_from_json_object(obj, key): - try: - return obj[key] - except KeyError: - return '-' - - -def stop(client): - client.disconnect() - print("\nExit") - sys.exit(0) - - -# Write uplink to tab file -def save_to_file(some_json): - end_device_ids = some_json["end_device_ids"] - device_id = end_device_ids["device_id"] - application_id = end_device_ids["application_ids"]["application_id"] - received_at = some_json["received_at"] - - if 'uplink_message' in some_json: - uplink_message = some_json["uplink_message"] - f_port = get_value_from_json_object(uplink_message, "f_port") - - # check if f_port is found - if f_port != '-': - f_cnt = get_value_from_json_object(uplink_message, "f_cnt") - frm_payload = uplink_message["frm_payload"] - # If decoded_payload is a json object or a string "-" it will be converted to string - decoded_payload = str(get_value_from_json_object(uplink_message, "decoded_payload")) - rssi = get_value_from_json_object(uplink_message["rx_metadata"][0], "rssi") - snr = get_value_from_json_object(uplink_message["rx_metadata"][0], "snr") - data_rate_index = get_value_from_json_object(uplink_message["settings"], "data_rate_index") - consumed_airtime = get_value_from_json_object(uplink_message, "consumed_airtime") - - # Daily log of uplinks - now = datetime.now() - path_n_file = now.strftime("%Y%m%d") + ".txt" - print(path_n_file) - if not os.path.isfile(path_n_file): - with open(path_n_file, 'a', newline='') as tabFile: - fw = csv.writer(tabFile, dialect='excel-tab') - fw.writerow(["received_at", "application_id", "device_id", "f_port", "f_cnt", "rssi", "snr", - "data_rate_index", "consumed_airtime", "frm_payload", "decoded_payload"]) - - with open(path_n_file, 'a', newline='') as tabFile: - fw = csv.writer(tabFile, dialect='excel-tab') - fw.writerow([received_at, application_id, device_id, f_port, f_cnt, rssi, snr, - data_rate_index, consumed_airtime, frm_payload, decoded_payload]) - - -# The callback for when the client receives a CONNACK response from the server. -def on_connect(client, userdata, flags, rc): - if rc == 0: - print("\nConnected successfully to MQTT broker") - else: - print("\nFailed to connect, return code = " + str(rc)) - - -# The callback for when a PUBLISH message is received from the server. -def on_message(client, userdata, message): - print("\nMessage received on topic '" + message.topic + "' with QoS = " + str(message.qos)) - - parsed_json = json.loads(message.payload) - - if DEBUG: - print("Payload (Collapsed): " + str(message.payload)) - print("Payload (Expanded): \n" + json.dumps(parsed_json, indent=4)) - - save_to_file(parsed_json) - - -# mid = message ID -# It is an integer that is a unique message identifier assigned by the client. -# If you use QoS levels 1 or 2 then the client loop will use the mid to identify messages that have not been sent. -def on_subscribe(client, userdata, mid, granted_qos): - print("\nSubscribed with message id (mid) = " + str(mid) + " and QoS = " + str(granted_qos)) - - -def on_disconnect(client, userdata, rc): - print("\nDisconnected with result code = " + str(rc)) - - -def on_log(client, userdata, level, buf): - print("\nLog: " + buf) - logging_level = client.LOGGING_LEVEL[level] - logging.log(logging_level, buf) - - -# Generate client ID with pub prefix randomly -client_id = f'python-mqtt-{random.randint(0, 1000)}' - -print("Create new mqtt client instance") -mqttc = mqtt.Client(callback_api_version=mqtt.CallbackAPIVersion.VERSION1, - client_id=client_id) - -print("Assign callback functions") -mqttc.on_connect = on_connect -mqttc.on_subscribe = on_subscribe -mqttc.on_message = on_message -mqttc.on_disconnect = on_disconnect -mqttc.on_log = on_log # Logging for debugging OK, waste - -# Setup authentication from settings above -mqttc.username_pw_set(USER, PASSWORD) - -# IMPORTANT - this enables the encryption of messages -mqttc.tls_set() # default certification authority of the system - -# mqttc.tls_set(ca_certs="mqtt-ca.pem") # Use this if you get security errors -# It loads the TTI security certificate. Download it from their website from this page: -# https://www.thethingsnetwork.org/docs/applications/mqtt/api/index.html -# This is normally required if you are running the script on Windows - -print("Connecting to broker: " + PUBLIC_TLS_ADDRESS + ":" + str(PUBLIC_TLS_ADDRESS_PORT)) -mqttc.connect(PUBLIC_TLS_ADDRESS, PUBLIC_TLS_ADDRESS_PORT, 60) - - -if ALL_DEVICES: - print("Subscribe to all topics (#) with QoS = " + str(QOS)) - mqttc.subscribe("#", QOS) -elif len(DEVICE_ID) != 0: - topic = "v3/" + USER + "/devices/" + DEVICE_ID + "/up" - print("Subscribe to topic " + topic + " with QoS = " + str(QOS)) - mqttc.subscribe(topic, QOS) -else: - print("Can not subscribe to any topic") - stop(mqttc) - - -print("And run forever") -try: - run = True - while run: - mqttc.loop(10) # seconds timeout / blocking time - print(".", end="", flush=True) # feedback to the user that something is actually happening -except KeyboardInterrupt: - stop(mqttc) \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 07ced1b1..924c4127 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -47,6 +47,7 @@ // first. When copying an EUI from ttnctl output, this means to reverse // the bytes. For TTN issued EUIs the last bytes should be 0xD5, 0xB3, // 0x70. + static const u1_t PROGMEM APPEUI[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; void os_getArtEui (u1_t* buf) { memcpy_P(buf, APPEUI, 8);}