package main import ( "fmt" "log" "time" "xengineering.eu/homematic-go/homematic" ) const ( OPENCCU = `http://127.0.0.1:8080` POLLING_PERIOD = 50 * time.Millisecond ) func HomematicRun(tx chan MQTTMessage) { req, inventory, err := Start() if err != nil { log.Fatalf("Failed startup process: %v", err) } cache := NewCache(tx) for { start := time.Now() states, _ := Poll(req, inventory) cache.Update(states) WaitUntil(start.Add(POLLING_PERIOD)) } } func Start() (homematic.Requester, homematic.Devices, error) { var req homematic.Requester var inventory homematic.Devices var err error req = homematic.NewRequester(OPENCCU) log.Printf("Created Homematic requester (%s).", OPENCCU) 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) } }