SinricPro Library
PowerSensor.h
1 #pragma once
2 
3 #include "../EventLimiter.h"
4 #include "../SinricProStrings.h"
5 
6 #include "../SinricProNamespace.h"
7 namespace SINRICPRO_NAMESPACE {
8 
9 FSTR(POWERSENSOR, powerUsage); // "powerUsage"
10 FSTR(POWERSENSOR, startTime); // "startTime"
11 FSTR(POWERSENSOR, voltage); // "voltage"
12 FSTR(POWERSENSOR, current); // "current"
13 FSTR(POWERSENSOR, power); // "power"
14 FSTR(POWERSENSOR, apparentPower); // "apparentPower"
15 FSTR(POWERSENSOR, reactivePower); // "reactivePower"
16 FSTR(POWERSENSOR, factor); // "factor"
17 FSTR(POWERSENSOR, wattHours); // "wattHours"
18 
23 template <typename T>
24 class PowerSensor {
25 public:
26  PowerSensor();
27  bool sendPowerSensorEvent(float voltage, float current, float power = -1.0f, float apparentPower = -1.0f, float reactivePower = -1.0f, float factor = -1.0f, String cause = FSTR_SINRICPRO_PERIODIC_POLL);
28 
29 private:
30  EventLimiter event_limiter;
31  unsigned long startTime = 0;
32  unsigned long lastPower = 0;
33  float getWattHours(unsigned long currentTimestamp);
34 };
35 
36 template <typename T>
38 : event_limiter(EVENT_LIMIT_SENSOR_VALUE) {}
39 
53 template <typename T>
54 bool PowerSensor<T>::sendPowerSensorEvent(float voltage, float current, float power, float apparentPower, float reactivePower, float factor, String cause) {
55  if (event_limiter) return false;
56  T* device = static_cast<T*>(this);
57 
58  JsonDocument eventMessage = device->prepareEvent(FSTR_POWERSENSOR_powerUsage, cause.c_str());
59  JsonObject event_value = eventMessage[FSTR_SINRICPRO_payload][FSTR_SINRICPRO_value];
60  if (power == -1)
61  power = voltage * current;
62  if (apparentPower != -1)
63  factor = power / apparentPower;
64 
65  unsigned long currentTimestamp = device->getTimestamp();
66 
67  event_value[FSTR_POWERSENSOR_startTime] = startTime;
68  event_value[FSTR_POWERSENSOR_voltage] = voltage;
69  event_value[FSTR_POWERSENSOR_current] = current;
70  event_value[FSTR_POWERSENSOR_power] = power;
71  event_value[FSTR_POWERSENSOR_apparentPower] = apparentPower;
72  event_value[FSTR_POWERSENSOR_reactivePower] = reactivePower;
73  event_value[FSTR_POWERSENSOR_factor] = factor;
74  event_value[FSTR_POWERSENSOR_wattHours] = getWattHours(currentTimestamp);
75 
76  startTime = currentTimestamp;
77  lastPower = power;
78  return device->sendEvent(eventMessage);
79 }
80 
81 template <typename T>
82 float PowerSensor<T>::getWattHours(unsigned long currentTimestamp) {
83  if (startTime)
84  return (currentTimestamp - startTime) * lastPower / 3600.0f;
85  return 0;
86 }
87 
88 } // SINRICPRO_NAMESPACE
89 
90 template <typename T>
91 using PowerSensor = SINRICPRO_NAMESPACE::PowerSensor<T>;
PowerSensor.
Definition: PowerSensor.h:24
bool sendPowerSensorEvent(float voltage, float current, float power=-1.0f, float apparentPower=-1.0f, float reactivePower=-1.0f, float factor=-1.0f, String cause=FSTR_SINRICPRO_PERIODIC_POLL)
Send PowerSensor event to SinricPro Server.
Definition: PowerSensor.h:54