From 6d3d45e3375a9f46f4edaf2f015b3e76edbde4f4 Mon Sep 17 00:00:00 2001 From: seydx Date: Mon, 27 Oct 2025 21:48:44 +0100 Subject: [PATCH] Handle speaker messages --- pkg/tuya/mqtt.go | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/pkg/tuya/mqtt.go b/pkg/tuya/mqtt.go index cf36e09c..81eeaf11 100644 --- a/pkg/tuya/mqtt.go +++ b/pkg/tuya/mqtt.go @@ -17,6 +17,7 @@ type TuyaMqttClient struct { client mqtt.Client waiter core.Waiter wakeupWaiter core.Waiter + speakerWaiter core.Waiter publishTopic string subscribeTopic string auth string @@ -152,6 +153,7 @@ func (c *TuyaMqttClient) Stop() { c.closed = true c.waiter.Done(errors.New("mqtt: stopped")) c.wakeupWaiter.Done(errors.New("mqtt: stopped")) + c.speakerWaiter.Done(errors.New("mqtt: stopped")) if c.client != nil { _ = c.SendDisconnect() @@ -240,10 +242,18 @@ func (c *TuyaMqttClient) SendResolution(resolution int) error { func (c *TuyaMqttClient) SendSpeaker(speaker int) error { // Protocol 312 is used for speaker - return c.sendMqttMessage("speaker", 312, "", SpeakerFrame{ + if err := c.sendMqttMessage("speaker", 312, "", SpeakerFrame{ Mode: "webrtc", Value: speaker, - }) + }); err != nil { + return err + } + + // if err := c.speakerWaiter.Wait(); err != nil { + // return fmt.Errorf("speaker wait failed: %w", err) + // } + + return nil } func (c *TuyaMqttClient) SendDisconnect() error { @@ -279,6 +289,8 @@ func (c *TuyaMqttClient) onMessage(client mqtt.Client, msg mqtt.Message) { c.onMqttCandidate(&rmqtt) case "disconnect": c.onMqttDisconnect() + case "speaker": + c.onMqttSpeaker(&rmqtt) } } @@ -333,6 +345,21 @@ func (c *TuyaMqttClient) onMqttDisconnect() { c.onDisconnect() } +func (c *TuyaMqttClient) onMqttSpeaker(msg *MqttMessage) { + var speakerResponse struct { + ResCode int `json:"resCode"` + } + + if err := json.Unmarshal(msg.Data.Message, &speakerResponse); err == nil { + if speakerResponse.ResCode != 0 { + c.speakerWaiter.Done(fmt.Errorf("speaker failed with resCode: %d", speakerResponse.ResCode)) + return + } + } + + c.speakerWaiter.Done(nil) +} + func (c *TuyaMqttClient) onAnswer(answer AnswerFrame) { if c.handleAnswer != nil { c.handleAnswer(answer)