diff --git a/src/openhab.cpp b/src/openhab.cpp index 8d0a1e2..40188da 100755 --- a/src/openhab.cpp +++ b/src/openhab.cpp @@ -70,7 +70,6 @@ OpenHAB::OpenHAB(const QVariantMap& config, EntitiesInterface* entities, Notific } else if (!_url.endsWith('/')) { _url += "/"; } - _pollingTimer = new QTimer(this); _sseReconnectTimer = new QTimer(this); @@ -170,12 +169,12 @@ void OpenHAB::onSseTimeout() { void OpenHAB::startSse() { QNetworkRequest request(_url + "events"); - request.setRawHeader(QByteArray("Accept"), QByteArray("text/event-stream")); + request.setRawHeader("Accept", "text/event-stream"); request.setHeader(QNetworkRequest::UserAgentHeader, "Yio Remote OpenHAB Plugin"); if (_token != "") { request.setRawHeader("accept", "*/*"); QString token = "Bearer " +_token; - request.setRawHeader(QByteArray("Authorization"), token.toUtf8()); + request.setRawHeader("Authorization", token.toUtf8()); } request.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true); request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, @@ -192,28 +191,16 @@ void OpenHAB::connect() { _tries = 0; _flagStandby = false; - QObject::connect(&_checkProcessOpenHabAvailability, - static_cast(&QProcess::finished), - [this](int exitCode, QProcess::ExitStatus exitStatus) { - if (exitCode == 0 && exitStatus == QProcess::ExitStatus::NormalExit) { - _sseReconnectTimer->setSingleShot(true); - _sseReconnectTimer->setInterval(2000); - _sseReconnectTimer->stop(); - _pollingTimer->setSingleShot(false); - _pollingTimer->setInterval(1000 * 60); // 1 minute - - QObject::connect(&_sseNetworkManager, &QNetworkAccessManager::finished, this, &OpenHAB::streamFinished); - QObject::connect(_sseReconnectTimer, &QTimer::timeout, this, &OpenHAB::onSseTimeout); - - QObject::connect(_pollingTimer, &QTimer::timeout, this, &OpenHAB::onPollingTimer); - QObject::connect(&_nam, &QNetworkAccessManager::networkAccessibleChanged, this, - &OpenHAB::onNetWorkAccessible); - startSse(); - getItems(true); - setState(CONNECTED); - QObject::disconnect(&_checkProcessOpenHabAvailability, - static_cast(&QProcess::finished), 0, 0); - } else { + QNetworkRequest request(_url + "/systeminfo"); + request.setHeader(QNetworkRequest::ContentTypeHeader, "text/plain"); + if (_token != "") { + request.setRawHeader("accept", "*/*"); + QString token = "Bearer " +_token; + request.setRawHeader("Authorization", token.toUtf8()); + } + QObject::connect(&_nam, &QNetworkAccessManager::finished, this, [=](QNetworkReply* reply) { + if (reply->error()) { + qCCritical(m_logCategory) << reply->errorString(); m_notifications->add( true, tr("Cannot connect to ").append(friendlyName()).append("."), tr("Reconnect"), [](QObject* param) { @@ -224,9 +211,24 @@ void OpenHAB::connect() { _flagOpenHabConnected = false; disconnect(); qCDebug(m_logCategory) << "openhab not reachable"; + } else if (reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() == 200) { + QString answer = reply->readAll(); + qCDebug(m_logCategory) << reply->header(QNetworkRequest::ContentTypeHeader).toString() <<" : " << answer; + + _sseReconnectTimer->setSingleShot(true); + _sseReconnectTimer->setInterval(2000); + _sseReconnectTimer->stop(); + + QObject::connect(&_sseNetworkManager, &QNetworkAccessManager::finished, this, &OpenHAB::streamFinished); + QObject::connect(_sseReconnectTimer, &QTimer::timeout, this, &OpenHAB::onSseTimeout); + + startSse(); + getItems(true); + setState(CONNECTED); } + QObject::disconnect(&_nam, &QNetworkAccessManager::finished, this, 0); }); - _checkProcessOpenHabAvailability.start("curl", QStringList() << "-s" << _url); + _nam.get(request); } void OpenHAB::disconnect() { @@ -234,53 +236,33 @@ void OpenHAB::disconnect() { _sseReply->abort(); }*/ - _pollingTimer->stop(); _sseReconnectTimer->stop(); QObject::disconnect(&_sseNetworkManager, &QNetworkAccessManager::finished, 0, 0); QObject::disconnect(_sseReconnectTimer, &QTimer::timeout, 0, 0); - QObject::disconnect(_pollingTimer, &QTimer::timeout, 0, 0); QObject::disconnect(&_nam, &QNetworkAccessManager::networkAccessibleChanged, 0, 0); setState(DISCONNECTED); } void OpenHAB::enterStandby() { _flagStandby = true; - - QObject::connect(&_checkProcessOpenHabAvailability, - static_cast(&QProcess::finished), - [this](int exitCode, QProcess::ExitStatus exitStatus) { - if (exitCode == 0 && exitStatus == QProcess::ExitStatus::NormalExit) { - _pollingTimer->start(); - if (_sseReply->isRunning()) { - _sseReply->abort(); - } - } else { - m_notifications->add( - true, tr("Cannot connect to ").append(friendlyName()).append("."), tr("Reconnect"), - [](QObject* param) { - Integration* i = qobject_cast(param); - i->connect(); - }, - this); - _flagOpenHabConnected = false; - disconnect(); - qCDebug(m_logCategory) << "openhab not reachable"; - } - QObject::disconnect(&_checkProcessOpenHabAvailability, - static_cast(&QProcess::finished), 0, 0); - }); - _checkProcessOpenHabAvailability.start("curl", QStringList() << "-s" << _url); + if (_sseReply->isRunning()) { + _sseReply->abort(); + } } void OpenHAB::leaveStandby() { _flagStandby = false; - QObject::connect(&_checkProcessOpenHabAvailability, - static_cast(&QProcess::finished), - [this](int exitCode, QProcess::ExitStatus exitStatus) { - if (exitCode == 0 && exitStatus == QProcess::ExitStatus::NormalExit) { - startSse(); - getItems(false); - } else { + + QNetworkRequest request(_url + "/systeminfo"); + request.setHeader(QNetworkRequest::ContentTypeHeader, "text/plain"); + if (_token != "") { + request.setRawHeader("accept", "*/*"); + QString token = "Bearer " +_token; + request.setRawHeader("Authorization", token.toUtf8()); + } + QObject::connect(&_nam, &QNetworkAccessManager::finished, this, [=](QNetworkReply* reply) { + if (reply->error()) { + qCCritical(m_logCategory) << reply->errorString(); m_notifications->add( true, tr("Cannot connect to ").append(friendlyName()).append("."), tr("Reconnect"), [](QObject* param) { @@ -291,40 +273,20 @@ void OpenHAB::leaveStandby() { _flagOpenHabConnected = false; disconnect(); qCDebug(m_logCategory) << "openhab not reachable"; + } else if (reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() == 200) { + _flagOpenHabConnected = true; + startSse(); + getItems(false); } - QObject::disconnect(&_checkProcessOpenHabAvailability, - static_cast(&QProcess::finished), 0, 0); + QObject::disconnect(&_nam, &QNetworkAccessManager::finished, this, 0); }); - _checkProcessOpenHabAvailability.start("curl", QStringList() << "-s" << _url); + _nam.get(request); } void OpenHAB::jsonError(const QString& error) { qCWarning(m_logCategory) << "JSON error " << error; } -void OpenHAB::onPollingTimer() { - QObject::connect(&_checkProcessOpenHabAvailability, - static_cast(&QProcess::finished), - [this](int exitCode, QProcess::ExitStatus exitStatus) { - if (exitCode == 0 && exitStatus == QProcess::ExitStatus::NormalExit) { - getItems(false); - } else { - m_notifications->add( - true, tr("Cannot connect to ").append(friendlyName()).append("."), tr("Reconnect"), - [](QObject* param) { - Integration* i = qobject_cast(param); - i->connect(); - }, - this); - _flagOpenHabConnected = false; - disconnect(); - qCDebug(m_logCategory) << "openhab not reachable"; - } - QObject::disconnect(&_checkProcessOpenHabAvailability, - static_cast(&QProcess::finished), 0, 0); - }); - _checkProcessOpenHabAvailability.start("curl", QStringList() << "-s" << _url); -} void OpenHAB::onNetWorkAccessible(QNetworkAccessManager::NetworkAccessibility accessibility) { qCInfo(m_logCategory) << "network accessibility" << accessibility; @@ -337,7 +299,7 @@ void OpenHAB::getItems(bool first) { if (_token != "") { request.setRawHeader("accept", "*/*"); QString token = "Bearer " +_token; - request.setRawHeader(QByteArray("Authorization"), token.toUtf8()); + request.setRawHeader("Authorization", token.toUtf8()); } request.setRawHeader("Accept", "application/json"); QNetworkReply* reply = _nam.get(request); @@ -350,11 +312,6 @@ void OpenHAB::getItems(bool first) { jsonError(parseerror.errorString()); return; } - if (first) { - // called during connect - // setState(CONNECTED); - // connect to the SSE source - } processItems(doc, first); }); } @@ -365,7 +322,7 @@ void OpenHAB::getItem(const QString name) { if (_token != "") { request.setRawHeader("accept", "*/*"); QString token = "Bearer " +_token; - request.setRawHeader(QByteArray("Authorization"), token.toUtf8()); + request.setRawHeader("Authorization", token.toUtf8()); } request.setRawHeader("Accept", "application/json"); QNetworkReply* reply = _nam.get(request); @@ -413,8 +370,9 @@ void OpenHAB::processItems(const QJsonDocument& result, bool first) { } } if ((_myEntities.count() - countFound) > 0) { - m_notifications->add(true, - "openHAB - entities missing : " + QString::number((_myEntities.count() - countFound))); + m_notifications->add( + true, "Could not load : " + QString::number((_myEntities.count() - countFound)) + + "openHAB items"); } } else { for (int i = 0; i < _myEntities.size(); ++i) { @@ -594,25 +552,37 @@ void OpenHAB::sendOpenHABCommand(const QString& itemId, const QString& state) { if (_token != "") { request.setRawHeader("accept", "*/*"); QString token = "Bearer " +_token; - request.setRawHeader(QByteArray("Authorization"), token.toUtf8()); + request.setRawHeader("Authorization", token.toUtf8()); } - /*QList reqHeaders = request.rawHeaderList(); - foreach(QByteArray reqName, reqHeaders) { - QByteArray reqValue = request.rawHeader(reqName); - qCDebug(m_logCategory) << reqName << ": " << reqValue; - } - qCDebug(m_logCategory) << request.rawHeaderList(); - */ QObject::connect(&_nam, &QNetworkAccessManager::finished, this, [=](QNetworkReply* reply) { if (reply->error()) { qCCritical(m_logCategory) << reply->errorString(); } else { - qCDebug(m_logCategory) << reply->header(QNetworkRequest::ContentTypeHeader).toString(); - qCDebug(m_logCategory) << reply->header(QNetworkRequest::LastModifiedHeader).toDateTime().toString();; - qCDebug(m_logCategory) << reply->header(QNetworkRequest::ContentLengthHeader).toULongLong(); - qCDebug(m_logCategory) << reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); - qCDebug(m_logCategory) << reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString(); + QString answer = reply->readAll(); + qCDebug(m_logCategory) << reply->header(QNetworkRequest::ContentTypeHeader).toString() <<" : " << answer; } }); _nam.post(request, state.toUtf8()); } + + +void OpenHAB::getSystemInfo(const QJsonDocument& result) { + QNetworkRequest request(_url + "/systeminfo"); + request.setHeader(QNetworkRequest::ContentTypeHeader, "text/plain"); + if (_token != "") { + request.setRawHeader("accept", "*/*"); + QString token = "Bearer " +_token; + request.setRawHeader("Authorization", token.toUtf8()); + } + QObject::connect(&_nam, &QNetworkAccessManager::finished, this, [=](QNetworkReply* reply) { + if (reply->error()) { + qCCritical(m_logCategory) << reply->errorString(); + } else { + QString answer = reply->readAll(); + qCDebug(m_logCategory) << reply->header(QNetworkRequest::ContentTypeHeader).toString() <<" : " << answer; + } + QObject::disconnect(&_nam, &QNetworkAccessManager::finished, this, 0); + }); + _nam.get(request); +} + diff --git a/src/openhab.h b/src/openhab.h index 13b83a6..8b60078 100755 --- a/src/openhab.h +++ b/src/openhab.h @@ -76,13 +76,13 @@ class OpenHAB : public Integration { void streamFinished(QNetworkReply* reply); void streamReceived(); void onSseTimeout(); - void onPollingTimer(); void onNetWorkAccessible(QNetworkAccessManager::NetworkAccessibility accessibility); private: void startSse(); void getItems(bool first = false); + void getSystemInfo(const QJsonDocument& result); void jsonError(const QString& error); void processItem(const QJsonDocument& result); void processItems(const QJsonDocument& result, bool first); @@ -102,7 +102,6 @@ class OpenHAB : public Integration { QNetworkAccessManager _sseNetworkManager; QNetworkReply* _sseReply; QTimer* _sseReconnectTimer; - QTimer* _pollingTimer; QString _url; QString _token; QNetworkAccessManager _nam; @@ -112,7 +111,6 @@ class OpenHAB : public Integration { QRegExp regex_brightnessvalue = QRegExp("[1]?[0-9]?[0-9]"); int _tries; bool _flagStandby; - QProcess _checkProcessOpenHabAvailability; bool _flagOpenHabConnected = false; QObject* context = new QObject(this); };