66 "encoding/json"
77 "fmt"
88 "log"
9+ "strings"
910
1011 mqtt "github.com/eclipse/paho.mqtt.golang"
1112 "github.com/rddl-network/energy-service/internal/config"
@@ -25,23 +26,71 @@ func (s *Server) initMQTT() {
2526 tlsConfig := & tls.Config {}
2627 opts .SetTLSConfig (tlsConfig )
2728
29+ // Add connection lost handler
30+ opts .SetConnectionLostHandler (func (client mqtt.Client , err error ) {
31+ log .Printf ("MQTT connection lost: %v" , err )
32+ })
33+ opts .AutoReconnect = true
34+
2835 client := mqtt .NewClient (opts )
2936 if token := client .Connect (); token .Wait () && token .Error () != nil {
3037 log .Printf ("MQTT connect error: %v" , token .Error ())
3138 return
3239 }
3340 s .mqttClient = client
34- topic := mqttCfg .Topic
35- if topic == "" {
36- topic = "energy-consumption-reports"
37- }
38- if token := client .Subscribe (topic , 0 , s .handleMQTTMessage ); token .Wait () && token .Error () != nil {
41+ //subscribe(client, mqttCfg.Topic, s.handleMQTTMessage)
42+ subscribe (client , "dirigera/+" , s .handleSimpleDataMQTTMessage )
43+ }
44+
45+ func subscribe (client mqtt.Client , topic string , callback mqtt.MessageHandler ) {
46+ if token := client .Subscribe (topic , 0 , callback ); token .Wait () && token .Error () != nil {
3947 log .Printf ("MQTT subscribe error: %v" , token .Error ())
4048 } else {
4149 log .Printf ("Subscribed to MQTT topic: %s" , topic )
4250 }
4351}
4452
53+ func extractIDFromTopic (topic string ) string {
54+ parts := strings .Split (topic , "/" )
55+ if len (parts ) == 2 && parts [0 ] == "dirigera" {
56+ return parts [1 ]
57+ }
58+ return ""
59+ }
60+
61+ func (s * Server ) handleSimpleDataMQTTMessage (client mqtt.Client , msg mqtt.Message ) {
62+ defer func () {
63+ if r := recover (); r != nil {
64+ log .Printf ("MQTT handler panic: %v" , r )
65+ }
66+ }()
67+
68+ var deviceStatusExt model.DeviceStatusExt
69+
70+ deviceStatusExt .ID = extractIDFromTopic (msg .Topic ())
71+ if deviceStatusExt .ID == "" {
72+ log .Printf ("MQTT: Invalid topic format: %s" , msg .Topic ())
73+ return
74+ }
75+
76+ if err := json .Unmarshal (msg .Payload (), & deviceStatusExt .DeviceStatus ); err != nil {
77+ log .Printf ("MQTT: Failed to decode JSON: %v" , err )
78+ return
79+ }
80+
81+ if deviceStatusExt .DeviceStatus .TotalEnergyConsumed == nil {
82+ log .Printf ("MQTT: JSON does not contain consumed energy values." )
83+ return
84+ }
85+
86+ err := s .writeDeviceStatus2InfluxDB (deviceStatusExt )
87+ if err != nil {
88+ log .Printf ("MQTT: Failed to write to database: %v" , err )
89+ return
90+ }
91+ log .Printf ("MQTT: Energy data received and written to database successfully" )
92+ }
93+
4594// handleMQTTMessage processes incoming MQTT messages as energy data
4695func (s * Server ) handleMQTTMessage (client mqtt.Client , msg mqtt.Message ) {
4796 var energyData model.EnergyData
0 commit comments