package temper import ( "fmt" "github.com/google/gousb" ) func GetTemperature() (float64, error) { ctx := gousb.NewContext() defer ctx.Close() vid, pid := gousb.ID(0x0c45), gousb.ID(0x7401) devs, err := ctx.OpenDevices(func(desc *gousb.DeviceDesc) bool { return desc.Vendor == vid && desc.Product == pid }) if err != nil { return 0, err } if len(devs) == 0 { return 0, fmt.Errorf("no devices found matching VID %s and PID %s", vid, pid) } devs[0].SetAutoDetach(true) for _, d := range devs { defer d.Close() } cfg, err := devs[0].Config(1) if err != nil { return 0, err } defer cfg.Close() intf, err := cfg.Interface(1, 0) if err != nil { return 0, err } defer intf.Close() epIn, err := intf.InEndpoint(0x82) if err != nil { return 0, err } _, err = devs[0].Control( 0x21, 0x09, 0x0200, 0x01, []byte{0x01, 0x80, 0x33, 0x01, 0x00, 0x00, 0x00, 0x00}, ) if err != nil { return 0, err } buf := make([]byte, 8) if _, err = epIn.Read(buf); err != nil { return 0, err } return float64(buf[2]) + float64(buf[3])/256, nil }