206 lines
5.7 KiB
C++
Executable File
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
|