Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
students
eue
Commits
4ca7dadf
Commit
4ca7dadf
authored
May 12, 2021
by
KangMin An
Browse files
Create & Update : 데이터 저장 구조 변경. 그에 따른 문서 생성 및 수정.
parent
6fd1d6fb
Changes
3
Show whitespace changes
Inline
Side-by-side
README.md
View file @
4ca7dadf
...
@@ -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/
r
db
_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
r
db
_setting
/dbsetting.js
```
```
위의 명령어를 통해 Location에 관련된 Relation들에 data가 입력됩니다.
위의 명령어를 통해 Location에 관련된 Relation들에 data가 입력됩니다.
<br>
5.
/server 경로상에서 다음을 입력해 서버를 시작합니다. (개발용 서버 동작)
```
console
npm run dev:server
```
server/Data명세서.md
0 → 100644
View file @
4ca7dadf
### _데이터 명세서_
<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형식의 독립적인 파일로 생성해 저장합니다. 저장된 가중치는 다음 훈련의 초기값으로 사용됩니다.
server/src/controllers/dataController.js
View file @
4ca7dadf
...
@@ -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
=
"
w
D
at
a
.csv
"
;
const
fileName
=
"
w
e
at
her
.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
);
};
};
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment