Mercurial > code > home > repos > mqtt_metrics
annotate convert.py @ 9:789042521535
crash on regexp syntax errors
author | drewp@bigasterisk.com |
---|---|
date | Mon, 12 Aug 2024 13:14:39 -0700 |
parents | bc2a93b306e9 |
children | 2a507e679d0d |
rev | line source |
---|---|
4 | 1 ''' |
2 Note that these functions need to parse the message['payload'] into a float | |
3 ''' | |
6 | 4 import json |
5 | |
2
579df3a4e62d
rewrite converters as register'able functions
drewp@bigasterisk.com
parents:
diff
changeset
|
6 converters = [] |
579df3a4e62d
rewrite converters as register'able functions
drewp@bigasterisk.com
parents:
diff
changeset
|
7 |
579df3a4e62d
rewrite converters as register'able functions
drewp@bigasterisk.com
parents:
diff
changeset
|
8 |
5
8390d5d0d512
one mqtt message can convert to multiple measurements
drewp@bigasterisk.com
parents:
4
diff
changeset
|
9 def f_from_c(c): |
8390d5d0d512
one mqtt message can convert to multiple measurements
drewp@bigasterisk.com
parents:
4
diff
changeset
|
10 return (c * 9 / 5) + 32 |
8390d5d0d512
one mqtt message can convert to multiple measurements
drewp@bigasterisk.com
parents:
4
diff
changeset
|
11 |
8390d5d0d512
one mqtt message can convert to multiple measurements
drewp@bigasterisk.com
parents:
4
diff
changeset
|
12 |
2
579df3a4e62d
rewrite converters as register'able functions
drewp@bigasterisk.com
parents:
diff
changeset
|
13 def topic(topic_pattern: str): |
579df3a4e62d
rewrite converters as register'able functions
drewp@bigasterisk.com
parents:
diff
changeset
|
14 |
579df3a4e62d
rewrite converters as register'able functions
drewp@bigasterisk.com
parents:
diff
changeset
|
15 def decorator(func): |
579df3a4e62d
rewrite converters as register'able functions
drewp@bigasterisk.com
parents:
diff
changeset
|
16 func.topic_pattern = topic_pattern |
579df3a4e62d
rewrite converters as register'able functions
drewp@bigasterisk.com
parents:
diff
changeset
|
17 converters.append(func) |
579df3a4e62d
rewrite converters as register'able functions
drewp@bigasterisk.com
parents:
diff
changeset
|
18 return func |
579df3a4e62d
rewrite converters as register'able functions
drewp@bigasterisk.com
parents:
diff
changeset
|
19 |
579df3a4e62d
rewrite converters as register'able functions
drewp@bigasterisk.com
parents:
diff
changeset
|
20 return decorator |
579df3a4e62d
rewrite converters as register'able functions
drewp@bigasterisk.com
parents:
diff
changeset
|
21 |
579df3a4e62d
rewrite converters as register'able functions
drewp@bigasterisk.com
parents:
diff
changeset
|
22 |
579df3a4e62d
rewrite converters as register'able functions
drewp@bigasterisk.com
parents:
diff
changeset
|
23 @topic(r'([^-]+)-air-quality/sensor/particulate_matter__10_0__m_concentration/state') |
5
8390d5d0d512
one mqtt message can convert to multiple measurements
drewp@bigasterisk.com
parents:
4
diff
changeset
|
24 def pm(message, topicGroups: tuple[str]) -> list[dict]: |
8390d5d0d512
one mqtt message can convert to multiple measurements
drewp@bigasterisk.com
parents:
4
diff
changeset
|
25 return [{ |
2
579df3a4e62d
rewrite converters as register'able functions
drewp@bigasterisk.com
parents:
diff
changeset
|
26 'name': 'air_quality_pm', |
579df3a4e62d
rewrite converters as register'able functions
drewp@bigasterisk.com
parents:
diff
changeset
|
27 'labels': [{ |
579df3a4e62d
rewrite converters as register'able functions
drewp@bigasterisk.com
parents:
diff
changeset
|
28 'labelName': 'location', |
579df3a4e62d
rewrite converters as register'able functions
drewp@bigasterisk.com
parents:
diff
changeset
|
29 'labelValue': topicGroups[0], |
579df3a4e62d
rewrite converters as register'able functions
drewp@bigasterisk.com
parents:
diff
changeset
|
30 }, { |
579df3a4e62d
rewrite converters as register'able functions
drewp@bigasterisk.com
parents:
diff
changeset
|
31 'labelName': 'size', |
579df3a4e62d
rewrite converters as register'able functions
drewp@bigasterisk.com
parents:
diff
changeset
|
32 'labelValue': '10', |
579df3a4e62d
rewrite converters as register'able functions
drewp@bigasterisk.com
parents:
diff
changeset
|
33 }], |
4 | 34 'value': float(message['payload']), |
5
8390d5d0d512
one mqtt message can convert to multiple measurements
drewp@bigasterisk.com
parents:
4
diff
changeset
|
35 }] |
2
579df3a4e62d
rewrite converters as register'able functions
drewp@bigasterisk.com
parents:
diff
changeset
|
36 |
579df3a4e62d
rewrite converters as register'able functions
drewp@bigasterisk.com
parents:
diff
changeset
|
37 |
579df3a4e62d
rewrite converters as register'able functions
drewp@bigasterisk.com
parents:
diff
changeset
|
38 @topic(r'([^-]+)-air-quality/sensor/air_temperature_c/state') |
5
8390d5d0d512
one mqtt message can convert to multiple measurements
drewp@bigasterisk.com
parents:
4
diff
changeset
|
39 def air_temp(message, topicGroups: tuple[str]) -> list[dict]: |
8390d5d0d512
one mqtt message can convert to multiple measurements
drewp@bigasterisk.com
parents:
4
diff
changeset
|
40 return [{ |
2
579df3a4e62d
rewrite converters as register'able functions
drewp@bigasterisk.com
parents:
diff
changeset
|
41 'name': 'air_temperature_f', |
579df3a4e62d
rewrite converters as register'able functions
drewp@bigasterisk.com
parents:
diff
changeset
|
42 'labels': [{ |
579df3a4e62d
rewrite converters as register'able functions
drewp@bigasterisk.com
parents:
diff
changeset
|
43 'labelName': 'location', |
579df3a4e62d
rewrite converters as register'able functions
drewp@bigasterisk.com
parents:
diff
changeset
|
44 'labelValue': topicGroups[0], |
579df3a4e62d
rewrite converters as register'able functions
drewp@bigasterisk.com
parents:
diff
changeset
|
45 }], |
5
8390d5d0d512
one mqtt message can convert to multiple measurements
drewp@bigasterisk.com
parents:
4
diff
changeset
|
46 'value': f_from_c(float(message['payload'])), |
8390d5d0d512
one mqtt message can convert to multiple measurements
drewp@bigasterisk.com
parents:
4
diff
changeset
|
47 }] |
6 | 48 |
49 | |
50 @topic(r'(tele/st-wall-power/SENSOR|tele/ki-fridge/SENSOR|tt-console-power/SENSOR)') | |
51 def poorly_named_sonoff_powermeter(message, topicGroups: tuple[str]) -> list[dict]: | |
52 energy = json.loads(message['payload'])['ENERGY'] | |
53 sensor = { | |
54 'tele/st-wall-power/SENSOR': 'st_wall', | |
55 'tele/ki-fridge/SENSOR': 'ki_fridge', | |
56 'tt-console-power/SENSOR': 'tt_console', | |
57 }[topicGroups[0]] | |
58 return [{ 'name': 'powermeter_w', 'labels': [{'labelName': 'sensor', 'labelValue': sensor}], 'value': energy['Power'] }, | |
59 { 'name': 'powermeter_apparent_power_va', 'labels': [{'labelName': 'sensor', 'labelValue': sensor}], 'value': energy['ApparentPower'] }, | |
60 { 'name': 'powermeter_reactive_power_var', 'labels': [{'labelName': 'sensor', 'labelValue': sensor}], 'value': energy['ReactivePower'] }, | |
61 { 'name': 'powermeter_factor', 'labels': [{'labelName': 'sensor', 'labelValue': sensor}], 'value': energy['Factor'] }, | |
62 { 'name': 'powermeter_voltage_v', 'labels': [{'labelName': 'sensor', 'labelValue': sensor}], 'value': energy['Voltage'] }, | |
63 { 'name': 'powermeter_current_a', 'labels': [{'labelName': 'sensor', 'labelValue': sensor}], 'value': energy['Current'] } ] # yapf: disable | |
64 | |
65 @topic(r'(.*)-power/status/switch:0') | |
66 def shelly_powermeter(message, topicGroups: tuple[str]) -> list[dict]: | |
67 sensor = topicGroups[0].replace('-', '_') | |
68 msg = json.loads(message['payload']) | |
69 return [ | |
70 { 'name': 'powermeter_w', 'labels': [{'labelName': 'sensor', 'labelValue': sensor}], 'value': msg['apower'] }, | |
71 { 'name': 'powermeter_voltage_v', 'labels': [{'labelName': 'sensor', 'labelValue': sensor}], 'value': msg['voltage'] }, | |
72 { 'name': 'powermeter_current_a', 'labels': [{'labelName': 'sensor', 'labelValue': sensor}], 'value': msg['current'] }, | |
73 { 'name': 'powermeter_apparent_power_va', 'labels': [{'labelName': 'sensor', 'labelValue': sensor}], 'value': msg['apower'] }, | |
74 { 'name': 'powermeter_temp_f', 'labels': [{'labelName': 'sensor', 'labelValue': sensor}], 'value': f_from_c(msg['temperature']['tC']) }, | |
75 ] # yapf: disable |