Skip to content
This repository has been archived by the owner on Jan 28, 2022. It is now read-only.

Improvments for less drain of battery and during reconnection #20

Merged
merged 5 commits into from
Jan 10, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
186 changes: 78 additions & 108 deletions src/openhab.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);


Expand Down Expand Up @@ -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,
Expand All @@ -192,28 +191,16 @@ void OpenHAB::connect() {

_tries = 0;
_flagStandby = false;
QObject::connect(&_checkProcessOpenHabAvailability,
static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&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<void(QProcess::*)(int, QProcess::ExitStatus)>(&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) {
Expand All @@ -224,63 +211,58 @@ 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);
miloit marked this conversation as resolved.
Show resolved Hide resolved
_nam.get(request);
}

void OpenHAB::disconnect() {
/* if (_sseReply->isRunning()) {
_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<void(QProcess::*)(int, QProcess::ExitStatus)>(&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<Integration*>(param);
i->connect();
},
this);
_flagOpenHabConnected = false;
disconnect();
qCDebug(m_logCategory) << "openhab not reachable";
}
QObject::disconnect(&_checkProcessOpenHabAvailability,
static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&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<void(QProcess::*)(int, QProcess::ExitStatus)>(&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) {
Expand All @@ -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<void(QProcess::*)(int, QProcess::ExitStatus)>(&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<void(QProcess::*)(int, QProcess::ExitStatus)>(&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<Integration*>(param);
i->connect();
},
this);
_flagOpenHabConnected = false;
disconnect();
qCDebug(m_logCategory) << "openhab not reachable";
}
QObject::disconnect(&_checkProcessOpenHabAvailability,
static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished), 0, 0);
});
_checkProcessOpenHabAvailability.start("curl", QStringList() << "-s" << _url);
}

void OpenHAB::onNetWorkAccessible(QNetworkAccessManager::NetworkAccessibility accessibility) {
qCInfo(m_logCategory) << "network accessibility" << accessibility;
Expand All @@ -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);
Expand All @@ -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);
});
}
Expand All @@ -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);
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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<QByteArray> 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);
}

4 changes: 1 addition & 3 deletions src/openhab.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -102,7 +102,6 @@ class OpenHAB : public Integration {
QNetworkAccessManager _sseNetworkManager;
QNetworkReply* _sseReply;
QTimer* _sseReconnectTimer;
QTimer* _pollingTimer;
QString _url;
QString _token;
QNetworkAccessManager _nam;
Expand All @@ -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);
};