n8n으로 미세먼지 알림 받기 (feat. 미세먼지 API)

2025. 4. 9. 17:00·Infra/n8n

환기를 할 수가 업서!!

맑은 공기 내놔~~~

봄이 되다 보니 미세먼지가 또 난리다

환기를 하긴 해야 하는데...

그렇다고 매일 어플을 들어가거나 검색해서 확인하기도 귀찮다

알림봇을 만들기로 결심! 바로 진행해보자

 

오늘 우리가 만들 것은 다음과 같은데 지역은 각자 맞추면 된다

일단 아래와 같은 순서로 동작한다

1) 2시간 인터벌 노드 (2시간마다 알림을 보낼 것)
2) if 노드로 주중 or 주말 체크 (주말엔 알림이 필요 없다)
3) 오늘 날짜 확인 및 필요한 데이터로 변환
4) 미세먼지 API에서 필요한 데이터 형태로 수정
5) 미세먼지 API HTTP Request 발송
6) Request 받고, 필요한 데이터 필터링
7) 조건에 따라 미세먼지 상태 판단
8) 전부 텍스트로 편하게 보낼 수 있도록 데이터 전처리
9) 웹훅으로 알림 전송

노드 하나씩 살펴보고 세팅해보자!!


1. 2시간 인터벌 노드 (2시간마다 알림을 보낼 것)

크론탭 설정하는게 더 쉬워서 크론탭으로 트리거 세팅했음

동작 조건 : 매일, 10, 14, 16시 정각에 동작

 

아래 사이트에서 좀 더 보기 편하게 짤 수 있다

https://crontab.guru/#5_4_*_*_sun

 

Crontab.guru - The cron schedule expression generator

When a Cron job fails, get to the root cause in minutes Stop guessing if your system is down because of a failing cron job. Cronitor gives you the reporting Cron should have shipped with. Setup takes 5 minutes and you'll get instant alerts when things go w

crontab.guru


2. 현재 시간 get & 주중 or 주말 체크 (주말엔 알림이 필요 없다)

1) Date & Time 노드로 현재 시간 정보 가져오기

그냥 편하게 하려고 크론탭 동작되는 시점에 Date & Time으로 현재 시간 가져온다

지금보니 Interval 노드에 timestamp 있으니까 그걸로 대체해도 될 것 같다

(Interval 데이터로 해도 될 것 같은데 왜 이랬지..?)


2) 주말인지 확인

interval 노드 데이터에 요일도 있길래 이거 가져다 써서 구현하면 된다

contains 써가지고 주말인지 아닌지만 체크하면 


3. 오늘 날짜 확인 및 필요한 데이터로 변환

input으로 들어온 데이터에서 필요한 것만 String으로 뽑아내기

더보기

필요한 데이터 추출 JS 코드

n8n은 늘 input 데이터를 받아오는 것이 헷갈리곤 하는데, $input으로 받아오면 된다

const currentDate = new Date($input.first().json.currentDate); // 문자열을 Date 객체로 변환

// 한국 시간대 (UTC+9)로 시간과 분을 추출
const hour = ('0' + (currentDate.getUTCHours() + 9)).slice(-2); // 한국 시간대는 UTC+9
const minute = ('0' + currentDate.getUTCMinutes()).slice(-2); // 분은 UTC에서 그대로 가져옴

// 날짜를 "YYYYMMDD" 형식으로 변환
const formattedDate = currentDate.getFullYear().toString() +
                      ('0' + (currentDate.getMonth() + 1)).slice(-2) +
                      ('0' + currentDate.getDate()).slice(-2);

// 반환할 객체 형식
return [
  {
    json: {
      formattedDate: formattedDate,
      hour: hour,
      minute: minute
    }
  }
];


4. 미세먼지 API에서 필요한 데이터 형태로 수정

여기는 각자의 지역에 맞춰 약간의 커스텀과 API가 필요한 부분이다

나는 한국환경공단 에어코리아 대기오염통계 현황 API를 사용했음

 

