This commit is contained in:
Sage The DM 2024-11-25 22:25:35 +01:00
parent db6b2a2a6e
commit 58a45463d4
38 changed files with 512 additions and 173 deletions

View file

@ -0,0 +1,87 @@
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ThingSpeakURLGenerator {
// Constants for Room channel numbers
private static final int ROOM_39_NUMBER = 1521262;
private static final int ROOM_38_NUMBER = 1364580;
private static final int ROOM_37_NUMBER = 1521263;
// Example Dates for fetching data, dynamically generated
private static final LocalDateTime START_DATE = LocalDateTime.of(2024, 11, 1, 0, 0);
private static final LocalDateTime END_DATE = LocalDateTime.of(2024, 11, 1, 23, 59);
// Room URLs
private static final Map<Integer, String> ROOM_URLS = new HashMap<>();
static {
ROOM_URLS.put(39, createUrl(ROOM_39_NUMBER));
ROOM_URLS.put(38, createUrl(ROOM_38_NUMBER));
ROOM_URLS.put(37, createUrl(ROOM_37_NUMBER));
}
// Method to create the ThingSpeak API URL dynamically
public static String createUrl(int channelNumber) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String startDate = encodeUrlParam(START_DATE.format(formatter));
String endDate = encodeUrlParam(END_DATE.format(formatter));
return String.format("https://api.thingspeak.com/channels/%d/feeds.csv?start=%s&end=%s",
channelNumber, startDate, endDate);
}
// Helper method to URL encode the date strings
private static String encodeUrlParam(String value) {
try {
return URLEncoder.encode(value, "UTF-8");
} catch (UnsupportedEncodingException e) {
System.err.println("Error encoding URL parameter: " + e.getMessage());
return value;
}
}
// Method to calculate the average of a specific number of data points (e.g.,
// CO2 levels)
public static double calculateAverage(List<Co2Data> dataList) {
if (dataList == null || dataList.isEmpty()) {
return 0.0;
}
double sum = 0.0;
for (Co2Data data : dataList) {
sum += data.getCo2Level(); // Assuming Co2Data has a method getCo2Level() that returns the CO2 level
}
return sum / dataList.size();
}
public static void main(String[] args) {
try {
// Print out the generated URLs for each room
for (Map.Entry<Integer, String> entry : ROOM_URLS.entrySet()) {
System.out.println("Room " + entry.getKey() + " URL: " + entry.getValue());
}
// Example: Calculate and print the average CO2 level for each room (assuming
// Co2Data.getData() method exists)
List<Co2Data> room39Data = Co2Data.getData(ROOM_URLS.get(39));
List<Co2Data> room38Data = Co2Data.getData(ROOM_URLS.get(38));
List<Co2Data> room37Data = Co2Data.getData(ROOM_URLS.get(37));
double avgRoom39 = calculateAverage(room39Data);
double avgRoom38 = calculateAverage(room38Data);
double avgRoom37 = calculateAverage(room37Data);
System.out.println("Average CO2 Level in Room 39: " + avgRoom39);
System.out.println("Average CO2 Level in Room 38: " + avgRoom38);
System.out.println("Average CO2 Level in Room 37: " + avgRoom37);
} catch (Exception e) {
e.printStackTrace();
}
}
}

Binary file not shown.

Binary file not shown.

View file

