supla-device
Loading...
Searching...
No Matches
three_phase_PzemV3_ADDR.h
1// SPDX-FileCopyrightText: AC SOFTWARE SP. Z O.O.
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#ifndef SRC_SUPLA_SENSOR_THREE_PHASE_PZEMV3_ADDR_H_
5#define SRC_SUPLA_SENSOR_THREE_PHASE_PZEMV3_ADDR_H_
6
7#include <Arduino.h>
8// dependence: Arduino library for the Updated PZEM-004T v3.0 Power and Energy
9// meter https://github.com/mandulaj/PZEM-004T-v30
10#include <PZEM004Tv30.h>
11#if defined(PZEM004_SOFTSERIAL)
12#include <SoftwareSerial.h>
13#endif
14#include <supla/time.h>
15
16#include "electricity_meter.h"
17
18#define PZEM_1_DEFAULT_ADDR 0x01
19#define PZEM_2_DEFAULT_ADDR 0x02
20#define PZEM_3_DEFAULT_ADDR 0x03
21
22namespace Supla {
23namespace Sensor {
24
26 public:
27#if defined(PZEM004_SOFTSERIAL)
28 ThreePhasePZEMv3_ADDR(uint8_t pinRX1,
29 uint8_t pinTX1,
30 uint8_t pzem_1_addr = PZEM_1_DEFAULT_ADDR,
31 uint8_t pzem_2_addr = PZEM_2_DEFAULT_ADDR,
32 uint8_t pzem_3_addr = PZEM_3_DEFAULT_ADDR)
33 : pzem{PZEM004Tv30(pinRX1, pinTX1, pzem_1_addr),
34 PZEM004Tv30(pinRX1, pinTX1, pzem_2_addr),
35 PZEM004Tv30(pinRX1, pinTX1, pzem_3_addr)} {
36 }
37#endif
38
39#if defined(ESP32)
40 ThreePhasePZEMv3_ADDR(HardwareSerial *serial,
41 uint8_t pinRx1,
42 uint8_t pinTx1,
43 uint8_t pzem_1_addr = PZEM_1_DEFAULT_ADDR,
44 uint8_t pzem_2_addr = PZEM_2_DEFAULT_ADDR,
45 uint8_t pzem_3_addr = PZEM_3_DEFAULT_ADDR)
46 : pzem{PZEM004Tv30(serial, pinRx1, pinTx1, pzem_1_addr),
47 PZEM004Tv30(serial, pinRx1, pinTx1, pzem_2_addr),
48 PZEM004Tv30(serial, pinRx1, pinTx1, pzem_3_addr)} {
49 }
50#else
51 ThreePhasePZEMv3_ADDR(HardwareSerial *serial,
52 uint8_t pzem_1_addr = PZEM_1_DEFAULT_ADDR,
53 uint8_t pzem_2_addr = PZEM_2_DEFAULT_ADDR,
54 uint8_t pzem_3_addr = PZEM_3_DEFAULT_ADDR)
55 : pzem{PZEM004Tv30(serial, pzem_1_addr),
56 PZEM004Tv30(serial, pzem_2_addr),
57 PZEM004Tv30(serial, pzem_3_addr)} {
58 }
59#endif
60
61 void onInit() {
62 lastReadTime = millis();
63 readValuesFromDevice();
64 updateChannelValues();
65 }
66
67 virtual void readValuesFromDevice() {
68 bool atLeatOnePzemWasRead = false;
69 for (int i = 0; i < 3; i++) {
70 float current = pzem[i].current();
71 // If current reading is NAN, we assume that PZEM there is no valid
72 // communication with PZEM. Sensor shouldn't show any data
73 if (isnan(current)) {
74 resetReadParametersForPhase(i);
75 continue;
76 }
77
78 atLeatOnePzemWasRead = true;
79
80 float voltage = pzem[i].voltage();
81 float active = pzem[i].power();
82 float apparent = (voltage * current);
83 float reactive = 0;
84 if (apparent > active) {
85 reactive = sqrt(apparent * apparent - active * active);
86 } else {
87 reactive = 0;
88 }
89
90 setVoltage(i, voltage * 100);
91 setCurrent(i, current * 1000);
92 setPowerActive(i, active * 100000);
93 setFwdActEnergy(i, pzem[i].energy() * 100000);
94 setPowerFactor(i, pzem[i].pf() * 1000);
95 setPowerApparent(i, apparent * 100000);
96 setPowerReactive(i, reactive * 100000);
97
98 setFreq(pzem[i].frequency() * 100);
99 }
100
101 if (!atLeatOnePzemWasRead) {
102 resetReadParameters();
103 }
104 }
105
106 void resetStorage() {
107 for (int i = 0; i < 3; i++) {
108 pzem[i].resetEnergy();
109 }
110 }
111
112 protected:
113 PZEM004Tv30 pzem[3];
114};
115
116}; // namespace Sensor
117}; // namespace Supla
118
119#endif // SRC_SUPLA_SENSOR_THREE_PHASE_PZEMV3_ADDR_H_
Definition electricity_meter.h:52
Definition three_phase_PzemV3_ADDR.h:25
void onInit()
Third method called on element in SuplaDevice.begin()
Definition three_phase_PzemV3_ADDR.h:61