해당 API 발급 및 활용 방법은 아래 포스팅에서 참고

https://ratatou2.tistory.com/145

 

미세먼지 API 발급 및 활용해보기 (feat. 공공데이터 포털)

오늘 미세먼지가 어떻다고?~n8n으로 미세먼지 알림봇 만들다가 선행되어야 하는 포스팅 발견n8n 안에 욱여넣기엔 양이 많고 연관이 없어서 분리함...1. 미세먼지 API 발급 요청하기아래 공공데이

ratatou2.tistory.com

 

아무튼 API에 맞춰서 요청을 보내면 오른쪽처럼 지역에 대한 미세먼지 데이터를 받아올 수 있다

파라미터 명을 API에 맞춰둬야 편하

여기서 핵심은 이 다음에 HTTP Request를 보낼건데 그에 맞춰 파라미터 변수명을 API 가이드대로 맞춰두는 것이다


5. 미세먼지 API HTTP Request 발송

API를 제대로 쐈다면 오른쪽처럼 데이터를 받아올 수 있다

특히, 이 요청을 보낼 때 쓸 키는 Encoding 키이다

URL 쪽을 자세히 보면 Expression을 따라 Result가 잘 대입되어 나오는 것을 확인할 수 있다

 

4번을 진행한 이유가 여기서 나온다
그간 n8n을 써보니 다음 노드에서 파라미터를 드래그 앤 드랍으로 넣을 수 있다는 장점이 강점다

다만, 이게 너무 명칭이 너무 길거나, 가져오려는 노드 데이터가 꽤 이전 것이라면 잘 안 되는 문제가 있었다

그래서 이렇게 정리하는 노드를 세팅해둔 것

그러니 이렇게 정리하는 노드를 넣지 않아도 잘 동작한다면 이대로 따라갈 필요는 없다

 


6. Request 받고, 필요한 데이터 필터링

여기서 나는 125개의 데이터 모두가 필요한 것이 아니다

시간 기준으로 내림차순 정렬되어 있기 때문에, 최근 데이터가 최상단에 위치한다

따라서 내가 필요한 지역(여기서는 유성구로 지정했다)을 첫번째로 마주치는 순간 해당 데이터만 저장하고 멈추도록 세팅했다

즉, 유성구에 가장 최신 정보만 output으로 저장하고 나머진 버렸다는 의미다

더보기

유성구 데이터만 가져오는 JS 코드

// 입력 데이터 Get
const items = $input.all();

// 첫 번째로 cityName이 '유성구'인 항목 (최신 데이터)
const filteredItem = items
  .map(item => item.json.response.body.items) // items 배열을 가져옴
  .flat() // items 배열 안의 배열을 평탄화
  .find(item => item.cityName === '유성구'); // cityName이 '유성구'인 첫 번째 항목을 찾음

// 조건에 맞는 항목이 있으면 반환하고, 없으면 빈 배열을 반환
if (filteredItem) {
  return [
    {
      json: filteredItem
    }
  ];
} else {
  return []; // 조건에 맞는 항목이 없으면 빈 배열
}

 


7. 조건에 따라 미세먼지 상태 판단

이제 미세먼지 상태를 따질 것이다

한국은 WHO 기준보다 느슨하긴 해서, 이 부분은 취향껏 조절하면 된다

'미세미세' 라는 앱이 더 기준을 세세하게 잘 나눠둔 듯해서 해당 기준을 나도 가져다 쓸까 고민중

더보기

조건에 따라 현재 미세먼지 상태 구분

- pm10은 미세먼지

- pm25는 초미세먼지 (PM2.5)를 의미한다

