This commit is contained in:
@@ -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
|
||||
|
||||
@@ -32,4 +32,5 @@ public:
|
||||
|
||||
signals:
|
||||
void uiLanguageChanged(QLocale::Language uiLanguage);
|
||||
void homeAssistantConfigurationChanged();
|
||||
};
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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
@@ -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'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'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
@@ -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'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'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>
|
||||
|
||||
@@ -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
@@ -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'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'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
@@ -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'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'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
@@ -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'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'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
@@ -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'a bağlanılıyor…</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../homeassistantclient.cpp" line="230"/>
|
||||
<source>Connected to Home Assistant.</source>
|
||||
<translation>Home Assistant'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'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'ı 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'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'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'ın MQTT entegrasyonunu bu aracıya bağlayın.
|
||||
• Şarj cihazını aynı aracıya bağlayın ve MQTT'yi etkinleştirin.
|
||||
• Home Assistant'ta ve şarj cihazında Home Assistant MQTT otomatik keşfini etkinleştirin.
|
||||
• Şarj cihazının varlıklarının Home Assistant'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'ı 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'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'ı 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'ı bağla</translation>
|
||||
<translation type="vanished">Home Assistant'ı 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>
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user