@ -1,78 +1,71 @@
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.HashMap;
public class App {
// #region app constants
private static final Scanner scanner = new Scanner(System.in);
private static final Teacher[] teachers = new Teacher[Teacher.nameMap.size()];
private static final String[] START_SMALL_BREAK = {
"8:30", "10:25", "11:15", "12:05", "13:30", "14:20", "16:10", "17:00", "17:50"
};
private static final String[] END_SMALL_BREAK = {
"8:35", "10:30", "11:20", "12:10", "13:35", "14:25", "16:15", "17:05", "17:55"
};
private static final String[] START_LONG_BREAK = {
"9:20", "15:10"
};
private static final String[] END_LONG_BREAK = {
"9:40", "15:25"
};
// Room channel numbers
private static final int ROOM_39_NUMBER = 1521262;
private static final int ROOM_38_NUMBER = 1364580;
private static final int ROOM_37_NUMBER = 1521263;
// Date and time constants
private static final int START_YEAR = 2024;
private static final int START_MONTH = 11; // November
private static final int START_DAY = 4;
private static final int START_HOUR = 0;
private static final int START_MINUTE = 0;
private static final int END_YEAR = 2024;
private static final int END_MONTH = 11; // November
private static final int END_DAY = 8;
private static final int END_HOUR = 23;
private static final int END_MINUTE = 59;
// Formatting the start and end date with time
private static final String START_DATE = String.format("%d-%02d-%02d%%20%02d:%02d:00",
START_YEAR, START_MONTH, START_DAY, START_HOUR, START_MINUTE);
private static final String END_DATE = String.format("%d-%02d-%02d%%20%02d:%02d:00",
END_YEAR, END_MONTH, END_DAY, END_HOUR, END_MINUTE);
// Date and time constants for Start and End Dates
private static final String START_DATE = "2024-11-04";
private static final String END_DATE = "2024-11-08";
// #region Initialization
private static String createUrl(int ROOM_X_NUMBER) {
return String.format("https://api.thingspeak.com/channels/%d/feeds.csv?start=%s&end=%s",
ROOM_X_NUMBER, START_DATE, END_DATE);
public static String generateLink(int channelNumber, String date, String startTime, String endTime) {
String baseUrl = "https://api.thingspeak.com/channels/";
String formattedStartDateTime = date + " " + startTime;
String formattedEndDateTime = date + " " + endTime;
return baseUrl + channelNumber + "/feeds.csv?start=" + formattedStartDateTime.replace(" ", "%20")
+ "&end=" + formattedEndDateTime.replace(" ", "%20"); // %20 --> " "
}
// #endregion
private static void getDataForBreak() {
// Co2Data[Wochentag][Room 37, 38 or 39]
Co2Data[][][] data = new Co2Data[5][3][11];
private static double getDataAverageForMinute(int minute, int hour, int number, String date) {
// get the url
String startTime = "";
if (hour < 10) {
startTime += "0";
}
startTime += String.valueOf(hour);
startTime += ":";
if (minute < 10) {
startTime += "0";
}
startTime += String.valueOf(minute);
String calcStarttime = startTime + ":00";
String calcEndTime = startTime + "59";
// Placeholder logic: Retrieve data for CO2 during breaks
// This should be replaced with the actual logic to get the data from ThingSpeak
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 3; j++) {
for (int k = 0; k < 11; k++) {
data[i][j][k] = new Co2Data(null, k); // Placeholder CO2 data
String url = generateLink(number, date, calcStarttime, calcEndTime);
double averageCO2 = 0.0;
List<Co2Data> co2DataList = Co2Data.getData(url);
for (Co2Data co2Data : co2DataList) {
averageCO2 += co2Data.getCo2Level();
}
return averageCO2 / co2DataList.size(); // Example CO2 average level
}
private static void calculateBreakPoints(double[] minuteData, Break calcBreak) {
int duration = calcBreak.getEnd().getMinute() - calcBreak.getStart().getMinute();
int breakPoints = minuteData.length;
if (duration == minuteData.length) {
for (int i = 0; i < duration; i++) {
if (minuteData[i] < minuteData[i + 1]) {
breakPoints--;
}
}
}
}
private static double getDataAverageForMinute(String time) {
// Placeholder logic to calculate average CO2 levels
return 400.0; // Example CO2 average level
} else
System.out.println("Unexpected error");
}
private static void initializeTeachers() {
@ -85,7 +78,6 @@ public class App {
}
}
private static final Scanner scanner = new Scanner(System.in);
// #region User Interaction
private static int getUserInput(String textOutput) {
@ -104,7 +96,6 @@ public class App {
System.out.println("1. Up to 5 points for keeping the window open during a small pause.");
System.out.println("2. Up to 10 points for long pauses, depending on window usage.");
System.out.println("3. 5 bonus points for teacher switches in classrooms.");
System.out.println("4. Deduct points if CO2 levels are too high.");
}
// #region shutdown
@ -168,15 +159,22 @@ public class App {
public static void main(String[] args) {
System.out.println("Calculations in process please do not shut off...");
initializeTeachers();
sortTeachers();
printTeachers();
// Loop threw each day with a specific classroom and after the weekdays are over
// go to the next of the 3 classroms
// go threw every break calculate the point and give them to the teacher
// directly
// remember the point class
// breakShedule needed
while (true) {
int userInput = getUserInput(
"Do you want to see how the points were calculated? (Yes 1, No 0; anything is an error)");
if (userInput == 1) {
printExplanation();
// add a more detailed listing of the teacher since points can be broken down
// further
printShutDown();
break;
} else if (userInput == 0) {

View file

@ -1,14 +1,10 @@
public class Break {
private Time start;
private Time end;
private Teacher teacher;
private int room;
public Break(Time start, Time end, Teacher teacher, int room) {
public Break(Time start, Time end) {
this.start = start;
this.end = end;
this.teacher = teacher;
this.room = room;
}
public Time getStart() {
@ -27,19 +23,34 @@ public class Break {
this.end = end;
}
public Teacher getTeacher() {
return teacher;
/**
* Generates a Thingspeak API link based on channel number, date, and break
* period.
*
* @param channelNumber The Thingspeak channel number.
* @param date The date in format "YYYY-MM-DD".
* @param breakPeriod The Break object containing start and end times.
* @return A formatted URL for fetching data from the Thingspeak API.
*/
public static String generateLink(int channelNumber, String date, Break breakPeriod) {
String baseUrl = "https://api.thingspeak.com/channels/";
String formattedStartDateTime = date + " " + breakPeriod.getStart().toString();
String formattedEndDateTime = date + " " + breakPeriod.getEnd().toString();
return baseUrl + channelNumber + "/feeds.csv?start=" + formattedStartDateTime.replace(" ", "%20")
+ "&end=" + formattedEndDateTime.replace(" ", "%20");
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
public static void main(String[] args) {
// Example usage
Time start = Time.valueOf("00:00:00");
Time end = Time.valueOf("23:59:59");
Break breakPeriod = new Break(start, end);
public int getRoom() {
return room;
}
String date = "2024-11-17";
int channelNumber = 1364580;
public void setRoom(int room) {
this.room = room;
String link = Break.generateLink(channelNumber, date, breakPeriod);
System.out.println(link);
}
}

View file

@ -0,0 +1,47 @@
public class BreakSchedule {
private static final String[] START_SMALL_BREAK = {
"8:30", "10:25", "11:15", "12:05", "13:30", "14:20", "16:10", "17:00", "17:50"
};
private static final String[] END_SMALL_BREAK = {
"8:35", "10:30", "11:20", "12:10", "13:35", "14:25", "16:15", "17:05", "17:55"
};
private static final String[] START_LONG_BREAK = {
"9:20", "15:10"
};
private static final String[] END_LONG_BREAK = {
"9:40", "15:25"
};
private static final Break[] SMALL_BREAKS;
private static final Break[] LONG_BREAKS;
static {
SMALL_BREAKS = createBreaks(START_SMALL_BREAK, END_SMALL_BREAK);
LONG_BREAKS = createBreaks(START_LONG_BREAK, END_LONG_BREAK);
}
private static Break[] createBreaks(String[] startTimes, String[] endTimes) {
Break[] breaks = new Break[startTimes.length];
for (int i = 0; i < startTimes.length; i++) {
// Append ":00" to include seconds
String startTimeWithSeconds = startTimes[i];
String endTimeWithSeconds = endTimes[i];
Time start = Time.valueOf(startTimeWithSeconds);
Time end = Time.valueOf(endTimeWithSeconds);
breaks[i] = new Break(start, end);
}
return breaks;
}
public static Break[] getSmallBreaks() {
return SMALL_BREAKS;
}
public static Break[] getLongBreaks() {
return LONG_BREAKS;
}
}

Binary file not shown.

View file

@ -2,21 +2,22 @@ import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class Co2Data {
// #region Fields
private Date date;
private int co2Level;
// #region Constructor
// Constructor
public Co2Data(Date date, int co2Level) {
this.date = date;
this.co2Level = co2Level;
}
// #region Getters and Setters
// Getters and Setters
public Date getDate() {
return date;
}
@ -33,17 +34,15 @@ public class Co2Data {
this.co2Level = co2Level;
}
// #region Data Fetching
// Method to fetch and parse CO2 data from a URL
public static List<Co2Data> getData(String csvURL, int classRoomNumber) {
// Fetch and parse data from a CSV URL
public static List<Co2Data> getData(String csvURL) {
List<Co2Data> dataList = new ArrayList<>();
Date referenceDate = new Date(8, 11, 2024, 0, 0); // Reference date: November 8, 2024
try {
URL url = new URL(csvURL);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept", "application/csv");
conn.setRequestProperty("Accept", "text/csv");
if (conn.getResponseCode() != 200) {
throw new RuntimeException("Failed : HTTP Error code : " + conn.getResponseCode());
@ -54,66 +53,36 @@ public class Co2Data {
String output;
while ((output = br.readLine()) != null) {
Co2Data data = parseData(output, classRoomNumber);
if (data != null && isNewerThanReferenceDate(data.getDate(), referenceDate)) {
Co2Data data = parseData(output);
if (data != null) {
dataList.add(data);
}
}
conn.disconnect();
} catch (Exception e) {
System.out.println("Exception in NetClientGet: " + e);
System.out.println("Error in data fetching: " + e);
}
return dataList;
}
// #region Date Comparison
// Method to compare if the data date is newer than the reference date
private static boolean isNewerThanReferenceDate(Date dataDate, Date referenceDate) {
if (dataDate.getYear() > referenceDate.getYear()) {
return true;
} else if (dataDate.getYear() == referenceDate.getYear()) {
if (dataDate.getMonth() > referenceDate.getMonth()) {
return true;
} else if (dataDate.getMonth() == referenceDate.getMonth()) {
return dataDate.getDay() > referenceDate.getDay();
}
}
return false;
}
// #region Data Parsing
// Method to parse CO2 data from a CSV line
private static Co2Data parseData(String csvLine, int classRoomNumber) {
String[] fields = csvLine.split(",");
if (fields.length < 5)
return null;
// Helper method to parse CSV data and create a Co2Data object
private static Co2Data parseData(String line) {
try {
String[] dateTime = fields[0].split(" ");
String[] dateParts = dateTime[0].split("-");
String[] timeParts = dateTime[1].split(":");
String[] parts = line.split(",");
String dateStr = parts[0].trim(); // assuming date is in the first column
int co2Level = Integer.parseInt(parts[1].trim()); // assuming CO2 level is in the second column
int year = Integer.parseInt(dateParts[0]);
int month = Integer.parseInt(dateParts[1]);
int day = Integer.parseInt(dateParts[2]);
int hour = Integer.parseInt(timeParts[0]);
int minute = Integer.parseInt(timeParts[1]);
Date date = new Date(day, month, year, hour, minute);
int co2Level = Integer.parseInt(fields[2]);
// Convert the date string into a Date object (assumes CSV date format is
// yyyy-MM-dd HH:mm:ss)
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = sdf.parse(dateStr);
return new Co2Data(date, co2Level);
} catch (NumberFormatException e) {
} catch (Exception e) {
System.out.println("Error parsing data line: " + e);
return null;
}
}
// #region ToString Method
// Method to return a string representation of the CO2 data
@Override
public String toString() {
return "Date: " + date + ", CO2 Level: " + co2Level;
}
}

Binary file not shown.

View file

@ -1,34 +1,62 @@
public class Date {
// #region Fields
private int day;
private int month;
private int year;
private int month;
private int day;
private int hour;
private int minute;
// #region Constructor
public Date(int day, int month, int year, int hour, int minute) {
this.day = day;
this.month = month;
this.year = year;
this.hour = hour;
this.minute = minute;
// Constructor to parse date string
public Date(String dateStr) {
String[] dateTime = dateStr.split(" ");
String[] dateParts = dateTime[0].split("-");
String[] timeParts = dateTime[1].split(":");
// Automatically adjust for Switzerland time after initialization
this.year = Integer.parseInt(dateParts[0]);
this.month = Integer.parseInt(dateParts[1]);
this.day = Integer.parseInt(dateParts[2]);
this.hour = Integer.parseInt(timeParts[0]);
this.minute = Integer.parseInt(timeParts[1]);
// Adjust for Switzerland time
adjustForSwitzerlandTime();
}
// #region Getters
public int getDay() {
return day;
// Constructor to create date with fixed numeric values
public Date(int year, int month, int day, int hour, int minute) {
this.year = year;
this.month = month;
this.day = day;
this.hour = hour;
this.minute = minute;
// Adjust for Switzerland time
adjustForSwitzerlandTime();
}
// Adjust time for Switzerland timezone (UTC+1 or UTC+2 during daylight saving
// time)
private void adjustForSwitzerlandTime() {
// Switzerland time adjustment logic (simplified version)
// For simplicity, this doesn't handle daylight saving time changes but adjusts
// based on UTC+1
this.hour += 1; // Assuming fixed UTC+1 offset for simplicity
if (this.hour >= 24) {
this.hour -= 24;
this.day += 1;
}
}
// Getter methods
public int getYear() {
return year;
}
public int getMonth() {
return month;
}
public int getYear() {
return year;
public int getDay() {
return day;
}
public int getHour() {
@ -39,38 +67,7 @@ public class Date {
return minute;
}
// #region Adjust UTC to Switzerland Time
private void adjustForSwitzerlandTime() {
hour += 1;
// Adjust if the hour exceeds 24 or falls below 0
if (hour >= 24) {
hour -= 24;
day++;
if (day > 31) { // Simple month/day rollover, could be more sophisticated
day = 1;
month++;
if (month > 12) {
month = 1;
year++;
}
}
} else if (hour < 0) {
hour += 24;
day--;
if (day < 1) {
month--;
if (month < 1) {
month = 12;
year--;
}
day = 31; // Simple month/day rollover, could be more sophisticated
}
}
}
// #region toString Override
@Override
// Method to print date in a readable format
public String toString() {
return String.format("%04d-%02d-%02d %02d:%02d", year, month, day, hour, minute);
}

Binary file not shown.

Binary file not shown.

View file

@ -26,4 +26,12 @@ public class Time {
public void setMinute(int minute) {
this.minute = minute;
}
public static Time valueOf(String time) {
String[] parts = time.split(":");
int hour = Integer.parseInt(parts[0]);
int minute = Integer.parseInt(parts[1]);
Time returnValue = new Time(hour, minute);
return returnValue;
}
}

View file

@ -0,0 +1,79 @@
public class TimeTable {
private String[][] shortTeacher;
public TimeTable(int roomIndex) {
shortTeacher = new String[11][5]; // 11 lessons, 5 weekdays
initializeTimeTable(roomIndex);
}
private void initializeTimeTable(int roomIndex) {
switch (roomIndex) {
case 0: // Room 37
fillRoom37();
break;
case 1: // Room 38
fillRoom38();
break;
case 2: // Room 39
fillRoom39();
break;
default:
throw new IllegalArgumentException("Invalid room index");
}
}
private void fillRoom37() {
shortTeacher = new String[][] {
{ "Hm", "Ts", "Lu", "Gi", "Kp" },
{ "Hm", "Ts", "Lu", "Gi", "KP" },
{ "Hi", "Ts", "Lu", "Ba", "Or" },
{ "Hm", "Ts", "Lu", "Ba", "Vt" },
{ "Hm", "Le", "Cg", "Ba", "Vt" },
{ "Lunch", "Lunch", "Lunch", "Lunch", "Lunch" },
{ "Bd", "Lunch", "Se", "Bd", "Lunch" },
{ "Gi", "Fh", "Se", "Du", "Du" },
{ "Gi", "Fh", "Se", "Lz", "Du" },
{ "Ts", "Fh", "Se", "Lz", "Du" },
{ "Ts", "Fh", "Se", "", "" }
};
}
private void fillRoom38() {
shortTeacher = new String[][] {
{ "Bz", "Kg", "Cg", "Do", "" },
{ "Bz", "Kg", "Cg", "Do", "Hu" },
{ "Bz", "Eh", "Cg", "Gr", "Ge" },
{ "Bz", "Re", "Cg", "Gr", "Eh" },
{ "Bz", "Re", "Es", "Or", "Eh" },
{ "Lunch", "Lunch", "Lunch", "Lunch", "Lunch" },
{ "Lunch", "Lunch", "Lunch", "Lunch", "Bu" },
{ "Hn", "Bt", "Cg", "Bu", "Eh" },
{ "Hn", "Kh", "Cg", "Bu", "Eh" },
{ "Bu", "Kh", "", "Zu", "" },
{ "Hn", "", "", "", "" }
};
}
private void fillRoom39() {
shortTeacher = new String[][] {
{ "Bd", "Do", "Cg", "Bd", "Gi" },
{ "Bd", "Do", "Cg", "Bd", "Gi" },
{ "Bd", "Zu", "Cg", "Bd", "Gr" },
{ "Bd", "Zu", "Cg", "Bd", "Gr" },
{ "Bd", "Zu", "Bu", "Or", "Gi" },
{ "Lunch", "Lunch", "Lunch", "Lunch", "Lunch" },
{ "Lunch", "Lunch", "Lunch", "Lunch", "Lunch" },
{ "Lu", "Se", "Gi", "Le", "Hi" },
{ "Lu", "Se", "Gi", "Le", "Hi" },
{ "Lu", "Se", "Gi", "Le", "Hi" },
{ "Lu", "Se", "Gi", "", "" }
};
}
public String getLesson(int lesson, int day) {
if (lesson < 0 || lesson >= 11 || day < 0 || day >= 5) {
throw new IllegalArgumentException("Invalid lesson or day");
}
return shortTeacher[lesson][day];
}
}

View file

@ -0,0 +1,7 @@
{
"java.project.sourcePaths": ["src"],
"java.project.outputPath": "bin",
"java.project.referencedLibraries": [
"lib/**/*.jar"
]
}

View file

@ -0,0 +1,18 @@
## Getting Started
Welcome to the VS Code Java world. Here is a guideline to help you get started to write Java code in Visual Studio Code.
## Folder Structure
The workspace contains two folders by default, where:
- `src`: the folder to maintain sources
- `lib`: the folder to maintain dependencies
Meanwhile, the compiled output files will be generated in the `bin` folder by default.
> If you want to customize the folder structure, open `.vscode/settings.json` and update the related settings there.
## Dependency Management
The `JAVA PROJECTS` view allows you to manage your dependencies. More details can be found [here](https://github.com/microsoft/vscode-java-dependency#manage-dependencies).

View file

@ -0,0 +1,22 @@
public static void main(String[] args) {
try {
// Example input for generating the URL
String channelId = "123456"; // Replace with your actual channel ID
String apiKey = "YOUR_READ_API_KEY"; // Replace with your actual API key
int results = 50; // Fetch 50 records
String start = "2024-11-01 00:00:00"; // Start date-time
String end = "2024-11-01 23:59:59"; // End date-time
String timezone = "Europe/Zurich"; // Timezone
// Generate the dynamic URL using the method
String url = createThingSpeakURL(channelId, apiKey, results, start, end, timezone);
// Output the generated URL
System.out.println("Generated ThingSpeak URL: ");
System.out.println(url);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}

View file

@ -0,0 +1,87 @@
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ThingSpeakURLGenerator {
// Constants for Room channel numbers
private static final int ROOM_39_NUMBER = 1521262;
private static final int ROOM_38_NUMBER = 1364580;
private static final int ROOM_37_NUMBER = 1521263;
// Example Dates for fetching data, dynamically generated
private static final LocalDateTime START_DATE = LocalDateTime.of(2024, 11, 1, 0, 0);
private static final LocalDateTime END_DATE = LocalDateTime.of(2024, 11, 1, 23, 59);
// Room URLs
private static final Map<Integer, String> ROOM_URLS = new HashMap<>();
static {
ROOM_URLS.put(39, createUrl(ROOM_39_NUMBER));
ROOM_URLS.put(38, createUrl(ROOM_38_NUMBER));
ROOM_URLS.put(37, createUrl(ROOM_37_NUMBER));
}
// Method to create the ThingSpeak API URL dynamically
public static String createUrl(int channelNumber) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String startDate = encodeUrlParam(START_DATE.format(formatter));
String endDate = encodeUrlParam(END_DATE.format(formatter));
return String.format("https://api.thingspeak.com/channels/%d/feeds.csv?start=%s&end=%s",
channelNumber, startDate, endDate);
}
// Helper method to URL encode the date strings
private static String encodeUrlParam(String value) {
try {
return URLEncoder.encode(value, "UTF-8");
} catch (UnsupportedEncodingException e) {
System.err.println("Error encoding URL parameter: " + e.getMessage());
return value;
}
}
// Method to calculate the average of a specific number of data points (e.g.,
// CO2 levels)
public static double calculateAverage(List<Co2Data> dataList) {
if (dataList == null || dataList.isEmpty()) {
return 0.0;
}
double sum = 0.0;
for (Co2Data data : dataList) {
sum += data.getCo2Level(); // Assuming Co2Data has a method getCo2Level() that returns the CO2 level
}
return sum / dataList.size();
}
public static void main(String[] args) {
try {
// Print out the generated URLs for each room
for (Map.Entry<Integer, String> entry : ROOM_URLS.entrySet()) {
System.out.println("Room " + entry.getKey() + " URL: " + entry.getValue());
}
// Example: Calculate and print the average CO2 level for each room (assuming
// Co2Data.getData() method exists)
List<Co2Data> room39Data = Co2Data.getData(ROOM_URLS.get(39));
List<Co2Data> room38Data = Co2Data.getData(ROOM_URLS.get(38));
List<Co2Data> room37Data = Co2Data.getData(ROOM_URLS.get(37));
double avgRoom39 = calculateAverage(room39Data);
double avgRoom38 = calculateAverage(room38Data);
double avgRoom37 = calculateAverage(room37Data);
System.out.println("Average CO2 Level in Room 39: " + avgRoom39);
System.out.println("Average CO2 Level in Room 38: " + avgRoom38);
System.out.println("Average CO2 Level in Room 37: " + avgRoom37);
} catch (Exception e) {
e.printStackTrace();
}
}
}