/** * Handler for one meteo data unit * Manages the connection to a MDU and sends data via DDS as soon as they have been changed * $Id$ * $HeadURL$ * $Author$ * Created by hjl, SLSE, 2016-09-27 */ #include "handler_meteo_data_unit.h" #include "handler_meteo_data_units.h" #include "handler_infrastructure_data.h" #include "tcpweatherstation.h" #include "main_handler.h" #include #include using namespace MeteoDataManagement; HandlerMeteoDataUnit::HandlerMeteoDataUnit(MainHandler *mainHandler, const InfrastructureManagement::InstrumentationAsset &asset, QObject *parent) : QObject(parent) , m_mainHandler(mainHandler) , m_asset(asset) , m_tcpWS(nullptr) , m_logger(getLogger("HandlerMeteoDataUnit")) { init(); } // end of ctor() //----------------------------------------------------------------------------- HandlerMeteoDataUnit::~HandlerMeteoDataUnit() { delete m_tcpWS; } // end of dtor() //----------------------------------------------------------------------------- bool HandlerMeteoDataUnit::init() { delete m_tcpWS; QJsonParseError jError; QJsonDocument doc(QJsonDocument::fromJson(m_asset.properties().c_str(), &jError)); if (jError.error != QJsonParseError::NoError || !doc.isObject()) { ERROR_LOG(m_logger) << "Can not initialize meteo data unit - properties are not parsable: " << jError.errorString() << " - '" << m_asset.properties() << "'"; return false; } QJsonObject obj(doc.object()); quint16 climatePort = obj[QStringLiteral("climatePort")].toInt(); quint16 windPort = obj[QStringLiteral("windPort")].toInt(); if (climatePort == 0 || windPort == 0) { ERROR_LOG(m_logger) << "Can not parse climate and/or wind port from properties: '" << m_asset.properties() << "'"; return false; } m_tcpWS = new TcpWeatherStation(m_asset.id(), QString::fromStdString(m_asset.hostname()), climatePort, windPort); // init local MeteoData Values for compare m_newMeteoData.id(m_asset.id()); m_newMeteoData.weatherStationId(m_asset.id()); m_newMeteoData.note(m_asset.name()); m_newMeteoData.isStaticMeteoData(false); // Position der MDU eintragen (GeoPosition2D) if (m_mainHandler->ism()) { const Core::GeoPosition geoPos = m_mainHandler->ism()->getStructureElementPosition(m_asset.id()); //GeoPos->GeoPos2D m_newMeteoData.pos(Core::GeoPosition2D(geoPos.lon(), geoPos.lat())); } m_newMeteoData.pressure(800.0); m_newMeteoData.humidity(0.0); m_newMeteoData.temperature(0.0); m_newMeteoData.windSpeed(0.0); m_newMeteoData.windDirection(0.0); m_lastMeteoData = m_newMeteoData; connect(m_tcpWS, &TcpWeatherStation::sigWeatherDataChanged, this, &HandlerMeteoDataUnit::onMeteoDataChanged); return true; } // end of init() //----------------------------------------------------------------------------- void HandlerMeteoDataUnit::onMeteoDataChanged(int id, float pressure, float temperature, float humidity, float direction, float speed, bool climateOk, bool windOk) { m_newMeteoData.id(id); m_newMeteoData.pressure(pressure); // in hPa m_newMeteoData.temperature(temperature); // in Grad Celsius m_newMeteoData.humidity(humidity); // % rel. Feuchte m_newMeteoData.windDirection(direction); // Grad, Nordbezogen mathem. negativ m_newMeteoData.windSpeed(speed); // in m/s m_newMeteoData.climateOk(climateOk); m_newMeteoData.windOk(windOk); // Position der MDU eintragen (falls sie noch nicht beim init() ermittelt werden konnte) if (m_lastMeteoData.pos() == Core::GeoPosition2D()) { if (m_mainHandler->ism()) { const Core::GeoPosition geoPos = m_mainHandler->ism()->getStructureElementPosition(m_asset.id()); m_newMeteoData.pos(Core::GeoPosition2D(geoPos.lon(), geoPos.lat())); } } if (m_lastMeteoData == m_newMeteoData) return; // publish newMeteoData onPublishData(); // safe for next compare m_lastMeteoData = m_newMeteoData; } // end of onMeteoDataChanged() //----------------------------------------------------------------------------- void HandlerMeteoDataUnit::onPublishData() { MeteoDataManagement::MeteoData ddsData; ddsData = m_newMeteoData; ddsData.timeStamp(m_mainHandler->dds()->currentPartitionTime()); INFO_LOG(m_logger) << "Publish dynamic MeteoData to dds: " << ddsData; if (!m_mainHandler->dds()->dts()->publish(ddsData)) ERROR_LOG(m_logger) << "Error publishing MdmMeteoData to dds"; } // end of onPublishData() //-----------------------------------------------------------------------------