{"record":{"id":"195aaa9704916250","repo":"henrygd/beszel","slug":"battery-capacity-unknown","errorCode":null,"errorMessage":"battery capacity unknown","messagePattern":"battery capacity unknown","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"agent/battery/battery_windows.go","lineNumber":261,"sourceCode":"\t\tname = windows.UTF16ToString(nameBuffer)\n\t}\n\n\tbws := batteryWaitStatus{BatteryTag: bqi.BatteryTag}\n\tvar bs batteryStatus\n\tif err = windows.DeviceIoControl(\n\t\thandle,\n\t\t2703436, // IOCTL_BATTERY_QUERY_STATUS\n\t\t(*byte)(unsafe.Pointer(&bws)),\n\t\tuint32(unsafe.Sizeof(bws)),\n\t\t(*byte)(unsafe.Pointer(&bs)),\n\t\tuint32(unsafe.Sizeof(bs)),\n\t\t&dwOut, nil,\n\t); err != nil {\n\t\treturn Battery{}, err\n\t}\n\n\tif bs.Capacity == 0xffffffff || bi.FullChargedCapacity == 0 || bi.FullChargedCapacity == 0xffffffff {\n\t\treturn Battery{}, errors.New(\"battery capacity unknown\")\n\t}\n\tpercent := min(float64(bs.Capacity)/float64(bi.FullChargedCapacity)*100, 100)\n\treturn Battery{Name: name, Percent: uint8(percent), State: readWinBatteryState(bs.PowerState),\n\t\tFullChargeCapacity: uint64(bi.FullChargedCapacity), HasFullChargeCapacity: true, System: true}, nil\n}\n\n// HasReadableBattery checks if the system has a battery and returns true if it does.\nfunc HasReadableBattery() bool {\n\tbatteries, _ := GetBatteryStats()\n\treturn len(batteries) > 0\n}\n\n// GetBatteryStats returns every readable battery reported by Windows.\nfunc GetBatteryStats() ([]Battery, error) {\n\tbatteries := make([]Battery, 0, 2)\n\tfor i := 0; ; i++ {\n\t\tbattery, bErr := winBatteryGet(i)\n\t\tif errors.Is(bErr, errNotFound) {","sourceCodeStart":243,"sourceCodeEnd":279,"githubUrl":"https://github.com/henrygd/beszel/blob/b38fb7dafa60812cc22e6a84ce313e94f1ce0a32/agent/battery/battery_windows.go#L243-L279","documentation":"After querying BATTERY_STATUS (capacities are in mWh), winBatteryGet validates the values: a capacity of 0xffffffff is the Windows 'unknown' sentinel, and FullChargedCapacity of 0 means division by zero would occur. If either is invalid, the library throws this error because a meaningful percent cannot be computed.","triggerScenarios":"BATTERY_STATUS returns Capacity == 0xffffffff (unknown), or batteryInformation.FullChargedCapacity is 0 or 0xffffffff — i.e. the driver reports capacities as unknown. This often happens immediately after wake/resume or during driver initialization.","commonSituations":"Smart batteries that don't expose FullChargedCapacity (non-Smart Battery spec); transient states right after suspend/resume; VMs or exotic hardware with partially implemented ACPI battery methods; reading capacity before the driver refreshes it.","solutions":["Retry the query after a short delay (e.g. 1-2s), as the driver may report unknown values transiently.","Treat the error as 'capacity unknown' and report battery state without a percent value.","Check battery info via powercfg /batteryreport to see if the firmware exposes FullChargedCapacity at all.","Update the battery/ACPI driver or BIOS if the value is permanently unknown."],"exampleFix":"// before\nb, err := GetBatteryStats()\npct := b.Percent\n// after\nb, err := GetBatteryStats()\nif err != nil && strings.Contains(err.Error(), \"battery capacity unknown\") {\n\tlog.Warn(\"battery capacity unavailable; skipping percent\")\n\treturn nil\n}\npct := b.Percent","handlingStrategy":"retry","validationCode":"// sanity-check reported values before computing percent\ncapacityOK := bs.Capacity != 0xffffffff &&\n\tbi.FullChargedCapacity != 0 && bi.FullChargedCapacity != 0xffffffff","typeGuard":"func isCapacityUnknownErr(err error) bool {\n\treturn err != nil && strings.Contains(err.Error(), \"battery capacity unknown\")\n}","tryCatchPattern":"b, err := GetBatteryStats()\nif isCapacityUnknownErr(err) {\n\ttime.Sleep(2 * time.Second)\n\tb, err = GetBatteryStats() // transient right after resume\n}\nif err != nil {\n\treportBatteryStateOnly() // still report charge state without percent\n\treturn\n}","preventionTips":["Retry once or twice with a short delay; values are often unknown immediately after resume.","Degrade gracefully: report State without Percent when capacity is unavailable.","Check powercfg /batteryreport on affected hardware to see if firmware exposes FullChargedCapacity.","Update battery/ACPI drivers and BIOS when the condition is persistent."],"tags":["windows","hardware","battery","invalid-data"],"backgroundTag":"battery-capacity-unknown","analyzedSha":"b38fb7dafa60812cc22e6a84ce313e94f1ce0a32","analyzedAt":"2026-08-31T15:10:10.149Z","schemaVersion":2},"datasetVersion":"2026-08-31T19:17:28.585Z"}