init
This commit is contained in:
+433
@@ -0,0 +1,433 @@
|
||||
#include "compteur.h"
|
||||
#include <QDebug>
|
||||
#include <QString>
|
||||
|
||||
/*
|
||||
PJOURF+1 0000C001 07008002 1700C001 NONUTILE NONUTILE NONUTILE NONUTILE NONUTILE NONUTILE NONUTILE NONUTILE U
|
||||
ADSC 812061050715 1
|
||||
VTIC 02 J
|
||||
DATE H211223140802 ;
|
||||
NGTF H PLEINE/CREUSE \
|
||||
LTARF HEURE PLEINE A
|
||||
EAST 018063371 ,
|
||||
EASF01 009242478 F
|
||||
EASF02 008820893 I
|
||||
EASF03 000000000 $
|
||||
EASF04 000000000 %
|
||||
EASF05 000000000 &
|
||||
EASF06 000000000 '
|
||||
EASF07 000000000 (
|
||||
EASF08 000000000 )
|
||||
EASF09 000000000 *
|
||||
EASF10 000000000 "
|
||||
EASD01 009242478 D
|
||||
EASD02 008820893 G
|
||||
EASD03 000000000 "
|
||||
EASD04 000000000 #
|
||||
EAIT 002487735 )
|
||||
ERQ1 000002119 H
|
||||
ERQ2 000001142 D
|
||||
ERQ3 000325124 N
|
||||
ERQ4 002330833 T
|
||||
IRMS1 008 6
|
||||
URMS1 235 D
|
||||
PREF 12 B
|
||||
PCOUP 12 \
|
||||
SINSTS 01905 U
|
||||
SMAXSN H211223042418 11190 7
|
||||
SMAXSN-1 H211222054856 14280
|
||||
SINSTI 00000 <
|
||||
SMAXIN H211223111510 01730 "
|
||||
SMAXIN-1 H211222000000 00000 +
|
||||
CCASN H211223140000 00454 8
|
||||
CCASN-1 H211223133000 00310 O
|
||||
UMOY1 H211223140000 237 *
|
||||
STGE 003A4501 C
|
||||
MSG1 PAS DE MESSAGE <
|
||||
PRM 04520405165913 .
|
||||
RELAIS 000 B
|
||||
NTARF 02 O
|
||||
NJOURF 00 &
|
||||
NJOURF+1 00 B
|
||||
PJOURF+1 0000C001 07008002 1700C001 NONUTILE NONUTILE NONUTILE NONUTILE NONUTILE NONUTILE NONUTILE NONUTILE U
|
||||
ADSC 812061050715 1
|
||||
VTIC 02 J
|
||||
DATE H211223140803 <
|
||||
NGTF H PLEINE/CREUSE \
|
||||
LTARF HEURE PLEINE A
|
||||
EAST 018063373 .
|
||||
EASF01 009242478 F
|
||||
EASF02 008820895 K
|
||||
EASF03 000000000 $
|
||||
EASF04 000000000 %
|
||||
EASF05 000000000 &
|
||||
EASF06 000000000 '
|
||||
EASF07 000000000 (
|
||||
EASF08 000000000 )
|
||||
EASF09 000000000 *
|
||||
EASF10 000000000 "
|
||||
EASD01 009242478 D
|
||||
EASD02 008820895 I
|
||||
EASD03 000000000 "
|
||||
EASD04 000000000 #
|
||||
EAIT 002487735 )
|
||||
ERQ1 000002119 H
|
||||
ERQ2 000001142 D
|
||||
ERQ3 000325124 N
|
||||
ERQ4 002330833 T
|
||||
IRMS1 008 6
|
||||
URMS1 235 D
|
||||
PREF 12 B
|
||||
PCOUP 12 \
|
||||
SINSTS 01929 [
|
||||
SMAXSN H211223042418 11190 7
|
||||
SMAXSN-1 H211222054856 14280
|
||||
SINSTI 00000 <
|
||||
SMAXIN H211223111510 01730 "
|
||||
SMAXIN-1 H211222000000 00000 +
|
||||
CCASN H211223140000 00454 8
|
||||
CCASN-1 H211223133000 00310 O
|
||||
UMOY1 H211223140000 237 *
|
||||
STGE 003A4501 C
|
||||
MSG1 PAS DE MESSAGE <
|
||||
PRM 04520405165913 .
|
||||
RELAIS 000 B
|
||||
NTARF 02 O
|
||||
NJOURF 00 &
|
||||
NJOURF+1 00 B
|
||||
PJOURF+1 0000C001 07008002 1700C001 NONUTILE NONUTILE NONUTILE NONUTILE NONUTILE NONUTILE NONUTILE NONUTILE U
|
||||
ADSC 812061050715 1
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
ADSC 812061050715 1
|
||||
VTIC 02 J
|
||||
DATE E210610220556 <
|
||||
NGTF H PLEINE/CREUSE \
|
||||
LTARF HEURE PLEINE A
|
||||
EAST 012060129 $
|
||||
EASF01 005811879 I
|
||||
EASF02 006248250 >
|
||||
EASF03 000000000 $
|
||||
EASF04 000000000 %
|
||||
EASF05 000000000 &
|
||||
EASF06 000000000 '
|
||||
EASF07 000000000 (
|
||||
EASF08 000000000 )
|
||||
EASF09 000000000 *
|
||||
EASF10 000000000 "
|
||||
EASD01 005811878 F
|
||||
EASD02 006248251 =
|
||||
EASD03 000000000 "
|
||||
EASD04 000000000 #
|
||||
IRMS1 003 1
|
||||
URMS1 236 E
|
||||
PREF 12 B
|
||||
PCOUP 12 \
|
||||
SINSTS 00725 T
|
||||
SMAXSN E210610000934 05560 4
|
||||
SMAXSN-1 E210609233927 05570 %
|
||||
CCASN E210610220000 00630 /
|
||||
CCASN-1 E210610213000 00512 N
|
||||
UMOY1 E210610220000 236 $
|
||||
STGE 003A4401 B
|
||||
MSG1 PAS DE MESSAGE <
|
||||
PRM 04520405165913 .
|
||||
RELAIS 000 B
|
||||
NTARF 02 O
|
||||
NJOURF 00 &
|
||||
NJOURF+1 00 B
|
||||
PJOURF+1 0000C001 06368002 1636C001 NONUTILE NONUTILE NONUTILE NONUTILE NONUTILE NONUTILE NONUTILE NONUTILE %
|
||||
|
||||
*/
|
||||
|
||||
|
||||
Compteur::Compteur(QObject *parent)
|
||||
: QObject(parent), serial(this),timerReadData(this)
|
||||
{
|
||||
serial.setPortName("domotiqueCompteur");
|
||||
serial.setBaudRate(9600);
|
||||
serial.setDataBits(QSerialPort::Data7);
|
||||
serial.setParity(QSerialPort::EvenParity);
|
||||
retryOpenSerial.setInterval(500);
|
||||
retryOpenSerial.setSingleShot(true);
|
||||
timerReadData.setInterval(400);
|
||||
|
||||
connect(&retryOpenSerial,&QTimer::timeout,this,&Compteur::serialError);
|
||||
connect(&timerReadData,&QTimer::timeout,this,&Compteur::getData);
|
||||
//connect(&serial,&QSerialPort::readyRead,this,&Compteur::getData);
|
||||
|
||||
|
||||
connect(&m_client,SIGNAL(connected()),this,SLOT(mqttConnected()));
|
||||
connect(&m_client,SIGNAL(disconnected()),this,SLOT(mqttDisConnected()));
|
||||
connect(&retryMqttTimer,SIGNAL(timeout()),this,SLOT(mqttReconnect()));
|
||||
|
||||
listeEtiquette.append("EASF01");
|
||||
listeTopic.append("fluide/elec/hc");
|
||||
listeValeur.append("");
|
||||
listeNewValeur.append("");
|
||||
listeDiv.append(100);
|
||||
listeArrondi.append(0);
|
||||
|
||||
listeEtiquette.append("EASF02");
|
||||
listeTopic.append("fluide/elec/hp");
|
||||
listeValeur.append("");
|
||||
listeNewValeur.append("");
|
||||
listeDiv.append(100);
|
||||
listeArrondi.append(0);
|
||||
|
||||
listeEtiquette.append("PTEC");
|
||||
listeTopic.append("fluide/elec/tarif");
|
||||
listeValeur.append("");
|
||||
listeNewValeur.append("");
|
||||
listeDiv.append(0);
|
||||
listeArrondi.append(0);
|
||||
|
||||
|
||||
nbEtiquettes=listeEtiquette.size();
|
||||
|
||||
m_client.setHostname(QString("iot"));
|
||||
m_client.setPort(1883);
|
||||
|
||||
retryMqttTimer.setInterval(100);
|
||||
retryMqttTimer.start();
|
||||
souscription=nullptr;
|
||||
|
||||
|
||||
retryOpenSerial.start();
|
||||
}
|
||||
|
||||
void Compteur::serialError()
|
||||
{
|
||||
disconnect(&serial,&QSerialPort::errorOccurred,this,&Compteur::serialError);
|
||||
timerReadData.stop();
|
||||
qDebug()<<"tentative d'ouverture de la liaison serie";
|
||||
serial.close();
|
||||
if (serial.open(QIODevice::ReadOnly)==false)
|
||||
{
|
||||
|
||||
qDebug()<<"echec";
|
||||
retryOpenSerial.start();
|
||||
serial.close();
|
||||
}
|
||||
else
|
||||
{
|
||||
retryOpenSerial.stop();
|
||||
qDebug()<<"ok";
|
||||
connect(&serial,&QSerialPort::errorOccurred,this,&Compteur::serialError);
|
||||
timerReadData.start();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void Compteur::getData()
|
||||
{
|
||||
QString line;
|
||||
static bool start=false;
|
||||
bool run=true;
|
||||
char c='\0',pc;
|
||||
char crc=0;
|
||||
do
|
||||
{
|
||||
pc=c;
|
||||
if (serial.getChar(&c))
|
||||
{
|
||||
if (c=='\n')
|
||||
{
|
||||
line.clear();
|
||||
crc=0;
|
||||
}
|
||||
else if (c=='\r')
|
||||
{
|
||||
crc-=pc;
|
||||
crc=(crc&0x3F)+0x20;
|
||||
QStringList liste = line.split(QLatin1Char('\t'));
|
||||
//qDebug()<<liste<<" "<<crc;
|
||||
|
||||
if (crc==liste.last().at(0))
|
||||
{
|
||||
//qDebug()<<"crc ok";
|
||||
|
||||
if (liste.at(0)=="DATE")
|
||||
{
|
||||
//qDebug()<<"start";
|
||||
if (start==false) start=true;
|
||||
else
|
||||
{
|
||||
if (injection==true)
|
||||
{
|
||||
if (iInst>0) iInst=-iInst;
|
||||
pInst=-pInj;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (iInst<0) iInst=-iInst;
|
||||
pInst=pSout;
|
||||
}
|
||||
/* if (iInst!=iInstPrec)
|
||||
{
|
||||
iInstPrec=iInst;
|
||||
//qDebug()<<"topic"<<"fluide/elec/iinst"<<iInst;
|
||||
mqttSend("fluide/elec/iinst",QString::number(iInst),1,true);
|
||||
}
|
||||
*/
|
||||
if (pInst!=pInstPrec)
|
||||
{
|
||||
pInstPrec=pInst;
|
||||
//qDebug()<<"topic"<<"fluide/elec/puissance"<<pInst;
|
||||
mqttSend("homeassistant/sensor/teleinfoPinst/state",QString::number(pInst),1,true);
|
||||
}
|
||||
pConso=pInst+pSolaire;
|
||||
if (pConso!=pConsoPrec)
|
||||
{
|
||||
pConsoPrec=pConso;
|
||||
mqttSend("homeassistant/sensor/teleinfoPconso/state",QString::number(pConso),1,true);
|
||||
}
|
||||
if (indexInj!=indexInjPrec)
|
||||
{
|
||||
indexInjPrec=indexInj;
|
||||
mqttSend("homeassistant/sensor/teleinfoIndexInjection/state",QString::number(indexInj/10)+'.'+QString::number(indexInj%10),1,true);
|
||||
}
|
||||
|
||||
for(int i=0;i<nbEtiquettes;i++)
|
||||
{
|
||||
if (listeValeur.at(i)!=listeNewValeur.at(i))
|
||||
{
|
||||
listeValeur[i]=listeNewValeur.at(i);
|
||||
//qDebug()<<"topic"<<listeTopic.at(i)<<listeValeur[i];
|
||||
mqttSend(listeTopic[i],listeValeur[i],1,true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (liste.at(0)=="IRMS1")
|
||||
{
|
||||
iInst=liste.at(1).toInt();
|
||||
}
|
||||
else if (liste.at(0)=="SINSTS")
|
||||
{
|
||||
pSout=liste.at(1).toInt();
|
||||
//if (pInst==0) injection=true; else injection=false;
|
||||
pSout=(pSout/50)*50;
|
||||
}
|
||||
else if (liste.at(0)=="SINSTI")
|
||||
{
|
||||
pInj=liste.at(1).toInt();
|
||||
if (pInj!=0) injection=true; else injection=false;
|
||||
pInj=(pInj/50)*50;
|
||||
}
|
||||
else if (liste.at(0)=="EAIT")
|
||||
{
|
||||
indexInj=liste.at(1).toLong()/100;
|
||||
}
|
||||
else
|
||||
{
|
||||
int i=listeEtiquette.indexOf(liste.at(0));
|
||||
if (i>=0)
|
||||
{
|
||||
listeNewValeur[i] = liste.at(1);
|
||||
int div=listeDiv.at(i);
|
||||
if (div!=0) listeNewValeur[i]=QString::number((listeNewValeur[i].toInt()/div));
|
||||
int arrondi=listeArrondi.at(i);
|
||||
if (arrondi!=0) listeNewValeur[i]=QString::number(( ((listeNewValeur[i].toInt())/arrondi)*arrondi));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
line.append(c);
|
||||
crc+=c;
|
||||
}
|
||||
|
||||
if (serial.bytesAvailable()<20) run=false;
|
||||
}
|
||||
else
|
||||
{
|
||||
run=false;
|
||||
}
|
||||
}while(run);
|
||||
|
||||
}
|
||||
|
||||
void Compteur::addHomeAssistant(QString name, QString type, QString unit)
|
||||
{
|
||||
QString payload;
|
||||
payload.append("{");
|
||||
if (type!="") payload.append("\"device_class\": \""+type+"\",");
|
||||
payload.append("\"state_topic\": \"homeassistant/sensor/teleinfo"+name+"/state\",");
|
||||
payload.append("\"name\": \"teleinfo"+name+"\",");
|
||||
payload.append("\"unique_id\": \"teleinfo"+name+"\",");
|
||||
if (unit!="") payload.append("\"unit_of_measurement\": \""+unit+"\"}");
|
||||
emit mqttSend("homeassistant/sensor/teleinfo"+name+"/config",
|
||||
payload,
|
||||
1,1);
|
||||
}
|
||||
|
||||
|
||||
void Compteur::mqttConnected()
|
||||
{
|
||||
isConnected = true;
|
||||
retryMqttTimer.stop();
|
||||
souscription=m_client.subscribe(QMqttTopicFilter("fluide/elec/pSolaire"),1);
|
||||
connect(souscription,&QMqttSubscription::messageReceived,
|
||||
this,&Compteur::newPuissanceSolaire);
|
||||
|
||||
addHomeAssistant("Pinst","power","W");
|
||||
addHomeAssistant("Pconso","power","W");
|
||||
addHomeAssistant("IndexHC","energy","kWh");
|
||||
addHomeAssistant("IndexHP","energy","kWh");
|
||||
addHomeAssistant("IndexInjection","energy","kWh");
|
||||
|
||||
qDebug()<<"connect to Mosquitto !";
|
||||
}
|
||||
|
||||
void Compteur::mqttDisConnected()
|
||||
{
|
||||
isConnected = false;
|
||||
if (souscription!=nullptr)
|
||||
{
|
||||
disconnect(souscription,&QMqttSubscription::messageReceived,
|
||||
this,&Compteur::newPuissanceSolaire);
|
||||
delete souscription;
|
||||
souscription=nullptr;
|
||||
}
|
||||
qDebug()<<"connection au serveur perdue !!!";
|
||||
retryMqttTimer.start();
|
||||
}
|
||||
|
||||
void Compteur::mqttReconnect()
|
||||
{
|
||||
qDebug()<<"try to (re)connect !";
|
||||
m_client.connectToHost();
|
||||
}
|
||||
|
||||
|
||||
void Compteur::mqttSend(QString topic, QString message, int qos, bool retain)
|
||||
{
|
||||
if (isConnected)
|
||||
{
|
||||
m_client.publish(topic, message.toLatin1(),quint8(qos),retain);
|
||||
}
|
||||
}
|
||||
|
||||
void Compteur::newPuissanceSolaire(QMqttMessage message)
|
||||
{
|
||||
//qDebug()<<"new message : "<<message.payload();
|
||||
bool isInt;
|
||||
int val=message.payload().toInt(&isInt);
|
||||
if (isInt)
|
||||
{
|
||||
//qDebug()<<val;
|
||||
pSolaire=val;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+65
@@ -0,0 +1,65 @@
|
||||
#ifndef COMPTEUR_H
|
||||
#define COMPTEUR_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QSerialPort>
|
||||
#include <QTimer>
|
||||
#include <QtMqtt/QMqttClient>
|
||||
#include <QStringList>
|
||||
|
||||
class Compteur : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit Compteur(QObject *parent = nullptr);
|
||||
|
||||
private:
|
||||
QSerialPort serial;
|
||||
QTimer retryOpenSerial;
|
||||
QTimer timerReadData;
|
||||
|
||||
bool isConnected;
|
||||
QMqttClient m_client;
|
||||
QTimer retryMqttTimer;
|
||||
QMqttSubscription * souscription;
|
||||
|
||||
|
||||
QStringList listeEtiquette;
|
||||
QStringList listeValeur;
|
||||
QStringList listeNewValeur;
|
||||
QStringList listeTopic;
|
||||
QList<int> listeDiv;
|
||||
QList<int> listeArrondi;
|
||||
|
||||
int nbEtiquettes;
|
||||
|
||||
int pSout;
|
||||
int pInj;
|
||||
int pInst;
|
||||
int pInstPrec=-9999;
|
||||
int pConso;
|
||||
int pConsoPrec=-9999;
|
||||
int iInst;
|
||||
int iInstPrec=-9999;
|
||||
long indexInj;
|
||||
long indexInjPrec=-9999;
|
||||
int pSolaire=0;
|
||||
bool injection;
|
||||
|
||||
|
||||
signals:
|
||||
|
||||
public slots:
|
||||
void serialError();
|
||||
void getData();
|
||||
|
||||
void mqttConnected();
|
||||
void mqttDisConnected();
|
||||
void mqttReconnect();
|
||||
void mqttSend(QString topic, QString message,int qos,bool retain);
|
||||
void newPuissanceSolaire(QMqttMessage message);
|
||||
void addHomeAssistant(QString name, QString type, QString unit);
|
||||
|
||||
};
|
||||
|
||||
#endif // COMPTEUR_H
|
||||
@@ -0,0 +1,11 @@
|
||||
#include <QCoreApplication>
|
||||
#include "compteur.h"
|
||||
#include "qem24energymeter.h"
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
QCoreApplication a(argc, argv);
|
||||
QEM24EnergyMeter energyMeter(&a);
|
||||
//Compteur cpt;
|
||||
return a.exec();
|
||||
}
|
||||
@@ -0,0 +1,164 @@
|
||||
#include "qem24energymeter.h"
|
||||
#include <QDebug>
|
||||
|
||||
|
||||
QEM24EnergyMeter::QEM24EnergyMeter(QObject *parent)
|
||||
: QObject{parent}
|
||||
{
|
||||
// reg.insert(QModbusDataUnit::Coils, { QModbusDataUnit::Coils, 0, 10 });
|
||||
// reg.insert(QModbusDataUnit::DiscreteInputs, { QModbusDataUnit::DiscreteInputs, 0, 10 });
|
||||
reg.insert(QModbusDataUnit::InputRegisters, { QModbusDataUnit::InputRegisters, 0, 0xA101 });
|
||||
reg.insert(QModbusDataUnit::HoldingRegisters, { QModbusDataUnit::HoldingRegisters, 0, 0xA101 });
|
||||
|
||||
|
||||
modbusDevice.setMap(reg);
|
||||
// 000Bh Carlo Gavazzi identification code 1648
|
||||
|
||||
setRegistre(0xB,1648);
|
||||
setRegistre( 0x0302, 0x101E ); // Version and revision code of measurement module
|
||||
setRegistre( 0x0304, 0x101E ); // Version and revision code of communication module
|
||||
setRegistre( 0x1002, 3 ); // Measuring system (3="1Ph", 4=“3P”)
|
||||
//setRegistre( 0x1003, 10 ); // current transformer ratio)
|
||||
//setRegistre( 0x1005, 10 ); // tension transformer ratio
|
||||
//setRegistre( 0x1010, 15 ); // interval Time
|
||||
|
||||
//setRegistre( 0x1109, 1 ); // filter coeff
|
||||
|
||||
setRegistre(0x2100,192);
|
||||
setRegistre(0x2101,168);
|
||||
setRegistre(0x2102,0);
|
||||
setRegistre(0x2103,7);
|
||||
|
||||
setRegistre(0x2104,255);
|
||||
setRegistre(0x2105,255);
|
||||
setRegistre(0x2106,255);
|
||||
setRegistre(0x2107,0);
|
||||
|
||||
setRegistre(0x2108,192);
|
||||
setRegistre(0x2109,168);
|
||||
setRegistre(0x210A,0);
|
||||
setRegistre(0x210B,1);
|
||||
|
||||
setRegistre(0x210C,502);
|
||||
|
||||
setRegistre(0x2120,192);
|
||||
setRegistre(0x2121,168);
|
||||
setRegistre(0x2122,0);
|
||||
setRegistre(0x2123,7);
|
||||
|
||||
setRegistre(0x2124,255);
|
||||
setRegistre(0x2125,255);
|
||||
setRegistre(0x2126,255);
|
||||
setRegistre(0x2127,0);
|
||||
|
||||
setRegistre(0x2128,192);
|
||||
setRegistre(0x2129,168);
|
||||
setRegistre(0x212A,0);
|
||||
setRegistre(0x212B,1);
|
||||
|
||||
|
||||
setRegistre( 0x0032, 0 ); // Phase sequence
|
||||
setRegistre( 0x0033, 500 ); // Frequence
|
||||
setRegistre( 0xA100, 3 ); //Front selector status lock
|
||||
setRegistre( 0x5000, 0x4c69 ); //Serial Digit 1 & 2
|
||||
setRegistre( 0x5001, 0x6e6b ); //Serial Digit 3 & 4
|
||||
setRegistre( 0x5002, 0x7930 ); //Serial Digit 5 & 6
|
||||
setRegistre( 0x5003, 0x3030 ); //Serial Digit 7 & 8
|
||||
setRegistre( 0x5004, 0x3030 ); //Serial Digit 9 & 10
|
||||
setRegistre( 0x5005, 0x3030 ); //Serial Digit 11 & 12
|
||||
setRegistre( 0x5006, 0x3100 ); //Serial Digit 13
|
||||
setRegistre( 0xA000, 7 ); //Application : Doit être égal à 7 pour Victron
|
||||
//Infos triphasées non utilisées:
|
||||
setRegistre( 0x0000, 2300 ); // V-L1
|
||||
setRegistre( 0x0001, 0 );
|
||||
setRegistre( 0x0002, 0 ); // V-L3
|
||||
setRegistre( 0x0003, 0 );
|
||||
setRegistre( 0x0004, 0 ); // V-L2
|
||||
setRegistre( 0x0005, 0 );
|
||||
setRegistre( 0x000C, 100 ); // A-L1
|
||||
setRegistre( 0x000D, 0 );
|
||||
setRegistre( 0x000E, 0 ); // A-L1
|
||||
setRegistre( 0x000F, 0 );
|
||||
setRegistre( 0x0010, 0 ); // A-L2
|
||||
setRegistre( 0x0011, 0 );
|
||||
setRegistre( 0x0012, 1000 ); // W-L1
|
||||
setRegistre( 0x0013, 0 );
|
||||
setRegistre( 0x0016, 0 ); // W-L2
|
||||
setRegistre( 0x0017, 0 );
|
||||
setRegistre( 0x0018, 1000 ); // VA-L1
|
||||
setRegistre( 0x0019, 0 );
|
||||
setRegistre( 0x0042, 0 ); // kWh-L2
|
||||
setRegistre( 0x0043, 0 );
|
||||
setRegistre( 0x0028, 1000 ); // W-Total
|
||||
setRegistre( 0x0029, 0 );
|
||||
setRegistre( 0x002A, 1000 ); // VA-Total
|
||||
setRegistre( 0x002B, 0 );
|
||||
setRegistre( 0x0034, 100); // kWh +
|
||||
setRegistre( 0x0035, 0 );
|
||||
//Initialisation des valeurs pertinentes pour le monophasé
|
||||
setRegistre( 0x0040, 1 ); // kWh-L1
|
||||
setRegistre( 0x0041, 0 );
|
||||
setRegistre( 0x0044, 0 ); // kWh-L2
|
||||
setRegistre( 0x0045, 0 );
|
||||
setRegistre( 0x004E, 0 ); // kWh-
|
||||
setRegistre( 0x004F, 0 );
|
||||
setRegistre( 0x0046, 0 ); // kWh+ T1
|
||||
setRegistre( 0x0047, 0 );
|
||||
setRegistre( 0x0048, 0 ); // kWh+ T2
|
||||
setRegistre( 0x0049, 0 );
|
||||
|
||||
|
||||
|
||||
modbusDevice.setConnectionParameter(QModbusDevice::NetworkPortParameter, 502);
|
||||
modbusDevice.setConnectionParameter(QModbusDevice::NetworkAddressParameter, "192.168.0.7");
|
||||
modbusDevice.setServerAddress(1);
|
||||
modbusDevice.setValue(QModbusServer::ListenOnlyMode, 0);
|
||||
//modbusDevice.setValue(QModbusServer::DeviceBusy, 0xfff);
|
||||
|
||||
|
||||
connect(&modbusDevice, &QModbusTcpServer::dataWritten,
|
||||
this, &QEM24EnergyMeter::updateWidgets);
|
||||
connect(&modbusDevice, &QModbusTcpServer::stateChanged,
|
||||
this, &QEM24EnergyMeter::onStateChanged);
|
||||
connect(&modbusDevice, &QModbusTcpServer::errorOccurred,
|
||||
this, &QEM24EnergyMeter::handleDeviceError);
|
||||
|
||||
connect(&modbusDevice, &QModbusTcpServer::modbusClientDisconnected,
|
||||
this, &QEM24EnergyMeter::clientDisconnected);
|
||||
|
||||
modbusDevice.setData(QModbusDataUnit::Coils, 0, 1);
|
||||
modbusDevice.setData(QModbusDataUnit::Coils, 1, 2);
|
||||
|
||||
modbusDevice.connectDevice();
|
||||
|
||||
}
|
||||
|
||||
void QEM24EnergyMeter::setRegistre(quint16 address, quint16 value)
|
||||
{
|
||||
modbusDevice.setData(QModbusDataUnit::HoldingRegisters,address,value);
|
||||
modbusDevice.setData(QModbusDataUnit::InputRegisters,address,value);
|
||||
}
|
||||
|
||||
void QEM24EnergyMeter::onStateChanged(int state)
|
||||
{
|
||||
qDebug()<<"state :"<<state;
|
||||
}
|
||||
|
||||
void QEM24EnergyMeter::updateWidgets(QModbusDataUnit::RegisterType table, int address, int size)
|
||||
{
|
||||
quint16 value;
|
||||
modbusDevice.data(QModbusDataUnit::HoldingRegisters,address,&value);
|
||||
qDebug()<<"updateWidgets :"<<address<<" "<<size<<" "<<value;
|
||||
|
||||
}
|
||||
|
||||
void QEM24EnergyMeter::handleDeviceError(QModbusDevice::Error newError)
|
||||
{
|
||||
qDebug()<<"error :"<<newError;
|
||||
|
||||
}
|
||||
|
||||
void QEM24EnergyMeter::clientDisconnected(QTcpSocket *modbusClient)
|
||||
{
|
||||
qDebug()<<"deconnexion : "<<modbusClient->peerAddress() ;
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
#ifndef QEM24ENERGYMETER_H
|
||||
#define QEM24ENERGYMETER_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QModbusTcpServer>
|
||||
#include <QTcpSocket>
|
||||
#include <QHostAddress>
|
||||
|
||||
class QEM24EnergyMeter : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit QEM24EnergyMeter(QObject *parent = nullptr);
|
||||
|
||||
private:
|
||||
QModbusTcpServer modbusDevice;
|
||||
|
||||
QModbusDataUnitMap reg;
|
||||
|
||||
void setRegistre(quint16 address, quint16 value);
|
||||
|
||||
private Q_SLOTS:
|
||||
void onStateChanged(int state);
|
||||
void updateWidgets(QModbusDataUnit::RegisterType table, int address, int size);
|
||||
void handleDeviceError(QModbusDevice::Error newError);
|
||||
|
||||
void clientDisconnected(QTcpSocket *modbusClient);
|
||||
|
||||
signals:
|
||||
|
||||
};
|
||||
|
||||
#endif // QEM24ENERGYMETER_H
|
||||
@@ -0,0 +1,31 @@
|
||||
QT -= gui
|
||||
QT += mqtt xml serialport serialbus
|
||||
|
||||
CONFIG += c++11 console
|
||||
CONFIG -= app_bundle
|
||||
|
||||
# The following define makes your compiler emit warnings if you use
|
||||
# any Qt feature that has been marked deprecated (the exact warnings
|
||||
# depend on your compiler). Please consult the documentation of the
|
||||
# deprecated API in order to know how to port your code away from it.
|
||||
#DEFINES += QT_DEPRECATED_WARNINGS
|
||||
|
||||
# You can also make your code fail to compile if it uses deprecated APIs.
|
||||
# In order to do so, uncomment the following line.
|
||||
# You can also select to disable deprecated APIs only up to a certain version of Qt.
|
||||
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
|
||||
|
||||
SOURCES += \
|
||||
main.cpp \
|
||||
compteur.cpp \
|
||||
qem24energymeter.cpp
|
||||
|
||||
# Default rules for deployment.
|
||||
target.path = /home/bas
|
||||
INSTALLS += target
|
||||
|
||||
HEADERS += \
|
||||
compteur.h \
|
||||
qem24energymeter.h
|
||||
|
||||
#LIBS += "/opt/electronique/navis/sysroot/lib/aarch64-linux-gnu/libudev.so.1"
|
||||
Reference in New Issue
Block a user