Files
qt5-legatus-legacy/Lts/Services/MeteoDataManagement/tcpclimate.cpp
T
2026-08-13 18:33:10 +02:00

206 lines
5.7 KiB
C++
Executable File

/**
* Handle one climate sensor
* Requests for climate sensor data in an given interval.
* All data will be send by signal/slot connection in case of data change.
* $Id$
* $HeadURL$
* $Author$
* Created by hjl, SLSE, 2016-09-22
*/
#include "tcpclimate.h"
#include "settings.h"
namespace MeteoDataManagement
{
TcpClimate::TcpClimate(QObject *parent)
: TcpSocket("TcpClimate", parent)
, m_requestTimer(new QTimer(this))
, m_requestTimeoutTimer(new QTimer(this))
, m_pressure(0.0)
, m_temperature(0.0)
, m_humidity(0.0)
, m_dataChanged(false)
{
// m_logger geerbt aus TcpSocket
DEBUG_LOG(m_logger) << "CTOR TcpClimate... hat TcpSocket fuer connects initialisiert";
connect(m_requestTimer, &QTimer::timeout, this, &TcpClimate::onSensorDataRequest);
connect(m_requestTimeoutTimer, &QTimer::timeout, this, &TcpClimate::onRequestTimeout);
}
//-------------------------------------------------------------------
void TcpClimate::start(const QString &converterIp, quint16 climatePort)
{
DEBUG_LOG(m_logger) << "TcpClimate::start() ... call function TcpSocket::start()";
TcpSocket::start(converterIp, climatePort); // connect...
m_requestTimer->start(Settings::getRequstIntervalClimateSensor());
}
//-------------------------------------------------------------------
void TcpClimate::init()
{
// pure virtual function aus TcpSocket
// PTU-300 Einstellungen: StopMode, 4800,7,E,1
// Hier sind dann keine weiteren Einstellungen erforderlich.
// Nach PowerOn ist die PTU betriebsbereit.
// PTU Stop-Mode setzen damit das Geraet ueberhaupt commands annnimmt.
// if(! sendCommand("S\r"))
// return;
}
//-------------------------------------------------------------------
void TcpClimate::dataAvailable(const QByteArray &line)
{
// pure virtual function aus TcpSocket
// Nur lines mit Wetterdaten behandeln
if (line.contains("P="))
{
m_requestTimeoutTimer->stop();
bool ok = extractDataFromLine(line);
if (!ok)
{
ERROR_LOG(m_logger) << "Read error climate sensor data."
<< " RS232-LAN Converter: " << m_hostName
<< " Port: " << m_hostPort;
}
if (m_dataChanged)
{
m_dataChanged = false;
INFO_LOG(m_logger) << "climateDataChanged()"
<< " pressure: " << m_pressure
<< " temperature: " << m_temperature
<< " humidity: " << m_humidity;
emit sigClimateDataChanged(m_pressure, m_temperature, m_humidity, ok);
}
}
else
{
DEBUG_LOG(m_logger) << "Other climate sensor data available. line: " << line;
// ggf. andere Meldungen behandeln
}
}
//-------------------------------------------------------------------
void TcpClimate::onSensorDataRequest()
{
if (m_requestTimeoutTimer->isActive())
return;
DEBUG_LOG(m_logger) << "onSensorDataRequest() ... " ;
if (!sendCommand("SEND\r\n"))
return;
m_requestTimeoutTimer->start(Settings::getRequstTimeoutClimateSensor());
}
//-------------------------------------------------------------------
void TcpClimate::onRequestTimeout()
{
ERROR_LOG(m_logger) << "Timeout for climate sensor data request."
<< " RS232-LAN Converter: " << m_hostName
<< " Port: " << m_hostPort;
emit sigClimateDataChanged(0, 0, 0, false);
m_requestTimeoutTimer->stop();
}
//-------------------------------------------------------------------
bool TcpClimate::extractDataFromLine(const QByteArray &line)
{
bool bOk = true;
float retValue;
if (extractValueFromLine(line, "P=", "hPa", retValue))
{
DEBUG_LOG(m_logger) << "pressure: " << retValue ;
if (!qFuzzyCompare(retValue, m_pressure))
{
m_pressure = retValue;
m_dataChanged = true;
}
}
else
{
WARNING_LOG(m_logger) << "Value for pressure not available!"
<< " RS232-LAN Converter: " << m_hostName
<< " Port: " << m_hostPort;
bOk = false;
}
if (extractValueFromLine(line, "T=", "'C", retValue))
{
DEBUG_LOG(m_logger) << "temperature: " << retValue ;
if (!qFuzzyCompare(retValue, m_temperature))
{
m_temperature = retValue;
m_dataChanged = true;
}
}
else
{
DEBUG_LOG(m_logger) << "Value for temperature not available!"
<< " RS232-LAN Converter: " << m_hostName
<< " Port: " << m_hostPort;
bOk = false;
}
if (extractValueFromLine(line, "RH=", "%RH", retValue))
{
DEBUG_LOG(m_logger) << "humidity: " << retValue ;
if (!qFuzzyCompare(retValue, m_humidity))
{
m_humidity = retValue;
m_dataChanged = true;
}
}
else
{
WARNING_LOG(m_logger) << "Value for humidity not available!"
<< " RS232-LAN Converter: " << m_hostName
<< " Port: " << m_hostPort;
bOk = false;
}
return bOk;
}
//-------------------------------------------------------------------
bool TcpClimate::extractValueFromLine(const QByteArray &line, const QByteArray &startKey, const QByteArray &endKey, float &retValue)
{
bool bOk = true;
if (line.contains(startKey) && line.contains(endKey))
{
int idx = line.indexOf(startKey);
int idx2 = line.indexOf(endKey);
QByteArray value;
for (int i = idx + startKey.length(); i < idx2; i++)
{
if (line.at(i) != ' ')
value.append(line.at(i));
}
retValue = value.toFloat(&bOk);
}
else
{
bOk = false;
WARNING_LOG(m_logger) << "One or both keywords not found in line: "
<< line << "keywords: " << startKey << " / " << endKey;
}
return bOk;
}
//-------------------------------------------------------------------
} // namespace MeteoDataManagement