// 미세먼지 (PM10)와 초미세먼지 (PM2.5)의 값을 인자로 받는 함수
function getAirQuality(pm10, pm25) {
    let pm10Status, pm25Status;

    // PM10 (미세먼지) 등급 판별
    if (pm10 >= 0 && pm10 <= 30) {
        pm10Status = "좋음";
    } else if (pm10 >= 31 && pm10 <= 80) {
        pm10Status = "보통";
    } else if (pm10 >= 81 && pm10 <= 150) {
        pm10Status = "나쁨";
    } else {
        pm10Status = "매우나쁨";
    }

    // PM2.5 (초미세먼지) 등급 판별
    if (pm25 >= 0 && pm25 <= 15) {
        pm25Status = "좋음";
    } else if (pm25 >= 16 && pm25 <= 50) {
        pm25Status = "보통";
    } else if (pm25 >= 51 && pm25 <= 100) {
        pm25Status = "나쁨";
    } else {
        pm25Status = "매우나쁨";
    }

    // JSON 형식으로 반환
    return [
      {
        json: {
          pm10Status: pm10Status,
          pm25Status: pm25Status
        }
      }
    ];
}

// 예시 사용
const pm10Value = $input.first().json.pm10Value; // 미세먼지 값 (예: 85)
const pm25Value = $input.first().json.pm25Value; // 초미세먼지 값 (예: 25)

const airQuality = getAirQuality(pm10Value, pm25Value);
return airQuality;  // "나쁨" 등급을 JSON 형식으로 반환


8. 전부 텍스트로 편하게 보낼 수 있도록 데이터 전처리

이 부분도 개인의 사용처에 따라 커스텀이 필요한 부분이다

앞서 말했던 이슈로 그냥 다음 노드에서 쓸 데이터들을 미리 다 정리해두는게 좋아서 넣은 노드

이제 저 상태 그대로 웹훅 쏴버리면 된다


9. 웹훅으로 알림 전송

JSON으로 발송하면 끝!


결과

이제 n8n workflow 저장해두고 서버 켜두면 알아서 띠링띠링..

편리하다 진짜 n8n 누가 만들었냐..

'Infra > n8n' 카테고리의 다른 글

n8n에서 GitHub API 사용시 유의사항 (feat. 어찌보면 너무 당연한..)  (0) 2025.04.11
n8n 특정 요일(Day)에만 동작하도록 조건 걸기 (feat. if & Date 노드)  (0) 2025.04.07
AI 코드리뷰 자동화 시스템 한방에 구축하기 (feat. n8n)  (2) 2025.03.13
n8n, 외부 라이브러리, 모듈 없음 (feat. Cannot find module)  (0) 2025.02.13
n8n, Active 안되는 이슈 해결방법 (feat. n8n 활성화)  (0) 2025.02.12
'Infra/n8n' 카테고리의 다른 글
  • n8n에서 GitHub API 사용시 유의사항 (feat. 어찌보면 너무 당연한..)
  • n8n 특정 요일(Day)에만 동작하도록 조건 걸기 (feat. if & Date 노드)
  • AI 코드리뷰 자동화 시스템 한방에 구축하기 (feat. n8n)
  • n8n, 외부 라이브러리, 모듈 없음 (feat. Cannot find module)
Ratatou2
Ratatou2
온갖 정보들을 기록해두는 메모보드 블로그
  • Ratatou2
    nak-z
    Ratatou2
  • 전체
    오늘
    어제
  • 공지사항

    • 블로그 이전 진행 중 (24.11.25 ~)
    • 분류 전체보기 (183) N
      • OS (63)
        • Linux (34)
        • Window (20)
        • Mac (5)
        • Android (4)
      • Infra (41) N
        • Docker (12) N
        • Jenkins (9)
        • n8n (13)
        • Nextcloud (1)
        • Rasberry Pi (6)
      • Dev (9)
        • JAVA (3)
        • Python (0)
        • DB (3)
        • Vue (2)
        • AI (1)
        • Git (0)
      • CS & Algorithm (40)
        • CS (1)
        • Algorithm (39)
      • Game (10)
        • Zomboid (9)
        • Don't Starve Together (1)
      • etc (20)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 인기 글

  • . hELLO· Designed By정상우.v4.10.1 .
Ratatou2
n8n으로 미세먼지 알림 받기 (feat. 미세먼지 API)
상단으로

티스토리툴바