From 1f4c3308be296d95163e3e0ea54761410f4da140 Mon Sep 17 00:00:00 2001 From: xengineering Date: Wed, 10 Dec 2025 21:08:39 +0100 Subject: Add homematic-go v0.1.0 This is the minimal viable product (MVP) of this library suitable to build the MVP of the sia-server. --- .../homematic-go/homematic/device.go | 92 ++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 vendor/xengineering.eu/homematic-go/homematic/device.go (limited to 'vendor/xengineering.eu/homematic-go/homematic/device.go') diff --git a/vendor/xengineering.eu/homematic-go/homematic/device.go b/vendor/xengineering.eu/homematic-go/homematic/device.go new file mode 100644 index 0000000..fc7f383 --- /dev/null +++ b/vendor/xengineering.eu/homematic-go/homematic/device.go @@ -0,0 +1,92 @@ +package homematic + +import ( + "fmt" + "strconv" + + "github.com/beevik/etree" +) + +type Device struct { + Type string + Subtype string + Address string + Parent string + Version int +} + +func (d Device) String() string { + return fmt.Sprintf( + "Homematic device\n"+ + "TYPE: %s\n"+ + "SUBTYPE: %s\n"+ + "ADDRESS: %s\n"+ + "PARENT: %s\n"+ + "VERSION: %d", + d.Type, + d.Subtype, + d.Address, + d.Parent, + d.Version, + ) +} + +func (d *Device) LoadXML(doc *etree.Document) error { + types := doc.FindElements("/struct/member[name='TYPE']/value") + if len(types) != 1 { + return fmt.Errorf("Expected one type field but got %d.", len(types)) + } + + subtypes := doc.FindElements("/struct/member[name='SUBTYPE']/value") + if len(subtypes) != 1 { + return fmt.Errorf("Expected one subtype field but got %d.", len(subtypes)) + } + + addresses := doc.FindElements("/struct/member[name='ADDRESS']/value") + if len(addresses) != 1 { + return fmt.Errorf("Expected one address field but got %d.", len(addresses)) + } + + parents := doc.FindElements("/struct/member[name='PARENT']/value") + if len(parents) != 1 { + return fmt.Errorf("Expected one parent field but got %d.", len(parents)) + } + + versions := doc.FindElements("/struct/member[name='VERSION']/value/i4") + if len(versions) != 1 { + return fmt.Errorf("Expected one version field but got %d.", len(versions)) + } + + version, err := strconv.Atoi(versions[0].Text()) + if err != nil { + return fmt.Errorf( + "Cannot convert version value '%s' to an integer: %w", + versions[0].Text(), + err, + ) + } + + d.Type = types[0].Text() + d.Subtype = subtypes[0].Text() + d.Address = addresses[0].Text() + d.Parent = parents[0].Text() + d.Version = version + + return nil +} + +type Devices []Device + +func (devices Devices) String() string { + value := "" + + for index, device := range devices { + if index > 0 { + value = value + "\n" + } + + value = value + fmt.Sprintf("%v\n", device) + } + + return value +} -- cgit v1.2.3-70-g09d2