first try in implementing homeassistant
Build Linux and Android / build (push) Successful in 2m57s

This commit is contained in:
2026-08-19 16:23:42 +02:00
parent 5d701c9f23
commit a2b488c2a7
15 changed files with 3606 additions and 306 deletions
+6 -1
View File
@@ -1,4 +1,4 @@
find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets Quick WebSockets LinguistTools Charts)
find_package(Qt6 REQUIRED COMPONENTS Core Gui Network Widgets Quick WebSockets LinguistTools Charts)
qt_standard_project_setup(REQUIRES 6.6 I18N_TRANSLATED_LANGUAGES de sv fi nb da tr)
@@ -13,6 +13,8 @@ qt_add_executable(evcharger-app WIN32 MACOSX_BUNDLE
deviceconnection.h
devicesmodel.cpp
devicesmodel.h
homeassistantclient.cpp
homeassistantclient.h
main.cpp
sendmessagehelper.cpp
sendmessagehelper.h
@@ -22,6 +24,8 @@ qt_add_executable(evcharger-app WIN32 MACOSX_BUNDLE
versionutils.h
)
target_link_libraries(evcharger-app PRIVATE Qt6::Network)
qt6_add_translations(evcharger-app
RESOURCE_PREFIX /EVChargerApp/i18n
TS_FILE_BASE qml
@@ -116,6 +120,7 @@ qt_add_qml_module(evcharger-app
qml/GroundCheckPage.qml
qml/HardwareInformationPage.qml
qml/HotspotPage.qml
qml/HomeAssistantSetupDialog.qml
qml/InformationsTabPage.qml
qml/InformationChartPanel.qml
qml/IndexedEditValueItem.qml
+1
View File
@@ -32,4 +32,5 @@ public:
signals:
void uiLanguageChanged(QLocale::Language uiLanguage);
void homeAssistantConfigurationChanged();
};
+581
View File
@@ -0,0 +1,581 @@
#include "homeassistantclient.h"
#include "appsettings.h"
#include <QDateTime>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonParseError>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QUrlQuery>
#include <algorithm>
#include <cmath>
namespace
{
constexpr auto urlSetting = "homeAssistant/url";
constexpr auto tokenSetting = "homeAssistant/accessToken";
constexpr auto chartsSetting = "homeAssistant/charts";
QString normalizedBaseUrl(const QString &input)
{
QString text = input.trimmed();
while (text.endsWith('/'))
text.chop(1);
return text;
}
QDateTime beginningOfPeriod(const QString &range, int offset)
{
const QDate today = QDate::currentDate();
QDate start;
if (range == QStringLiteral("week"))
start = today.addDays(1 - today.dayOfWeek()).addDays(offset * 7);
else if (range == QStringLiteral("month"))
start = QDate(today.year(), today.month(), 1).addMonths(offset);
else if (range == QStringLiteral("year"))
start = QDate(today.year(), 1, 1).addYears(offset);
else
start = today.addDays(offset);
return start.startOfDay();
}
QDateTime endOfPeriod(const QString &range, const QDateTime &start)
{
if (range == QStringLiteral("week"))
return start.addDays(7);
if (range == QStringLiteral("month"))
return QDateTime(start.date().addMonths(1), QTime(0, 0));
if (range == QStringLiteral("year"))
return QDateTime(start.date().addYears(1), QTime(0, 0));
return start.addDays(1);
}
QString defaultColor(int index)
{
static const QStringList colors{
QStringLiteral("#3274d9"), QStringLiteral("#f2c037"),
QStringLiteral("#2ca02c"), QStringLiteral("#d64f4f"),
QStringLiteral("#8b5cf6"), QStringLiteral("#00a6a6"),
QStringLiteral("#e8792e"), QStringLiteral("#64748b")};
return colors.at(index % colors.size());
}
}
HomeAssistantEntityModel::HomeAssistantEntityModel(QObject *parent)
: QAbstractListModel(parent)
{
}
int HomeAssistantEntityModel::rowCount(const QModelIndex &parent) const
{
return parent.isValid() ? 0 : m_visibleRows.size();
}
QVariant HomeAssistantEntityModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid() || index.row() < 0 || index.row() >= m_visibleRows.size())
return {};
const Entity &entity = m_entities.at(m_visibleRows.at(index.row()));
switch (role)
{
case EntityIdRole: return entity.entityId;
case NameRole: return entity.name;
case UnitRole: return entity.unit;
case DeviceClassRole: return entity.deviceClass;
case StateRole: return entity.state;
case SearchTextRole: return entity.searchText;
default: return {};
}
}
QHash<int, QByteArray> HomeAssistantEntityModel::roleNames() const
{
return {{EntityIdRole, "entityId"}, {NameRole, "name"}, {UnitRole, "unit"},
{DeviceClassRole, "deviceClass"}, {StateRole, "currentValue"},
{SearchTextRole, "searchText"}};
}
void HomeAssistantEntityModel::setEntities(QList<Entity> entities)
{
std::sort(entities.begin(), entities.end(), [](const Entity &left, const Entity &right) {
const int nameOrder = QString::localeAwareCompare(left.name, right.name);
return nameOrder == 0 ? left.entityId < right.entityId : nameOrder < 0;
});
beginResetModel();
m_entities = std::move(entities);
m_entityRows.clear();
for (int i = 0; i < m_entities.size(); ++i)
m_entityRows.insert(m_entities.at(i).entityId, i);
m_visibleRows.clear();
const QStringList words = m_filter.split(' ', Qt::SkipEmptyParts);
for (int i = 0; i < m_entities.size(); ++i)
{
bool matches = true;
for (const QString &word : words)
matches = matches && m_entities.at(i).searchText.contains(word, Qt::CaseInsensitive);
if (matches)
m_visibleRows.append(i);
}
endResetModel();
}
void HomeAssistantEntityModel::setFilter(const QString &filter)
{
const QString simplified = filter.simplified();
if (m_filter == simplified)
return;
m_filter = simplified;
rebuildVisibleRows();
}
const HomeAssistantEntityModel::Entity *HomeAssistantEntityModel::entity(
const QString &entityId) const
{
const auto row = m_entityRows.constFind(entityId);
return row == m_entityRows.cend() ? nullptr : &m_entities.at(*row);
}
void HomeAssistantEntityModel::rebuildVisibleRows()
{
beginResetModel();
m_visibleRows.clear();
const QStringList words = m_filter.split(' ', Qt::SkipEmptyParts);
for (int i = 0; i < m_entities.size(); ++i)
{
bool matches = true;
for (const QString &word : words)
matches = matches && m_entities.at(i).searchText.contains(word, Qt::CaseInsensitive);
if (matches)
m_visibleRows.append(i);
}
endResetModel();
}
HomeAssistantClient::HomeAssistantClient(QObject *parent)
: QObject(parent), m_settings(nullptr), m_entities(this)
{
}
void HomeAssistantClient::setSettings(AppSettings *settings)
{
if (m_settings == settings)
return;
if (m_settings)
disconnect(m_settings, &AppSettings::homeAssistantConfigurationChanged,
this, &HomeAssistantClient::loadConfiguration);
m_settings = settings;
if (m_settings)
connect(m_settings, &AppSettings::homeAssistantConfigurationChanged,
this, &HomeAssistantClient::loadConfiguration);
loadConfiguration();
emit settingsChanged();
}
void HomeAssistantClient::setEntitySearch(const QString &search)
{
if (m_entitySearch == search)
return;
m_entitySearch = search;
m_entities.setFilter(search);
emit entitySearchChanged();
}
void HomeAssistantClient::testAndSaveConnection(const QString &baseUrl,
const QString &accessToken)
{
if (m_busy)
return;
m_pendingBaseUrl = normalizedBaseUrl(baseUrl);
m_pendingAccessToken = accessToken.trimmed();
const QUrl parsedUrl(m_pendingBaseUrl);
if (!parsedUrl.isValid()
|| (parsedUrl.scheme() != QStringLiteral("http")
&& parsedUrl.scheme() != QStringLiteral("https"))
|| parsedUrl.host().isEmpty())
{
setErrorText(tr("Enter a valid HTTP or HTTPS Home Assistant address."));
emit connectionTestFinished(false);
return;
}
if (m_pendingAccessToken.isEmpty())
{
setErrorText(tr("Enter a Home Assistant access token."));
emit connectionTestFinished(false);
return;
}
setErrorText({});
setStatusText(tr("Connecting to Home Assistant…"));
setBusy(true);
QUrl url = parsedUrl;
QString path = url.path();
if (path.endsWith('/'))
path.chop(1);
url.setPath(path + QStringLiteral("/api/"));
QNetworkReply *reply = m_network.get(authenticatedRequest(
url, m_pendingAccessToken.toUtf8()));
connect(reply, &QNetworkReply::finished, this, [this, reply] {
const int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
const QByteArray body = reply->readAll();
const bool success = reply->error() == QNetworkReply::NoError
&& status >= 200 && status < 300;
if (success)
{
m_baseUrl = m_pendingBaseUrl;
m_accessToken = m_pendingAccessToken;
persistConfiguration();
emit configurationChanged();
setErrorText({});
setStatusText(tr("Connected to Home Assistant."));
}
else
{
QString detail = reply->errorString();
const QJsonDocument errorDocument = QJsonDocument::fromJson(body);
if (errorDocument.isObject()
&& !errorDocument.object().value(QStringLiteral("message")).toString().isEmpty())
detail = errorDocument.object().value(QStringLiteral("message")).toString();
setErrorText(status == 401
? tr("Home Assistant rejected the access token.")
: tr("Could not connect to Home Assistant: %1").arg(detail));
setStatusText({});
}
setBusy(false);
reply->deleteLater();
emit connectionTestFinished(success);
if (success)
loadEntities();
});
}
void HomeAssistantClient::loadEntities()
{
if (!configured() || m_entitiesLoading)
return;
setErrorText({});
setEntitiesLoading(true);
setStatusText(tr("Loading Home Assistant entities…"));
QNetworkReply *reply = m_network.get(authenticatedRequest(apiUrl(QStringLiteral("api/states"))));
connect(reply, &QNetworkReply::finished, this, [this, reply] {
const QByteArray body = reply->readAll();
QJsonParseError parseError;
const QJsonDocument document = QJsonDocument::fromJson(body, &parseError);
if (reply->error() != QNetworkReply::NoError || !document.isArray())
{
setErrorText(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() == 401
? tr("The Home Assistant credential is no longer valid.")
: tr("Could not load Home Assistant entities: %1")
.arg(reply->errorString()));
}
else
{
QList<HomeAssistantEntityModel::Entity> entities;
entities.reserve(document.array().size());
for (const QJsonValue &value : document.array())
{
const QJsonObject object = value.toObject();
const QString entityId = object.value(QStringLiteral("entity_id")).toString();
if (entityId.isEmpty())
continue;
const QJsonObject attributes = object.value(QStringLiteral("attributes")).toObject();
HomeAssistantEntityModel::Entity entity;
entity.entityId = entityId;
entity.name = attributes.value(QStringLiteral("friendly_name")).toString();
if (entity.name.isEmpty())
entity.name = entityId;
entity.unit = attributes.value(QStringLiteral("unit_of_measurement")).toString();
entity.deviceClass = attributes.value(QStringLiteral("device_class")).toString();
entity.state = object.value(QStringLiteral("state")).toString();
entity.searchText = entity.name + QLatin1Char(' ') + entity.entityId
+ QLatin1Char(' ') + entity.unit + QLatin1Char(' ')
+ entity.deviceClass;
entities.append(std::move(entity));
}
m_entities.setEntities(std::move(entities));
setErrorText({});
setStatusText(tr("Loaded %1 Home Assistant entities.")
.arg(m_entities.rowCount()));
}
setEntitiesLoading(false);
reply->deleteLater();
});
}
void HomeAssistantClient::saveCharts(const QVariantList &charts)
{
m_charts = charts;
persistConfiguration();
emit chartsChanged();
}
void HomeAssistantClient::clearConfiguration()
{
if (m_historyReply)
{
disconnect(m_historyReply, nullptr, this, nullptr);
m_historyReply->abort();
m_historyReply->deleteLater();
m_historyReply = nullptr;
setHistoryLoading(false);
}
m_baseUrl.clear();
m_accessToken.clear();
m_charts.clear();
m_historyPanels.clear();
m_entities.setEntities({});
if (m_settings)
{
m_settings->remove(QStringLiteral("homeAssistant"));
m_settings->sync();
emit m_settings->homeAssistantConfigurationChanged();
}
setStatusText({});
setErrorText({});
emit configurationChanged();
emit chartsChanged();
emit historyPanelsChanged();
}
void HomeAssistantClient::requestHistory(const QString &range, int offset)
{
if (!configured() || m_charts.isEmpty())
return;
if (m_historyReply)
{
disconnect(m_historyReply, nullptr, this, nullptr);
m_historyReply->abort();
m_historyReply->deleteLater();
m_historyReply = nullptr;
setHistoryLoading(false);
}
QStringList entityIds;
for (const QVariant &chartValue : m_charts)
{
const QVariantList series = chartValue.toMap().value(QStringLiteral("entities")).toList();
for (const QVariant &seriesValue : series)
{
const QString entityId = seriesValue.toMap().value(QStringLiteral("entityId")).toString();
if (!entityId.isEmpty() && !entityIds.contains(entityId))
entityIds.append(entityId);
}
}
if (entityIds.isEmpty())
return;
const QDateTime start = beginningOfPeriod(range, offset);
QDateTime end = endOfPeriod(range, start);
const QDateTime now = QDateTime::currentDateTime();
if (end > now)
end = now;
if (start > end)
return;
QUrl url = apiUrl(QStringLiteral("api/history/period/")
+ start.toUTC().toString(Qt::ISODate));
QUrlQuery query;
query.addQueryItem(QStringLiteral("end_time"), end.toUTC().toString(Qt::ISODate));
query.addQueryItem(QStringLiteral("filter_entity_id"), entityIds.join(','));
query.addQueryItem(QStringLiteral("minimal_response"), QString());
query.addQueryItem(QStringLiteral("no_attributes"), QString());
url.setQuery(query);
setErrorText({});
setHistoryLoading(true);
setStatusText(tr("Loading Home Assistant history…"));
QNetworkReply *reply = m_network.get(authenticatedRequest(url));
m_historyReply = reply;
connect(reply, &QNetworkReply::finished, this, [this, reply] {
if (m_historyReply != reply)
{
reply->deleteLater();
return;
}
m_historyReply = nullptr;
const QByteArray body = reply->readAll();
QJsonParseError parseError;
const QJsonDocument document = QJsonDocument::fromJson(body, &parseError);
if (reply->error() != QNetworkReply::NoError || !document.isArray())
{
setErrorText(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() == 401
? tr("The Home Assistant credential is no longer valid.")
: tr("Could not load Home Assistant history: %1")
.arg(reply->errorString()));
}
else
{
rebuildHistoryPanels(document.array());
setErrorText({});
setStatusText(tr("Home Assistant history is up to date."));
}
setHistoryLoading(false);
reply->deleteLater();
});
}
QUrl HomeAssistantClient::apiUrl(const QString &relativePath) const
{
QUrl url(m_baseUrl);
QString path = url.path();
if (!path.endsWith('/'))
path += '/';
url.setPath(path + relativePath);
return url;
}
QNetworkRequest HomeAssistantClient::authenticatedRequest(const QUrl &url,
const QByteArray &token) const
{
QNetworkRequest request(url);
request.setRawHeader("Authorization", "Bearer " + (token.isEmpty()
? m_accessToken.toUtf8()
: token));
request.setRawHeader("Accept", "application/json");
request.setHeader(QNetworkRequest::UserAgentHeader,
QStringLiteral("EVChargerApp HomeAssistantClient"));
request.setTransferTimeout(20000);
return request;
}
void HomeAssistantClient::setBusy(bool busy)
{
if (m_busy == busy)
return;
m_busy = busy;
emit busyChanged();
}
void HomeAssistantClient::setEntitiesLoading(bool loading)
{
if (m_entitiesLoading == loading)
return;
m_entitiesLoading = loading;
emit entitiesLoadingChanged();
}
void HomeAssistantClient::setHistoryLoading(bool loading)
{
if (m_historyLoading == loading)
return;
m_historyLoading = loading;
emit historyLoadingChanged();
}
void HomeAssistantClient::setStatusText(const QString &text)
{
if (m_statusText == text)
return;
m_statusText = text;
emit statusTextChanged();
}
void HomeAssistantClient::setErrorText(const QString &text)
{
if (m_errorText == text)
return;
m_errorText = text;
emit errorTextChanged();
}
void HomeAssistantClient::persistConfiguration()
{
if (!m_settings)
return;
m_settings->setValue(urlSetting, m_baseUrl);
m_settings->setValue(tokenSetting, m_accessToken);
m_settings->setValue(chartsSetting,
QJsonDocument::fromVariant(m_charts).toJson(QJsonDocument::Compact));
m_settings->sync();
emit m_settings->homeAssistantConfigurationChanged();
}
void HomeAssistantClient::loadConfiguration()
{
const QString previousBaseUrl = m_baseUrl;
const QString previousAccessToken = m_accessToken;
const QVariantList previousCharts = m_charts;
m_baseUrl.clear();
m_accessToken.clear();
m_charts.clear();
if (m_settings)
{
m_baseUrl = normalizedBaseUrl(m_settings->value(urlSetting).toString());
m_accessToken = m_settings->value(tokenSetting).toString();
QJsonParseError error;
const QJsonDocument document = QJsonDocument::fromJson(
m_settings->value(chartsSetting).toByteArray(), &error);
if (error.error == QJsonParseError::NoError && document.isArray())
m_charts = document.array().toVariantList();
}
if (previousBaseUrl != m_baseUrl || previousAccessToken != m_accessToken)
emit configurationChanged();
if (previousCharts != m_charts)
emit chartsChanged();
}
void HomeAssistantClient::rebuildHistoryPanels(const QJsonArray &history)
{
QHash<QString, QVariantList> pointsByEntity;
for (const QJsonValue &seriesValue : history)
{
const QJsonArray states = seriesValue.toArray();
QString entityId;
QVariantList points;
points.reserve(states.size());
for (const QJsonValue &stateValue : states)
{
const QJsonObject state = stateValue.toObject();
const QString receivedId = state.value(QStringLiteral("entity_id")).toString();
if (!receivedId.isEmpty())
entityId = receivedId;
bool numeric = false;
const double value = state.value(QStringLiteral("state")).toString().toDouble(&numeric);
const QString timestampText = state.value(QStringLiteral("last_changed")).toString(
state.value(QStringLiteral("last_updated")).toString());
const QDateTime timestamp = QDateTime::fromString(timestampText, Qt::ISODate);
if (numeric && timestamp.isValid())
points.append(QVariantMap{{QStringLiteral("t"), timestamp.toMSecsSinceEpoch() / 1000.0},
{QStringLiteral("value"), value}});
}
if (!entityId.isEmpty())
pointsByEntity.insert(entityId, points);
}
QVariantList panels;
for (const QVariant &chartValue : m_charts)
{
const QVariantMap chart = chartValue.toMap();
QVariantList dataSeries;
const QVariantList configuredSeries = chart.value(QStringLiteral("entities")).toList();
for (int i = 0; i < configuredSeries.size(); ++i)
{
const QVariantMap configuration = configuredSeries.at(i).toMap();
const QString entityId = configuration.value(QStringLiteral("entityId")).toString();
const auto *entity = m_entities.entity(entityId);
const QString label = configuration.value(QStringLiteral("label")).toString();
dataSeries.append(QVariantMap{
{QStringLiteral("name"), entityId},
{QStringLiteral("friendlyName"), !label.isEmpty() ? label
: entity ? entity->name : entityId},
{QStringLiteral("unit"), entity ? entity->unit : QString()},
{QStringLiteral("color"), configuration.value(QStringLiteral("color"),
defaultColor(i))},
{QStringLiteral("showLegend"), true},
{QStringLiteral("dataSet"), pointsByEntity.value(entityId)}});
}
panels.append(QVariantMap{{QStringLiteral("title"), chart.value(QStringLiteral("title"))},
{QStringLiteral("dataseries"), dataSeries}});
}
m_historyPanels = panels;
m_historyCurrentTime = QDateTime::currentSecsSinceEpoch();
emit historyPanelsChanged();
}
+143
View File
@@ -0,0 +1,143 @@
#pragma once
#include <QAbstractListModel>
#include <QHash>
#include <QNetworkAccessManager>
#include <QPointer>
#include <QVariantList>
#include <QtQml/qqmlregistration.h>
class AppSettings;
class HomeAssistantEntityModel final : public QAbstractListModel
{
Q_OBJECT
public:
enum Role {
EntityIdRole = Qt::UserRole + 1,
NameRole,
UnitRole,
DeviceClassRole,
StateRole,
SearchTextRole,
};
struct Entity {
QString entityId;
QString name;
QString unit;
QString deviceClass;
QString state;
QString searchText;
};
explicit HomeAssistantEntityModel(QObject *parent = nullptr);
int rowCount(const QModelIndex &parent = {}) const override;
QVariant data(const QModelIndex &index, int role) const override;
QHash<int, QByteArray> roleNames() const override;
void setEntities(QList<Entity> entities);
void setFilter(const QString &filter);
const Entity *entity(const QString &entityId) const;
private:
void rebuildVisibleRows();
QList<Entity> m_entities;
QList<int> m_visibleRows;
QHash<QString, int> m_entityRows;
QString m_filter;
};
class HomeAssistantClient : public QObject
{
Q_OBJECT
QML_ELEMENT
Q_PROPERTY(AppSettings *settings READ settings WRITE setSettings NOTIFY settingsChanged FINAL)
Q_PROPERTY(QString baseUrl READ baseUrl NOTIFY configurationChanged FINAL)
Q_PROPERTY(bool configured READ configured NOTIFY configurationChanged FINAL)
Q_PROPERTY(bool busy READ busy NOTIFY busyChanged FINAL)
Q_PROPERTY(bool entitiesLoading READ entitiesLoading NOTIFY entitiesLoadingChanged FINAL)
Q_PROPERTY(bool historyLoading READ historyLoading NOTIFY historyLoadingChanged FINAL)
Q_PROPERTY(QString statusText READ statusText NOTIFY statusTextChanged FINAL)
Q_PROPERTY(QString errorText READ errorText NOTIFY errorTextChanged FINAL)
Q_PROPERTY(QString entitySearch READ entitySearch WRITE setEntitySearch NOTIFY entitySearchChanged FINAL)
Q_PROPERTY(QAbstractItemModel *entitiesModel READ entitiesModel CONSTANT FINAL)
Q_PROPERTY(QVariantList charts READ charts NOTIFY chartsChanged FINAL)
Q_PROPERTY(QVariantList historyPanels READ historyPanels NOTIFY historyPanelsChanged FINAL)
Q_PROPERTY(qreal historyCurrentTime READ historyCurrentTime NOTIFY historyPanelsChanged FINAL)
public:
explicit HomeAssistantClient(QObject *parent = nullptr);
AppSettings *settings() const { return m_settings; }
QString baseUrl() const { return m_baseUrl; }
bool configured() const { return !m_baseUrl.isEmpty() && !m_accessToken.isEmpty(); }
bool busy() const { return m_busy; }
bool entitiesLoading() const { return m_entitiesLoading; }
bool historyLoading() const { return m_historyLoading; }
QString statusText() const { return m_statusText; }
QString errorText() const { return m_errorText; }
QString entitySearch() const { return m_entitySearch; }
QAbstractItemModel *entitiesModel() { return &m_entities; }
QVariantList charts() const { return m_charts; }
QVariantList historyPanels() const { return m_historyPanels; }
qreal historyCurrentTime() const { return m_historyCurrentTime; }
void setEntitySearch(const QString &search);
void setSettings(AppSettings *settings);
Q_INVOKABLE void testAndSaveConnection(const QString &baseUrl,
const QString &accessToken);
Q_INVOKABLE void loadEntities();
Q_INVOKABLE void saveCharts(const QVariantList &charts);
Q_INVOKABLE void clearConfiguration();
Q_INVOKABLE void requestHistory(const QString &range, int offset);
Q_INVOKABLE QString accessTokenForEditing() const { return m_accessToken; }
signals:
void settingsChanged();
void configurationChanged();
void busyChanged();
void entitiesLoadingChanged();
void historyLoadingChanged();
void statusTextChanged();
void errorTextChanged();
void entitySearchChanged();
void chartsChanged();
void historyPanelsChanged();
void connectionTestFinished(bool success);
private:
QUrl apiUrl(const QString &relativePath) const;
QNetworkRequest authenticatedRequest(const QUrl &url,
const QByteArray &token = {}) const;
void setBusy(bool busy);
void setEntitiesLoading(bool loading);
void setHistoryLoading(bool loading);
void setStatusText(const QString &text);
void setErrorText(const QString &text);
void persistConfiguration();
void loadConfiguration();
void rebuildHistoryPanels(const QJsonArray &history);
AppSettings *m_settings;
QNetworkAccessManager m_network;
HomeAssistantEntityModel m_entities;
QString m_baseUrl;
QString m_accessToken;
QString m_pendingBaseUrl;
QString m_pendingAccessToken;
QString m_statusText;
QString m_errorText;
QString m_entitySearch;
QVariantList m_charts;
QVariantList m_historyPanels;
qreal m_historyCurrentTime = 0;
bool m_busy = false;
bool m_entitiesLoading = false;
bool m_historyLoading = false;
QPointer<QNetworkReply> m_historyReply;
};
+362 -41
View File
@@ -2856,6 +2856,269 @@
<translation>RSSI:</translation>
</message>
</context>
<context>
<name>HomeAssistantClient</name>
<message>
<location filename="../homeassistantclient.cpp" line="196"/>
<source>Enter a valid HTTP or HTTPS Home Assistant address.</source>
<translation>Indtast en gyldig HTTP- eller HTTPS-adresse til Home Assistant.</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="202"/>
<source>Enter a Home Assistant access token.</source>
<translation>Indtast et adgangstoken til Home Assistant.</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="208"/>
<source>Connecting to Home Assistant…</source>
<translation>Opretter forbindelse til Home Assistant…</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="230"/>
<source>Connected to Home Assistant.</source>
<translation>Forbundet med Home Assistant.</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="240"/>
<source>Home Assistant rejected the access token.</source>
<translation>Home Assistant afviste adgangstokenet.</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="241"/>
<source>Could not connect to Home Assistant: %1</source>
<translation>Kunne ikke oprette forbindelse til Home Assistant: %1</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="258"/>
<source>Loading Home Assistant entities…</source>
<translation>Indlæser Home Assistant-entiteter…</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="267"/>
<location filename="../homeassistantclient.cpp" line="402"/>
<source>The Home Assistant credential is no longer valid.</source>
<translation>Loginoplysningerne til Home Assistant er ikke længere gyldige.</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="268"/>
<source>Could not load Home Assistant entities: %1</source>
<translation>Kunne ikke indlæse Home Assistant-entiteter: %1</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="297"/>
<source>Loaded %1 Home Assistant entities.</source>
<translation>Indlæste %1 Home Assistant-entiteter.</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="386"/>
<source>Loading Home Assistant history…</source>
<translation>Indlæser Home Assistant-historik…</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="403"/>
<source>Could not load Home Assistant history: %1</source>
<translation>Kunne ikke indlæse Home Assistant-historik: %1</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="410"/>
<source>Home Assistant history is up to date.</source>
<translation>Home Assistant-historikken er opdateret.</translation>
</message>
</context>
<context>
<name>HomeAssistantSetupDialog</name>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="17"/>
<source>Edit chart</source>
<translation>Rediger diagram</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="17"/>
<source>Connect Home Assistant</source>
<translation>Forbind Home Assistant</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="136"/>
<source>Server</source>
<translation>Server</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="136"/>
<source>Login</source>
<translation>Login</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="136"/>
<source>Charts</source>
<translation>Diagrammer</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="142"/>
<source>%1. %2</source>
<translation>%1. %2</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="176"/>
<source>Before you begin</source>
<translation>Før du begynder</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="180"/>
<source>Home Assistant must already be installed and running. A Raspberry Pi with Home Assistant on an SD card is one option; other supported Home Assistant installations work as well.
Before charts can receive data:
• Install or configure an MQTT broker, such as the Mosquitto broker app or a separate broker.
• Connect Home Assistant&apos;s MQTT integration to that broker.
• Connect the charger to the same broker and enable MQTT.
• Enable Home Assistant MQTT auto-discovery in Home Assistant and on the charger.
• Verify that the charger&apos;s entities are visible in Home Assistant.</source>
<translation>Home Assistant skal allerede være installeret og køre. En mulighed er en Raspberry Pi med Home Assistant på et SD-kort; andre understøttede Home Assistant-installationer fungerer også.
Før diagrammer kan modtage data:
• Installer eller konfigurer en MQTT-broker, f.eks. Mosquitto Broker-appen eller en separat broker.
• Forbind Home Assistants MQTT-integration til denne broker.
• Forbind laderen til den samme broker, og aktivér MQTT.
• Aktivér automatisk MQTT-registrering til Home Assistant i Home Assistant og på laderen.
• Kontrollér, at laderens entiteter er synlige i Home Assistant.</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="188"/>
<source>Installation guide</source>
<translation>Installationsvejledning</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="193"/>
<source>MQTT guide</source>
<translation>MQTT-vejledning</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="201"/>
<source>Enter the address you normally use to open Home Assistant. The app will contact this server directly.</source>
<translation>Indtast den adresse, du normalt bruger til at åbne Home Assistant. Appen kontakter denne server direkte.</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="217"/>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="467"/>
<source>Cancel</source>
<translation>Annuller</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="220"/>
<source>Next</source>
<translation>Næste</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="232"/>
<source>Create a long-lived access token in your Home Assistant profile and paste it below. Your Home Assistant password is never entered into this app.</source>
<translation>Opret et langtidsholdbart adgangstoken i din Home Assistant-profil, og indsæt det nedenfor. Din Home Assistant-adgangskode indtastes aldrig i denne app.</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="238"/>
<source>Open Home Assistant profile</source>
<translation>Åbn Home Assistant-profil</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="249"/>
<source>Long-lived access token</source>
<translation>Langtidsholdbart adgangstoken</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="255"/>
<source>Hide</source>
<translation>Skjul</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="255"/>
<source>Show</source>
<translation>Vis</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="278"/>
<source>Back</source>
<translation>Tilbage</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="281"/>
<source>Connect</source>
<translation>Opret forbindelse</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="294"/>
<source>Create charts and choose exactly which Home Assistant entities each chart should display.</source>
<translation>Opret diagrammer, og vælg præcist, hvilke Home Assistant-entiteter hvert diagram skal vise.</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="307"/>
<source>Change server or access token</source>
<translation>Skift server eller adgangstoken</translation>
</message>
<message numerus="yes">
<location filename="../qml/HomeAssistantSetupDialog.qml" line="340"/>
<source>%n entity(s)</source>
<translation>
<numerusform>%n entitet</numerusform>
<numerusform>%n entiteter</numerusform>
</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="345"/>
<source>Edit</source>
<translation>Rediger</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="349"/>
<source>Delete</source>
<translation>Slet</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="358"/>
<source>No charts configured yet.</source>
<translation>Der er endnu ikke konfigureret nogen diagrammer.</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="366"/>
<source>Add chart</source>
<translation>Tilføj diagram</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="368"/>
<source>Done</source>
<translation>Færdig</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="378"/>
<source>Chart title</source>
<translation>Diagramtitel</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="385"/>
<source>Search by name, entity ID, unit or device class…</source>
<translation>Søg efter navn, entitets-id, enhed eller enhedsklasse…</translation>
</message>
<message numerus="yes">
<location filename="../qml/HomeAssistantSetupDialog.qml" line="394"/>
<source>%n entity(s) selected</source>
<translation>
<numerusform>%n entitet valgt</numerusform>
<numerusform>%n entiteter valgt</numerusform>
</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="404"/>
<source>Reload</source>
<translation>Indlæs igen</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="459"/>
<source>No matching entities found.</source>
<translation>Ingen matchende entiteter fundet.</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="470"/>
<source>Save chart</source>
<translation>Gem diagram</translation>
</message>
</context>
<context>
<name>HotspotPage</name>
<message>
@@ -3011,7 +3274,7 @@
<translation type="vanished">Information</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="235"/>
<location filename="../qml/InformationsTabPage.qml" line="278"/>
<source>Idle</source>
<translation>Inaktiv</translation>
</message>
@@ -3024,66 +3287,132 @@
<translation type="vanished">INDLÆSER</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="70"/>
<location filename="../qml/InformationsTabPage.qml" line="78"/>
<source>%1 – %2</source>
<translation>%1 – %2</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="118"/>
<location filename="../qml/InformationsTabPage.qml" line="161"/>
<source>Receiving manufacturer data…</source>
<translation>Modtager producentdata…</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="120"/>
<location filename="../qml/InformationsTabPage.qml" line="163"/>
<source>Loading manufacturer charts…</source>
<translation>Indlæser producentdiagrammer…</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="134"/>
<location filename="../qml/InformationsTabPage.qml" line="177"/>
<source>%1 images</source>
<translation>%1 billeder</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="136"/>
<location filename="../qml/InformationsTabPage.qml" line="179"/>
<source>%1 charts</source>
<translation>%1 diagrammer</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="138"/>
<location filename="../qml/InformationsTabPage.qml" line="181"/>
<source>Loaded %1</source>
<translation>%1 indlæst</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="139"/>
<location filename="../qml/InformationsTabPage.qml" line="182"/>
<source>No information data received</source>
<translation>Ingen informationsdata modtaget</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="141"/>
<location filename="../qml/InformationsTabPage.qml" line="184"/>
<source>The manufacturer cloud returned invalid data.</source>
<translation>Producentens cloud returnerede ugyldige data.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="151"/>
<location filename="../qml/InformationsTabPage.qml" line="194"/>
<source>Requesting manufacturer data…</source>
<translation>Anmoder om producentdata…</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="159"/>
<location filename="../qml/InformationsTabPage.qml" line="202"/>
<source>Information</source>
<translation>Information</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="174"/>
<location filename="../qml/InformationsTabPage.qml" line="217"/>
<source>Manufacturer cloud</source>
<translation>Producentens cloud</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="331"/>
<source>Connected to Home Assistant</source>
<translation>Forbundet med Home Assistant</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="332"/>
<source>Home Assistant is not configured</source>
<translation>Home Assistant er ikke konfigureret</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="345"/>
<source>Configure</source>
<translation>Konfigurer</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="345"/>
<location filename="../qml/InformationsTabPage.qml" line="476"/>
<source>Set up</source>
<translation>Konfigurer</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="409"/>
<source>Refresh</source>
<translation>Opdater</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="459"/>
<source>Connect Home Assistant to display history</source>
<translation>Forbind Home Assistant for at vise historik</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="460"/>
<source>Create your first history chart</source>
<translation>Opret dit første historikdiagram</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="467"/>
<source>The setup wizard connects to your server and lets you select the entities to display.</source>
<translation>Opsætningsguiden opretter forbindelse til din server og lader dig vælge de entiteter, der skal vises.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="468"/>
<source>Open the configuration and add a chart with one or more Home Assistant entities.</source>
<translation>Åbn konfigurationen, og tilføj et diagram med en eller flere Home Assistant-entiteter.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="476"/>
<source>Add chart</source>
<translation>Tilføj diagram</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="485"/>
<source>Forget Home Assistant configuration</source>
<translation>Glem Home Assistant-konfigurationen</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="498"/>
<source>Forget Home Assistant?</source>
<translation>Glem Home Assistant?</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="505"/>
<source>This removes the server address, access token and all chart definitions stored in this app.</source>
<translation>Dette fjerner serveradressen, adgangstokenet og alle diagramdefinitioner, der er gemt i appen.</translation>
</message>
<message>
<source>Limited · unreliable · slow</source>
<translation type="vanished">Begrænset · upålidelig · langsom</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="197"/>
<location filename="../qml/InformationsTabPage.qml" line="240"/>
<source>Your own cloud</source>
<translation>Din egen cloud</translation>
</message>
@@ -3092,105 +3421,97 @@
<translation type="vanished">Historik · vedligeholdt · hurtig</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="181"/>
<location filename="../qml/InformationsTabPage.qml" line="224"/>
<source>Lacks features · unreliable · slow</source>
<translation>Mangler funktioner · upålidelig · langsom</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="204"/>
<location filename="../qml/InformationsTabPage.qml" line="247"/>
<source>Historical data · properly maintained · fast</source>
<translation>Historiske data · godt vedligeholdt · hurtig</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="227"/>
<location filename="../qml/InformationsTabPage.qml" line="270"/>
<source>The manufacturer cloud provides basic charts, but can be slow, unavailable or limited to the data selected by the manufacturer.</source>
<translation>Producentens cloud leverer grundlæggende diagrammer, men kan være langsom, utilgængelig eller begrænset til de data, som producenten har valgt.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="262"/>
<location filename="../qml/InformationsTabPage.qml" line="305"/>
<source>Download information</source>
<translation>Download information</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="272"/>
<location filename="../qml/InformationsTabPage.qml" line="315"/>
<source>Own your charging history</source>
<translation>Bevar ejerskabet over din ladehistorik</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="276"/>
<location filename="../qml/InformationsTabPage.qml" line="319"/>
<source>Connect the charger to your own Home Assistant installation for fast, dependable history that remains under your control. You decide how long data is retained and which measurements are recorded.</source>
<translation>Forbind laderen med din egen Home Assistant-installation for at få hurtig og pålidelig historik, der forbliver under din kontrol. Du bestemmer, hvor længe data gemmes, og hvilke målinger der registreres.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="282"/>
<source>Home Assistant recorder integration is being prepared. The setup below is currently a preview and does not connect yet.</source>
<translation>Integrationen med Home Assistant Recorder er under udarbejdelse. Opsætningen nedenfor er i øjeblikket en forhåndsvisning og opretter endnu ingen forbindelse.</translation>
<translation type="vanished">Integrationen med Home Assistant Recorder er under udarbejdelse. Opsætningen nedenfor er i øjeblikket en forhåndsvisning og opretter endnu ingen forbindelse.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="289"/>
<source>Set up connection to Home Assistant</source>
<translation>Opsæt forbindelse til Home Assistant</translation>
<translation type="vanished">Opsæt forbindelse til Home Assistant</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="294"/>
<location filename="../qml/InformationsTabPage.qml" line="353"/>
<source>Historical data</source>
<translation>Historiske data</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="302"/>
<location filename="../qml/InformationsTabPage.qml" line="363"/>
<source>Day</source>
<translation>Dag</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="303"/>
<location filename="../qml/InformationsTabPage.qml" line="364"/>
<source>Week</source>
<translation>Uge</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="304"/>
<location filename="../qml/InformationsTabPage.qml" line="365"/>
<source>Month</source>
<translation>Måned</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="305"/>
<location filename="../qml/InformationsTabPage.qml" line="366"/>
<source>Year</source>
<translation>År</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="323"/>
<location filename="../qml/InformationsTabPage.qml" line="385"/>
<source>Previous</source>
<translation>Forrige</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="335"/>
<location filename="../qml/InformationsTabPage.qml" line="412"/>
<location filename="../qml/InformationsTabPage.qml" line="400"/>
<source>Next</source>
<translation>Næste</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="359"/>
<source>Home Assistant history will appear here</source>
<translation>Home Assistant-historikken vises her</translation>
<translation type="vanished">Home Assistant-historikken vises her</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="365"/>
<source>After the recorder integration is connected, this view will request measurements for the selected period.</source>
<translation>Når Recorder-integrationen er forbundet, anmoder denne visning om målinger for den valgte periode.</translation>
<translation type="vanished">Når Recorder-integrationen er forbundet, anmoder denne visning om målinger for den valgte periode.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="377"/>
<source>Connect Home Assistant</source>
<translation>Forbind Home Assistant</translation>
<translation type="vanished">Forbind Home Assistant</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="387"/>
<source>Enter the address of your Home Assistant server. No connection is made in this preview.</source>
<translation>Indtast adressen på din Home Assistant-server. Der oprettes ingen forbindelse i denne forhåndsvisning.</translation>
<translation type="vanished">Indtast adressen på din Home Assistant-server. Der oprettes ingen forbindelse i denne forhåndsvisning.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="407"/>
<source>Cancel</source>
<translation>Annuller</translation>
<translation type="vanished">Annuller</translation>
</message>
<message>
<source>Request started...</source>
+362 -41
View File
@@ -3031,6 +3031,269 @@
<translation>RSSI:</translation>
</message>
</context>
<context>
<name>HomeAssistantClient</name>
<message>
<location filename="../homeassistantclient.cpp" line="196"/>
<source>Enter a valid HTTP or HTTPS Home Assistant address.</source>
<translation>Gib eine gültige HTTP- oder HTTPS-Adresse für Home Assistant ein.</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="202"/>
<source>Enter a Home Assistant access token.</source>
<translation>Gib ein Home-Assistant-Zugriffstoken ein.</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="208"/>
<source>Connecting to Home Assistant…</source>
<translation>Verbindung zu Home Assistant wird hergestellt…</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="230"/>
<source>Connected to Home Assistant.</source>
<translation>Mit Home Assistant verbunden.</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="240"/>
<source>Home Assistant rejected the access token.</source>
<translation>Home Assistant hat das Zugriffstoken abgelehnt.</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="241"/>
<source>Could not connect to Home Assistant: %1</source>
<translation>Verbindung zu Home Assistant fehlgeschlagen: %1</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="258"/>
<source>Loading Home Assistant entities…</source>
<translation>Home-Assistant-Entitäten werden geladen…</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="267"/>
<location filename="../homeassistantclient.cpp" line="402"/>
<source>The Home Assistant credential is no longer valid.</source>
<translation>Die Home-Assistant-Anmeldedaten sind nicht mehr gültig.</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="268"/>
<source>Could not load Home Assistant entities: %1</source>
<translation>Home-Assistant-Entitäten konnten nicht geladen werden: %1</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="297"/>
<source>Loaded %1 Home Assistant entities.</source>
<translation>%1 Home-Assistant-Entitäten geladen.</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="386"/>
<source>Loading Home Assistant history…</source>
<translation>Home-Assistant-Verlauf wird geladen…</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="403"/>
<source>Could not load Home Assistant history: %1</source>
<translation>Home-Assistant-Verlauf konnte nicht geladen werden: %1</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="410"/>
<source>Home Assistant history is up to date.</source>
<translation>Der Home-Assistant-Verlauf ist aktuell.</translation>
</message>
</context>
<context>
<name>HomeAssistantSetupDialog</name>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="17"/>
<source>Edit chart</source>
<translation>Diagramm bearbeiten</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="17"/>
<source>Connect Home Assistant</source>
<translation>Home Assistant verbinden</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="136"/>
<source>Server</source>
<translation>Server</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="136"/>
<source>Login</source>
<translation>Anmeldung</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="136"/>
<source>Charts</source>
<translation>Diagramme</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="142"/>
<source>%1. %2</source>
<translation>%1. %2</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="176"/>
<source>Before you begin</source>
<translation>Bevor du beginnst</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="180"/>
<source>Home Assistant must already be installed and running. A Raspberry Pi with Home Assistant on an SD card is one option; other supported Home Assistant installations work as well.
Before charts can receive data:
• Install or configure an MQTT broker, such as the Mosquitto broker app or a separate broker.
• Connect Home Assistant&apos;s MQTT integration to that broker.
• Connect the charger to the same broker and enable MQTT.
• Enable Home Assistant MQTT auto-discovery in Home Assistant and on the charger.
• Verify that the charger&apos;s entities are visible in Home Assistant.</source>
<translation>Home Assistant muss bereits installiert sein und laufen. Eine Möglichkeit ist ein Raspberry Pi mit Home Assistant auf einer SD-Karte; andere unterstützte Home-Assistant-Installationen funktionieren ebenfalls.
Bevor Diagramme Daten empfangen können:
• Installiere oder konfiguriere einen MQTT-Broker, beispielsweise die Mosquitto-Broker-App oder einen separaten Broker.
• Verbinde die MQTT-Integration von Home Assistant mit diesem Broker.
• Verbinde den Charger mit demselben Broker und aktiviere MQTT.
• Aktiviere die Home-Assistant-MQTT-Auto-Discovery in Home Assistant und auf dem Charger.
• Prüfe, ob die Entitäten des Chargers in Home Assistant sichtbar sind.</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="188"/>
<source>Installation guide</source>
<translation>Installationsanleitung</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="193"/>
<source>MQTT guide</source>
<translation>MQTT-Anleitung</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="201"/>
<source>Enter the address you normally use to open Home Assistant. The app will contact this server directly.</source>
<translation>Gib die Adresse ein, über die du Home Assistant normalerweise öffnest. Die App verbindet sich direkt mit diesem Server.</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="217"/>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="467"/>
<source>Cancel</source>
<translation>Abbrechen</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="220"/>
<source>Next</source>
<translation>Weiter</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="232"/>
<source>Create a long-lived access token in your Home Assistant profile and paste it below. Your Home Assistant password is never entered into this app.</source>
<translation>Erstelle in deinem Home-Assistant-Profil ein langlebiges Zugriffstoken und füge es unten ein. Dein Home-Assistant-Passwort wird niemals in diese App eingegeben.</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="238"/>
<source>Open Home Assistant profile</source>
<translation>Home-Assistant-Profil öffnen</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="249"/>
<source>Long-lived access token</source>
<translation>Langlebiges Zugriffstoken</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="255"/>
<source>Hide</source>
<translation>Ausblenden</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="255"/>
<source>Show</source>
<translation>Anzeigen</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="278"/>
<source>Back</source>
<translation>Zurück</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="281"/>
<source>Connect</source>
<translation>Verbinden</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="294"/>
<source>Create charts and choose exactly which Home Assistant entities each chart should display.</source>
<translation>Erstelle Diagramme und wähle genau aus, welche Home-Assistant-Entitäten jedes Diagramm anzeigen soll.</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="307"/>
<source>Change server or access token</source>
<translation>Server oder Zugriffstoken ändern</translation>
</message>
<message numerus="yes">
<location filename="../qml/HomeAssistantSetupDialog.qml" line="340"/>
<source>%n entity(s)</source>
<translation>
<numerusform>%n Entität</numerusform>
<numerusform>%n Entitäten</numerusform>
</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="345"/>
<source>Edit</source>
<translation>Bearbeiten</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="349"/>
<source>Delete</source>
<translation>Löschen</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="358"/>
<source>No charts configured yet.</source>
<translation>Noch keine Diagramme eingerichtet.</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="366"/>
<source>Add chart</source>
<translation>Diagramm hinzufügen</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="368"/>
<source>Done</source>
<translation>Fertig</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="378"/>
<source>Chart title</source>
<translation>Diagrammtitel</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="385"/>
<source>Search by name, entity ID, unit or device class…</source>
<translation>Nach Name, Entitäts-ID, Einheit oder Geräteklasse suchen…</translation>
</message>
<message numerus="yes">
<location filename="../qml/HomeAssistantSetupDialog.qml" line="394"/>
<source>%n entity(s) selected</source>
<translation>
<numerusform>%n Entität ausgewählt</numerusform>
<numerusform>%n Entitäten ausgewählt</numerusform>
</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="404"/>
<source>Reload</source>
<translation>Neu laden</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="459"/>
<source>No matching entities found.</source>
<translation>Keine passenden Entitäten gefunden.</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="470"/>
<source>Save chart</source>
<translation>Diagramm speichern</translation>
</message>
</context>
<context>
<name>HotspotPage</name>
<message>
@@ -3186,71 +3449,137 @@
<translation type="vanished">Informationen</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="235"/>
<location filename="../qml/InformationsTabPage.qml" line="278"/>
<source>Idle</source>
<translation>Inaktiv</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="70"/>
<location filename="../qml/InformationsTabPage.qml" line="78"/>
<source>%1 – %2</source>
<translation>%1 – %2</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="118"/>
<location filename="../qml/InformationsTabPage.qml" line="161"/>
<source>Receiving manufacturer data…</source>
<translation>Herstellerdaten werden empfangen…</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="120"/>
<location filename="../qml/InformationsTabPage.qml" line="163"/>
<source>Loading manufacturer charts…</source>
<translation>Herstellerdiagramme werden geladen…</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="134"/>
<location filename="../qml/InformationsTabPage.qml" line="177"/>
<source>%1 images</source>
<translation>%1 Bilder</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="136"/>
<location filename="../qml/InformationsTabPage.qml" line="179"/>
<source>%1 charts</source>
<translation>%1 Diagramme</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="138"/>
<location filename="../qml/InformationsTabPage.qml" line="181"/>
<source>Loaded %1</source>
<translation>%1 geladen</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="139"/>
<location filename="../qml/InformationsTabPage.qml" line="182"/>
<source>No information data received</source>
<translation>Keine Informationsdaten empfangen</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="141"/>
<location filename="../qml/InformationsTabPage.qml" line="184"/>
<source>The manufacturer cloud returned invalid data.</source>
<translation>Die Hersteller-Cloud hat ungültige Daten zurückgegeben.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="151"/>
<location filename="../qml/InformationsTabPage.qml" line="194"/>
<source>Requesting manufacturer data…</source>
<translation>Herstellerdaten werden angefordert…</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="159"/>
<location filename="../qml/InformationsTabPage.qml" line="202"/>
<source>Information</source>
<translation>Informationen</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="174"/>
<location filename="../qml/InformationsTabPage.qml" line="217"/>
<source>Manufacturer cloud</source>
<translation>Hersteller-Cloud</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="331"/>
<source>Connected to Home Assistant</source>
<translation>Mit Home Assistant verbunden</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="332"/>
<source>Home Assistant is not configured</source>
<translation>Home Assistant ist nicht eingerichtet</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="345"/>
<source>Configure</source>
<translation>Konfigurieren</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="345"/>
<location filename="../qml/InformationsTabPage.qml" line="476"/>
<source>Set up</source>
<translation>Einrichten</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="409"/>
<source>Refresh</source>
<translation>Aktualisieren</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="459"/>
<source>Connect Home Assistant to display history</source>
<translation>Verbinde Home Assistant, um den Verlauf anzuzeigen</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="460"/>
<source>Create your first history chart</source>
<translation>Erstelle dein erstes Verlaufsdiagramm</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="467"/>
<source>The setup wizard connects to your server and lets you select the entities to display.</source>
<translation>Der Einrichtungsassistent verbindet sich mit deinem Server und lässt dich die anzuzeigenden Entitäten auswählen.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="468"/>
<source>Open the configuration and add a chart with one or more Home Assistant entities.</source>
<translation>Öffne die Konfiguration und füge ein Diagramm mit einer oder mehreren Home-Assistant-Entitäten hinzu.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="476"/>
<source>Add chart</source>
<translation>Diagramm hinzufügen</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="485"/>
<source>Forget Home Assistant configuration</source>
<translation>Home-Assistant-Konfiguration vergessen</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="498"/>
<source>Forget Home Assistant?</source>
<translation>Home Assistant vergessen?</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="505"/>
<source>This removes the server address, access token and all chart definitions stored in this app.</source>
<translation>Dadurch werden die Serveradresse, das Zugriffstoken und alle in dieser App gespeicherten Diagrammdefinitionen entfernt.</translation>
</message>
<message>
<source>Limited · unreliable · slow</source>
<translation type="vanished">Eingeschränkt · unzuverlässig · langsam</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="197"/>
<location filename="../qml/InformationsTabPage.qml" line="240"/>
<source>Your own cloud</source>
<translation>Eigene Cloud</translation>
</message>
@@ -3259,105 +3588,97 @@
<translation type="vanished">Verlauf · gepflegt · schnell</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="181"/>
<location filename="../qml/InformationsTabPage.qml" line="224"/>
<source>Lacks features · unreliable · slow</source>
<translation>Fehlende Funktionen · unzuverlässig · langsam</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="204"/>
<location filename="../qml/InformationsTabPage.qml" line="247"/>
<source>Historical data · properly maintained · fast</source>
<translation>Historische Daten · gut gepflegt · schnell</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="227"/>
<location filename="../qml/InformationsTabPage.qml" line="270"/>
<source>The manufacturer cloud provides basic charts, but can be slow, unavailable or limited to the data selected by the manufacturer.</source>
<translation>Die Hersteller-Cloud stellt grundlegende Diagramme bereit, kann jedoch langsam, nicht erreichbar oder auf vom Hersteller ausgewählte Daten beschränkt sein.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="262"/>
<location filename="../qml/InformationsTabPage.qml" line="305"/>
<source>Download information</source>
<translation>Informationen herunterladen</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="272"/>
<location filename="../qml/InformationsTabPage.qml" line="315"/>
<source>Own your charging history</source>
<translation>Dein Ladeprotokoll gehört dir</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="276"/>
<location filename="../qml/InformationsTabPage.qml" line="319"/>
<source>Connect the charger to your own Home Assistant installation for fast, dependable history that remains under your control. You decide how long data is retained and which measurements are recorded.</source>
<translation>Verbinde den Charger mit deiner eigenen Home-Assistant-Installation, um einen schnellen, zuverlässigen Verlauf unter deiner Kontrolle zu erhalten. Du bestimmst, wie lange Daten aufbewahrt und welche Messwerte aufgezeichnet werden.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="282"/>
<source>Home Assistant recorder integration is being prepared. The setup below is currently a preview and does not connect yet.</source>
<translation>Die Home-Assistant-Recorder-Integration wird vorbereitet. Die Einrichtung unten ist derzeit eine Vorschau und stellt noch keine Verbindung her.</translation>
<translation type="vanished">Die Home-Assistant-Recorder-Integration wird vorbereitet. Die Einrichtung unten ist derzeit eine Vorschau und stellt noch keine Verbindung her.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="289"/>
<source>Set up connection to Home Assistant</source>
<translation>Verbindung zu Home Assistant einrichten</translation>
<translation type="vanished">Verbindung zu Home Assistant einrichten</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="294"/>
<location filename="../qml/InformationsTabPage.qml" line="353"/>
<source>Historical data</source>
<translation>Historische Daten</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="302"/>
<location filename="../qml/InformationsTabPage.qml" line="363"/>
<source>Day</source>
<translation>Tag</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="303"/>
<location filename="../qml/InformationsTabPage.qml" line="364"/>
<source>Week</source>
<translation>Woche</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="304"/>
<location filename="../qml/InformationsTabPage.qml" line="365"/>
<source>Month</source>
<translation>Monat</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="305"/>
<location filename="../qml/InformationsTabPage.qml" line="366"/>
<source>Year</source>
<translation>Jahr</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="323"/>
<location filename="../qml/InformationsTabPage.qml" line="385"/>
<source>Previous</source>
<translation>Zurück</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="335"/>
<location filename="../qml/InformationsTabPage.qml" line="412"/>
<location filename="../qml/InformationsTabPage.qml" line="400"/>
<source>Next</source>
<translation>Weiter</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="359"/>
<source>Home Assistant history will appear here</source>
<translation>Der Home-Assistant-Verlauf wird hier angezeigt</translation>
<translation type="vanished">Der Home-Assistant-Verlauf wird hier angezeigt</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="365"/>
<source>After the recorder integration is connected, this view will request measurements for the selected period.</source>
<translation>Nach Verbindung der Recorder-Integration ruft diese Ansicht die Messwerte für den ausgewählten Zeitraum ab.</translation>
<translation type="vanished">Nach Verbindung der Recorder-Integration ruft diese Ansicht die Messwerte für den ausgewählten Zeitraum ab.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="377"/>
<source>Connect Home Assistant</source>
<translation>Home Assistant verbinden</translation>
<translation type="vanished">Home Assistant verbinden</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="387"/>
<source>Enter the address of your Home Assistant server. No connection is made in this preview.</source>
<translation>Gib die Adresse deines Home-Assistant-Servers ein. In dieser Vorschau wird keine Verbindung hergestellt.</translation>
<translation type="vanished">Gib die Adresse deines Home-Assistant-Servers ein. In dieser Vorschau wird keine Verbindung hergestellt.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="407"/>
<source>Cancel</source>
<translation>Abbrechen</translation>
<translation type="vanished">Abbrechen</translation>
</message>
<message>
<source>Download informations</source>
+17
View File
@@ -1,4 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1">
<context>
<name>HomeAssistantSetupDialog</name>
<message numerus="yes">
<location filename="../qml/HomeAssistantSetupDialog.qml" line="340"/>
<source>%n entity(s)</source>
<translation type="unfinished">
<numerusform></numerusform>
</translation>
</message>
<message numerus="yes">
<location filename="../qml/HomeAssistantSetupDialog.qml" line="394"/>
<source>%n entity(s) selected</source>
<translation type="unfinished">
<numerusform></numerusform>
</translation>
</message>
</context>
</TS>
+362 -41
View File
@@ -2856,6 +2856,269 @@
<translation>RSSI:</translation>
</message>
</context>
<context>
<name>HomeAssistantClient</name>
<message>
<location filename="../homeassistantclient.cpp" line="196"/>
<source>Enter a valid HTTP or HTTPS Home Assistant address.</source>
<translation>Anna kelvollinen Home Assistantin HTTP- tai HTTPS-osoite.</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="202"/>
<source>Enter a Home Assistant access token.</source>
<translation>Anna Home Assistantin käyttöoikeustunnus.</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="208"/>
<source>Connecting to Home Assistant…</source>
<translation>Yhdistetään Home Assistantiin…</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="230"/>
<source>Connected to Home Assistant.</source>
<translation>Yhdistetty Home Assistantiin.</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="240"/>
<source>Home Assistant rejected the access token.</source>
<translation>Home Assistant hylkäsi käyttöoikeustunnuksen.</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="241"/>
<source>Could not connect to Home Assistant: %1</source>
<translation>Home Assistantiin ei voitu yhdistää: %1</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="258"/>
<source>Loading Home Assistant entities…</source>
<translation>Ladataan Home Assistant -entiteettejä…</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="267"/>
<location filename="../homeassistantclient.cpp" line="402"/>
<source>The Home Assistant credential is no longer valid.</source>
<translation>Home Assistantin tunnistetieto ei ole enää voimassa.</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="268"/>
<source>Could not load Home Assistant entities: %1</source>
<translation>Home Assistant -entiteettejä ei voitu ladata: %1</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="297"/>
<source>Loaded %1 Home Assistant entities.</source>
<translation>Ladattiin %1 Home Assistant -entiteettiä.</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="386"/>
<source>Loading Home Assistant history…</source>
<translation>Ladataan Home Assistant -historiaa…</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="403"/>
<source>Could not load Home Assistant history: %1</source>
<translation>Home Assistant -historiaa ei voitu ladata: %1</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="410"/>
<source>Home Assistant history is up to date.</source>
<translation>Home Assistant -historia on ajan tasalla.</translation>
</message>
</context>
<context>
<name>HomeAssistantSetupDialog</name>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="17"/>
<source>Edit chart</source>
<translation>Muokkaa kaaviota</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="17"/>
<source>Connect Home Assistant</source>
<translation>Yhdistä Home Assistantiin</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="136"/>
<source>Server</source>
<translation>Palvelin</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="136"/>
<source>Login</source>
<translation>Kirjautuminen</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="136"/>
<source>Charts</source>
<translation>Kaaviot</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="142"/>
<source>%1. %2</source>
<translation>%1. %2</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="176"/>
<source>Before you begin</source>
<translation>Ennen aloittamista</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="180"/>
<source>Home Assistant must already be installed and running. A Raspberry Pi with Home Assistant on an SD card is one option; other supported Home Assistant installations work as well.
Before charts can receive data:
• Install or configure an MQTT broker, such as the Mosquitto broker app or a separate broker.
• Connect Home Assistant&apos;s MQTT integration to that broker.
• Connect the charger to the same broker and enable MQTT.
• Enable Home Assistant MQTT auto-discovery in Home Assistant and on the charger.
• Verify that the charger&apos;s entities are visible in Home Assistant.</source>
<translation>Home Assistantin on oltava jo asennettuna ja käynnissä. Yksi vaihtoehto on Raspberry Pi, jossa Home Assistant on SD-kortilla; myös muut tuetut Home Assistant -asennukset toimivat.
Ennen kuin kaaviot voivat vastaanottaa tietoja:
• Asenna tai määritä MQTT-välittäjä, kuten Mosquitto Broker -sovellus tai erillinen välittäjä.
• Yhdistä Home Assistantin MQTT-integraatio tähän välittäjään.
• Yhdistä laturi samaan välittäjään ja ota MQTT käyttöön.
• Ota Home Assistantin MQTT-automaattinen tunnistus käyttöön Home Assistantissa ja laturissa.
• Varmista, että laturin entiteetit näkyvät Home Assistantissa.</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="188"/>
<source>Installation guide</source>
<translation>Asennusohje</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="193"/>
<source>MQTT guide</source>
<translation>MQTT-ohje</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="201"/>
<source>Enter the address you normally use to open Home Assistant. The app will contact this server directly.</source>
<translation>Anna osoite, jolla yleensä avaat Home Assistantin. Sovellus ottaa suoraan yhteyden tähän palvelimeen.</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="217"/>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="467"/>
<source>Cancel</source>
<translation>Peruuta</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="220"/>
<source>Next</source>
<translation>Seuraava</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="232"/>
<source>Create a long-lived access token in your Home Assistant profile and paste it below. Your Home Assistant password is never entered into this app.</source>
<translation>Luo pitkäikäinen käyttöoikeustunnus Home Assistant -profiilissasi ja liitä se alle. Home Assistant -salasanaasi ei koskaan syötetä tähän sovellukseen.</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="238"/>
<source>Open Home Assistant profile</source>
<translation>Avaa Home Assistant -profiili</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="249"/>
<source>Long-lived access token</source>
<translation>Pitkäikäinen käyttöoikeustunnus</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="255"/>
<source>Hide</source>
<translation>Piilota</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="255"/>
<source>Show</source>
<translation>Näytä</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="278"/>
<source>Back</source>
<translation>Takaisin</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="281"/>
<source>Connect</source>
<translation>Yhdistä</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="294"/>
<source>Create charts and choose exactly which Home Assistant entities each chart should display.</source>
<translation>Luo kaavioita ja valitse tarkasti, mitkä Home Assistant -entiteetit kussakin kaaviossa näytetään.</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="307"/>
<source>Change server or access token</source>
<translation>Vaihda palvelinta tai käyttöoikeustunnusta</translation>
</message>
<message numerus="yes">
<location filename="../qml/HomeAssistantSetupDialog.qml" line="340"/>
<source>%n entity(s)</source>
<translation>
<numerusform>%n entiteetti</numerusform>
<numerusform>%n entiteettiä</numerusform>
</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="345"/>
<source>Edit</source>
<translation>Muokkaa</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="349"/>
<source>Delete</source>
<translation>Poista</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="358"/>
<source>No charts configured yet.</source>
<translation>Kaavioita ei ole vielä määritetty.</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="366"/>
<source>Add chart</source>
<translation>Lisää kaavio</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="368"/>
<source>Done</source>
<translation>Valmis</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="378"/>
<source>Chart title</source>
<translation>Kaavion otsikko</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="385"/>
<source>Search by name, entity ID, unit or device class…</source>
<translation>Hae nimellä, entiteettitunnuksella, yksiköllä tai laiteluokalla…</translation>
</message>
<message numerus="yes">
<location filename="../qml/HomeAssistantSetupDialog.qml" line="394"/>
<source>%n entity(s) selected</source>
<translation>
<numerusform>%n entiteetti valittu</numerusform>
<numerusform>%n entiteettiä valittu</numerusform>
</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="404"/>
<source>Reload</source>
<translation>Lataa uudelleen</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="459"/>
<source>No matching entities found.</source>
<translation>Vastaavia entiteettejä ei löytynyt.</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="470"/>
<source>Save chart</source>
<translation>Tallenna kaavio</translation>
</message>
</context>
<context>
<name>HotspotPage</name>
<message>
@@ -3011,7 +3274,7 @@
<translation type="vanished">Tiedot</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="235"/>
<location filename="../qml/InformationsTabPage.qml" line="278"/>
<source>Idle</source>
<translation>Valmiustila</translation>
</message>
@@ -3024,66 +3287,132 @@
<translation type="vanished">LADATAAN</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="70"/>
<location filename="../qml/InformationsTabPage.qml" line="78"/>
<source>%1 – %2</source>
<translation>%1 – %2</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="118"/>
<location filename="../qml/InformationsTabPage.qml" line="161"/>
<source>Receiving manufacturer data…</source>
<translation>Vastaanotetaan valmistajan tietoja…</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="120"/>
<location filename="../qml/InformationsTabPage.qml" line="163"/>
<source>Loading manufacturer charts…</source>
<translation>Ladataan valmistajan kaavioita…</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="134"/>
<location filename="../qml/InformationsTabPage.qml" line="177"/>
<source>%1 images</source>
<translation>%1 kuvaa</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="136"/>
<location filename="../qml/InformationsTabPage.qml" line="179"/>
<source>%1 charts</source>
<translation>%1 kaaviota</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="138"/>
<location filename="../qml/InformationsTabPage.qml" line="181"/>
<source>Loaded %1</source>
<translation>Ladattu: %1</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="139"/>
<location filename="../qml/InformationsTabPage.qml" line="182"/>
<source>No information data received</source>
<translation>Tietoja ei vastaanotettu</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="141"/>
<location filename="../qml/InformationsTabPage.qml" line="184"/>
<source>The manufacturer cloud returned invalid data.</source>
<translation>Valmistajan pilvipalvelu palautti virheellisiä tietoja.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="151"/>
<location filename="../qml/InformationsTabPage.qml" line="194"/>
<source>Requesting manufacturer data…</source>
<translation>Pyydetään valmistajan tietoja…</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="159"/>
<location filename="../qml/InformationsTabPage.qml" line="202"/>
<source>Information</source>
<translation>Tiedot</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="174"/>
<location filename="../qml/InformationsTabPage.qml" line="217"/>
<source>Manufacturer cloud</source>
<translation>Valmistajan pilvipalvelu</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="331"/>
<source>Connected to Home Assistant</source>
<translation>Yhdistetty Home Assistantiin</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="332"/>
<source>Home Assistant is not configured</source>
<translation>Home Assistantia ei ole määritetty</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="345"/>
<source>Configure</source>
<translation>Määritä</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="345"/>
<location filename="../qml/InformationsTabPage.qml" line="476"/>
<source>Set up</source>
<translation>Määritä</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="409"/>
<source>Refresh</source>
<translation>Päivitä</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="459"/>
<source>Connect Home Assistant to display history</source>
<translation>Yhdistä Home Assistant historian näyttämiseksi</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="460"/>
<source>Create your first history chart</source>
<translation>Luo ensimmäinen historiakaaviosi</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="467"/>
<source>The setup wizard connects to your server and lets you select the entities to display.</source>
<translation>Ohjattu määritys yhdistää palvelimeesi ja antaa valita näytettävät entiteetit.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="468"/>
<source>Open the configuration and add a chart with one or more Home Assistant entities.</source>
<translation>Avaa määritys ja lisää kaavio, jossa on yksi tai useampi Home Assistant -entiteetti.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="476"/>
<source>Add chart</source>
<translation>Lisää kaavio</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="485"/>
<source>Forget Home Assistant configuration</source>
<translation>Unohda Home Assistant -määritys</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="498"/>
<source>Forget Home Assistant?</source>
<translation>Unohdetaanko Home Assistant?</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="505"/>
<source>This removes the server address, access token and all chart definitions stored in this app.</source>
<translation>Tämä poistaa palvelimen osoitteen, käyttöoikeustunnuksen ja kaikki tähän sovellukseen tallennetut kaaviomääritykset.</translation>
</message>
<message>
<source>Limited · unreliable · slow</source>
<translation type="vanished">Rajallinen · epäluotettava · hidas</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="197"/>
<location filename="../qml/InformationsTabPage.qml" line="240"/>
<source>Your own cloud</source>
<translation>Oma pilvipalvelusi</translation>
</message>
@@ -3092,105 +3421,97 @@
<translation type="vanished">Historia · ylläpidetty · nopea</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="181"/>
<location filename="../qml/InformationsTabPage.qml" line="224"/>
<source>Lacks features · unreliable · slow</source>
<translation>Puutteelliset ominaisuudet · epäluotettava · hidas</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="204"/>
<location filename="../qml/InformationsTabPage.qml" line="247"/>
<source>Historical data · properly maintained · fast</source>
<translation>Historiatiedot · hyvin ylläpidetty · nopea</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="227"/>
<location filename="../qml/InformationsTabPage.qml" line="270"/>
<source>The manufacturer cloud provides basic charts, but can be slow, unavailable or limited to the data selected by the manufacturer.</source>
<translation>Valmistajan pilvipalvelu tarjoaa peruskaavioita, mutta se voi olla hidas, poissa käytöstä tai rajoittunut valmistajan valitsemiin tietoihin.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="262"/>
<location filename="../qml/InformationsTabPage.qml" line="305"/>
<source>Download information</source>
<translation>Lataa tiedot</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="272"/>
<location filename="../qml/InformationsTabPage.qml" line="315"/>
<source>Own your charging history</source>
<translation>Hallitse lataushistoriaasi</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="276"/>
<location filename="../qml/InformationsTabPage.qml" line="319"/>
<source>Connect the charger to your own Home Assistant installation for fast, dependable history that remains under your control. You decide how long data is retained and which measurements are recorded.</source>
<translation>Yhdistä laturi omaan Home Assistant -asennukseesi, jotta saat nopean ja luotettavan historian, joka pysyy hallinnassasi. Päätät, kuinka kauan tiedot säilytetään ja mitkä mittaukset tallennetaan.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="282"/>
<source>Home Assistant recorder integration is being prepared. The setup below is currently a preview and does not connect yet.</source>
<translation>Home Assistant Recorder -integraatiota valmistellaan. Alla oleva määritys on tällä hetkellä esikatselu eikä vielä muodosta yhteyttä.</translation>
<translation type="vanished">Home Assistant Recorder -integraatiota valmistellaan. Alla oleva määritys on tällä hetkellä esikatselu eikä vielä muodosta yhteyttä.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="289"/>
<source>Set up connection to Home Assistant</source>
<translation>Määritä yhteys Home Assistantiin</translation>
<translation type="vanished">Määritä yhteys Home Assistantiin</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="294"/>
<location filename="../qml/InformationsTabPage.qml" line="353"/>
<source>Historical data</source>
<translation>Historiatiedot</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="302"/>
<location filename="../qml/InformationsTabPage.qml" line="363"/>
<source>Day</source>
<translation>Päivä</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="303"/>
<location filename="../qml/InformationsTabPage.qml" line="364"/>
<source>Week</source>
<translation>Viikko</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="304"/>
<location filename="../qml/InformationsTabPage.qml" line="365"/>
<source>Month</source>
<translation>Kuukausi</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="305"/>
<location filename="../qml/InformationsTabPage.qml" line="366"/>
<source>Year</source>
<translation>Vuosi</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="323"/>
<location filename="../qml/InformationsTabPage.qml" line="385"/>
<source>Previous</source>
<translation>Edellinen</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="335"/>
<location filename="../qml/InformationsTabPage.qml" line="412"/>
<location filename="../qml/InformationsTabPage.qml" line="400"/>
<source>Next</source>
<translation>Seuraava</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="359"/>
<source>Home Assistant history will appear here</source>
<translation>Home Assistant -historia näkyy tässä</translation>
<translation type="vanished">Home Assistant -historia näkyy tässä</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="365"/>
<source>After the recorder integration is connected, this view will request measurements for the selected period.</source>
<translation>Kun Recorder-integraatio on yhdistetty, tämä näkymä pyytää valitun ajanjakson mittaukset.</translation>
<translation type="vanished">Kun Recorder-integraatio on yhdistetty, tämä näkymä pyytää valitun ajanjakson mittaukset.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="377"/>
<source>Connect Home Assistant</source>
<translation>Yhdistä Home Assistantiin</translation>
<translation type="vanished">Yhdistä Home Assistantiin</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="387"/>
<source>Enter the address of your Home Assistant server. No connection is made in this preview.</source>
<translation>Anna Home Assistant -palvelimesi osoite. Tässä esikatselussa yhteyttä ei muodosteta.</translation>
<translation type="vanished">Anna Home Assistant -palvelimesi osoite. Tässä esikatselussa yhteyttä ei muodosteta.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="407"/>
<source>Cancel</source>
<translation>Peruuta</translation>
<translation type="vanished">Peruuta</translation>
</message>
<message>
<source>Request started...</source>
+362 -41
View File
@@ -2856,6 +2856,269 @@
<translation>RSSI:</translation>
</message>
</context>
<context>
<name>HomeAssistantClient</name>
<message>
<location filename="../homeassistantclient.cpp" line="196"/>
<source>Enter a valid HTTP or HTTPS Home Assistant address.</source>
<translation>Skriv inn en gyldig HTTP- eller HTTPS-adresse til Home Assistant.</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="202"/>
<source>Enter a Home Assistant access token.</source>
<translation>Skriv inn et tilgangstoken for Home Assistant.</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="208"/>
<source>Connecting to Home Assistant…</source>
<translation>Kobler til Home Assistant…</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="230"/>
<source>Connected to Home Assistant.</source>
<translation>Koblet til Home Assistant.</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="240"/>
<source>Home Assistant rejected the access token.</source>
<translation>Home Assistant avviste tilgangstokenet.</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="241"/>
<source>Could not connect to Home Assistant: %1</source>
<translation>Kunne ikke koble til Home Assistant: %1</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="258"/>
<source>Loading Home Assistant entities…</source>
<translation>Laster inn Home Assistant-entiteter…</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="267"/>
<location filename="../homeassistantclient.cpp" line="402"/>
<source>The Home Assistant credential is no longer valid.</source>
<translation>Påloggingsinformasjonen for Home Assistant er ikke lenger gyldig.</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="268"/>
<source>Could not load Home Assistant entities: %1</source>
<translation>Kunne ikke laste inn Home Assistant-entiteter: %1</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="297"/>
<source>Loaded %1 Home Assistant entities.</source>
<translation>Lastet inn %1 Home Assistant-entiteter.</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="386"/>
<source>Loading Home Assistant history…</source>
<translation>Laster inn Home Assistant-historikk…</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="403"/>
<source>Could not load Home Assistant history: %1</source>
<translation>Kunne ikke laste inn Home Assistant-historikk: %1</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="410"/>
<source>Home Assistant history is up to date.</source>
<translation>Home Assistant-historikken er oppdatert.</translation>
</message>
</context>
<context>
<name>HomeAssistantSetupDialog</name>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="17"/>
<source>Edit chart</source>
<translation>Rediger diagram</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="17"/>
<source>Connect Home Assistant</source>
<translation>Koble til Home Assistant</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="136"/>
<source>Server</source>
<translation>Server</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="136"/>
<source>Login</source>
<translation>Pålogging</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="136"/>
<source>Charts</source>
<translation>Diagrammer</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="142"/>
<source>%1. %2</source>
<translation>%1. %2</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="176"/>
<source>Before you begin</source>
<translation>Før du begynner</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="180"/>
<source>Home Assistant must already be installed and running. A Raspberry Pi with Home Assistant on an SD card is one option; other supported Home Assistant installations work as well.
Before charts can receive data:
• Install or configure an MQTT broker, such as the Mosquitto broker app or a separate broker.
• Connect Home Assistant&apos;s MQTT integration to that broker.
• Connect the charger to the same broker and enable MQTT.
• Enable Home Assistant MQTT auto-discovery in Home Assistant and on the charger.
• Verify that the charger&apos;s entities are visible in Home Assistant.</source>
<translation>Home Assistant må allerede være installert og kjøre. Ett alternativ er en Raspberry Pi med Home Assistant på et SD-kort; andre støttede Home Assistant-installasjoner fungerer også.
Før diagrammer kan motta data:
• Installer eller konfigurer en MQTT-megler, for eksempel Mosquitto Broker-appen eller en separat megler.
• Koble Home Assistants MQTT-integrasjon til denne megleren.
• Koble laderen til den samme megleren og aktiver MQTT.
• Aktiver automatisk MQTT-oppdagelse for Home Assistant i Home Assistant og på laderen.
• Kontroller at laderens entiteter er synlige i Home Assistant.</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="188"/>
<source>Installation guide</source>
<translation>Installasjonsveiledning</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="193"/>
<source>MQTT guide</source>
<translation>MQTT-veiledning</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="201"/>
<source>Enter the address you normally use to open Home Assistant. The app will contact this server directly.</source>
<translation>Skriv inn adressen du vanligvis bruker for å åpne Home Assistant. Appen kontakter denne serveren direkte.</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="217"/>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="467"/>
<source>Cancel</source>
<translation>Avbryt</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="220"/>
<source>Next</source>
<translation>Neste</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="232"/>
<source>Create a long-lived access token in your Home Assistant profile and paste it below. Your Home Assistant password is never entered into this app.</source>
<translation>Opprett et langlivet tilgangstoken i Home Assistant-profilen din, og lim det inn nedenfor. Home Assistant-passordet ditt skrives aldri inn i denne appen.</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="238"/>
<source>Open Home Assistant profile</source>
<translation>Åpne Home Assistant-profil</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="249"/>
<source>Long-lived access token</source>
<translation>Langlivet tilgangstoken</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="255"/>
<source>Hide</source>
<translation>Skjul</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="255"/>
<source>Show</source>
<translation>Vis</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="278"/>
<source>Back</source>
<translation>Tilbake</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="281"/>
<source>Connect</source>
<translation>Koble til</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="294"/>
<source>Create charts and choose exactly which Home Assistant entities each chart should display.</source>
<translation>Opprett diagrammer og velg nøyaktig hvilke Home Assistant-entiteter hvert diagram skal vise.</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="307"/>
<source>Change server or access token</source>
<translation>Bytt server eller tilgangstoken</translation>
</message>
<message numerus="yes">
<location filename="../qml/HomeAssistantSetupDialog.qml" line="340"/>
<source>%n entity(s)</source>
<translation>
<numerusform>%n entitet</numerusform>
<numerusform>%n entiteter</numerusform>
</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="345"/>
<source>Edit</source>
<translation>Rediger</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="349"/>
<source>Delete</source>
<translation>Slett</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="358"/>
<source>No charts configured yet.</source>
<translation>Ingen diagrammer er konfigurert ennå.</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="366"/>
<source>Add chart</source>
<translation>Legg til diagram</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="368"/>
<source>Done</source>
<translation>Ferdig</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="378"/>
<source>Chart title</source>
<translation>Diagramtittel</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="385"/>
<source>Search by name, entity ID, unit or device class…</source>
<translation>Søk etter navn, entitets-ID, enhet eller enhetsklasse…</translation>
</message>
<message numerus="yes">
<location filename="../qml/HomeAssistantSetupDialog.qml" line="394"/>
<source>%n entity(s) selected</source>
<translation>
<numerusform>%n entitet valgt</numerusform>
<numerusform>%n entiteter valgt</numerusform>
</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="404"/>
<source>Reload</source>
<translation>Last inn på nytt</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="459"/>
<source>No matching entities found.</source>
<translation>Fant ingen samsvarende entiteter.</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="470"/>
<source>Save chart</source>
<translation>Lagre diagram</translation>
</message>
</context>
<context>
<name>HotspotPage</name>
<message>
@@ -3011,7 +3274,7 @@
<translation type="vanished">Informasjon</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="235"/>
<location filename="../qml/InformationsTabPage.qml" line="278"/>
<source>Idle</source>
<translation>Inaktiv</translation>
</message>
@@ -3024,66 +3287,132 @@
<translation type="vanished">LASTER INN</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="70"/>
<location filename="../qml/InformationsTabPage.qml" line="78"/>
<source>%1 – %2</source>
<translation>%1 – %2</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="118"/>
<location filename="../qml/InformationsTabPage.qml" line="161"/>
<source>Receiving manufacturer data…</source>
<translation>Mottar produsentdata…</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="120"/>
<location filename="../qml/InformationsTabPage.qml" line="163"/>
<source>Loading manufacturer charts…</source>
<translation>Laster produsentdiagrammer…</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="134"/>
<location filename="../qml/InformationsTabPage.qml" line="177"/>
<source>%1 images</source>
<translation>%1 bilder</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="136"/>
<location filename="../qml/InformationsTabPage.qml" line="179"/>
<source>%1 charts</source>
<translation>%1 diagrammer</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="138"/>
<location filename="../qml/InformationsTabPage.qml" line="181"/>
<source>Loaded %1</source>
<translation>Lastet inn %1</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="139"/>
<location filename="../qml/InformationsTabPage.qml" line="182"/>
<source>No information data received</source>
<translation>Ingen informasjonsdata mottatt</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="141"/>
<location filename="../qml/InformationsTabPage.qml" line="184"/>
<source>The manufacturer cloud returned invalid data.</source>
<translation>Produsentskyen returnerte ugyldige data.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="151"/>
<location filename="../qml/InformationsTabPage.qml" line="194"/>
<source>Requesting manufacturer data…</source>
<translation>Ber om produsentdata…</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="159"/>
<location filename="../qml/InformationsTabPage.qml" line="202"/>
<source>Information</source>
<translation>Informasjon</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="174"/>
<location filename="../qml/InformationsTabPage.qml" line="217"/>
<source>Manufacturer cloud</source>
<translation>Produsentsky</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="331"/>
<source>Connected to Home Assistant</source>
<translation>Koblet til Home Assistant</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="332"/>
<source>Home Assistant is not configured</source>
<translation>Home Assistant er ikke konfigurert</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="345"/>
<source>Configure</source>
<translation>Konfigurer</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="345"/>
<location filename="../qml/InformationsTabPage.qml" line="476"/>
<source>Set up</source>
<translation>Konfigurer</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="409"/>
<source>Refresh</source>
<translation>Oppdater</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="459"/>
<source>Connect Home Assistant to display history</source>
<translation>Koble til Home Assistant for å vise historikk</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="460"/>
<source>Create your first history chart</source>
<translation>Opprett ditt første historikkdiagram</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="467"/>
<source>The setup wizard connects to your server and lets you select the entities to display.</source>
<translation>Oppsettsveiviseren kobler til serveren og lar deg velge entitetene som skal vises.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="468"/>
<source>Open the configuration and add a chart with one or more Home Assistant entities.</source>
<translation>Åpne konfigurasjonen og legg til et diagram med én eller flere Home Assistant-entiteter.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="476"/>
<source>Add chart</source>
<translation>Legg til diagram</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="485"/>
<source>Forget Home Assistant configuration</source>
<translation>Glem Home Assistant-konfigurasjonen</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="498"/>
<source>Forget Home Assistant?</source>
<translation>Glemme Home Assistant?</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="505"/>
<source>This removes the server address, access token and all chart definitions stored in this app.</source>
<translation>Dette fjerner serveradressen, tilgangstokenet og alle diagramdefinisjoner som er lagret i appen.</translation>
</message>
<message>
<source>Limited · unreliable · slow</source>
<translation type="vanished">Begrenset · upålitelig · treg</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="197"/>
<location filename="../qml/InformationsTabPage.qml" line="240"/>
<source>Your own cloud</source>
<translation>Din egen sky</translation>
</message>
@@ -3092,105 +3421,97 @@
<translation type="vanished">Historikk · vedlikeholdt · rask</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="181"/>
<location filename="../qml/InformationsTabPage.qml" line="224"/>
<source>Lacks features · unreliable · slow</source>
<translation>Mangler funksjoner · upålitelig · treg</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="204"/>
<location filename="../qml/InformationsTabPage.qml" line="247"/>
<source>Historical data · properly maintained · fast</source>
<translation>Historiske data · godt vedlikeholdt · rask</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="227"/>
<location filename="../qml/InformationsTabPage.qml" line="270"/>
<source>The manufacturer cloud provides basic charts, but can be slow, unavailable or limited to the data selected by the manufacturer.</source>
<translation>Produsentskyen tilbyr grunnleggende diagrammer, men kan være treg, utilgjengelig eller begrenset til data som produsenten har valgt.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="262"/>
<location filename="../qml/InformationsTabPage.qml" line="305"/>
<source>Download information</source>
<translation>Last ned informasjon</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="272"/>
<location filename="../qml/InformationsTabPage.qml" line="315"/>
<source>Own your charging history</source>
<translation>Ha kontroll over ladehistorikken</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="276"/>
<location filename="../qml/InformationsTabPage.qml" line="319"/>
<source>Connect the charger to your own Home Assistant installation for fast, dependable history that remains under your control. You decide how long data is retained and which measurements are recorded.</source>
<translation>Koble laderen til din egen Home Assistant-installasjon for rask, pålitelig historikk som forblir under din kontroll. Du bestemmer hvor lenge data beholdes og hvilke målinger som registreres.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="282"/>
<source>Home Assistant recorder integration is being prepared. The setup below is currently a preview and does not connect yet.</source>
<translation>Integrasjonen med Home Assistant Recorder er under utvikling. Oppsettet nedenfor er foreløpig en forhåndsvisning og kobler ikke til ennå.</translation>
<translation type="vanished">Integrasjonen med Home Assistant Recorder er under utvikling. Oppsettet nedenfor er foreløpig en forhåndsvisning og kobler ikke til ennå.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="289"/>
<source>Set up connection to Home Assistant</source>
<translation>Konfigurer tilkobling til Home Assistant</translation>
<translation type="vanished">Konfigurer tilkobling til Home Assistant</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="294"/>
<location filename="../qml/InformationsTabPage.qml" line="353"/>
<source>Historical data</source>
<translation>Historiske data</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="302"/>
<location filename="../qml/InformationsTabPage.qml" line="363"/>
<source>Day</source>
<translation>Dag</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="303"/>
<location filename="../qml/InformationsTabPage.qml" line="364"/>
<source>Week</source>
<translation>Uke</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="304"/>
<location filename="../qml/InformationsTabPage.qml" line="365"/>
<source>Month</source>
<translation>Måned</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="305"/>
<location filename="../qml/InformationsTabPage.qml" line="366"/>
<source>Year</source>
<translation>År</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="323"/>
<location filename="../qml/InformationsTabPage.qml" line="385"/>
<source>Previous</source>
<translation>Forrige</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="335"/>
<location filename="../qml/InformationsTabPage.qml" line="412"/>
<location filename="../qml/InformationsTabPage.qml" line="400"/>
<source>Next</source>
<translation>Neste</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="359"/>
<source>Home Assistant history will appear here</source>
<translation>Home Assistant-historikken vises her</translation>
<translation type="vanished">Home Assistant-historikken vises her</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="365"/>
<source>After the recorder integration is connected, this view will request measurements for the selected period.</source>
<translation>Når Recorder-integrasjonen er tilkoblet, vil denne visningen be om målinger for den valgte perioden.</translation>
<translation type="vanished">Når Recorder-integrasjonen er tilkoblet, vil denne visningen be om målinger for den valgte perioden.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="377"/>
<source>Connect Home Assistant</source>
<translation>Koble til Home Assistant</translation>
<translation type="vanished">Koble til Home Assistant</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="387"/>
<source>Enter the address of your Home Assistant server. No connection is made in this preview.</source>
<translation>Skriv inn adressen til Home Assistant-serveren. Ingen tilkobling opprettes i denne forhåndsvisningen.</translation>
<translation type="vanished">Skriv inn adressen til Home Assistant-serveren. Ingen tilkobling opprettes i denne forhåndsvisningen.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="407"/>
<source>Cancel</source>
<translation>Avbryt</translation>
<translation type="vanished">Avbryt</translation>
</message>
<message>
<source>Request started...</source>
+362 -41
View File
@@ -2856,6 +2856,269 @@
<translation>RSSI:</translation>
</message>
</context>
<context>
<name>HomeAssistantClient</name>
<message>
<location filename="../homeassistantclient.cpp" line="196"/>
<source>Enter a valid HTTP or HTTPS Home Assistant address.</source>
<translation>Ange en giltig HTTP- eller HTTPS-adress till Home Assistant.</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="202"/>
<source>Enter a Home Assistant access token.</source>
<translation>Ange en åtkomsttoken för Home Assistant.</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="208"/>
<source>Connecting to Home Assistant…</source>
<translation>Ansluter till Home Assistant…</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="230"/>
<source>Connected to Home Assistant.</source>
<translation>Ansluten till Home Assistant.</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="240"/>
<source>Home Assistant rejected the access token.</source>
<translation>Home Assistant avvisade åtkomsttoken.</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="241"/>
<source>Could not connect to Home Assistant: %1</source>
<translation>Det gick inte att ansluta till Home Assistant: %1</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="258"/>
<source>Loading Home Assistant entities…</source>
<translation>Läser in Home Assistant-entiteter…</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="267"/>
<location filename="../homeassistantclient.cpp" line="402"/>
<source>The Home Assistant credential is no longer valid.</source>
<translation>Autentiseringsuppgiften för Home Assistant är inte längre giltig.</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="268"/>
<source>Could not load Home Assistant entities: %1</source>
<translation>Det gick inte att läsa in Home Assistant-entiteter: %1</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="297"/>
<source>Loaded %1 Home Assistant entities.</source>
<translation>%1 Home Assistant-entiteter har lästs in.</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="386"/>
<source>Loading Home Assistant history…</source>
<translation>Läser in Home Assistant-historik…</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="403"/>
<source>Could not load Home Assistant history: %1</source>
<translation>Det gick inte att läsa in Home Assistant-historik: %1</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="410"/>
<source>Home Assistant history is up to date.</source>
<translation>Home Assistant-historiken är aktuell.</translation>
</message>
</context>
<context>
<name>HomeAssistantSetupDialog</name>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="17"/>
<source>Edit chart</source>
<translation>Redigera diagram</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="17"/>
<source>Connect Home Assistant</source>
<translation>Anslut Home Assistant</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="136"/>
<source>Server</source>
<translation>Server</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="136"/>
<source>Login</source>
<translation>Inloggning</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="136"/>
<source>Charts</source>
<translation>Diagram</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="142"/>
<source>%1. %2</source>
<translation>%1. %2</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="176"/>
<source>Before you begin</source>
<translation>Innan du börjar</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="180"/>
<source>Home Assistant must already be installed and running. A Raspberry Pi with Home Assistant on an SD card is one option; other supported Home Assistant installations work as well.
Before charts can receive data:
• Install or configure an MQTT broker, such as the Mosquitto broker app or a separate broker.
• Connect Home Assistant&apos;s MQTT integration to that broker.
• Connect the charger to the same broker and enable MQTT.
• Enable Home Assistant MQTT auto-discovery in Home Assistant and on the charger.
• Verify that the charger&apos;s entities are visible in Home Assistant.</source>
<translation>Home Assistant måste redan vara installerat och igång. Ett alternativ är en Raspberry Pi med Home Assistant på ett SD-kort; även andra Home Assistant-installationer som stöds fungerar.
Innan diagram kan ta emot data:
• Installera eller konfigurera en MQTT-mäklare, till exempel Mosquitto Broker-appen eller en separat mäklare.
• Anslut Home Assistants MQTT-integration till den mäklaren.
• Anslut laddaren till samma mäklare och aktivera MQTT.
• Aktivera automatisk MQTT-identifiering för Home Assistant i Home Assistant och på laddaren.
• Kontrollera att laddarens entiteter är synliga i Home Assistant.</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="188"/>
<source>Installation guide</source>
<translation>Installationsguide</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="193"/>
<source>MQTT guide</source>
<translation>MQTT-guide</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="201"/>
<source>Enter the address you normally use to open Home Assistant. The app will contact this server directly.</source>
<translation>Ange adressen som du normalt använder för att öppna Home Assistant. Appen kontaktar servern direkt.</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="217"/>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="467"/>
<source>Cancel</source>
<translation>Avbryt</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="220"/>
<source>Next</source>
<translation>Nästa</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="232"/>
<source>Create a long-lived access token in your Home Assistant profile and paste it below. Your Home Assistant password is never entered into this app.</source>
<translation>Skapa en långlivad åtkomsttoken i din Home Assistant-profil och klistra in den nedan. Ditt Home Assistant-lösenord anges aldrig i appen.</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="238"/>
<source>Open Home Assistant profile</source>
<translation>Öppna Home Assistant-profil</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="249"/>
<source>Long-lived access token</source>
<translation>Långlivad åtkomsttoken</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="255"/>
<source>Hide</source>
<translation>Dölj</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="255"/>
<source>Show</source>
<translation>Visa</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="278"/>
<source>Back</source>
<translation>Tillbaka</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="281"/>
<source>Connect</source>
<translation>Anslut</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="294"/>
<source>Create charts and choose exactly which Home Assistant entities each chart should display.</source>
<translation>Skapa diagram och välj exakt vilka Home Assistant-entiteter varje diagram ska visa.</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="307"/>
<source>Change server or access token</source>
<translation>Byt server eller åtkomsttoken</translation>
</message>
<message numerus="yes">
<location filename="../qml/HomeAssistantSetupDialog.qml" line="340"/>
<source>%n entity(s)</source>
<translation>
<numerusform>%n entitet</numerusform>
<numerusform>%n entiteter</numerusform>
</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="345"/>
<source>Edit</source>
<translation>Redigera</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="349"/>
<source>Delete</source>
<translation>Ta bort</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="358"/>
<source>No charts configured yet.</source>
<translation>Inga diagram har konfigurerats ännu.</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="366"/>
<source>Add chart</source>
<translation>Lägg till diagram</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="368"/>
<source>Done</source>
<translation>Klar</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="378"/>
<source>Chart title</source>
<translation>Diagramrubrik</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="385"/>
<source>Search by name, entity ID, unit or device class…</source>
<translation>Sök efter namn, entitets-ID, enhet eller enhetsklass…</translation>
</message>
<message numerus="yes">
<location filename="../qml/HomeAssistantSetupDialog.qml" line="394"/>
<source>%n entity(s) selected</source>
<translation>
<numerusform>%n entitet vald</numerusform>
<numerusform>%n entiteter valda</numerusform>
</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="404"/>
<source>Reload</source>
<translation>Läs in igen</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="459"/>
<source>No matching entities found.</source>
<translation>Inga matchande entiteter hittades.</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="470"/>
<source>Save chart</source>
<translation>Spara diagram</translation>
</message>
</context>
<context>
<name>HotspotPage</name>
<message>
@@ -3011,7 +3274,7 @@
<translation type="vanished">Information</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="235"/>
<location filename="../qml/InformationsTabPage.qml" line="278"/>
<source>Idle</source>
<translation>Viloläge</translation>
</message>
@@ -3024,66 +3287,132 @@
<translation type="vanished">LÄSER IN</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="70"/>
<location filename="../qml/InformationsTabPage.qml" line="78"/>
<source>%1 – %2</source>
<translation>%1 – %2</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="118"/>
<location filename="../qml/InformationsTabPage.qml" line="161"/>
<source>Receiving manufacturer data…</source>
<translation>Tar emot tillverkardata…</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="120"/>
<location filename="../qml/InformationsTabPage.qml" line="163"/>
<source>Loading manufacturer charts…</source>
<translation>Läser in tillverkarens diagram…</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="134"/>
<location filename="../qml/InformationsTabPage.qml" line="177"/>
<source>%1 images</source>
<translation>%1 bilder</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="136"/>
<location filename="../qml/InformationsTabPage.qml" line="179"/>
<source>%1 charts</source>
<translation>%1 diagram</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="138"/>
<location filename="../qml/InformationsTabPage.qml" line="181"/>
<source>Loaded %1</source>
<translation>%1 inläst</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="139"/>
<location filename="../qml/InformationsTabPage.qml" line="182"/>
<source>No information data received</source>
<translation>Ingen informationsdata mottogs</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="141"/>
<location filename="../qml/InformationsTabPage.qml" line="184"/>
<source>The manufacturer cloud returned invalid data.</source>
<translation>Tillverkarens molntjänst returnerade ogiltiga data.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="151"/>
<location filename="../qml/InformationsTabPage.qml" line="194"/>
<source>Requesting manufacturer data…</source>
<translation>Begär tillverkardata…</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="159"/>
<location filename="../qml/InformationsTabPage.qml" line="202"/>
<source>Information</source>
<translation>Information</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="174"/>
<location filename="../qml/InformationsTabPage.qml" line="217"/>
<source>Manufacturer cloud</source>
<translation>Tillverkarens moln</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="331"/>
<source>Connected to Home Assistant</source>
<translation>Ansluten till Home Assistant</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="332"/>
<source>Home Assistant is not configured</source>
<translation>Home Assistant är inte konfigurerat</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="345"/>
<source>Configure</source>
<translation>Konfigurera</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="345"/>
<location filename="../qml/InformationsTabPage.qml" line="476"/>
<source>Set up</source>
<translation>Konfigurera</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="409"/>
<source>Refresh</source>
<translation>Uppdatera</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="459"/>
<source>Connect Home Assistant to display history</source>
<translation>Anslut Home Assistant för att visa historik</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="460"/>
<source>Create your first history chart</source>
<translation>Skapa ditt första historikdiagram</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="467"/>
<source>The setup wizard connects to your server and lets you select the entities to display.</source>
<translation>Installationsguiden ansluter till servern och låter dig välja vilka entiteter som ska visas.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="468"/>
<source>Open the configuration and add a chart with one or more Home Assistant entities.</source>
<translation>Öppna konfigurationen och lägg till ett diagram med en eller flera Home Assistant-entiteter.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="476"/>
<source>Add chart</source>
<translation>Lägg till diagram</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="485"/>
<source>Forget Home Assistant configuration</source>
<translation>Glöm Home Assistant-konfiguration</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="498"/>
<source>Forget Home Assistant?</source>
<translation>Glöm Home Assistant?</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="505"/>
<source>This removes the server address, access token and all chart definitions stored in this app.</source>
<translation>Detta tar bort serveradressen, åtkomsttoken och alla diagramdefinitioner som lagras i appen.</translation>
</message>
<message>
<source>Limited · unreliable · slow</source>
<translation type="vanished">Begränsat · opålitligt · långsamt</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="197"/>
<location filename="../qml/InformationsTabPage.qml" line="240"/>
<source>Your own cloud</source>
<translation>Ditt eget moln</translation>
</message>
@@ -3092,105 +3421,97 @@
<translation type="vanished">Historik · underhållet · snabbt</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="181"/>
<location filename="../qml/InformationsTabPage.qml" line="224"/>
<source>Lacks features · unreliable · slow</source>
<translation>Saknar funktioner · opålitligt · långsamt</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="204"/>
<location filename="../qml/InformationsTabPage.qml" line="247"/>
<source>Historical data · properly maintained · fast</source>
<translation>Historiska data · väl underhållet · snabbt</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="227"/>
<location filename="../qml/InformationsTabPage.qml" line="270"/>
<source>The manufacturer cloud provides basic charts, but can be slow, unavailable or limited to the data selected by the manufacturer.</source>
<translation>Tillverkarens molntjänst erbjuder grundläggande diagram, men kan vara långsam, otillgänglig eller begränsad till data som tillverkaren har valt.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="262"/>
<location filename="../qml/InformationsTabPage.qml" line="305"/>
<source>Download information</source>
<translation>Hämta information</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="272"/>
<location filename="../qml/InformationsTabPage.qml" line="315"/>
<source>Own your charging history</source>
<translation>Äg din laddningshistorik</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="276"/>
<location filename="../qml/InformationsTabPage.qml" line="319"/>
<source>Connect the charger to your own Home Assistant installation for fast, dependable history that remains under your control. You decide how long data is retained and which measurements are recorded.</source>
<translation>Anslut laddaren till din egen Home Assistant-installation för snabb, tillförlitlig historik som förblir under din kontroll. Du bestämmer hur länge data sparas och vilka mätvärden som registreras.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="282"/>
<source>Home Assistant recorder integration is being prepared. The setup below is currently a preview and does not connect yet.</source>
<translation>Integrationen med Home Assistant Recorder förbereds. Inställningen nedan är för närvarande en förhandsvisning och ansluter inte ännu.</translation>
<translation type="vanished">Integrationen med Home Assistant Recorder förbereds. Inställningen nedan är för närvarande en förhandsvisning och ansluter inte ännu.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="289"/>
<source>Set up connection to Home Assistant</source>
<translation>Konfigurera anslutning till Home Assistant</translation>
<translation type="vanished">Konfigurera anslutning till Home Assistant</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="294"/>
<location filename="../qml/InformationsTabPage.qml" line="353"/>
<source>Historical data</source>
<translation>Historiska data</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="302"/>
<location filename="../qml/InformationsTabPage.qml" line="363"/>
<source>Day</source>
<translation>Dag</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="303"/>
<location filename="../qml/InformationsTabPage.qml" line="364"/>
<source>Week</source>
<translation>Vecka</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="304"/>
<location filename="../qml/InformationsTabPage.qml" line="365"/>
<source>Month</source>
<translation>Månad</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="305"/>
<location filename="../qml/InformationsTabPage.qml" line="366"/>
<source>Year</source>
<translation>År</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="323"/>
<location filename="../qml/InformationsTabPage.qml" line="385"/>
<source>Previous</source>
<translation>Föregående</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="335"/>
<location filename="../qml/InformationsTabPage.qml" line="412"/>
<location filename="../qml/InformationsTabPage.qml" line="400"/>
<source>Next</source>
<translation>Nästa</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="359"/>
<source>Home Assistant history will appear here</source>
<translation>Home Assistant-historiken visas här</translation>
<translation type="vanished">Home Assistant-historiken visas här</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="365"/>
<source>After the recorder integration is connected, this view will request measurements for the selected period.</source>
<translation>När Recorder-integrationen har anslutits begär den här vyn mätvärden för den valda perioden.</translation>
<translation type="vanished">När Recorder-integrationen har anslutits begär den här vyn mätvärden för den valda perioden.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="377"/>
<source>Connect Home Assistant</source>
<translation>Anslut Home Assistant</translation>
<translation type="vanished">Anslut Home Assistant</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="387"/>
<source>Enter the address of your Home Assistant server. No connection is made in this preview.</source>
<translation>Ange adressen till din Home Assistant-server. Ingen anslutning görs i denna förhandsvisning.</translation>
<translation type="vanished">Ange adressen till din Home Assistant-server. Ingen anslutning görs i denna förhandsvisning.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="407"/>
<source>Cancel</source>
<translation>Avbryt</translation>
<translation type="vanished">Avbryt</translation>
</message>
<message>
<source>Request started...</source>
+360 -41
View File
@@ -2856,6 +2856,267 @@
<translation>RSSI:</translation>
</message>
</context>
<context>
<name>HomeAssistantClient</name>
<message>
<location filename="../homeassistantclient.cpp" line="196"/>
<source>Enter a valid HTTP or HTTPS Home Assistant address.</source>
<translation>Geçerli bir HTTP veya HTTPS Home Assistant adresi girin.</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="202"/>
<source>Enter a Home Assistant access token.</source>
<translation>Bir Home Assistant erişim belirteci girin.</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="208"/>
<source>Connecting to Home Assistant…</source>
<translation>Home Assistant&#x27;a bağlanılıyor…</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="230"/>
<source>Connected to Home Assistant.</source>
<translation>Home Assistant&#x27;a bağlandı.</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="240"/>
<source>Home Assistant rejected the access token.</source>
<translation>Home Assistant erişim belirtecini reddetti.</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="241"/>
<source>Could not connect to Home Assistant: %1</source>
<translation>Home Assistant&#x27;a bağlanılamadı: %1</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="258"/>
<source>Loading Home Assistant entities…</source>
<translation>Home Assistant varlıkları yükleniyor…</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="267"/>
<location filename="../homeassistantclient.cpp" line="402"/>
<source>The Home Assistant credential is no longer valid.</source>
<translation>Home Assistant kimlik bilgisi artık geçerli değil.</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="268"/>
<source>Could not load Home Assistant entities: %1</source>
<translation>Home Assistant varlıkları yüklenemedi: %1</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="297"/>
<source>Loaded %1 Home Assistant entities.</source>
<translation>%1 Home Assistant varlığı yüklendi.</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="386"/>
<source>Loading Home Assistant history…</source>
<translation>Home Assistant geçmişi yükleniyor…</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="403"/>
<source>Could not load Home Assistant history: %1</source>
<translation>Home Assistant geçmişi yüklenemedi: %1</translation>
</message>
<message>
<location filename="../homeassistantclient.cpp" line="410"/>
<source>Home Assistant history is up to date.</source>
<translation>Home Assistant geçmişi güncel.</translation>
</message>
</context>
<context>
<name>HomeAssistantSetupDialog</name>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="17"/>
<source>Edit chart</source>
<translation>Grafiği düzenle</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="17"/>
<source>Connect Home Assistant</source>
<translation>Home Assistant&#x27;ı bağla</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="136"/>
<source>Server</source>
<translation>Sunucu</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="136"/>
<source>Login</source>
<translation>Oturum açma</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="136"/>
<source>Charts</source>
<translation>Grafikler</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="142"/>
<source>%1. %2</source>
<translation>%1. %2</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="176"/>
<source>Before you begin</source>
<translation>Başlamadan önce</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="180"/>
<source>Home Assistant must already be installed and running. A Raspberry Pi with Home Assistant on an SD card is one option; other supported Home Assistant installations work as well.
Before charts can receive data:
• Install or configure an MQTT broker, such as the Mosquitto broker app or a separate broker.
• Connect Home Assistant&apos;s MQTT integration to that broker.
• Connect the charger to the same broker and enable MQTT.
• Enable Home Assistant MQTT auto-discovery in Home Assistant and on the charger.
• Verify that the charger&apos;s entities are visible in Home Assistant.</source>
<translation>Home Assistant önceden kurulmuş ve çalışıyor olmalıdır. SD kart üzerinde Home Assistant bulunan bir Raspberry Pi seçeneklerden biridir; desteklenen diğer Home Assistant kurulumları da kullanılabilir.
Grafiklerin veri alabilmesi için:
• Mosquitto Broker uygulaması veya ayrı bir aracı gibi bir MQTT aracısı kurun ya da yapılandırın.
• Home Assistant&#x27;ın MQTT entegrasyonunu bu aracıya bağlayın.
• Şarj cihazını aynı aracıya bağlayın ve MQTT&#x27;yi etkinleştirin.
• Home Assistant&#x27;ta ve şarj cihazında Home Assistant MQTT otomatik keşfini etkinleştirin.
• Şarj cihazının varlıklarının Home Assistant&#x27;ta göründüğünü doğrulayın.</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="188"/>
<source>Installation guide</source>
<translation>Kurulum kılavuzu</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="193"/>
<source>MQTT guide</source>
<translation>MQTT kılavuzu</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="201"/>
<source>Enter the address you normally use to open Home Assistant. The app will contact this server directly.</source>
<translation>Home Assistant&#x27;ı açmak için normalde kullandığınız adresi girin. Uygulama bu sunucuyla doğrudan iletişim kuracaktır.</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="217"/>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="467"/>
<source>Cancel</source>
<translation>İptal</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="220"/>
<source>Next</source>
<translation>Sonraki</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="232"/>
<source>Create a long-lived access token in your Home Assistant profile and paste it below. Your Home Assistant password is never entered into this app.</source>
<translation>Home Assistant profilinizde uzun ömürlü bir erişim belirteci oluşturup aşağıya yapıştırın. Home Assistant parolanız bu uygulamaya hiçbir zaman girilmez.</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="238"/>
<source>Open Home Assistant profile</source>
<translation>Home Assistant profilini aç</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="249"/>
<source>Long-lived access token</source>
<translation>Uzun ömürlü erişim belirteci</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="255"/>
<source>Hide</source>
<translation>Gizle</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="255"/>
<source>Show</source>
<translation>Göster</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="278"/>
<source>Back</source>
<translation>Geri</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="281"/>
<source>Connect</source>
<translation>Bağlan</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="294"/>
<source>Create charts and choose exactly which Home Assistant entities each chart should display.</source>
<translation>Grafikler oluşturun ve her grafiğin hangi Home Assistant varlıklarını göstereceğini tam olarak seçin.</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="307"/>
<source>Change server or access token</source>
<translation>Sunucuyu veya erişim belirtecini değiştir</translation>
</message>
<message numerus="yes">
<location filename="../qml/HomeAssistantSetupDialog.qml" line="340"/>
<source>%n entity(s)</source>
<translation>
<numerusform>%n varlık</numerusform>
</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="345"/>
<source>Edit</source>
<translation>Düzenle</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="349"/>
<source>Delete</source>
<translation>Sil</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="358"/>
<source>No charts configured yet.</source>
<translation>Henüz yapılandırılmış grafik yok.</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="366"/>
<source>Add chart</source>
<translation>Grafik ekle</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="368"/>
<source>Done</source>
<translation>Bitti</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="378"/>
<source>Chart title</source>
<translation>Grafik başlığı</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="385"/>
<source>Search by name, entity ID, unit or device class…</source>
<translation>Ada, varlık kimliğine, birime veya cihaz sınıfına göre ara…</translation>
</message>
<message numerus="yes">
<location filename="../qml/HomeAssistantSetupDialog.qml" line="394"/>
<source>%n entity(s) selected</source>
<translation>
<numerusform>%n varlık seçildi</numerusform>
</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="404"/>
<source>Reload</source>
<translation>Yeniden yükle</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="459"/>
<source>No matching entities found.</source>
<translation>Eşleşen varlık bulunamadı.</translation>
</message>
<message>
<location filename="../qml/HomeAssistantSetupDialog.qml" line="470"/>
<source>Save chart</source>
<translation>Grafiği kaydet</translation>
</message>
</context>
<context>
<name>HotspotPage</name>
<message>
@@ -3011,7 +3272,7 @@
<translation type="vanished">Bilgiler</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="235"/>
<location filename="../qml/InformationsTabPage.qml" line="278"/>
<source>Idle</source>
<translation>Boşta</translation>
</message>
@@ -3024,66 +3285,132 @@
<translation type="vanished">YÜKLENİYOR</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="70"/>
<location filename="../qml/InformationsTabPage.qml" line="78"/>
<source>%1 – %2</source>
<translation>%1 – %2</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="118"/>
<location filename="../qml/InformationsTabPage.qml" line="161"/>
<source>Receiving manufacturer data…</source>
<translation>Üretici verileri alınıyor…</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="120"/>
<location filename="../qml/InformationsTabPage.qml" line="163"/>
<source>Loading manufacturer charts…</source>
<translation>Üretici grafikleri yükleniyor…</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="134"/>
<location filename="../qml/InformationsTabPage.qml" line="177"/>
<source>%1 images</source>
<translation>%1 resim</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="136"/>
<location filename="../qml/InformationsTabPage.qml" line="179"/>
<source>%1 charts</source>
<translation>%1 grafik</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="138"/>
<location filename="../qml/InformationsTabPage.qml" line="181"/>
<source>Loaded %1</source>
<translation>%1 yüklendi</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="139"/>
<location filename="../qml/InformationsTabPage.qml" line="182"/>
<source>No information data received</source>
<translation>Bilgi verisi alınmadı</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="141"/>
<location filename="../qml/InformationsTabPage.qml" line="184"/>
<source>The manufacturer cloud returned invalid data.</source>
<translation>Üretici bulutu geçersiz veri döndürdü.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="151"/>
<location filename="../qml/InformationsTabPage.qml" line="194"/>
<source>Requesting manufacturer data…</source>
<translation>Üretici verileri isteniyor…</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="159"/>
<location filename="../qml/InformationsTabPage.qml" line="202"/>
<source>Information</source>
<translation>Bilgi</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="174"/>
<location filename="../qml/InformationsTabPage.qml" line="217"/>
<source>Manufacturer cloud</source>
<translation>Üretici bulutu</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="331"/>
<source>Connected to Home Assistant</source>
<translation>Home Assistant&#x27;a bağlı</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="332"/>
<source>Home Assistant is not configured</source>
<translation>Home Assistant yapılandırılmadı</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="345"/>
<source>Configure</source>
<translation>Yapılandır</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="345"/>
<location filename="../qml/InformationsTabPage.qml" line="476"/>
<source>Set up</source>
<translation>Kur</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="409"/>
<source>Refresh</source>
<translation>Yenile</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="459"/>
<source>Connect Home Assistant to display history</source>
<translation>Geçmişi görüntülemek için Home Assistant&#x27;ı bağlayın</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="460"/>
<source>Create your first history chart</source>
<translation>İlk geçmiş grafiğinizi oluşturun</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="467"/>
<source>The setup wizard connects to your server and lets you select the entities to display.</source>
<translation>Kurulum sihirbazı sunucunuza bağlanır ve görüntülenecek varlıkları seçmenizi sağlar.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="468"/>
<source>Open the configuration and add a chart with one or more Home Assistant entities.</source>
<translation>Yapılandırmayı açın ve bir veya daha fazla Home Assistant varlığı içeren bir grafik ekleyin.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="476"/>
<source>Add chart</source>
<translation>Grafik ekle</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="485"/>
<source>Forget Home Assistant configuration</source>
<translation>Home Assistant yapılandırmasını unut</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="498"/>
<source>Forget Home Assistant?</source>
<translation>Home Assistant unutulsun mu?</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="505"/>
<source>This removes the server address, access token and all chart definitions stored in this app.</source>
<translation>Bu işlem sunucu adresini, erişim belirtecini ve bu uygulamada saklanan tüm grafik tanımlarını kaldırır.</translation>
</message>
<message>
<source>Limited · unreliable · slow</source>
<translation type="vanished">Kısıtlı · güvenilmez · yavaş</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="197"/>
<location filename="../qml/InformationsTabPage.qml" line="240"/>
<source>Your own cloud</source>
<translation>Kendi bulutunuz</translation>
</message>
@@ -3092,105 +3419,97 @@
<translation type="vanished">Geçmiş · bakımlı · hızlı</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="181"/>
<location filename="../qml/InformationsTabPage.qml" line="224"/>
<source>Lacks features · unreliable · slow</source>
<translation>Eksik özellikler · güvenilmez · yavaş</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="204"/>
<location filename="../qml/InformationsTabPage.qml" line="247"/>
<source>Historical data · properly maintained · fast</source>
<translation>Geçmiş veriler · iyi bakımlı · hızlı</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="227"/>
<location filename="../qml/InformationsTabPage.qml" line="270"/>
<source>The manufacturer cloud provides basic charts, but can be slow, unavailable or limited to the data selected by the manufacturer.</source>
<translation>Üretici bulutu temel grafikler sağlar, ancak yavaş veya erişilemez olabilir ya da üreticinin seçtiği verilerle sınırlı kalabilir.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="262"/>
<location filename="../qml/InformationsTabPage.qml" line="305"/>
<source>Download information</source>
<translation>Bilgileri indir</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="272"/>
<location filename="../qml/InformationsTabPage.qml" line="315"/>
<source>Own your charging history</source>
<translation>Şarj geçmişiniz size ait olsun</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="276"/>
<location filename="../qml/InformationsTabPage.qml" line="319"/>
<source>Connect the charger to your own Home Assistant installation for fast, dependable history that remains under your control. You decide how long data is retained and which measurements are recorded.</source>
<translation>Şarj cihazını kendi Home Assistant kurulumunuza bağlayarak kontrolünüz altında kalan hızlı ve güvenilir bir geçmiş elde edin. Verilerin ne kadar süre saklanacağına ve hangi ölçümlerin kaydedileceğine siz karar verin.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="282"/>
<source>Home Assistant recorder integration is being prepared. The setup below is currently a preview and does not connect yet.</source>
<translation>Home Assistant Recorder entegrasyonu hazırlanmaktadır. Aşağıdaki kurulum şu anda yalnızca bir ön izlemedir ve henüz bağlantı kurmaz.</translation>
<translation type="vanished">Home Assistant Recorder entegrasyonu hazırlanmaktadır. Aşağıdaki kurulum şu anda yalnızca bir ön izlemedir ve henüz bağlantı kurmaz.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="289"/>
<source>Set up connection to Home Assistant</source>
<translation>Home Assistant bağlantısını kur</translation>
<translation type="vanished">Home Assistant bağlantısını kur</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="294"/>
<location filename="../qml/InformationsTabPage.qml" line="353"/>
<source>Historical data</source>
<translation>Geçmiş veriler</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="302"/>
<location filename="../qml/InformationsTabPage.qml" line="363"/>
<source>Day</source>
<translation>Gün</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="303"/>
<location filename="../qml/InformationsTabPage.qml" line="364"/>
<source>Week</source>
<translation>Hafta</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="304"/>
<location filename="../qml/InformationsTabPage.qml" line="365"/>
<source>Month</source>
<translation>Ay</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="305"/>
<location filename="../qml/InformationsTabPage.qml" line="366"/>
<source>Year</source>
<translation>Yıl</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="323"/>
<location filename="../qml/InformationsTabPage.qml" line="385"/>
<source>Previous</source>
<translation>Önceki</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="335"/>
<location filename="../qml/InformationsTabPage.qml" line="412"/>
<location filename="../qml/InformationsTabPage.qml" line="400"/>
<source>Next</source>
<translation>Sonraki</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="359"/>
<source>Home Assistant history will appear here</source>
<translation>Home Assistant geçmişi burada görünecek</translation>
<translation type="vanished">Home Assistant geçmişi burada görünecek</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="365"/>
<source>After the recorder integration is connected, this view will request measurements for the selected period.</source>
<translation>Recorder entegrasyonu bağlandıktan sonra bu görünüm seçilen dönem için ölçümleri isteyecektir.</translation>
<translation type="vanished">Recorder entegrasyonu bağlandıktan sonra bu görünüm seçilen dönem için ölçümleri isteyecektir.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="377"/>
<source>Connect Home Assistant</source>
<translation>Home Assistant&apos;ı bağla</translation>
<translation type="vanished">Home Assistant&apos;ı bağla</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="387"/>
<source>Enter the address of your Home Assistant server. No connection is made in this preview.</source>
<translation>Home Assistant sunucunuzun adresini girin. Bu ön izlemede bağlantı kurulmaz.</translation>
<translation type="vanished">Home Assistant sunucunuzun adresini girin. Bu ön izlemede bağlantı kurulmaz.</translation>
</message>
<message>
<location filename="../qml/InformationsTabPage.qml" line="407"/>
<source>Cancel</source>
<translation>İptal</translation>
<translation type="vanished">İptal</translation>
</message>
<message>
<source>Request started...</source>
+47 -8
View File
@@ -35,6 +35,15 @@ AnimatedStackView {
arrayLength(categoryPowers.value),
customCategoryIcons.exists
? 6 + arrayLength(customCategoryIcons.value) : 0)
property var activeCategories: ({})
readonly property var visibleCategoryIndexes: {
const result = []
for (let i = 0; i < categoryCount; ++i) {
if (activeCategories[i] === true)
result.push(i)
}
return result
}
function arrayLength(value) {
return value !== null && value !== undefined && value.length !== undefined
@@ -49,11 +58,37 @@ AnimatedStackView {
function categorySeriesDefinitions() {
const result = []
for (let i = 0; i < categoryCount; ++i)
result.push({name: categoryName(i)})
for (let i = 0; i < visibleCategoryIndexes.length; ++i)
result.push({name: categoryName(visibleCategoryIndexes[i])})
return result
}
function categorySeriesValues() {
const powers = categoryPowers.value || []
const result = []
for (let i = 0; i < visibleCategoryIndexes.length; ++i)
result.push(powers[visibleCategoryIndexes[i]])
return result
}
function rememberActiveCategories(powers) {
if (!powers || powers.length === undefined)
return
const updated = Object.assign({}, activeCategories)
let changed = false
for (let i = 0; i < powers.length; ++i) {
const power = Number(powers[i])
if (isFinite(power) && Math.abs(power) > 1
&& updated[i] !== true) {
updated[i] = true
changed = true
}
}
if (changed)
activeCategories = updated
}
RowLayout {
Layout.fillWidth: true
@@ -101,6 +136,8 @@ AnimatedStackView {
id: categoryPowers
deviceConnection: theDeviceConnection
apiKey: "ccp"
onValueChanged: controllerPage.rememberActiveCategories(value)
Component.onCompleted: controllerPage.rememberActiveCategories(value)
}
ApiKeyValueHelper {
@@ -110,13 +147,14 @@ AnimatedStackView {
}
Repeater {
model: controllerPage.categoryCount
model: controllerPage.visibleCategoryIndexes
Pane {
required property int index
required property int modelData
readonly property int categoryIndex: modelData
property var power: categoryPowers.value
&& categoryPowers.value.length > index
? categoryPowers.value[index] : null
&& categoryPowers.value.length > categoryIndex
? categoryPowers.value[categoryIndex] : null
Layout.fillWidth: true
Layout.preferredWidth: gridLayout.width / 3
@@ -133,7 +171,7 @@ AnimatedStackView {
Text {
Layout.fillWidth: true
text: controllerPage.categoryName(index)
text: controllerPage.categoryName(categoryIndex)
}
Text {
@@ -149,6 +187,7 @@ AnimatedStackView {
SettingsCard {
visible: categoryPowers.exists
&& controllerPage.visibleCategoryIndexes.length > 0
Layout.fillWidth: true
LiveHistoryChart {
@@ -156,7 +195,7 @@ AnimatedStackView {
unit: qsTr("W")
historyMilliseconds: 60000
seriesDefinitions: controllerPage.categorySeriesDefinitions()
values: categoryPowers.value || []
values: controllerPage.categorySeriesValues()
}
}
@@ -0,0 +1,479 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import EVChargerApp
CenteredDialog {
id: dialog
property int wizardStep: 0
required property HomeAssistantClient client
property int editingChartIndex: -1
property var selectedEntityIds: []
property var originalEntityConfigurations: []
property int selectionRevision: 0
property bool tokenVisible: false
title: wizardStep === 3 ? qsTr("Edit chart") : qsTr("Connect Home Assistant")
modal: true
focus: true
width: Math.min(620, Overlay.overlay.width - 20)
height: Math.min(760, Overlay.overlay.height - 20)
closePolicy: Popup.CloseOnEscape
function selected(entityId) {
const unusedRevision = selectionRevision
return selectedEntityIds.indexOf(entityId) >= 0
}
function setSelected(entityId, enabled) {
const values = selectedEntityIds.slice()
const index = values.indexOf(entityId)
if (enabled && index < 0)
values.push(entityId)
else if (!enabled && index >= 0)
values.splice(index, 1)
selectedEntityIds = values
++selectionRevision
}
function editChart(index) {
editingChartIndex = index
const chart = dialog.client.charts[index]
chartTitleInput.text = chart && chart.title ? chart.title : ""
originalEntityConfigurations = chart && chart.entities
? chart.entities.slice() : []
const ids = []
for (let i = 0; i < originalEntityConfigurations.length; ++i)
ids.push(originalEntityConfigurations[i].entityId)
selectedEntityIds = ids
++selectionRevision
entitySearchInput.text = ""
dialog.client.entitySearch = ""
wizardStep = 3
if (!dialog.client.entitiesLoading)
dialog.client.loadEntities()
}
function newChart() {
editingChartIndex = -1
chartTitleInput.text = ""
originalEntityConfigurations = []
selectedEntityIds = []
++selectionRevision
entitySearchInput.text = ""
dialog.client.entitySearch = ""
wizardStep = 3
if (!dialog.client.entitiesLoading)
dialog.client.loadEntities()
}
function saveChart() {
const entities = []
for (let i = 0; i < selectedEntityIds.length; ++i) {
const entityId = selectedEntityIds[i]
let saved = undefined
for (let j = 0; j < originalEntityConfigurations.length; ++j) {
if (originalEntityConfigurations[j].entityId === entityId) {
saved = originalEntityConfigurations[j]
break
}
}
entities.push(saved || { entityId: entityId })
}
const charts = dialog.client.charts.slice()
const chart = {
id: editingChartIndex >= 0 && charts[editingChartIndex].id
? charts[editingChartIndex].id
: Date.now().toString(36),
title: chartTitleInput.text.trim(),
entities: entities
}
if (editingChartIndex >= 0)
charts[editingChartIndex] = chart
else
charts.push(chart)
dialog.client.saveCharts(charts)
wizardStep = 2
}
function removeChart(index) {
const charts = dialog.client.charts.slice()
charts.splice(index, 1)
dialog.client.saveCharts(charts)
}
onOpened: {
urlInput.text = dialog.client.baseUrl || ""
tokenInput.text = dialog.client.accessTokenForEditing()
wizardStep = dialog.client.configured ? 2 : 0
if (dialog.client.configured)
dialog.client.loadEntities()
}
onClosed: {
dialog.client.entitySearch = ""
entitySearchInput.text = ""
}
Connections {
target: dialog.client
function onConnectionTestFinished(success) {
if (success)
dialog.wizardStep = 2
}
}
contentItem: ColumnLayout {
spacing: 10
RowLayout {
Layout.fillWidth: true
visible: dialog.wizardStep < 3
Repeater {
model: [qsTr("Server"), qsTr("Login"), qsTr("Charts")]
Label {
required property int index
required property string modelData
Layout.fillWidth: true
text: qsTr("%1. %2").arg(index + 1).arg(modelData)
font.bold: index === dialog.wizardStep
color: index <= dialog.wizardStep
? palette.text : palette.placeholderText
horizontalAlignment: Text.AlignHCenter
}
}
}
Rectangle {
Layout.fillWidth: true
visible: dialog.wizardStep < 3
Layout.preferredHeight: 1
color: dialog.palette.mid
}
StackLayout {
Layout.fillWidth: true
Layout.fillHeight: true
currentIndex: dialog.wizardStep
ColumnLayout {
spacing: 12
ScrollView {
Layout.fillWidth: true
Layout.fillHeight: true
clip: true
ColumnLayout {
width: parent.availableWidth
spacing: 10
SettingsCard {
SettingsSectionLabel { text: qsTr("Before you begin") }
Text {
Layout.fillWidth: true
text: qsTr("Home Assistant must already be installed and running. A Raspberry Pi with Home Assistant on an SD card is one option; other supported Home Assistant installations work as well.\n\nBefore charts can receive data:\n• Install or configure an MQTT broker, such as the Mosquitto broker app or a separate broker.\n• Connect Home Assistant's MQTT integration to that broker.\n• Connect the charger to the same broker and enable MQTT.\n• Enable Home Assistant MQTT auto-discovery in Home Assistant and on the charger.\n• Verify that the charger's entities are visible in Home Assistant.")
wrapMode: Text.Wrap
}
RowLayout {
Layout.fillWidth: true
Button {
Layout.fillWidth: true
text: qsTr("Installation guide")
onClicked: Qt.openUrlExternally("https://www.home-assistant.io/installation/")
}
Button {
Layout.fillWidth: true
text: qsTr("MQTT guide")
onClicked: Qt.openUrlExternally("https://www.home-assistant.io/integrations/mqtt/")
}
}
}
Text {
Layout.fillWidth: true
text: qsTr("Enter the address you normally use to open Home Assistant. The app will contact this server directly.")
wrapMode: Text.Wrap
}
TextField {
id: urlInput
Layout.fillWidth: true
placeholderText: "https://homeassistant.local:8123"
inputMethodHints: Qt.ImhUrlCharactersOnly
selectByMouse: true
}
}
}
RowLayout {
Layout.fillWidth: true
Button { text: qsTr("Cancel"); onClicked: dialog.close() }
Item { Layout.fillWidth: true }
Button {
text: qsTr("Next")
enabled: urlInput.text.trim().length > 0
onClicked: dialog.wizardStep = 1
}
}
}
ColumnLayout {
spacing: 10
Text {
Layout.fillWidth: true
text: qsTr("Create a long-lived access token in your Home Assistant profile and paste it below. Your Home Assistant password is never entered into this app.")
wrapMode: Text.Wrap
}
Button {
Layout.fillWidth: true
text: qsTr("Open Home Assistant profile")
onClicked: Qt.openUrlExternally(urlInput.text.trim().replace(/\/$/, "")
+ "/profile/security")
}
RowLayout {
Layout.fillWidth: true
TextField {
id: tokenInput
Layout.fillWidth: true
placeholderText: qsTr("Long-lived access token")
echoMode: dialog.tokenVisible ? TextInput.Normal : TextInput.Password
selectByMouse: true
}
ToolButton {
text: dialog.tokenVisible ? qsTr("Hide") : qsTr("Show")
onClicked: dialog.tokenVisible = !dialog.tokenVisible
}
}
Label {
Layout.fillWidth: true
visible: dialog.client.errorText.length > 0
text: dialog.client.errorText
color: palette.brightText
wrapMode: Text.Wrap
}
BusyIndicator {
Layout.alignment: Qt.AlignHCenter
visible: dialog.client.busy
running: visible
}
Item { Layout.fillHeight: true }
RowLayout {
Layout.fillWidth: true
Button { text: qsTr("Back"); onClicked: dialog.wizardStep = 0 }
Item { Layout.fillWidth: true }
Button {
text: qsTr("Connect")
enabled: !dialog.client.busy && tokenInput.text.trim().length > 0
onClicked: dialog.client.testAndSaveConnection(urlInput.text,
tokenInput.text)
}
}
}
ColumnLayout {
spacing: 8
Text {
Layout.fillWidth: true
text: qsTr("Create charts and choose exactly which Home Assistant entities each chart should display.")
wrapMode: Text.Wrap
}
Label {
Layout.fillWidth: true
text: dialog.client.baseUrl
elide: Text.ElideMiddle
color: palette.placeholderText
}
Button {
Layout.fillWidth: true
text: qsTr("Change server or access token")
onClicked: dialog.wizardStep = 0
}
ScrollView {
Layout.fillWidth: true
Layout.fillHeight: true
clip: true
ListView {
spacing: 6
model: dialog.client.charts
delegate: WhiteBox {
required property int index
required property var modelData
width: ListView.view.width
implicitHeight: chartRow.implicitHeight + 16
RowLayout {
id: chartRow
anchors.fill: parent
anchors.margins: 8
ColumnLayout {
Layout.fillWidth: true
Label {
Layout.fillWidth: true
text: modelData.title
font.bold: true
elide: Text.ElideRight
}
Label {
text: qsTr("%n entity(s)", "", modelData.entities.length)
color: palette.placeholderText
}
}
ToolButton {
text: qsTr("Edit")
onClicked: dialog.editChart(index)
}
ToolButton {
text: qsTr("Delete")
onClicked: dialog.removeChart(index)
}
}
}
Label {
anchors.centerIn: parent
visible: parent.count === 0
text: qsTr("No charts configured yet.")
color: palette.placeholderText
}
}
}
RowLayout {
Layout.fillWidth: true
Button { text: qsTr("Add chart"); onClicked: dialog.newChart() }
Item { Layout.fillWidth: true }
Button { text: qsTr("Done"); onClicked: dialog.close() }
}
}
ColumnLayout {
spacing: 7
TextField {
id: chartTitleInput
Layout.fillWidth: true
placeholderText: qsTr("Chart title")
selectByMouse: true
}
TextField {
id: entitySearchInput
Layout.fillWidth: true
placeholderText: qsTr("Search by name, entity ID, unit or device class…")
selectByMouse: true
onTextChanged: dialog.client.entitySearch = text
}
RowLayout {
Layout.fillWidth: true
Label {
Layout.fillWidth: true
text: qsTr("%n entity(s) selected", "", dialog.selectedEntityIds.length)
font.bold: true
}
BusyIndicator {
implicitWidth: 28
implicitHeight: 28
visible: dialog.client.entitiesLoading
running: visible
}
ToolButton {
text: qsTr("Reload")
enabled: !dialog.client.entitiesLoading
onClicked: dialog.client.loadEntities()
}
}
ListView {
Layout.fillWidth: true
Layout.fillHeight: true
clip: true
spacing: 1
model: dialog.client.entitiesModel
delegate: CheckDelegate {
id: entityDelegate
required property string entityId
required property string name
required property string unit
required property string deviceClass
required property string currentValue
width: ListView.view.width
checked: dialog.selected(entityId)
onClicked: dialog.setSelected(entityId, checked)
contentItem: Column {
spacing: 1
Label {
width: parent.width
text: entityDelegate.name
font.bold: true
elide: Text.ElideRight
}
Label {
width: parent.width
text: {
let details = entityDelegate.entityId
if (entityDelegate.currentValue.length > 0)
details += " · " + entityDelegate.currentValue
if (entityDelegate.unit.length > 0)
details += " " + entityDelegate.unit
return details
}
color: palette.placeholderText
font.pixelSize: 11
elide: Text.ElideMiddle
}
}
}
Label {
anchors.centerIn: parent
visible: parent.count === 0 && !dialog.client.entitiesLoading
width: parent.width - 20
text: dialog.client.errorText.length > 0
? dialog.client.errorText
: qsTr("No matching entities found.")
horizontalAlignment: Text.AlignHCenter
wrapMode: Text.Wrap
}
}
RowLayout {
Layout.fillWidth: true
Button { text: qsTr("Cancel"); onClicked: dialog.wizardStep = 2 }
Item { Layout.fillWidth: true }
Button {
text: qsTr("Save chart")
enabled: chartTitleInput.text.trim().length > 0
&& dialog.selectedEntityIds.length > 0
onClicked: dialog.saveChart()
}
}
}
}
}
}
+161 -51
View File
@@ -11,13 +11,21 @@ ScrollableTabPage {
property real chartCurrentTime: 0
property string historyRange: "day"
property int historyOffset: 0
property string homeAssistantUrl
HomeAssistantClient {
id: homeAssistant
settings: theSettings
}
function backPressed() {
if (homeAssistantDialog.opened) {
homeAssistantDialog.close()
return true
}
if (forgetHomeAssistantDialog.opened) {
forgetHomeAssistantDialog.close()
return true
}
return false
}
@@ -45,6 +53,18 @@ ScrollableTabPage {
}
}
function manufacturerImageSource(value) {
if (value === null || value === undefined)
return ""
const sourceText = String(value)
if (sourceText.indexOf("data:") === 0)
return sourceText
if (sourceText.trim().indexOf("<svg") === 0
|| sourceText.trim().indexOf("<?xml") === 0)
return "data:image/svg+xml;utf8," + encodeURIComponent(sourceText)
return sourceText
}
function historyDate() {
const date = new Date()
if (historyRange === "day")
@@ -78,6 +98,43 @@ ScrollableTabPage {
function selectHistoryRange(range) {
historyRange = range
historyOffset = 0
homeAssistant.requestHistory(historyRange, historyOffset)
}
function refreshHomeAssistantHistory() {
if (cloudTabs.currentIndex === 1 && homeAssistant.configured)
homeAssistant.requestHistory(historyRange, historyOffset)
}
Component.onCompleted: {
if (homeAssistant.configured)
homeAssistant.loadEntities()
}
Connections {
target: homeAssistant
function onConfigurationChanged() {
if (homeAssistant.configured) {
homeAssistant.loadEntities()
page.refreshHomeAssistantHistory()
}
}
function onChartsChanged() {
page.refreshHomeAssistantHistory()
}
function onEntitiesLoadingChanged() {
if (!homeAssistant.entitiesLoading)
page.refreshHomeAssistantHistory()
}
}
Timer {
interval: 60000
repeat: true
running: cloudTabs.currentIndex === 1 && homeAssistant.configured
&& page.historyOffset === 0
onTriggered: page.refreshHomeAssistantHistory()
}
ApiKeyValueHelper {
@@ -240,9 +297,14 @@ ScrollableTabPage {
id: imagesRepeater
Image {
required property var modelData
Layout.fillWidth: true
source: "data:image/svg+xml;utf8," + modelData
Layout.preferredHeight: implicitWidth > 0 && implicitHeight > 0
? width * implicitHeight / implicitWidth : 220
source: page.manufacturerImageSource(modelData)
fillMode: Image.PreserveAspectFit
asynchronous: true
}
}
@@ -277,24 +339,42 @@ ScrollableTabPage {
wrapMode: Text.Wrap
}
Text {
RowLayout {
Layout.fillWidth: true
text: qsTr("Home Assistant recorder integration is being prepared. The setup below is currently a preview and does not connect yet.")
wrapMode: Text.Wrap
color: AppTheme.sectionLabelColor
}
Button {
Layout.fillWidth: true
text: qsTr("Set up connection to Home Assistant")
onClicked: homeAssistantDialog.open()
ColumnLayout {
Layout.fillWidth: true
Label {
Layout.fillWidth: true
text: homeAssistant.configured
? qsTr("Connected to Home Assistant")
: qsTr("Home Assistant is not configured")
font.bold: true
}
Label {
Layout.fillWidth: true
visible: homeAssistant.configured
text: homeAssistant.baseUrl
color: palette.placeholderText
elide: Text.ElideMiddle
}
}
Button {
text: homeAssistant.configured ? qsTr("Configure") : qsTr("Set up")
onClicked: homeAssistantDialog.open()
}
}
}
SettingsSectionLabel { text: qsTr("Historical data") }
SettingsSectionLabel {
visible: homeAssistant.configured && homeAssistant.charts.length > 0
text: qsTr("Historical data")
}
RowLayout {
Layout.fillWidth: true
visible: homeAssistant.configured && homeAssistant.charts.length > 0
spacing: 2
Repeater {
@@ -318,10 +398,14 @@ ScrollableTabPage {
RowLayout {
Layout.fillWidth: true
visible: homeAssistant.configured && homeAssistant.charts.length > 0
Button {
text: qsTr("Previous")
onClicked: --page.historyOffset
onClicked: {
--page.historyOffset
page.refreshHomeAssistantHistory()
}
}
Label {
@@ -334,12 +418,46 @@ ScrollableTabPage {
Button {
text: qsTr("Next")
enabled: page.historyOffset < 0
onClicked: ++page.historyOffset
onClicked: {
++page.historyOffset
page.refreshHomeAssistantHistory()
}
}
ToolButton {
text: qsTr("Refresh")
enabled: !homeAssistant.historyLoading
onClicked: page.refreshHomeAssistantHistory()
}
}
BusyIndicator {
Layout.alignment: Qt.AlignHCenter
visible: homeAssistant.historyLoading
running: visible
}
Label {
Layout.fillWidth: true
visible: homeAssistant.errorText.length > 0
text: homeAssistant.errorText
color: palette.brightText
wrapMode: Text.Wrap
}
Repeater {
model: homeAssistant.historyPanels
InformationChartPanel {
required property var modelData
panelData: modelData
currentTime: homeAssistant.historyCurrentTime
}
}
WhiteBox {
Layout.fillWidth: true
visible: !homeAssistant.configured || homeAssistant.charts.length === 0
implicitHeight: historyPlaceholder.implicitHeight + 30
ColumnLayout {
@@ -356,63 +474,55 @@ ScrollableTabPage {
SettingsLabel {
Layout.fillWidth: true
text: qsTr("Home Assistant history will appear here")
text: !homeAssistant.configured
? qsTr("Connect Home Assistant to display history")
: qsTr("Create your first history chart")
horizontalAlignment: Text.AlignHCenter
}
Text {
Layout.fillWidth: true
text: qsTr("After the recorder integration is connected, this view will request measurements for the selected period.")
text: !homeAssistant.configured
? qsTr("The setup wizard connects to your server and lets you select the entities to display.")
: qsTr("Open the configuration and add a chart with one or more Home Assistant entities.")
wrapMode: Text.Wrap
horizontalAlignment: Text.AlignHCenter
color: AppTheme.sectionLabelColor
}
Button {
Layout.alignment: Qt.AlignHCenter
text: !homeAssistant.configured ? qsTr("Set up") : qsTr("Add chart")
onClicked: homeAssistantDialog.open()
}
}
}
Button {
Layout.fillWidth: true
visible: homeAssistant.configured
text: qsTr("Forget Home Assistant configuration")
onClicked: forgetHomeAssistantDialog.open()
}
}
}
CenteredDialog {
HomeAssistantSetupDialog {
id: homeAssistantDialog
title: qsTr("Connect Home Assistant")
modal: true
focus: true
width: parent.width
client: homeAssistant
}
CenteredDialog {
id: forgetHomeAssistantDialog
title: qsTr("Forget Home Assistant?")
standardButtons: Dialog.Cancel | Dialog.Ok
onAccepted: homeAssistant.clearConfiguration()
contentItem: ColumnLayout {
spacing: 12
Text {
Layout.fillWidth: true
text: qsTr("Enter the address of your Home Assistant server. No connection is made in this preview.")
wrapMode: Text.Wrap
}
TextField {
id: homeAssistantUrlInput
Layout.fillWidth: true
Layout.minimumWidth: 260
placeholderText: "https://homeassistant.local:8123"
text: page.homeAssistantUrl
inputMethodHints: Qt.ImhUrlCharactersOnly
onTextChanged: page.homeAssistantUrl = text
}
RowLayout {
Layout.fillWidth: true
Item { Layout.fillWidth: true }
Button {
text: qsTr("Cancel")
onClicked: homeAssistantDialog.close()
}
Button {
text: qsTr("Next")
enabled: homeAssistantUrlInput.text.trim().length > 0
onClicked: {}
}
text: qsTr("This removes the server address, access token and all chart definitions stored in this app.")
wrapMode: Text.Wrap
}
}
}
+1
View File
@@ -50,6 +50,7 @@ EVChargerApp 1.0 GridPage.qml
EVChargerApp 1.0 GroundCheckPage.qml
EVChargerApp 1.0 HardwareInformationPage.qml
EVChargerApp 1.0 HotspotPage.qml
EVChargerApp 1.0 HomeAssistantSetupDialog.qml
EVChargerApp 1.0 InformationsTabPage.qml
EVChargerApp 1.0 InformationChartPanel.qml
EVChargerApp 1.0 IndexedEditValueItem.qml