JanDeDobbeleer/oh-my-posh · error

unable to parse charge_full

Error message

unable to parse charge_full

What it means

In the charge-based fallback path, charge_full supplies the Full capacity, read via readAmp. If charge_full is missing, empty, or non-numeric, getByPath returns 'unable to parse charge_full'.

Source

Thrown at src/runtime/battery/battery_linux.go:117

	b := &battery{}
	var err error

	if b.Current, err = readFloat(path, "energy_now"); err == nil {
		if b.Full, err = readFloat(path, "energy_full"); err != nil {
			return nil, errors.New("unable to parse energy_full")
		}
	} else {
		currentDoesNotExist := os.IsNotExist(err)
		if b.Voltage, err = readFloat(path, "voltage_now"); err != nil {
			return nil, errors.New("unable to parse voltage_now")
		}
		b.Voltage /= 1000
		if currentDoesNotExist {
			if b.Current, err = readAmp(path, "charge_now", b.Voltage); err != nil {
				return nil, errors.New("unable to parse charge_now")
			}
			if b.Full, err = readAmp(path, "charge_full", b.Voltage); err != nil {
				return nil, errors.New("unable to parse charge_full")
			}
		} else {
			if b.Full, err = readFloat(path, "energy_full"); err != nil {
				return nil, errors.New("unable to parse energy_full")
			}
		}
	}

	state, err := os.ReadFile(filepath.Join(path, "status"))
	if err != nil || len(state) == 0 {
		return nil, errors.New("unable to parse or invalid status")
	}
	if b.State, err = newState(string(state[:len(state)-1])); err != nil {
		return nil, errors.New("unable to map to new state")
	}

	return b, nil
}

View on GitHub (pinned to 0976794618)

Solutions

  1. Verify: cat /sys/class/power_supply/BAT0/charge_full; it must contain an integer in µAh
  2. Prefer the energy path by making energy_now/energy_full readable so charge_* is not used
  3. Update kernel/driver/firmware so charge_full is exposed
  4. Skip the battery: systemGetAll collects per-battery errors and still returns others

Example fix

// before
$ cat /sys/class/power_supply/BAT0/charge_full
(empty)
// after
$ cat /sys/class/power_supply/BAT0/charge_full
3800000
Defensive patterns

Strategy: fallback

Validate before calling

test -s /sys/class/power_supply/BAT0/charge_full || echo "charge_full missing - Full capacity unavailable"

Type guard

func hasChargeFull(dir string) bool {
  b, err := os.ReadFile(filepath.Join(dir, "charge_full"))
  return err == nil && len(strings.TrimSpace(string(b))) > 0
}

Try / catch

bat, err := battery.Get()
if err != nil {
  log.Printf("battery unavailable: %v", err)
  return nil
}

Prevention

When it happens

Trigger: battery.Get()/systemGetAll -> getByPath on a Linux battery where energy_now is absent and charge_now parsed OK but charge_full is missing/unparseable.

Common situations: Drivers exposing only charge_now but not charge_full; firmware quirks on some laptops; battery firmware reporting errors making charge_full read empty.

Understand the failure class

Related errors


AI-assisted analysis of JanDeDobbeleer/oh-my-posh@0976794618 (2026-08-31). Data as JSON: /api/errors/272d3f33386a13d2. Report an issue: GitHub.