Commit 4ca7dadf authored by KangMin An's avatar KangMin An
Browse files

Create & Update : 데이터 저장 구조 변경. 그에 따른 문서 생성 및 수정.

parent 6fd1d6fb
...@@ -14,11 +14,11 @@ ...@@ -14,11 +14,11 @@
- 3-2. [Client (React)](https://github.com/dorakang612/EUE#3-2-client-react) - 3-2. [Client (React)](https://github.com/dorakang612/EUE#3-2-client-react)
- 3-3. [Server (Express.js)](https://github.com/dorakang612/EUE#3-3-server-expressjs) - 3-3. [Server (Express.js)](https://github.com/dorakang612/EUE#3-3-server-expressjs)
</br> <br>
--- ---
</br> <br>
## 1. 프로젝트 구성 ## 1. 프로젝트 구성
...@@ -32,16 +32,17 @@ ...@@ -32,16 +32,17 @@
∟ (data) ∟ (data)
∟ src ∟ src
∟ controllers ∟ controllers
∟ db ∟ data_processing
∟ rdb_setting
∟ routers ∟ routers
∟ views ∟ views
</br> <br>
</br> <br>
## 2. 프로젝트 설치 ## 2. 프로젝트 설치
</br> <br>
### 2-1. Git ### 2-1. Git
...@@ -51,22 +52,22 @@ ...@@ -51,22 +52,22 @@
git clone https://github.com/dorakang612/EUE.git git clone https://github.com/dorakang612/EUE.git
``` ```
</br> <br>
**또는** **또는**
</br> <br>
### 2-2. Zip File ### 2-2. Zip File
프로젝트의 zip 파일을 <https://github.com/dorakang612/EUE>에서 받은 뒤 압축을 해제하여 설치합니다. 프로젝트의 zip 파일을 <https://github.com/dorakang612/EUE>에서 받은 뒤 압축을 해제하여 설치합니다.
</br> <br>
</br> <br>
## 3. 프로젝트 실행 ## 3. 프로젝트 실행
</br> <br>
### 3-1. 아두이노 ### 3-1. 아두이노
...@@ -75,6 +76,7 @@ git clone https://github.com/dorakang612/EUE.git ...@@ -75,6 +76,7 @@ git clone https://github.com/dorakang612/EUE.git
> - 이미 설치를 해두셨다면 바로 아래부터 진행합니다. > - 이미 설치를 해두셨다면 바로 아래부터 진행합니다.
> >
> - 최근에는 Arduino에서 Online IDE를 서비스해주는 것 같습니다. 아두이노를 많이 다루지 않아도 되므로, 필요에 따라 IDE설치 보다 Online IDE를 사용하는 것을 고려해보시기 바랍니다.(해당 내용은 추후 서비스 사용 후 수정 예정) > - 최근에는 Arduino에서 Online IDE를 서비스해주는 것 같습니다. 아두이노를 많이 다루지 않아도 되므로, 필요에 따라 IDE설치 보다 Online IDE를 사용하는 것을 고려해보시기 바랍니다.(해당 내용은 추후 서비스 사용 후 수정 예정)
> <br>
2. 프로젝트에서 다음의 두 파일을 수정합니다. 2. 프로젝트에서 다음의 두 파일을 수정합니다.
...@@ -87,21 +89,28 @@ git clone https://github.com/dorakang612/EUE.git ...@@ -87,21 +89,28 @@ git clone https://github.com/dorakang612/EUE.git
2. SSPW (공유기의 비밀번호) 2. SSPW (공유기의 비밀번호)
3. EUEIP (웹사이트 아이피주소) 3. EUEIP (웹사이트 아이피주소)
4. EUEPORT (웹사이트 포트번호) 4. EUEPORT (웹사이트 포트번호)
<br>
3. 아두이노 메인보드를 PC에 연결합니다. 3. 아두이노 메인보드를 PC에 연결합니다.
<br>
4. 실내용 아두이노 보드에는 main_inside.io를 업로드합니다. 4. 실내용 아두이노 보드에는 main_inside.io를 업로드합니다.
<br>
5. 외부용 아두이노 보드에는 main_inside.io를 업로드합니다. 5. 외부용 아두이노 보드에는 main_inside.io를 업로드합니다.
> 프로젝트를 진행하는데 있어 사용한 모듈 정보는 arduino/info.md를 참고하시면 됩니다. > 프로젝트를 진행하는데 있어 사용한 모듈 정보는 arduino/info.md를 참고하시면 됩니다.
</br> <br>
### 3-2. Client (React) ### 3-2. Client (React)
</br> <br>
### 3-3. Server (Express.js) ### 3-3. Server (Express.js)
<br>
1. /server 경로상으로 이동한 뒤 다음의 명령어를 실행합니다. 1. /server 경로상으로 이동한 뒤 다음의 명령어를 실행합니다.
```console ```console
...@@ -110,18 +119,34 @@ git clone https://github.com/dorakang612/EUE.git ...@@ -110,18 +119,34 @@ git clone https://github.com/dorakang612/EUE.git
위의 명령어를 통해 프로젝트가 사용하는 모든 node module들을 설치합니다. 위의 명령어를 통해 프로젝트가 사용하는 모든 node module들을 설치합니다.
<br>
2. Mysql을 통해 Database를 생성합니다. 2. Mysql을 통해 Database를 생성합니다.
각자의 OS에 맞는 방법으로 MySQL 서버에 접속해 주신 뒤, DataBase를 생성해줍니다.
<br>
3. 생성된 Database 상에서 다음의 명령어를 입력해 Relation들을 생성합니다. 3. 생성된 Database 상에서 다음의 명령어를 입력해 Relation들을 생성합니다.
```console ```console
mysql> source server/src/db/eue.sql mysql> source server/src/rdb_setting/eue.sql
``` ```
4. /server 경로상으로 이동한 뒤 db/dbsetting.js를 다음의 명령어로 실행합니다. <br>
4. /server 경로상으로 이동한 뒤 rdb_setting/dbsetting.js를 다음의 명령어로 실행합니다.
```console ```console
npx babel-node db/dbsetting.js npx babel-node rdb_setting/dbsetting.js
``` ```
위의 명령어를 통해 Location에 관련된 Relation들에 data가 입력됩니다. 위의 명령어를 통해 Location에 관련된 Relation들에 data가 입력됩니다.
<br>
5. /server 경로상에서 다음을 입력해 서버를 시작합니다. (개발용 서버 동작)
```console
npm run dev:server
```
### _데이터 명세서_
<br>
# 1. Data Directory Structure
data
∟ Local Code (Do/도)
∟ Local Code (SGG/시군구)
∟ Local Code (EMD/읍면동)
∟ Year (연)
∟ YYYYMMDD (연/월/일)
∟ Outside
∟ weather.csv
∟ Users
∟ ID (사용자 개인 ID)
∟ weather.csv
∟ weights.csv
데이터가 저장되는 경로의 구조입니다.<br><br>
# 2. Data Format
데이터들은 CSV(Comma Separated Values) 형식의 파일로 저장됩니다.<br><br>
## Ouside Data
외부 데이터는 다음과 같은 형식으로 저장됩니다.
| Month | Date | Hour | Minute | Temperature | Humidity | Press | Wind Speed |
| :---: | :--: | :--: | :----: | :---------: | :------: | :-------: | :--------: |
| 월 | 일 | 시 | 분 | 온도(℃) | 습도(%) | 기압(hPa) | 풍속(m/s) |
<br><br>
## User Side Data
사용자가 설정한 장소의 데이터는 다음과 같은 형식으로 저장됩니다.
| Month | Date | Hour | Minute | Temperature | Humidity | Lights | Future Temperature |
| :---: | :--: | :--: | :----: | :---------: | :------: | :----: | :------------------: |
| 월 | 일 | 시 | 분 | 온도(℃) | 습도(%) | 광도 | 단위 시간 후 온도(℃) |
<br><br>
# 3. Data Processing
EUE가 제일 중요하게 수행해야할 부분입니다. 데이터를 학습하고 예측 값을 반환합니다.
## Input Data
- 공통 데이터
- 월 ( Month )
- 일 ( Date )
- 시 ( Hour )
- 분 ( Minute )
- 외부 데이터
- 온도
- 습도
- 기압
- 풍속
- 사용자 데이터
- 온도
- 습도
- 광도
<br>
## Output Data
- 사용자 장소의 미래 온도
: 현재 시간에 들어온 데이터들을 통해서 다음 30분, 한시간의 데이터를 예측합니다.<br><br>
## Modeling Method
[Linear Regression](https://ko.wikipedia.org/wiki/선형_회귀)를 통해서 데이터들의 선형 관계를 파악 후 다음의 온도를 예측해보려 합니다.
훈련 데이터는 최근 7일 간의 데이터를 사용합니다. 훈련을 통해 생성된 가중치들은 데이터들과 마찬가지로 CSV형식의 독립적인 파일로 생성해 저장합니다. 저장된 가중치는 다음 훈련의 초기값으로 사용됩니다.
...@@ -40,9 +40,19 @@ const getTimeInfo = () => { ...@@ -40,9 +40,19 @@ const getTimeInfo = () => {
return time; return time;
}; };
const getDataDIR = (loc, time) => {
const repoDIR = `./data/${loc.DO}/${loc.SGG}/${loc.EMD}/${time.year}/${
time.year
}${time.month < 10 ? "0" + time.month : time.month}${
time.date < 10 ? "0" + time.date : time.date
}`;
return repoDIR;
};
// 데이터를 파일 형식으로 저장 // 데이터를 파일 형식으로 저장
const storeData = (type, time, loc, fdir, data) => { const storeData = (type, time, loc, fdir, data) => {
const fileName = "wData.csv"; const fileName = "weather.csv";
fs.open(fdir + `/${fileName}`, "a", (err, fd) => { fs.open(fdir + `/${fileName}`, "a", (err, fd) => {
if (err) { if (err) {
...@@ -55,7 +65,14 @@ const storeData = (type, time, loc, fdir, data) => { ...@@ -55,7 +65,14 @@ const storeData = (type, time, loc, fdir, data) => {
}); });
console.log("Create directory."); console.log("Create directory.");
} else console.log(err);
if (type === IN) {
data = data.split("\n")[1];
console.log("Split the user Data.");
}
}
// 그 외의 에러는 출력
else console.log(err);
} }
fs.appendFile(fdir + `/${fileName}`, data, (err) => { fs.appendFile(fdir + `/${fileName}`, data, (err) => {
...@@ -73,8 +90,9 @@ const storeData = (type, time, loc, fdir, data) => { ...@@ -73,8 +90,9 @@ const storeData = (type, time, loc, fdir, data) => {
// 외부 수집기로 부터 들어온 정보 처리 // 외부 수집기로 부터 들어온 정보 처리
const handleOutData = (locCode, lat, lng) => { const handleOutData = (locCode, lat, lng) => {
// OpenWeatherAPI로 부터 지역의 날씨 정보획득 // OpenWeatherAPI로 부터 지역의 날씨 정보획득
// 지역의 경도와 위도, API KEy, 단위 기준 metric 전달
fetch( fetch(
`https://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${lng}&appid=${process.env.OPENWEATHERMAP_API_KEY}` `https://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${lng}&appid=${process.env.OPENWEATHERMAP_API_KEY}&units=metric`
) )
.then((response) => response.json()) .then((response) => response.json())
.then((json) => { .then((json) => {
...@@ -86,8 +104,9 @@ const handleOutData = (locCode, lat, lng) => { ...@@ -86,8 +104,9 @@ const handleOutData = (locCode, lat, lng) => {
const loc = locCodeSep(locCode); const loc = locCodeSep(locCode);
const time = getTimeInfo(); const time = getTimeInfo();
const fdir = `data/${loc.DO}/${loc.SGG}/${loc.EMD}/Outside/${time.year}/${time.month}/${time.date}`; const fdir = getDataDIR(loc, time) + "/Outside";
const data = `${time.hour},${time.minute},${temp},${humi},${press},${wind_speed}\n`; // 데이터 형식 - 월 | 일 | 시 | 분 | 온도 | 습도 | 기압 | 풍속
const data = `${time.month},${time.date},${time.hour},${time.minute},${temp},${humi},${press},${wind_speed}\n`;
storeData(OUT, time, loc, fdir, data); storeData(OUT, time, loc, fdir, data);
}) })
...@@ -99,8 +118,9 @@ const handleInData = (id, locCode, temp, humi, lights) => { ...@@ -99,8 +118,9 @@ const handleInData = (id, locCode, temp, humi, lights) => {
const loc = locCodeSep(locCode); const loc = locCodeSep(locCode);
const time = getTimeInfo(); const time = getTimeInfo();
const fdir = `data/${loc.DO}/${loc.SGG}/${loc.EMD}/${id}/${time.year}/${time.month}/${time.date}`; const fdir = getDataDIR(loc, time) + `/Users/${id}`;
const data = `${time.hour},${time.minute},${temp},${humi},${lights}\n`; // 데이터 형식 - [이전 줄 : 현재 온도 ( 이전 기록 기준 단위 시간 후 온도)] , [ 현재 줄 : 월 | 일 | 시 | 분 | 온도 | 습도 | 광도 ]
const data = `${temp}\n${time.month},${time.date},${time.hour},${time.minute},${temp},${humi},${lights}`;
storeData(IN, time, loc, fdir, data); storeData(IN, time, loc, fdir, data);
}; };
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment