Source code for juham.ts.powermeter_record
import json
from typing import Any, Dict
from typing_extensions import override
from influxdb_client_3 import Point
from juham.base import Base, MqttMsg
from juham.base.time import epoc2utc
[docs]
class PowerMeterRecord(Base):
"""Power meter recorder.
Listens 'powerconsumption' topic and records the corresponding
time series.
"""
def __init__(self, name: str = "powermeter_record") -> None:
super().__init__(name)
self.power_topic = self.make_topic_name("powerconsumption") # topic to listen
[docs]
@override
def on_connect(self, client: object, userdata: Any, flags: int, rc: int) -> None:
super().on_connect(client, userdata, flags, rc)
if rc == 0:
self.subscribe(self.power_topic)
[docs]
@override
def on_message(self, client: object, userdata: Any, msg: MqttMsg) -> None:
super().on_message(client, userdata, msg)
if msg.topic == self.power_topic:
m = json.loads(msg.payload.decode())
self.record_power(m)
[docs]
def record_power(self, em: dict[str, Any]) -> None:
"""Write from the power (energy) meter to the time
series database accordingly.
Args:
ts (float): utc time
em (dict): energy meter message
"""
point = (
Point("powermeter")
.tag("sensor", "em0")
.field("real_A", em["real_a"])
.field("real_B", em["real_b"])
.field("real_C", em["real_c"])
.field("total_real_power", em["real_total"])
.time(epoc2utc(em["timestamp"]))
)
try:
self.write(point)
self.debug(
f"PowerMeter event recorded {epoc2utc(em["timestamp"])} - {em["real_a"]} {em["real_b"]} {em["real_c"]}"
)
except Exception as e:
self.error(f"Writing to influx failed {str(e)}")
[docs]
def to_dict(self) -> Dict[str, Any]:
data: Dict[str, Any] = super().to_dict()
data["_powermeter_record"] = {
"power_topic": self.power_topic,
}
return data
[docs]
def from_dict(self, data: Dict[str, Any]) -> None:
super().from_dict(data)
if "_powermeter_record" in data:
for key, value in data["_powermeter_record"].items():
setattr(self, key, value)