First, before proposing them, I think it would be nifty to have some kind of inheritance. For example, the “Rechargeable” listed below should inherit battery. At any rate…
Capability: Rechargeable
Description: Represents things with batteries with connected recharging profiles. Should also always support Battery capability.
Attributes: chargeLimit (percentage), chargeRate (percent per hour), chargeState (enum: disconnected, connected, complete, charging, pending, error), chargeCurrent (amps), chargeVoltage (Volts), chargedSoFar (kW), timeToChargeLimit (duration)
Commands: startCharge(delayInSeconds), stopCharge()
Capability: Vehicle
Description: Represents things that travel places like trains, planes, and automobiles. If EV, should also support Rechargeable and Battery.
Attributes: speed (native: mph, need option to display in kph), heading (degrees), locationLatitude, locationLongitude, gear (enum: P, R, N, D), gasRange (native: miles), electricRange (native: miles), gasMaxRange (native: miles), electricMaxRange (native: miles), gasEfficiency (m/g), electricEfficiency (Wh/m), vehicleType (enum: gas, electric, hybrid)
Capability: Sunroof
Description: Represents the presence of a sunroof on a vehicle. There may be a more generic expression of this kind of functionality. This is essentially a thing that can be opened in degrees rather than binary open/close
Attributes: percentOpen (percent)
Commands: openSunroof(toPercent), closeSunroof() (same as openSunroof(0)), vent()