JuiceBar 만들기: PC 전력을 전기요금으로 바꾸기

와트 숫자는 잠깐 보면 재미있습니다. 전기요금은 실제로 행동을 바꾸게 합니다.
그래서 JuiceBar를 만들었습니다. PC가 쓰는 전력을 Windows 트레이에서 보고, 그 값을 현재 청구 주기의 비용으로 바꾸는 앱입니다. 트레이 아이콘은 연료 게이지처럼 차오르고, 열어 보면 이번 주기 비용과 오늘 사용량, 예상 비용, 최근 추세가 나옵니다.
화면보다 어려웠던 것은 그 숫자가 무엇을 의미해야 하는지 정하는 일이었습니다.
Windows는 PC 전체 벽전력을 주지 않습니다
콘센트에서 실제로 빠져나가는 와트를 한 번에 돌려주는 Windows API는 없습니다. 대신 하드웨어가 일부 부품의 값을 보여줍니다.
Windows 11에서는 Energy Meter Interface로 CPU 패키지 에너지를 읽을 수 있습니다. 그 경로를 쓸 수 없는 환경에서는 PawnIO를 통해 Intel RAPL이나 AMD SMU 기반 CPU 센서로 폴백할 수 있습니다. 외장 GPU는 NVIDIA NVML 또는 AMD ADL을 사용하고, 노트북에서는 ACPI 배터리 충방전 값도 활용할 수 있습니다.
하지만 메인보드, RAM, 드라이브, 팬, 그리고 파워서플라이 손실까지 센서가 전부 보여주지는 않습니다. 여기서 그냥 "전체 소비전력"이라고 부르면 구현은 간단해지지만 숫자는 덜 정직해집니다.
그래서 JuiceBar는 측정되는 것과 추정해야 하는 것을 분리합니다.
P_wall = (P_measured + B) / ηP_measured는 실제 센서에서 읽은 값의 합입니다. B는 직접 측정할 수 없는 부품의 기준 전력이고, η는 파워서플라이 효율입니다.
보정값을 숨은 상수로 두지 않았습니다
B와 η는 PC마다 다릅니다. 고정된 추정값 하나를 박아 두면 편하지만 신뢰하기 어렵습니다.
그래서 데스크톱에서는 콘센트 전력계나 전력 측정 스마트플러그에서 두 번 읽은 값을 넣어 모델을 보정할 수 있게 했습니다. 노트북에서는 배터리로 동작할 때의 방전 전력이 전체 시스템을 보는 기준값 역할을 할 수 있습니다.
아직 보정하지 않았더라도 앱은 보수적인 기본값으로 동작합니다. 대신 화면에 not calibrated라고 표시합니다. 추정값을 측정값처럼 보이게 만드는 것보다 어느 부분부터 추정인지 드러내는 쪽을 택했습니다.
전력보다 더 복잡했던 것은 요금제였습니다
처음 알고 싶었던 것은 와트가 아니라 돈이었습니다. 전기요금은 고정 단가일 수도 있고, 사용량 구간에 따라 달라질 수도 있고, 시간대별 요금일 수도 있습니다. 기본료와 세금이 붙고 청구 주기 시작일도 다릅니다.
모든 경우를 폼의 수십 개 입력칸으로 만들고 싶지는 않았습니다. 대신 JuiceBar가 고정 JSON 스키마를 요구하는 프롬프트를 만들어 줍니다. 이 프롬프트를 ChatGPT, Gemini, Claude 같은 도구에 붙여 넣고 돌아온 JSON을 앱에 넣을 수 있습니다. 설명 문장이 JSON 주변에 있어도 파싱하되, 잘못된 청구일이나 구간 순서, 이상한 세율 형태는 저장 전에 거부합니다.
AI는 요금제를 구조화하는 입력 편의 기능일 뿐이고, 실제 요금 계산은 앱의 결정론적 코드가 맡습니다.
사용 이력은 로컬에 남깁니다
JuiceBar가 필요한 사용 이력은 로컬 SQLite에 저장됩니다. 보정값, 센서 선택, 요금제, 언어, 사용 이력은 앱이 설치된 각 PC의 데이터입니다. 별도 JuiceBar 계정도 없고 이 데이터를 보관하는 서버도 없습니다.
앱은 .NET 10 WPF로 만든 Windows 트레이 프로그램이고 GitHub Releases에서 self-contained 실행 파일로 배포합니다. 저장소는 MIT 라이선스로 공개했습니다.
이 프로젝트에서 마음에 드는 부분은 특별한 알고리즘을 발명했다는 데 있지 않습니다. 어디까지가 측정이고 어디부터가 추정인지 정하고, 그 차이를 계산식에서 UI까지 숨기지 않았다는 데 있습니다.