comparison mqtt_metrics.py @ 5:8390d5d0d512

one mqtt message can convert to multiple measurements
author drewp@bigasterisk.com
date Sat, 10 Aug 2024 23:02:51 -0700
parents cd1b8d7bda78
children bc2a93b306e9
comparison
equal deleted inserted replaced
4:cd1b8d7bda78 5:8390d5d0d512
75 75
76 76
77 def onMqttMessage(metrics, mqttMessage): 77 def onMqttMessage(metrics, mqttMessage):
78 message = simplifyMqttMessage(mqttMessage) 78 message = simplifyMqttMessage(mqttMessage)
79 79
80 metricEvent = tryConverters(message) 80 metricEvents = tryConverters(message)
81 if metricEvent: 81 for metricEvent in metricEvents:
82 metrics.write(message['t'], metricEvent) 82 metrics.write(message['t'], metricEvent)
83 broadcastToDebugListeners({'message': message, 'metricEvent': metricEvent}) 83 broadcastToDebugListeners({'message': message, 'metricEvent': metricEvent})
84 84
85 85
86 def tryConverters(message) -> dict | None: 86 def tryConverters(message) -> list[dict]:
87 metricEvent = None 87 metricEvents: list[dict] = []
88 matchedPats = [] 88 matchedPats = []
89 for converter in converters: 89 for converter in converters:
90 if not (m := re.search(converter.topic_pattern, message['topic'])): 90 if not (m := re.search(converter.topic_pattern, message['topic'])):
91 continue 91 continue
92 if not matchedPats: 92 if not matchedPats:
93 try: 93 try:
94 metricEvent = converter(message, cast(tuple[str], m.groups())) 94 metricEvents.extend(converter(message, cast(tuple[str], m.groups())))
95 except Exception: 95 except Exception:
96 log.error("Error converting mqtt message: topic pattern = %r", converter.topic_pattern, exc_info=True) 96 log.error("Error converting mqtt message: topic pattern = %r", converter.topic_pattern, exc_info=True)
97 matchedPats.append(converter.topic_pattern) 97 matchedPats.append(converter.topic_pattern)
98 98
99 if len(matchedPats) > 1: 99 if len(matchedPats) > 1:
100 log.warning("Multiple patterns matched: %s", ", ".join(matchedPats)) 100 log.warning("Multiple patterns matched: %s", ", ".join(matchedPats))
101 101
102 return metricEvent 102 return metricEvents
103 103
104 104
105 def main(): 105 def main():
106 metrics = MetricsWriter() 106 metrics = MetricsWriter()
107 loop = asyncio.new_event_loop() 107 loop = asyncio.new_event_loop()