package main import ( "fmt" "log" "time" "xengineering.eu/homematic-go/homematic" ) func HomematicRun(config HomematicConfig, tx chan MQTTMessage) { req, inventory, err := Start(config.CCU) if err != nil { log.Fatalf("Failed startup process: %v", err) } cache := NewCache(tx) pollingPeriod, err := time.ParseDuration(config.PollingPeriod) if err != nil { log.Fatalf("Failed to parse Homematic polling period: %v", err) } for { start := time.Now() states, _ := Poll(req, inventory) cache.Update(states) WaitUntil(start.Add(pollingPeriod)) } } func Start(ccu string) (homematic.Requester, homematic.Devices, error) { var req homematic.Requester var inventory homematic.Devices var err error req = homematic.NewRequester(ccu) log.Printf("Created Homematic requester (%s).", ccu) inventory, err = req.ListDevices() if err != nil { return req, inventory, fmt.Errorf("Failed getting initial device list: %w", err) } log.Printf("Retrieved Homematic inventory with %d devices.", len(inventory)) return req, inventory, nil } func Poll(req homematic.Requester, inventory homematic.Devices) (States, error) { states := make(States) for _, device := range inventory { if device.Type == `SHUTTER_CONTACT` { state, err := req.GetValue(device.Address) if err != nil { return states, fmt.Errorf("Failed to get value: %w", err) } states[device.Address] = state } } return states, nil } func WaitUntil(deadline time.Time) { duration := time.Until(deadline) if duration > 0 { time.Sleep(duration) } }