전기가 끊길 때: 나이지리아의 정전 상황에서 노트북을 들고 밖에 나가게 하는 앱
요약
본 앱은 나이지리아의 정전 상황을 활용하여 사용자가 신체 활동을 하도록 유도하는 웹 기반 도구입니다. 전기가 끊기는 짧은 시간 동안 60초 스트레칭 타이머와 외부 활동 권유 메시지를 제공하며, 배터리 상태에 따른 맞춤형 알림(일몰/야경)을 통해 사용자에게 휴식과 움직임을 상기시킵니다.
핵심 포인트
- 정전 시간을 활용한 신체 활동 유도 앱 개발 사례
- 60초 스트레칭 타이머 및 '스스로 해냈습니다' 메시지 구현
- 배터리 잔량, 시간대별(낮/밤) 상황을 반영한 맞춤형 알림 제공
이 글은 Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass에 제출하는 내용입니다.
내가 만든 것
포트하코트에서는 전기가 나가면 방의 분위기가 약 2초 만에 변합니다. 선풍기는 멈추고, 라우터는 작동을 멈춥니다. 노트북은 배터리 구동으로 전환됩니다. 그러다 누군가 "발전기 틀어!"라고 소리칩니다.
예전에는 그냥 앉아만 있었습니다. 휴대폰으로는 모바일 데이터를 사용하고, 노트북은 배터리로 전원을 유지하며 발전기가 돌아오기를 기다렸습니다.
NEPA(전력 회사)의 전기가 끊기는 순간부터 누군가 발전기를 가동하기 시작하는 그 짧은 간격이 제가 하루를 보내는 동안 화면이 가장 많이 꺼지는 순간입니다. 정전 시에는 이 시간을 활용합니다. 노트북 배터리가 30초 이상 구동되면, 현재 작업 중인 어떤 페이지 위로 전체 화면 페이지가 열립니다:
[
10월 8일 12시 31분의 실제 정전 상황. 큰 전선은 Gemma의 것입니다. 그 위의 선은 코드입니다.
이것은 저에게 하나의 계획을 제공합니다. 즉, 60초 스트레칭 타이머(일어서기, 팔 위로 뻗기, 어깨 돌리기, 발끝 터치하기, 밖에 나가기)와 버튼: "저는 일어났습니다. 닫기." 이 타이머가 끝나면 **"스스로 해냈습니다."**라는 메시지가 표시됩니다. 다음 정전이 발생할 때까지 페이지는 다시 열리지 않습니다.
하늘은 상황을 반영합니다. 낮에는 따뜻하고 비나 일몰 시간을 카운트다운 합니다. 밤에는 어둡고, 집 근처에 이 계획이 준비되어 있습니다:
[

Day와 night은 시뮬레이션 실행(ldg simulate)입니다. 제시되는 알림(nudges)은 해당 실행에서 가져온 실제 Gemma 출력물이며, 로그에서 추출되었습니다.
이 페이지는 라우터가 이미 꺼져 있기 때문에 인터넷 연결 없이 작동합니다: 웹 폰트를 사용하지 않으며 CDN에서 아무것도 로드하지 않습니다.
이는 정전이 일상적인 환경에서 노트북으로 작업하는 모든 사람을 위한 것입니다: 나이지리아, 남아프리카공국의 전력 차단(load-shedding), 인도와 파키스탄의 많은 지역. 이 문제에 대해 누구에게도 설명할 필요가 없습니다.
모를 수 있는 단어들 (나이지리아 영어 및 피진):
| 단어 | 의미 |
|---|---|
| NEPA | 나이지리아 사람들이 여전히 부르는 전력 회사(구 국립전력청, National Electric Power Authority). "NEPA takes light"는 그리드 전력이 끊긴다는 의미입니다. |
| ... |
데모
YouTube에서 시청하기:
지금까지의 실제 정전 기록, logs/outages.jsonl (2026년 10월 8일과 9일, WAT):
| 시간 | 이벤트 | 도구가 취한 조치 |
|---|---|---|
| 12:23 | NEPA 차단 | 비 오는 길, 실내 활동. Gemma가 시간 초과(timed out); 대체 문장 표시 |
| ... | ||
| 도구가 밖에 나가라고 했을 때 제가 한 일. 저는 노트북을 닫고 포트하코에서 동네를 산책하고, 사촌들을 방문하여 그들의 아이들과 놀았습니다. 이것이 10월 9일의 07:33 차단 상황이었습니다. 전기는 약 12:05에 돌아왔습니다. |
첫 실제 정전 기록은 버그를 발견했습니다. 자세한 내용은 아래에서 다룹니다.
코드
GitHub logo dannwaneri / light-don-go
NEPA가 전기를 끊으면, 현지 Gemma가 발전기(gen)를 켜기 전에 밖에 나가라고 알려줍니다. Hacktoberfest 2026 Touch Grass.
Light don go
NEPA가 전기를 끊고, 누군가 발전기를 시작하기 전에, 당신의 노트북이 당신에게 밖에 나가라고 알린 다음, 자리를 비킵니다.
- 정전 감지: 노트북 배터리가 30초 이상 방전될 때 (이 집에는 인버터가 없음).
- 라우터 작동 방식: 전력 공급 중일 때는 예보를 저장하고, 정전 후에는 네트워크에 아무것도 연결하지 않음.
- 코드 결정, Gemma 문구 생성: 규칙은 일몰 시간(NOAA 공식, 오프라인), 건기 기간 및 절약된 ₦ 금액을 계산한 다음 사실 라인을 작성합니다. 로컬 오픈 웨이트 모델인 Gemma는 알림만 작성하며, 숫자가 있거나, 20단어를 초과하거나, '전등/발전기'를 언급하면 가드(guard)가 거부합니다. 한 번 재시도 후에는 고정된 문장이 나갑니다.
모를 수 있는 단어들 (나이지리아 영어 및 피진어):
| 단어 | 의미 |
|---|---|
| NEPA | 나이지리아 사람들이 여전히 부르는 전력 회사 이름 (구 국립전기공사, National Electric Power Authority). 'NEPA takes light'는 그리드 전력이 끊긴다는 뜻입니다. |
…
제작 과정 (How I Built It)
감지 기능 (Detection). 저희 집에는 인버터가 없기 때문에 NEPA 전력이 끊기면 노트북 배터리가 실제로 방전됩니다. psutil이 5초마다 전원 상태를 읽습니다. 30초 미만의 하락은 깜빡임(flicker)입니다. 15분 이내에 발생하는 두 번째 정전은 기록되지만 알림을 보내지 않아, NEPA가 전등을 켰다 껐다 하는 상황이 스팸처럼 느껴지지 않게 합니다.
인터넷 없는 날씨 정보 (Weather without internet). 전기가 끊기면 라우터도 함께 작동을 멈춥니다. 따라서 전력이 공급되는 동안 이 도구는 매 30분마다 시간별 Open-Meteo 예보를 저장합니다. 정전 후에는 오직 그 파일만 읽습니다. 일몰 시간은 노트북에서 계산된 NOAA 태양 공식에서 나옵니다. 10월 7일 포트하코에서는 18:21을 알려주며, Open-Meteo는 18:21, sunrise-sunset.org는 18:22를 보여줍니다.
한 가지 규칙은 우기 시즌에 맞춰 변경해야 했습니다. 처음에는 강우 확률 50%일 경우 한 시간을 '습윤(wet)'하다고 계산했습니다. 포트하코의 10월은 거의 모든 시간이 50%를 넘었기 때문에, 이 도구는 하루 종일 모두가 실내에 머물도록 했습니다. 이제는 강우 확률이 70%이거나 예상 강수량이 0.5mm일 때 한 시간을 습윤하다고 간주합니다.
모델: CPU에서 Gemma 4 E2B 사용하기. Ollama를 통해 gemma4:e2b-it-qat 모델을 사용했습니다. 다운로드 용량은 4.3 GB입니다. 제 노트북은 NVIDIA GPU가 없는 i5-1135G7입니다. 측정 결과, 콜드(cold) 상태에서는 14초, 워밍업(warm) 상태에서는 3.64.0초가 걸렸으며, 초당 약 1520 토큰을 생성했습니다.
모델이 허용되는 작업 범위. 제가 가장 중요하게 생각하는 부분입니다.
제 첫 번째 버전은 Gemma에게 사실 정보 전체를 작성하도록 했습니다. 4번의 테스트 실행에서 모델은 모든 숫자를 누락했으며, 두 번은 의미 자체를 뒤집었습니다:
"E be like NEPA light don come Port Harcourt…"
이는 전기가 다시 돌아왔다는 뜻입니다.
"노트북을 지금 닫으세요, 발전기가 꺼지기 전에…"
실제로는 발전기가 작동하고 있지 않았습니다.
숫자를 확인하는 검사만으로는 이 두 가지 경우를 모두 잡아낼 수 없었습니다. 왜냐하면 두 문장 모두 숫자를 포함하고 있지 않았기 때문입니다.
그래서 저는 작업을 분리했습니다:
- 코드(Code)가 사실 정보 라인을 작성합니다. 무슨 일이 일어났는지, 비나 해질 녘이 언제 오는지, 남은 분, 그리고 절약된 나이라(naira)를 알려줍니다. 메시지에 있는 모든 숫자는 코드에서 가져옵니다.
- Gemma는 '넛지(nudge)'만 작성합니다. Gemma는 세 가지 요소만 파악합니다: 장소, 상황("비가 온다", "맑은 낮", "어두워진 후"), 그리고 규칙에 의해 선택된 활동입니다. 숫자는 전혀 보지 못합니다.
- 가드(Guard)가 넛지를 검사합니다. 이 가드는 넛지에 숫자가 있거나, 단어가 20개를 초과하거나, NEPA, 전등, 전기 또는 발전기에 대한 언급이 있을 경우 이를 거부합니다. Gemma는 이유와 함께 한 번의 재시도 기회를 얻습니다. 만약 재시도가 실패할 경우에도 고정된 문장이 사용됩니다. 즉, 최대 두 번의 모델 호출이며, 루프(loop)는 절대 발생하지 않습니다.
작업을 분리한 후, 제가 발견한 의미 오류가 전혀 없이 9번 중 9번의 테스트 실행이 첫 시도에 통과했습니다.
가드가 할 수 없는 것. 가드는 숫자와 주제를 확인하지만, '의미(sense)'는 확인하지 못합니다. 한 테스트 실행에서 Gemma는 "휴대폰 안에서 비를 지켜보세요"라고 작성했고, 이는 통과되었습니다. 더 큰 모델이라면 이런 문장을 적게 만들겠지만, 이 노트북에서는 구동되지 않을 것입니다. 저는 작은 모델을 선택했으며, 그 결과 일부 문장이 때때로 이상할 수 있다는 점을 받아들입니다.
실제 정전이 발견한 버그. 12시 23분에 불이 꺼졌고, 도구는 이를 포착했으며, Gemma가 시간 초과되었습니다. 아무것도 바꾸기 전에 제가 측정했습니다. ollama ps를 확인해보니, 실패한 요청으로 인해 모델이 방금 로드된 상태였습니다. Ollama는 유휴(idle) 모델을 5분 후에 언로드합니다. 제 워밍업은 11시 53분에 실행되었으므로, 12시 23분에는 도구가 콜드 스타트(cold start)를 겪었고 배터리로 작동하며 20초 이상이 걸렸습니다. 해결책은 하나의 설정입니다: keep_alive: -1로, 이는 Gemma를 RAM에 유지합니다 (제 15.7GB 중 3.9GB). 다음 차단 시점인 12시 31분에 Gemma가 처음으로 응답했습니다. 또 다른 나중 차단 시점인 13시 34분에도 시간 초과되었지만, 원인은 달랐습니다: 노트북이 절전 모드였습니다 (Windows Modern Standby). 제가 해결책을 비난하기 전에 이벤트 로그를 확인했습니다.
따라서 기본 설정(defaults)은 도구가 작동해야 하는 순간, 즉 불이 꺼질 때라는 약속 중 하나를 깨뜨렸습니다. 저는 시뮬레이션에서는 그것을 발견하지 못했을 것입니다.
페이지. 정전 데이터를 JSON으로 작성한 하나의 HTML 파일입니다. Edge는 --app --start-fullscreen으로 이를 열기 때문에 주소 표시줄이나 탭이 없습니다. 모델의 문장은 데이터로 들어오며 HTML로 삽입되는 적이 없습니다. 테스트에서는 </script>를 포함하는 알림을 전송하여 페이지가 깨지지 않는지 확인합니다.
테스트. 네트워크 소켓을 모두 차단하고도 정전 경로를 끝까지 실행하는 98개의 테스트가 있습니다. 또한 의도적으로 가드(guard)를 8번이나 무너뜨렸습니다 (더 넓은 허용 오차, 검사 제거), 그리고 매번 테스트가 실패했습니다.
Open Innovation이 중요한 이유?
네트워크는 불과 함께 죽기 때문입니다.
NEPA가 전기를 끊으면, 누군가 발전기를 가동하기 전까지 제 라우터는 꺼져 있습니다. 클라우드 API는 이 도구가 말해야 할 정확한 순간에 연결할 수 없습니다. 노트북의 모델은 신호 없이 4초 만에 응답합니다. 다른 이유를 찾을 필요가 없었습니다.
또한 정전당 비용이 들지 않는다는 점도 중요하며, 이는 매일 정전이 발생하는 경우 더욱 그렇습니다. 그리고 Ollama와 모델이 오픈 소스이기 때문에, 첫 번째 실제 호출이 실패한 이유(유휴 모델이 5분 후에 언로드되고, 제가 그 설정을 변경할 수 있었다)를 확인할 수 있었습니다. 폐쇄된 API의 경우, 시간 초과는 단지 시간 초과일 뿐입니다.
상금 카테고리
⚠️ [IMG:N]
- Gemma 4의 최적 활용. Gemma 4 E2B (QAT)는 Ollama를 통해 CPU 전용 노트북에서 오프라인으로 로컬 구동됩니다. 이 시스템 중 유일하게 텍스트를 작성하는 부분이며, 가드(guard)가 작은 모델이 잘 하는 것에 한정합니다.
도구의 지금까지 최고의 결과물은 로그에 있는 것이 아닙니다. 그것은 발전기(gen)를 기다리느라 보냈을 시간을 사촌들의 아이들과 함께 보내는 아침입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기