diff --git a/hems/shm/shm.go b/hems/shm/shm.go
index 3e7cdc984..158f19e58 100644
--- a/hems/shm/shm.go
+++ b/hems/shm/shm.go
@@ -26,7 +26,7 @@ const (
sempController = "Sunny Home Manager"
sempBaseURLEnv = "SEMP_BASE_URL"
sempGateway = "urn:schemas-simple-energy-management-protocol:device:Gateway:1"
- sempDeviceId = "F-%s-%.12x-00" // 6 bytes
+ sempDeviceId = "F-%s-%.12X-00" // 6 bytes
sempSerialNumber = "%s-%d"
sempCharger = "EVCharger"
basePath = "/semp"
@@ -55,11 +55,17 @@ type Config struct {
// NewFromConfig creates a new SEMP instance from configuration and starts it
func NewFromConfig(cfg Config, site site.API, addr string, router *mux.Router) error {
- vendorId := cfg.VendorId
+ vendorId := strings.ToUpper(cfg.VendorId)
if vendorId == "" {
vendorId = "28081973"
- } else if len(vendorId) != 8 {
- return fmt.Errorf("invalid vendor id: %v. Must be 8 characters HEX string", vendorId)
+ } else {
+ if _, err := hex.DecodeString(cfg.VendorId); err != nil {
+ return fmt.Errorf("vendor id: %w", err)
+ }
+
+ if len(cfg.VendorId) != 8 {
+ return fmt.Errorf("invalid vendor id: %v. Must be 8 characters HEX string", vendorId)
+ }
}
uid, err := uuid.NewUUID()
@@ -198,7 +204,7 @@ func (s *SEMP) gatewayDescription(w http.ResponseWriter, r *http.Request) {
Device: Device{
DeviceType: sempGateway,
FriendlyName: "evcc",
- Manufacturer: "github.com/evcc-io/evcc",
+ Manufacturer: "evcc.io",
ModelName: serverName,
PresentationURL: s.hostURI,
UDN: uid,
diff --git a/tests/config-shm.spec.ts b/tests/config-shm.spec.ts
index 2ff062678..c70746ed1 100644
--- a/tests/config-shm.spec.ts
+++ b/tests/config-shm.spec.ts
@@ -71,9 +71,7 @@ test.describe("SHM", () => {
modal.getByTestId("semp-url").click(),
]);
const xml = await sempPage.content();
- expect(xml).toContain(
- `F-${VALID_VENDOR_ID}-${VALID_DEVICE_ID.toLowerCase()}-00`
- );
+ expect(xml).toContain(`F-${VALID_VENDOR_ID}-${VALID_DEVICE_ID}-00`);
await sempPage.close();
// uncheck allow control