From 50ce057dc7a8d4501594ca36873a3845f6e14b75 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 4 Jan 2024 04:56:08 +0000 Subject: [PATCH] HTML Elements --- 202401_AirVisual_values.txt | 206 +++++++++++++++++++++++++++++ __pycache__/app.cpython-310.pyc | Bin 3980 -> 4097 bytes app.py | 46 +++++-- outdoor_data_cache.txt | 2 +- static/index.html | 60 +++++++++ static/index_global.html | 225 ++++++++++++++++++++++++++++++++ static/satite/index.html | 1 + static/satitm/index.html | 1 + unit.json | 60 +++++++++ 9 files changed, 589 insertions(+), 12 deletions(-) mode change 100644 => 100755 app.py create mode 100644 static/index.html create mode 100644 static/index_global.html create mode 120000 static/satite/index.html create mode 120000 static/satitm/index.html create mode 100644 unit.json diff --git a/202401_AirVisual_values.txt b/202401_AirVisual_values.txt index 4dc7025..224dd5c 100644 --- a/202401_AirVisual_values.txt +++ b/202401_AirVisual_values.txt @@ -1267,3 +1267,209 @@ Date;Time;Timestamp;PM2_5(ug/m3);AQI(US);AQI(CN);PM10(ug/m3);PM1(ug/m3);Outdoor 2024/01/03;23:07:27;1704323247;18.0;63;26;21.0;14.0;1;1;25.2;77.3;51;970; 2024/01/03;23:12:27;1704323547;16.0;59;23;18.0;12.0;72;31;25.1;77.3;51;966; 2024/01/03;23:17:27;1704323847;17.0;61;24;20.0;13.0;76;34;25.0;77.1;51;959; +2024/01/03;23:22:27;1704324147;17.0;61;24;19.0;13.0;75;34;25.0;77.0;51;959; +2024/01/03;23:27:27;1704324447;16.0;59;23;20.0;12.0;75;34;25.0;77.0;51;944; +2024/01/03;23:32:27;1704324747;15.0;57;21;16.0;11.0;75;34;25.0;77.0;51;917; +2024/01/03;23:37:27;1704325047;18.0;63;26;21.0;14.0;76;34;24.9;76.9;53;895; +2024/01/03;23:42:27;1704325347;20.0;68;29;23.0;16.0;72;31;24.9;76.9;54;912; +2024/01/03;23:47:27;1704325647;19.0;66;27;23.0;15.0;73;32;25.0;77.1;57;921; +2024/01/03;23:52:27;1704325947;18.0;63;26;20.0;14.0;76;34;25.2;77.3;59;945; +2024/01/03;23:57:25;1704326245;18.0;63;26;27.0;14.0;74;33;25.3;77.5;62;960; +2024/01/03;23:57:27;1704326247;18.0;63;26;27.0;14.0;74;33;25.3;77.5;62;960; +2024/01/03;23:57:35;1704326255;19.0;66;27;25.0;16.0;74;33;25.3;77.5;62;962; +2024/01/03;23:57:45;1704326265;19.0;66;27;24.0;16.0;74;33;25.3;77.5;62;963; +2024/01/03;23:57:55;1704326275;19.0;66;27;22.0;16.0;74;33;25.3;77.5;62;963; +2024/01/03;23:58:05;1704326285;20.0;68;29;23.0;17.0;74;33;25.2;77.4;63;963; +2024/01/03;23:58:15;1704326295;19.0;66;27;21.0;16.0;74;33;25.2;77.4;63;965; +2024/01/03;23:58:25;1704326305;18.0;63;26;21.0;15.0;74;33;25.2;77.4;63;966; +2024/01/03;23:58:35;1704326315;18.0;63;26;21.0;15.0;74;33;25.2;77.3;63;965; +2024/01/03;23:58:45;1704326325;17.0;61;24;20.0;13.0;74;33;25.2;77.3;63;965; +2024/01/03;23:58:55;1704326335;18.0;63;26;20.0;15.0;74;33;25.2;77.3;63;965; +2024/01/03;23:59:05;1704326345;19.0;66;27;21.0;16.0;74;33;25.2;77.3;63;965; +2024/01/03;23:59:15;1704326355;20.0;68;29;22.0;17.0;74;33;25.2;77.3;63;965; +2024/01/03;23:59:25;1704326365;19.0;66;27;21.0;16.0;74;33;25.2;77.3;63;965; +2024/01/03;23:59:35;1704326375;19.0;66;27;20.0;16.0;77;35;25.1;77.2;63;964; +2024/01/03;23:59:45;1704326385;18.0;63;26;20.0;15.0;77;35;25.1;77.2;63;964; +2024/01/03;23:59:55;1704326395;18.0;63;26;21.0;15.0;77;35;25.1;77.2;63;965; +2024/01/04;00:00:05;1704326405;18.0;63;26;21.0;15.0;77;35;25.1;77.2;63;965; +2024/01/04;00:00:15;1704326415;19.0;66;27;22.0;16.0;77;35;25.1;77.2;63;965; +2024/01/04;00:00:25;1704326425;19.0;66;27;22.0;16.0;77;35;25.1;77.2;63;965; +2024/01/04;00:00:35;1704326435;20.0;68;29;23.0;17.0;1;1;25.1;77.2;63;966; +2024/01/04;00:00:45;1704326445;20.0;68;29;23.0;17.0;1;1;25.1;77.2;63;966; +2024/01/04;00:00:55;1704326455;20.0;68;29;22.0;17.0;1;1;25.1;77.2;63;966; +2024/01/04;00:01:05;1704326465;19.0;66;27;21.0;16.0;1;1;25.1;77.1;64;966; +2024/01/04;00:01:15;1704326475;17.0;61;24;19.0;14.0;1;1;25.1;77.1;64;966; +2024/01/04;00:01:25;1704326485;17.0;61;24;19.0;14.0;1;1;25.1;77.1;64;966; +2024/01/04;00:01:35;1704326495;19.0;66;27;21.0;16.0;1;1;25.1;77.1;64;967; +2024/01/04;00:01:45;1704326505;19.0;66;27;22.0;16.0;1;1;25.1;77.1;64;968; +2024/01/04;00:01:55;1704326515;19.0;66;27;22.0;16.0;1;1;25.1;77.1;64;969; +2024/01/04;00:02:05;1704326525;17.0;61;24;20.0;14.0;1;1;25.1;77.1;64;969; +2024/01/04;00:02:15;1704326535;17.0;61;24;20.0;14.0;1;1;25.1;77.1;64;967; +2024/01/04;00:02:25;1704326545;18.0;63;26;21.0;15.0;1;1;25.1;77.1;64;966; +2024/01/04;00:02:35;1704326555;18.0;63;26;21.0;15.0;1;1;25.1;77.1;64;966; +2024/01/04;00:02:45;1704326565;18.0;63;26;21.0;15.0;1;1;25.1;77.1;64;966; +2024/01/04;00:02:55;1704326575;18.0;63;26;21.0;15.0;1;1;25.1;77.1;64;966; +2024/01/04;00:03:05;1704326585;17.0;61;24;20.0;14.0;1;1;25.0;77.1;64;966; +2024/01/04;00:03:15;1704326595;17.0;61;24;21.0;14.0;1;1;25.0;77.1;64;966; +2024/01/04;00:03:25;1704326605;16.0;59;23;20.0;12.0;1;1;25.0;77.1;64;967; +2024/01/04;00:03:35;1704326615;17.0;61;24;21.0;14.0;1;1;25.1;77.1;64;967; +2024/01/04;00:03:45;1704326625;17.0;61;24;22.0;14.0;1;1;25.1;77.1;64;967; +2024/01/04;00:03:55;1704326635;17.0;61;24;21.0;14.0;1;1;25.1;77.1;64;967; +2024/01/04;00:04:05;1704326645;17.0;61;24;20.0;14.0;1;1;25.1;77.2;64;967; +2024/01/04;00:04:15;1704326655;17.0;61;24;20.0;14.0;1;1;25.1;77.2;64;968; +2024/01/04;00:04:25;1704326665;17.0;61;24;19.0;14.0;1;1;25.1;77.2;64;968; +2024/01/04;00:04:35;1704326675;16.0;59;23;19.0;12.0;74;33;25.1;77.1;64;968; +2024/01/04;00:04:45;1704326685;17.0;61;24;20.0;14.0;74;33;25.1;77.1;64;968; +2024/01/04;00:04:55;1704326695;17.0;61;24;20.0;14.0;74;33;25.1;77.1;64;968; +2024/01/04;00:05:05;1704326705;18.0;63;26;20.0;15.0;74;33;25.1;77.1;64;969; +2024/01/04;00:05:15;1704326715;17.0;61;24;18.0;14.0;74;33;25.1;77.1;64;970; +2024/01/04;00:05:25;1704326725;17.0;61;24;19.0;14.0;74;33;25.1;77.1;64;971; +2024/01/04;00:05:35;1704326735;17.0;61;24;19.0;14.0;74;33;25.1;77.1;64;971; +2024/01/04;00:05:45;1704326745;17.0;61;24;20.0;14.0;74;33;25.1;77.1;64;971; +2024/01/04;00:05:55;1704326755;17.0;61;24;19.0;14.0;74;33;25.1;77.1;64;971; +2024/01/04;00:06:05;1704326765;17.0;61;24;20.0;14.0;74;33;25.1;77.2;64;971; +2024/01/04;00:06:15;1704326775;18.0;63;26;21.0;15.0;74;33;25.1;77.2;64;972; +2024/01/04;00:06:25;1704326785;18.0;63;26;21.0;15.0;74;33;25.1;77.2;64;974; +2024/01/04;00:06:35;1704326795;19.0;66;27;22.0;16.0;74;33;25.1;77.1;64;975; +2024/01/04;00:06:45;1704326805;18.0;63;26;21.0;15.0;74;33;25.1;77.1;64;978; +2024/01/04;00:06:55;1704326815;18.0;63;26;20.0;15.0;74;33;25.1;77.1;64;978; +2024/01/04;00:07:05;1704326825;17.0;61;24;19.0;14.0;74;33;25.1;77.2;64;979; +2024/01/04;00:07:15;1704326835;17.0;61;24;18.0;14.0;74;33;25.1;77.2;64;980; +2024/01/04;00:07:25;1704326845;17.0;61;24;18.0;14.0;74;33;25.1;77.2;64;983; +2024/01/04;00:12:28;1704327148;17.0;61;24;18.0;13.0;74;33;25.1;77.1;64;990; +2024/01/04;00:17:28;1704327448;18.0;63;26;20.0;14.0;74;33;25.0;77.0;62;1004; +2024/01/04;00:22:28;1704327748;17.0;61;24;19.0;13.0;74;33;24.9;76.8;59;1009; +2024/01/04;00:27:28;1704328048;17.0;61;24;19.0;14.0;74;33;24.8;76.7;58;1015; +2024/01/04;00:32:28;1704328348;18.0;63;26;19.0;14.0;74;33;24.8;76.6;57;1031; +2024/01/04;00:37:28;1704328648;17.0;61;24;20.0;13.0;76;34;24.7;76.5;55;1034; +2024/01/04;00:42:28;1704328948;16.0;59;23;19.0;12.0;74;33;24.7;76.4;55;1036; +2024/01/04;00:47:28;1704329248;18.0;63;26;20.0;14.0;73;32;24.6;76.3;55;1038; +2024/01/04;00:52:28;1704329548;16.0;59;23;18.0;12.0;71;31;24.6;76.2;55;1036; +2024/01/04;00:57:28;1704329848;16.0;59;23;18.0;12.0;70;30;24.5;76.1;55;1036; +2024/01/04;01:02:28;1704330148;19.0;66;27;21.0;15.0;73;32;24.5;76.1;55;1036; +2024/01/04;01:07:28;1704330448;17.0;61;24;21.0;13.0;1;1;24.6;76.3;54;1042; +2024/01/04;01:12:28;1704330748;17.0;61;24;20.0;13.0;72;31;25.0;76.9;54;1091; +2024/01/04;01:17:28;1704331048;16.0;59;23;18.0;12.0;71;31;25.7;78.3;53;1075; +2024/01/04;01:22:28;1704331348;16.0;59;23;19.0;12.0;69;29;26.7;80.0;53;1077; +2024/01/04;01:27:28;1704331648;17.0;61;24;19.0;13.0;70;30;27.6;81.7;53;1088; +2024/01/04;01:32:28;1704331948;16.0;59;23;19.0;13.0;70;30;28.5;83.3;53;1086; +2024/01/04;01:37:28;1704332248;17.0;61;24;19.0;14.0;70;30;29.2;84.6;51;1090; +2024/01/04;01:42:28;1704332548;18.0;63;26;21.0;15.0;69;29;29.4;85.0;51;1106; +2024/01/04;01:47:28;1704332848;16.0;59;23;18.0;14.0;69;29;29.4;84.8;53;1105; +2024/01/04;01:52:28;1704333148;17.0;61;24;20.0;15.0;73;32;29.2;84.5;54;1113; +2024/01/04;01:57:28;1704333448;18.0;63;26;19.0;15.0;71;31;28.8;83.8;54;1122; +2024/01/04;02:02:28;1704333748;17.0;61;24;18.0;14.0;72;31;28.5;83.3;55;1125; +2024/01/04;02:07:28;1704334048;16.0;59;23;18.0;13.0;1;1;28.1;82.6;56;1137; +2024/01/04;02:12:28;1704334348;15.0;57;21;17.0;11.0;70;30;27.8;82.0;55;1141; +2024/01/04;02:17:28;1704334648;15.0;57;21;17.0;13.0;74;33;27.4;81.4;54;1138; +2024/01/04;02:22:28;1704334948;15.0;57;21;17.0;12.0;74;33;27.1;80.8;53;1139; +2024/01/04;02:27:28;1704335248;15.0;57;21;17.0;12.0;75;34;26.7;80.1;53;1137; +2024/01/04;02:32:28;1704335548;15.0;57;21;16.0;11.0;76;34;26.4;79.6;53;1134; +2024/01/04;02:37:28;1704335848;16.0;59;23;19.0;13.0;78;36;26.2;79.1;54;1135; +2024/01/04;02:42:28;1704336148;15.0;57;21;17.0;12.0;78;36;26.0;78.7;56;1100; +2024/01/04;02:47:28;1704336448;16.0;59;23;19.0;12.0;82;39;25.9;78.5;58;1096; +2024/01/04;02:52:28;1704336748;17.0;61;24;20.0;13.0;80;37;25.8;78.4;59;1099; +2024/01/04;02:57:28;1704337048;14.0;55;20;16.0;11.0;83;39;25.7;78.2;60;1104; +2024/01/04;03:02:28;1704337348;15.0;57;21;17.0;12.0;86;41;25.6;78.1;62;1114; +2024/01/04;03:07:28;1704337648;15.0;57;21;17.0;12.0;1;1;25.6;78.1;64;1124; +2024/01/04;03:12:28;1704337948;17.0;61;24;19.0;13.0;87;42;25.6;78.2;65;1127; +2024/01/04;03:17:28;1704338248;15.0;57;21;17.0;12.0;87;42;25.5;78.0;64;1086; +2024/01/04;03:22:28;1704338548;14.0;55;20;17.0;11.0;84;40;25.7;78.2;64;1065; +2024/01/04;03:27:28;1704338848;15.0;57;21;16.0;12.0;88;43;25.9;78.6;63;1045; +2024/01/04;03:32:28;1704339148;17.0;61;24;18.0;15.0;90;44;26.1;78.9;63;1037; +2024/01/04;03:37:28;1704339448;15.0;57;21;17.0;13.0;91;44;26.2;79.2;63;1027; +2024/01/04;03:42:28;1704339748;14.0;55;20;16.0;11.0;90;44;26.4;79.5;62;1020; +2024/01/04;03:47:28;1704340048;18.0;63;26;21.0;15.0;93;46;26.5;79.8;62;1013; +2024/01/04;03:52:28;1704340348;17.0;61;24;18.0;15.0;90;44;26.7;80.0;62;1006; +2024/01/04;03:57:28;1704340648;15.0;57;21;16.0;13.0;92;45;26.8;80.2;60;997; +2024/01/04;04:02:28;1704340948;15.0;57;21;16.0;13.0;93;46;26.9;80.4;60;987; +2024/01/04;04:07:28;1704341248;15.0;57;21;17.0;13.0;1;1;27.0;80.6;60;980; +2024/01/04;04:12:28;1704341548;15.0;57;21;17.0;13.0;91;44;27.0;80.7;60;972; +2024/01/04;04:17:28;1704341848;15.0;57;21;16.0;13.0;88;43;27.1;80.8;60;966; +2024/01/04;04:22:28;1704342148;15.0;57;21;16.0;13.0;85;41;27.2;81.0;60;956; +2024/01/04;04:27:28;1704342448;16.0;59;23;17.0;14.0;83;39;27.3;81.1;60;950; +2024/01/04;04:32:28;1704342748;15.0;57;21;17.0;13.0;84;40;27.3;81.2;59;943; +2024/01/04;04:37:28;1704343048;16.0;59;23;18.0;14.0;81;38;27.4;81.3;59;941; +2024/01/04;04:42:28;1704343348;15.0;57;21;17.0;13.0;83;39;27.5;81.5;59;935; +2024/01/04;04:47:28;1704343648;15.0;57;21;16.0;13.0;84;40;27.5;81.6;59;929; +2024/01/04;04:52:28;1704343948;14.0;55;20;16.0;12.0;83;39;27.6;81.7;59;923; +2024/01/04;04:57:28;1704344248;16.0;59;23;17.0;14.0;82;39;27.7;81.8;59;915; +2024/01/04;05:02:28;1704344548;15.0;57;21;17.0;13.0;81;38;27.7;81.9;59;912; +2024/01/04;05:07:28;1704344848;16.0;59;23;18.0;14.0;1;1;27.7;81.9;59;903; +2024/01/04;05:12:28;1704345148;15.0;57;21;16.0;13.0;79;36;27.8;82.0;59;897; +2024/01/04;05:17:28;1704345448;15.0;57;21;16.0;13.0;78;36;27.8;82.0;59;894; +2024/01/04;05:22:28;1704345748;16.0;59;23;17.0;14.0;73;32;27.8;82.1;59;890; +2024/01/04;05:27:28;1704346048;15.0;57;21;16.0;13.0;71;31;27.9;82.2;58;884; +2024/01/04;05:32:28;1704346348;15.0;57;21;18.0;13.0;70;30;27.9;82.3;58;871; +2024/01/04;05:37:28;1704346648;15.0;57;21;16.0;13.0;69;29;28.0;82.3;58;870; +2024/01/04;05:42:28;1704346948;15.0;57;21;17.0;13.0;65;27;28.0;82.4;58;861; +2024/01/04;05:47:28;1704347248;14.0;55;20;17.0;12.0;65;27;28.0;82.4;58;860; +2024/01/04;05:52:28;1704347548;15.0;57;21;16.0;13.0;69;29;28.0;82.4;58;856; +2024/01/04;05:57:28;1704347848;15.0;57;21;17.0;13.0;65;27;28.1;82.5;58;850; +2024/01/04;06:02:28;1704348148;15.0;57;21;16.0;13.0;65;27;28.1;82.5;58;841; +2024/01/04;06:07:28;1704348448;14.0;55;20;15.0;12.0;1;1;28.1;82.6;58;836; +2024/01/04;06:12:28;1704348748;15.0;57;21;17.0;13.0;64;26;28.1;82.6;58;828; +2024/01/04;06:17:28;1704349048;17.0;61;24;20.0;15.0;66;28;28.2;82.7;58;813; +2024/01/04;06:22:28;1704349348;15.0;57;21;16.0;13.0;65;27;28.2;82.7;58;809; +2024/01/04;06:27:28;1704349648;15.0;57;21;17.0;13.0;65;27;28.2;82.8;58;803; +2024/01/04;06:32:28;1704349948;16.0;59;23;18.0;14.0;61;24;28.2;82.8;58;793; +2024/01/04;06:37:28;1704350248;15.0;57;21;18.0;13.0;68;29;28.3;82.9;58;790; +2024/01/04;06:42:28;1704350548;14.0;55;20;16.0;12.0;66;28;28.3;82.9;58;777; +2024/01/04;06:47:28;1704350848;15.0;57;21;17.0;13.0;66;28;28.3;82.9;58;777; +2024/01/04;06:52:28;1704351148;15.0;57;21;17.0;13.0;63;26;28.3;83.0;58;762; +2024/01/04;06:57:28;1704351448;14.0;55;20;15.0;12.0;65;27;28.3;83.0;58;750; +2024/01/04;07:02:28;1704351748;15.0;57;21;17.0;13.0;68;29;28.3;83.0;58;747; +2024/01/04;07:07:28;1704352048;14.0;55;20;16.0;12.0;1;1;28.3;83.0;58;738; +2024/01/04;07:12:28;1704352348;15.0;57;21;16.0;13.0;65;27;28.4;83.0;58;730; +2024/01/04;07:17:28;1704352648;14.0;55;20;16.0;12.0;77;35;28.4;83.1;58;721; +2024/01/04;07:22:28;1704352948;14.0;55;20;16.0;12.0;84;40;28.4;83.1;58;708; +2024/01/04;07:27:28;1704353248;14.0;55;20;16.0;12.0;73;32;28.4;83.2;58;708; +2024/01/04;07:32:28;1704353548;15.0;57;21;17.0;13.0;68;29;28.4;83.2;58;701; +2024/01/04;07:37:28;1704353848;16.0;59;23;18.0;14.0;69;29;28.5;83.2;58;690; +2024/01/04;07:42:28;1704354148;15.0;57;21;17.0;13.0;65;27;28.5;83.3;58;686; +2024/01/04;07:47:28;1704354448;15.0;57;21;16.0;13.0;71;31;28.5;83.3;58;683; +2024/01/04;07:52:28;1704354748;14.0;55;20;16.0;12.0;82;39;28.6;83.4;58;681; +2024/01/04;07:57:28;1704355048;15.0;57;21;16.0;13.0;155;86;28.6;83.4;58;669; +2024/01/04;08:02:28;1704355348;15.0;57;21;16.0;13.0;69;29;28.6;83.5;58;670; +2024/01/04;08:07:28;1704355648;14.0;55;20;16.0;12.0;1;1;28.6;83.5;58;659; +2024/01/04;08:12:28;1704355948;15.0;57;21;17.0;13.0;66;28;28.6;83.5;58;660; +2024/01/04;08:17:28;1704356248;15.0;57;21;19.0;13.0;70;30;28.7;83.6;58;654; +2024/01/04;08:22:28;1704356548;16.0;59;23;17.0;14.0;66;28;28.7;83.6;58;648; +2024/01/04;08:27:28;1704356848;15.0;57;21;17.0;13.0;69;29;28.7;83.7;57;643; +2024/01/04;08:32:28;1704357148;14.0;55;20;16.0;12.0;66;28;28.8;83.8;58;639; +2024/01/04;08:37:28;1704357448;15.0;57;21;17.0;13.0;65;27;28.8;83.8;58;639; +2024/01/04;08:42:28;1704357748;14.0;55;20;15.0;12.0;68;29;28.8;83.8;58;630; +2024/01/04;08:47:28;1704358048;14.0;55;20;15.0;12.0;64;26;28.8;83.9;57;626; +2024/01/04;08:52:28;1704358348;15.0;57;21;16.0;13.0;66;28;28.9;84.0;57;620; +2024/01/04;08:57:28;1704358648;15.0;57;21;17.0;13.0;68;29;28.9;84.0;58;609; +2024/01/04;09:02:28;1704358948;14.0;55;20;15.0;12.0;74;33;28.9;84.0;58;605; +2024/01/04;09:07:28;1704359248;15.0;57;21;17.0;13.0;1;1;28.9;84.1;58;599; +2024/01/04;09:12:28;1704359548;16.0;59;23;20.0;14.0;96;48;29.0;84.2;58;592; +2024/01/04;09:17:28;1704359848;15.0;57;21;16.0;13.0;111;56;29.1;84.3;58;586; +2024/01/04;09:22:28;1704360148;15.0;57;21;18.0;12.0;117;59;29.1;84.4;57;577; +2024/01/04;09:27:28;1704360448;15.0;57;21;18.0;13.0;98;49;29.1;84.5;57;573; +2024/01/04;09:32:28;1704360748;17.0;61;24;20.0;14.0;105;53;29.2;84.5;57;567; +2024/01/04;09:37:28;1704361048;17.0;61;24;21.0;14.0;84;40;29.2;84.6;57;558; +2024/01/04;09:42:28;1704361348;20.0;68;29;24.0;16.0;102;51;29.2;84.6;57;550; +2024/01/04;09:47:28;1704361648;17.0;61;24;20.0;14.0;86;41;29.3;84.7;57;551; +2024/01/04;09:52:28;1704361948;17.0;61;24;20.0;14.0;76;34;29.3;84.8;57;540; +2024/01/04;09:57:28;1704362248;16.0;59;23;19.0;14.0;72;31;29.4;84.9;57;536; +2024/01/04;10:02:28;1704362548;15.0;57;21;18.0;13.0;61;24;29.4;84.9;57;528; +2024/01/04;10:07:28;1704362848;16.0;59;23;19.0;14.0;1;1;29.5;85.1;57;520; +2024/01/04;10:12:28;1704363148;16.0;59;23;18.0;14.0;68;29;29.5;85.1;57;516; +2024/01/04;10:17:28;1704363448;16.0;59;23;20.0;14.0;77;35;29.6;85.2;57;503; +2024/01/04;10:22:28;1704363748;16.0;59;23;18.0;13.0;87;42;29.6;85.3;57;508; +2024/01/04;10:27:28;1704364048;16.0;59;23;18.0;14.0;68;29;29.6;85.3;57;497; +2024/01/04;10:32:28;1704364348;17.0;61;24;21.0;14.0;71;31;29.6;85.4;57;499; +2024/01/04;10:37:28;1704364648;17.0;61;24;19.0;15.0;66;28;29.7;85.5;57;496; +2024/01/04;10:42:28;1704364948;16.0;59;23;18.0;14.0;74;33;29.8;85.6;57;491; +2024/01/04;10:47:28;1704365248;17.0;61;24;23.0;14.0;87;42;29.8;85.7;57;491; +2024/01/04;10:52:28;1704365548;16.0;59;23;19.0;14.0;72;31;29.9;85.8;57;488; +2024/01/04;10:57:28;1704365848;19.0;66;27;23.0;17.0;68;29;29.9;85.9;57;480; +2024/01/04;11:02:28;1704366148;18.0;63;26;21.0;15.0;65;27;29.8;85.7;55;483; +2024/01/04;11:07:28;1704366448;18.0;63;26;20.0;16.0;1;1;29.4;84.9;55;503; +2024/01/04;11:12:28;1704366748;18.0;63;26;21.0;15.0;70;30;29.0;84.1;53;523; +2024/01/04;11:17:28;1704367048;15.0;57;21;17.0;13.0;87;42;28.5;83.3;50;544; +2024/01/04;11:22:28;1704367348;13.0;53;19;15.0;11.0;64;26;28.0;82.4;49;562; +2024/01/04;11:27:28;1704367648;17.0;61;24;18.0;14.0;65;27;27.6;81.6;48;578; +2024/01/04;11:32:28;1704367948;15.0;57;21;17.0;12.0;64;26;27.2;80.9;48;584; diff --git a/__pycache__/app.cpython-310.pyc b/__pycache__/app.cpython-310.pyc index 90868c7a5583fa5044cc1eef87b3e17ddd4a0c26..0142f02acba1660556b318df46e18e6ef5e6c2bb 100644 GIT binary patch delta 2295 zcmaJ?&2Jk;6rb5$uh-rWJ0Eu9d`F2(-O`XsJ)o#m6dFneR5YQj5;a)c%qH1<*_qw6 zRkX&SL~7bnsxlI%O4!G$LIQE+REZN3AJ_Q@5aQAU7b+omZ}ZjkfLHUId2inQ=FOXV z&!6{yHsDljJ5AvC*2%BDd%X{x9{TLz@yWVpHZ0F(I!kUU4W~((bUNc@m{A~Z7Wx$Q zEzqZ-Z)GO4eCoC_+iRawn8Pw#+H?-2JV;sA0#XNS_42F@8ftac&T^pb^i;2~NvFG5 zo^@=I>25FSb+gXi)`NNv38w58ioXJdOJ&aA=s$X8`%TkQdzIp~i zVM0@(1$QYSA*m5YYZRIi(wZ774V5W?8U#hDX_3a%4pK{miAaf5rZH_(tLc&6&?CYU zO@)#$86}v$snn97H6j`%qGVI01f&$6GM&jRIgtq*CLAwbcWN76T7g8)HUZ=BA{%^k zVjrJGHe7n)qD;9yzu^b#?(&9KoGPwtsx7{td^{F-Xlr*P&K@kQd)2+o&i%nEdw9lD?l{Qj&L@S|wC z&pRcaC5C4Y^Okm9(pKFS4=Bt%iWRr|l3Ul}Z2_LQ6sJxUS56e!K=IwN;s;~J$x<6n z;WTDD9~3|9ojI<+SSBHbR=wF!YL%+DD#fRIQEx+|cJV|X?2@X#8uB72N*QVH<`udk zzfAVmrC#OUoPSHE=KN)^Ty?_*sUe{>VnyZpqSTlhx-kPk7H_zF0G>xFg|p>lKL~e+ z5SK7MS4rhZ(2o+raRiK$%*=Zsh7Z%cfQ!398(aazhyO&C;slYEbki@%e-bW3y? zpVWT{4aneBBONJC$m5Nr&}7CYrkdIykXQur70McxG-kpR+>xw9l6^>W_N_AeqwM~u zWq;HPtJ=mM88t}th6Tj!pvXaD!00sUY?cRfpk;Pun~-Q7kO@0B;$rGp{VJJ+T7e(< z-5L8$bTS26kfDgeIbdAsy10?wD{OIKXWiKaZzQ}G#tFiqqLEUHcR|N7ZoCJf51}7n z06-dWr$MmJJwAw{wd@A@u)JOcLXSy$lb;8*zW`j~LVBo*y>_MY*`=;-J)e-$05UMFP3o)CYg2eVnJ#eV^b z<%-J!J}P?5PV@DBGE2nFMRC*YH4hTGQ+#dq>dP<_Oo*rE zu&QW^_`^JsHdI3~R88SCqT9NcmdV|BD8;u{PX8F`%i<@i_n@BaJlXV$$LGB=UdZ>z zY5{0kmO2!hM){m5*h~6VBp4TW?PI+!I0H&)L6X6pEW{K~#cy_wE{Wgmg=;=8nL(IC z&;TH97I9ogm_>Mr%)tbT9|wo0;{5_90ai~<)oGd^4<5k5q? zgfNOQ0U-6A|KJzO3;u(0bWLiQ*nB)5#)-Y}t2D}GEFw!ZA0fj3A3tST05rxtuh{Iwf9y_V4abu{Nv{=8uss*`q9hyDlR CN+jn1 delta 2193 zcmZ8hOKclO7@pae*WQPn#Cf+(+QxuO>pYr9Nk|{4Mdi^}pcLA!QW?iHNu1iTGrNgs zSQAi+ngBgiBgCah_5qAJJ{PjZge*hMzm|ShonjOGA2Fu6w*uj?jZ2)CHg$d z_CFR#vN&>h7SCai|BMf9yP&dQsj&P_j1a+fM3g#)r4Y5Q60NQUC{#j~=tSSq>UyX* zaEOS}R4@vZP$RJ&rEY*$4RNT2MpMNIBuxO4c2nAohEC#53^t=-G*Kf4%iJc3Cf*aO zcoWrQa_=aNT>#Ye7-(e@;t*HtU+kH5iTyn=_mpL{hl9i}cwRs^oduZv_L46M%E?V(m*colD;^4K#1*7b`Zpen02(Z zZTE{pHO!yrlR4p@#j*%wPqwoA0#T_*eRf!QK8xcE#>m+h%VhTvYHNiGg%sA)6qQ2l zC6w>B%04oBdpei`LKG`j*Vbq;h_q^ru6aBa%NU~jS(3jIJ3Pq-g_G$AY$+&JXcRA3 zi-ode)zVtP4uLuAMwU<6CS`enz~h^-p=~d|R4UVatq`n4nyBHKQc+!8jWkjS3Nn-( zl^FH`%Y%yI!kRCa{J?9ma1MdoM^uuz!Jh5i8&){i{GVMZ@w_ z`3dtqJk4*L2k}?@JM**cN5rfvf!Tw>8C>;toof*3SABHf_qfuR9zPUvjX3)F$-wyaGU!d@7Y zmJk0uek@0f(}3w3nupg!e1N`RqDKb00a}m;S~85#ARkT)q-=3u@RXr!oOQz=|4UDI zumRvAv&N|JZ!pRRc{R~}b{3S6=YVWYt^`5NpB)_~bQ9V!S6YYR%N47Y(anj`smaBu zlSQ&Ld5Y2kotT*f#i^Mw!tW)HPKXkoxcMUM0haX&Sud=YHvC8lYM!!E@st_^-p`tC zKsgDB&4>umdXjAQWNw_uR8C~b)y&(onai`8`P|spn8z}F#5$fzM%t=hU5oT`wLpCK zD*xE(Gsa{v-?2vebAlZO5*d|SqII(xI|ZW0f3*(E=V5{o09o2rRTXeM@vFWO&kd$Ij~^UQp8BM?sq%$;5eXvNR!?6N3$MHI9ulr2*t+cHvb z(c6)}StxJN=iUg}!U^do-M$y~#a(Gy3cFY=s5=jeA}smiWhZaQ7i60M;T${p?7@-A zY(|&hK38PApCCe}Q?Q9!8&RIH>pbVKEPMnuc1aMCo@qc}#I6Zmpl9z3@=|hF44a%# z20N#}fQxSe(NqH`pafe0A=~Hif7~ZWY5}@3;IajHYjWRtWy4*j4;EAwN8r$%}^}(lU+JCO* QUg|k-+NSCzT-C+@10lft;Q#;t diff --git a/app.py b/app.py old mode 100644 new mode 100755 index c07becd..e1bb688 --- a/app.py +++ b/app.py @@ -1,3 +1,4 @@ +#! /usr/bin/python3 from smb.SMBConnection import SMBConnection from flask import Flask, jsonify, request from threading import Thread @@ -7,19 +8,36 @@ import requests import json global last_indoor_data +global indoor_server_ip +global indoor_server_password +global outdoor_api_url + +# Load the config file "config.json" +config = json.loads(open("config.json", "r").read()) +indoor_server_ip = config["indoor_server_ip"] +indoor_server_password = config["indoor_server_password"] +outdoor_api_url = config["outdoor_api_url"] + +# Assume that the indoor unit is offline +# The get_indoor_data() function will update this variable last_indoor_data = { "offline": True } def get_indoor_data() -> list: + global indoor_server_ip + global indoor_server_password # SMB server details - server_name = "192.168.0.116" + server_name = indoor_server_ip share_name = "airvisual" username = "airvisual" - password = "6scprjag" - - # File details - file_path = "202401_AirVisual_values.txt" + password = indoor_server_password + + # File details, The file is a text file with name: + # _AirVisual_values.txt + # Get the prefix of the file name + prefix = time.strftime("%Y%m", time.localtime()) + file_path = prefix + "_AirVisual_values.txt" # Connect to the SMB server conn = SMBConnection(username, password, "", "") @@ -51,7 +69,7 @@ def get_indoor_data() -> list: "PM10(ug/m3)": "pm10", "PM1(ug/m3)": "pm1", "CO2(ppm)": "co2", - "AQI(US)_indoor": "aqi", + "AQI(US)": "aqi", "Temperature(C)": "temperature", "Humidity(%RH)": "humidity", "Timestamp": "time" @@ -110,13 +128,15 @@ def get_outdoor_data_current() -> dict: } open("outdoor_data_cache.txt", "w").write(json.dumps(default_data)) data = default_data - # Is the last_updated time more than 1 minute ago? + # Is the last_updated time more than 6 minute ago? # If it is, fetch the data from the API # If it is not, return the cached data # Note that the cache file is a JSON object data["last_updated"] = int(data["last_updated"]) - if data["last_updated"] + 60 < int(time.time()): - url = "https://device.iqair.com/v2/64b63cdf45eeae29464b590d" + # Remove the last_updated key + if data["last_updated"] + 60*6 < int(time.time()): + global outdoor_api_url + url = outdoor_api_url response = requests.get(url) try: print("Fetching data from API!" ) @@ -143,15 +163,17 @@ def get_outdoor_data_current() -> dict: data["last_updated"] = int(time.time()) open("outdoor_data_cache.txt", "w").write(json.dumps(data)) # Remove the last_updated key - del data["last_updated"] return data except: # Oops, we got rate limited # Return the cached data print("Rate limited!") + # Remove the last_updated key return data else: + # Return the cached data print("Using cached data!") + # Remove the last_updated key return data def merge_data(indoor_data_current: dict, outdoor_data: dict) -> dict: @@ -188,4 +210,6 @@ def get_data_route(): indoor_data = last_indoor_data outdoor_data = get_outdoor_data_current() merged_data = merge_data(indoor_data, outdoor_data) - return jsonify(merged_data) \ No newline at end of file + return jsonify(merged_data) + +app.run("0.0.0.0", 5000) \ No newline at end of file diff --git a/outdoor_data_cache.txt b/outdoor_data_cache.txt index 47ad680..ade9dc0 100644 --- a/outdoor_data_cache.txt +++ b/outdoor_data_cache.txt @@ -1 +1 @@ -{"pm25": 23.5, "pm10": 37.5, "pm1": 18, "aqi": 75, "temperature": 29.4, "humidity": 51, "pressure": 101179, "time": "2024-01-03 23:18:32", "last_updated": 1704298803} \ No newline at end of file +{"pm25": 21, "pm10": 35.5, "pm1": 14.5, "aqi": 70, "temperature": 29.1, "humidity": 55, "pressure": 101385, "time": "2024-01-04 11:03:32", "last_updated": 1704341266} \ No newline at end of file diff --git a/static/index.html b/static/index.html new file mode 100644 index 0000000..43ff5d2 --- /dev/null +++ b/static/index.html @@ -0,0 +1,60 @@ + + + + + + + Welcome to the IQAir API Server + + + + +
+

