first commit

This commit is contained in:
Jérôme Delacotte
2025-03-06 11:15:32 +01:00
commit 7b30d6e298
5276 changed files with 2108927 additions and 0 deletions

328
PZEM_Ecran/Domoticz.cpp Normal file
View File

@@ -0,0 +1,328 @@
#include "Domoticz.h"
Domoticz::Domoticz(String domoticz, String port, const char* ssid, const char* pass)
{
_domoticz = domoticz;
_port = port;
_ssid = ssid;
_pass = pass;
// // Domo
// _domoc[_domoticz.length() + 1];
// _domoticz.toCharArray(_domoc, _domoticz.length() + 1);
//
// // Port
// char portc[_port.length() + 1];
// _port.toCharArray(portc, _port.length() + 1);
// _iport = atoi(portc);
}
boolean Domoticz::connect()
{
// Domo
char _domoc[_domoticz.length() + 1];
_domoticz.toCharArray(_domoc, _domoticz.length() + 1);
// Port
char portc[_port.length() + 1];
_port.toCharArray(portc, _port.length() + 1);
int _iport = atoi(portc);
boolean connected = _client.connect(_domoc, _iport);
Serial.print(_domoc);
Serial.print(" ");
Serial.print(_iport);
Serial.print(" ");
Serial.print(" connected ");
Serial.println(connected);
return connected;
}
void Domoticz::close()
{
}
void Domoticz::initWifi()
{
WiFi.mode(WIFI_AP);
WiFi.begin(_ssid, _pass); //Connect to local Wifi
Serial.println();
Serial.print("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(500);
}
Serial.println("WiFi Connected!");
Serial.print("Connexion au reseau ");
Serial.println(WiFi.localIP());
}
void Domoticz::initWifiStatic(
IPAddress ip,
IPAddress gateway,
IPAddress subnet,
IPAddress DNS)
{
WiFi.config(ip, gateway, subnet, DNS);
delay(100);
WiFi.mode(WIFI_STA);
WiFi.begin(_ssid, _pass);
Serial.print("Connecting");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(200);
}
while (WiFi.waitForConnectResult() != WL_CONNECTED) {
Serial.println();
Serial.println("Fail connecting");
delay(5000);
ESP.restart();
}
Serial.print(" static OK ");
Serial.print("Module IP: ");
Serial.println(WiFi.localIP());
}
String Domoticz::generateKey()
{
// WiFi.mode(WIFI_AP);
// Do a little work to get a unique-ish name. Append the
// last two bytes of the MAC (HEX'd) to "Thing-":
uint8_t mac[WL_MAC_ADDR_LENGTH];
WiFi.softAPmacAddress(mac);
String macID = String(mac[WL_MAC_ADDR_LENGTH - 2], HEX) + String(mac[WL_MAC_ADDR_LENGTH - 1], HEX);
macID.toUpperCase();
String AP_NameString = "ESP8266 Thing " + macID;
char AP_NameChar[AP_NameString.length() + 1];
memset(AP_NameChar, 0, AP_NameString.length() + 1);
for (int i = 0; i < AP_NameString.length(); i++)
{
AP_NameChar[i] = AP_NameString.charAt(i);
}
// WiFi.softAP(AP_NameChar, WiFiAPPSK);
Serial.println("macID=" + macID);
return macID;
}
//void Domoticz::getIdFromDomoticz(String macID, Params * params)
//{
// String separator = ",";
// int nb = 0;
//
// Serial.println("Dans getIdFromDomoticz " + macID);
//
// // -------------------
// // LECTURE PARAM
// // -------------------
// if (params->esp8266_id == "") {
// boolean connected = connect();
//
// if (connected) {
// Serial.println("Connected to domoticz");
// executeJson("/json.htm?type=command&param=getuservariables", "", "");
// // Read the first line of the request
// while (1) {
// String req = readLine();
// if (req.indexOf(macID) != -1) {
// Serial.println(req);
// req = readLine();
// req = readLine();
// String val = req.substring(req.indexOf(":") + 2, req.length() - 1);
// Serial.println(val);
// val.replace("\"", "");
// params->esp8266_id = getIndexOfString(val, separator, 0);
// String tmp = getIndexOfString(val, separator, 1);
// if (tmp != "") {
// char tmpc[tmp.length() + 1];
// tmp.toCharArray(tmpc, tmp.length() + 1);
// params->sleepTime = atoi(tmpc);
// if (params->sleepTime <= 0) {
// params->sleepTime = 60;
// }
// }
// params->esp8266_id_Vcc = getIndexOfString(val, separator, 2);
//
// params->esp8266_id_lum = getIndexOfString(val, separator, 3);
// Serial.println("val1=" + params->esp8266_id);
// Serial.print("val2=");
// Serial.println(params->sleepTime);
// Serial.println("val3=" + params->esp8266_id_Vcc);
// Serial.println("val4=" + params->esp8266_id_lum);
//
// break;
// }
// if (req == "" || nb > 500) {
// break;
// }
// nb++;
// }
// _client.stop();
// delay(100);
// }
// }
//
//}
IPAddress Domoticz::getIP(String macId)
{
IPAddress ip; //(192, 168, 1, 222);
String fst = macId.substring(0, 2);
String sec = macId.substring(2);
char fstc[fst.length() + 1];
fst.toCharArray(fstc, fst.length() + 1);
char secc[sec.length() + 1];
sec.toCharArray(secc, fst.length() + 1);
return IPAddress(192, 168, strtol(fstc, 0, 16), strtol(secc, 0, 16));
}
void Domoticz::executeJson(String json, String svalue, String nvalue)
{
// Domo
char _domoc[_domoticz.length() + 1];
_domoticz.toCharArray(_domoc, _domoticz.length() + 1);
// Port
char portc[_port.length() + 1];
_port.toCharArray(portc, _port.length() + 1);
int _iport = atoi(portc);
_client.print("GET " + json); //"GET /json.htm?type=command&param=getuservariables");
if (svalue != "") {
_client.print("&svalue=" + svalue);
}
if (nvalue != "") {
_client.print("&nvalue=" + nvalue);
}
Serial.println(json + "&svalue=" + svalue + "&nvalue=" + nvalue);
_client.println(" HTTP/1.1");
_client.print("Host: ");
_client.print(_domoc);
_client.print(":");
_client.println(_iport);
_client.println("User-Agent: Arduino-ethernet");
_client.println("Connection: close");
_client.println();
}
void Domoticz::readResponse()
{
int x = 0; // variable for looping
char dataStr[16]; //array to store the response
char c;
while(_client.available()) { //_client.connected() || _client.available()) {
String req = readLine();
Serial.println(req);
if (req == "") {
break;
}
// c = _client.read(); //read first character
// while (c!= '<') { //while < character is not coming yet, keep reading character
// c = _client.read();
// }
// c = _client.read(); //read the '<' character, but not storing in array
// while (c != '>') { //while > character is not coming yet,
// dataStr[x] = c; //Store character in array
// x++; //incrementing index array
// }
// for (x=0; x<12; x++) {
// Serial.print(dataStr[x]);
// }
}
Serial.println("Fin réponse");
}
//--------------------------------------------------------------------------------------------------
// Read current supply voltage
//--------------------------------------------------------------------------------------------------
String Domoticz::readVcc() {
// most exact output
uint16_t v = ESP.getVcc();
float_t v_cal = ((float) v / 1024.0f);
char v_str[10];
dtostrf(v_cal, 5, 3, v_str);
sprintf(v_str, "%s", v_str);
Serial.print("Tension lue ");
Serial.println(String(v_str));
return String(v_str); //ESP.getVcc() / 1024.0f; // Vcc in millivolts
}
String Domoticz::getIndexOfString(String data, String separator, int index)
{
int found = 0;
int strIndex[] = { 0, -1 };
int maxIndex = data.length() - 1;
for (int i = 0; i <= maxIndex && found <= index; i++) {
if (data.charAt(i) == separator.charAt(0) || i == maxIndex) {
found++;
strIndex[0] = strIndex[1] + 1;
strIndex[1] = (i == maxIndex) ? i + 1 : i;
}
}
return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
}
String Domoticz::readLine()
{
return _client.readStringUntil('\n');
}
void Domoticz::readTempDayValues(String idx)
{
String json = "/json.htm?type=graph&sensor=temp&idx=" + idx + "&range=day";
int nb = 0;
int nbVal = 0;
Serial.println("readTempDayValues " + idx);
connect();
executeJson(json, "", "");
while (1)
{
String line = readLine();
if (line == "") {
break;
}
if (line.indexOf("\"te\"") != -1) {
//Serial.print(line + " ");
nbVal++;
if (nbVal % 10) {
String val = line.substring(line.indexOf(":") + 2, line.length());
// Serial.println(val);
}
}
nb++;
}
Serial.print("Nombre de lignes ");
Serial.println(nb);
close();
}
int Domoticz::strToHex(char str[])
{
return (int) strtol(str, 0, 16);
}

