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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4
cd1b8d7bda78 get metrics writing to victoriametrics
drewp@bigasterisk.com
parents: 2
diff changeset
1 '''
cd1b8d7bda78 get metrics writing to victoriametrics
drewp@bigasterisk.com
parents: 2
diff changeset
2 Note that these functions need to parse the message['payload'] into a float
cd1b8d7bda78 get metrics writing to victoriametrics
drewp@bigasterisk.com
parents: 2
diff changeset
3 '''
6
bc2a93b306e9 port over the powermeter measurements
drewp@bigasterisk.com
parents: 5
diff changeset
4 import json
bc2a93b306e9 port over the powermeter measurements
drewp@bigasterisk.com
parents: 5
diff changeset
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
cd1b8d7bda78 get metrics writing to victoriametrics
drewp@bigasterisk.com
parents: 2
diff changeset
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
bc2a93b306e9 port over the powermeter measurements
drewp@bigasterisk.com
parents: 5
diff changeset
48
bc2a93b306e9 port over the powermeter measurements
drewp@bigasterisk.com
parents: 5
diff changeset
49
bc2a93b306e9 port over the powermeter measurements
drewp@bigasterisk.com
parents: 5
diff changeset
50 @topic(r'(tele/st-wall-power/SENSOR|tele/ki-fridge/SENSOR|tt-console-power/SENSOR)')
bc2a93b306e9 port over the powermeter measurements
drewp@bigasterisk.com
parents: 5
diff changeset
51 def poorly_named_sonoff_powermeter(message, topicGroups: tuple[str]) -> list[dict]:
bc2a93b306e9 port over the powermeter measurements
drewp@bigasterisk.com
parents: 5
diff changeset
52 energy = json.loads(message['payload'])['ENERGY']
bc2a93b306e9 port over the powermeter measurements
drewp@bigasterisk.com
parents: 5
diff changeset
53 sensor = {
bc2a93b306e9 port over the powermeter measurements
drewp@bigasterisk.com
parents: 5
diff changeset
54 'tele/st-wall-power/SENSOR': 'st_wall',
bc2a93b306e9 port over the powermeter measurements
drewp@bigasterisk.com
parents: 5
diff changeset
55 'tele/ki-fridge/SENSOR': 'ki_fridge',
bc2a93b306e9 port over the powermeter measurements
drewp@bigasterisk.com
parents: 5
diff changeset
56 'tt-console-power/SENSOR': 'tt_console',
bc2a93b306e9 port over the powermeter measurements
drewp@bigasterisk.com
parents: 5
diff changeset
57 }[topicGroups[0]]
bc2a93b306e9 port over the powermeter measurements
drewp@bigasterisk.com
parents: 5
diff changeset
58 return [{ 'name': 'powermeter_w', 'labels': [{'labelName': 'sensor', 'labelValue': sensor}], 'value': energy['Power'] },
bc2a93b306e9 port over the powermeter measurements
drewp@bigasterisk.com
parents: 5
diff changeset
59 { 'name': 'powermeter_apparent_power_va', 'labels': [{'labelName': 'sensor', 'labelValue': sensor}], 'value': energy['ApparentPower'] },
bc2a93b306e9 port over the powermeter measurements
drewp@bigasterisk.com
parents: 5
diff changeset
60 { 'name': 'powermeter_reactive_power_var', 'labels': [{'labelName': 'sensor', 'labelValue': sensor}], 'value': energy['ReactivePower'] },
bc2a93b306e9 port over the powermeter measurements
drewp@bigasterisk.com
parents: 5
diff changeset
61 { 'name': 'powermeter_factor', 'labels': [{'labelName': 'sensor', 'labelValue': sensor}], 'value': energy['Factor'] },
bc2a93b306e9 port over the powermeter measurements
drewp@bigasterisk.com
parents: 5
diff changeset
62 { 'name': 'powermeter_voltage_v', 'labels': [{'labelName': 'sensor', 'labelValue': sensor}], 'value': energy['Voltage'] },
bc2a93b306e9 port over the powermeter measurements
drewp@bigasterisk.com
parents: 5
diff changeset
63 { 'name': 'powermeter_current_a', 'labels': [{'labelName': 'sensor', 'labelValue': sensor}], 'value': energy['Current'] } ] # yapf: disable
bc2a93b306e9 port over the powermeter measurements
drewp@bigasterisk.com
parents: 5
diff changeset
64
bc2a93b306e9 port over the powermeter measurements
drewp@bigasterisk.com
parents: 5
diff changeset
65 @topic(r'(.*)-power/status/switch:0')
bc2a93b306e9 port over the powermeter measurements
drewp@bigasterisk.com
parents: 5
diff changeset
66 def shelly_powermeter(message, topicGroups: tuple[str]) -> list[dict]:
bc2a93b306e9 port over the powermeter measurements
drewp@bigasterisk.com
parents: 5
diff changeset
67 sensor = topicGroups[0].replace('-', '_')
bc2a93b306e9 port over the powermeter measurements
drewp@bigasterisk.com
parents: 5
diff changeset
68 msg = json.loads(message['payload'])
bc2a93b306e9 port over the powermeter measurements
drewp@bigasterisk.com
parents: 5
diff changeset
69 return [
bc2a93b306e9 port over the powermeter measurements
drewp@bigasterisk.com
parents: 5
diff changeset
70 { 'name': 'powermeter_w', 'labels': [{'labelName': 'sensor', 'labelValue': sensor}], 'value': msg['apower'] },
bc2a93b306e9 port over the powermeter measurements
drewp@bigasterisk.com
parents: 5
diff changeset
71 { 'name': 'powermeter_voltage_v', 'labels': [{'labelName': 'sensor', 'labelValue': sensor}], 'value': msg['voltage'] },
bc2a93b306e9 port over the powermeter measurements
drewp@bigasterisk.com
parents: 5
diff changeset
72 { 'name': 'powermeter_current_a', 'labels': [{'labelName': 'sensor', 'labelValue': sensor}], 'value': msg['current'] },
bc2a93b306e9 port over the powermeter measurements
drewp@bigasterisk.com
parents: 5
diff changeset
73 { 'name': 'powermeter_apparent_power_va', 'labels': [{'labelName': 'sensor', 'labelValue': sensor}], 'value': msg['apower'] },
bc2a93b306e9 port over the powermeter measurements
drewp@bigasterisk.com
parents: 5
diff changeset
74 { 'name': 'powermeter_temp_f', 'labels': [{'labelName': 'sensor', 'labelValue': sensor}], 'value': f_from_c(msg['temperature']['tC']) },
bc2a93b306e9 port over the powermeter measurements
drewp@bigasterisk.com
parents: 5
diff changeset
75 ] # yapf: disable