Mercurial > code > home > repos > mqtt_metrics
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() |