41
PZEM_Ecran/Domoticz.h Normal file
View File

@@ -0,0 +1,41 @@
#ifndef Domoticz_h
#define Domoticz_h
#include <ESP8266WiFi.h>
//IPAddress ip(192, 168, 1, 222);
class Domoticz
{
public:
Domoticz(String domoticz, String port, const char* ssid, const char* pass);
boolean connect();
void close();
void initWifi();
void initWifiStatic(IPAddress ip, IPAddress gateway, IPAddress subnet, IPAddress DNS);
void executeJson(String json, String svalue, String nvalue);
//String getIdFromDomoticz();
String generateKey();
IPAddress getIP(String macId);
String readLine();
void readResponse();
String readVcc();
void readTempDayValues(String idx);
// void getIdFromDomoticz(String macID, Params * params);
int strToHex(char str[]);
static String getIndexOfString(String data, String separator, int index);
private:
const char* _ssid;
const char* _pass;
public:
WiFiClient _client;
char _domoc[];
int _iport;
String _domoticz;
String _port;
};
#endif

166
PZEM_Ecran/PZEM_Ecran.ino Normal file
View File

@@ -0,0 +1,166 @@
#include <PZEM004Tv30.h>
/////////////////////
// Domoticz Classe
/////////////////////
#include "Domoticz.h"
Domoticz domo("192.168.1.3", "81", "Livebox-37cc", "8A6060920A8A86896F770F2C47");
/* Use software serial for the PZEM
* Pin 11 Rx (Connects to the Tx pin on the PZEM)
* Pin 12 Tx (Connects to the Rx pin on the PZEM)
*/
// ARduino
//PZEM004Tv30 pzem(11, 12);
// ESP
PZEM004Tv30 pzem(D5, D6);
#include <Wire.h> // This library is already built in to the Arduino IDE
#include <LiquidCrystal_I2C.h> //This library you can add via Include Library > Manage Library >
//LiquidCrystal_I2C lcd(0x3F, 20, 4);
LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display
const int PUISSANCE_RADIATEUR = 750;
const char* ssid = "Livebox-37cc";
const char* password = "8A6060920A8A86896F770F2C47";
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 0, 0);
IPAddress DNS(192, 168, 1, 1);
void setup() {
Serial.begin(115200);
lcd.init(); // initializing the LCD
lcd.noBacklight(); // Enable or Turn On the backlight
lcd.setCursor(0, 0);
lcd.print("Init Wifi");
String macId = domo.generateKey();
IPAddress ip = domo.getIP(macId);
domo.initWifiStatic(ip, gateway, subnet, DNS);
delay(300);
lcd.setCursor(0, 1);
lcd.print("-----------------------"); // Start Print Test to Line 2
pzem.resetEnergy();
delay(300);
lcd.clear();
}
int boucle = 0;
void loop() {
boucle ++;
lcd.setCursor(0, 0);
float voltage = pzem.voltage();
if( !isnan(voltage) ){
Serial.print("Voltage: "); Serial.print(voltage); Serial.println("V");
//lcd.print(String(voltage,1) + " V ");
} else {
Serial.println("Error reading voltage");
}
float current = pzem.current();
if( !isnan(current) ){
Serial.print("Current: "); Serial.print(current); Serial.println("A");
// lcd.print(String(current,1) + "A ");
} else {
Serial.println("Error reading current");
}
float pf = pzem.pf();
float power = pzem.power();
if( !isnan(pf) ){
Serial.print("PF: "); Serial.println(pf);
lcd.print(String(pf,3) + "pf ");
if (pf != 0) {
lcd.print(String(power / pf,0) + "Wa");
}
} else {
Serial.println("Error reading power factor");
}
lcd.setCursor(0, 1);
if( !isnan(power) ){
Serial.print("Power: "); Serial.print(power); Serial.println("W");
if (pf > 0) {
lcd.print("+" + String(power,1) + "W ");
}
else {
lcd.print("-" + String(power,1) + "Wa");
}
if (boucle > 10) {
printInfo(power);
boucle = 0;
}
} else {
Serial.println("Error reading power");
if (boucle > 10) {
printInfo(0);
boucle = 0;
}
}
float energy = pzem.energy();
if( !isnan(energy) ){
if (energy < 1000) {
lcd.print(String(energy * 1000,0) + "Wh ");
}
else {
lcd.print(String(energy,1) + "kWh ");
}
Serial.print("Energy: ");
Serial.print(energy,3);
Serial.println("kWh");
} else {
Serial.println("Error reading energy");
}
float frequency = pzem.frequency();
if( !isnan(frequency) ){
Serial.print("Frequency: "); Serial.print(frequency, 1); Serial.println("Hz");
} else {
Serial.println("Error reading frequency");
}
// pf très proche ou égal à 0 ==> début d'injection
// if(!isnan(pf) && pf < 0.01 && power > 10){
// int level = power / (PUISSANCE_RADIATEUR / 100);
//
// Serial.println("début injection " + level);
// }
Serial.println();
delay(210);
}
void printInfo(double value)
{
// Domoticz format /json.htm?type=command&param=udevice&idx=IDX&nvalue=0&svalue=TEMP;HUM;HUM_STAT;BAR;BAR_FOR
boolean connected = domo.connect();
if (connected) {
String svalue = String(value);
Serial.println(svalue);
domo.executeJson("/json.htm?type=command&param=udevice&idx=1138", svalue, "0");
domo._client.stop();
delay(200);
}
Serial.print("Time = ");
Serial.println(millis());
delay(200);
}