Welcome to the IQAir API Server

+

Where are you?

+ SATITM + SATITE +
+ + + diff --git a/static/index_global.html b/static/index_global.html new file mode 100644 index 0000000..8dc888c --- /dev/null +++ b/static/index_global.html @@ -0,0 +1,225 @@ + + + + + + + Air Quality Dashboard + + + + + + + + +
+
+
+ +

Healthy

+
+
+

N/A

+
+

Indoor PM2.5

+
+
+
+

N/A

+
+

Outdoor PM2.5

+
+
+
+
+
+ +

Indoor AQI: N/A

+
+
+ +

Outdoor AQI: N/A

+
+
+
+ + + + + + + \ No newline at end of file diff --git a/static/satite/index.html b/static/satite/index.html new file mode 120000 index 0000000..45f996a --- /dev/null +++ b/static/satite/index.html @@ -0,0 +1 @@ +/app/iqair-apiserver/static/index_global.html \ No newline at end of file diff --git a/static/satitm/index.html b/static/satitm/index.html new file mode 120000 index 0000000..45f996a --- /dev/null +++ b/static/satitm/index.html @@ -0,0 +1 @@ +/app/iqair-apiserver/static/index_global.html \ No newline at end of file diff --git a/unit.json b/unit.json new file mode 100644 index 0000000..8ee4ce4 --- /dev/null +++ b/unit.json @@ -0,0 +1,60 @@ +{ + "listeners": { + "*:80": { + "pass": "routes" + } + }, + "routes": [ + { + "match": { + "uri": [ + "/satitm/get_data" + ] + }, + "action": { + "pass": "applications/iqair-apiserver-satitm", + "rewrite": "/get_data" + } + }, + { + "match": { + "uri": [ + "/satite/get_data" + ] + }, + "action": { + "pass": "applications/iqair-apiserver-satite", + "rewrite": "/get_data" + } + }, { + "match": { + "uri": [ + "/*" + ] + }, + "action": { + "share": "/app/iqair-apiserver/static/$uri", + "index": "index.html" + } + } + ], + "applications": { + "iqair-apiserver-satitm": { + "type": "python 3.10", + "path": "/app/iqair-apiserver", + "home": "/app/venv", + "module": "app", + "callable": "app", + "working_directory": "/app/env-satitm" + }, + "iqair-apiserver-satite": { + "type": "python 3.10", + "path": "/app/iqair-apiserver", + "home": "/app/venv", + "module": "app", + "callable": "app", + "working_directory": "/app/env-satite" + } + } + +} \ No newline at end of file