/** * 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