From 3bf0f9a3d4574d9467d405fbeeb19ff4c10c5162 Mon Sep 17 00:00:00 2001 From: Boernsman Date: Mon, 8 Feb 2021 13:59:12 +0100 Subject: [PATCH] added heos redicovery on disconnect --- denon/heos.cpp | 54 +-- denon/heos.h | 3 +- denon/integrationplugindenon.cpp | 181 ++++++--- denon/integrationplugindenon.h | 3 + denon/integrationplugindenon.json | 7 - ...cd758269-dbbb-4ef0-80ab-48bd9a8a2765-de.ts | 348 +++++++++--------- ...58269-dbbb-4ef0-80ab-48bd9a8a2765-en_US.ts | 348 +++++++++--------- 7 files changed, 505 insertions(+), 439 deletions(-) diff --git a/denon/heos.cpp b/denon/heos.cpp index f82fab2e..b0ebb618 100644 --- a/denon/heos.cpp +++ b/denon/heos.cpp @@ -44,28 +44,31 @@ Heos::Heos(const QHostAddress &hostAddress, QObject *parent) : QObject(parent), m_hostAddress(hostAddress) { + qCDebug(dcDenon()) << "Heos: Creating heos connection" << m_hostAddress; m_socket = new QTcpSocket(this); - connect(m_socket, &QTcpSocket::stateChanged, this, &Heos::onStateChanged); + connect(m_socket, &QTcpSocket::connected, this, &Heos::onConnected); + connect(m_socket, &QTcpSocket::disconnected, this, &Heos::onDisconnected); connect(m_socket, &QTcpSocket::readyRead, this, &Heos::readData); connect(m_socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onError(QAbstractSocket::SocketError))); m_reconnectTimer = new QTimer(this); m_reconnectTimer->setInterval(5000); connect(m_reconnectTimer, &QTimer::timeout, this, [this]{ + qCDebug(dcDenon()) << "Heos: Reconnect timer timeout, trying to connect to" << m_hostAddress.toString(); connectDevice(); }); } Heos::~Heos() { - m_socket->close(); + qCDebug(dcDenon()) << "Heos: Deleting heos connection" << m_hostAddress; } void Heos::connectDevice() { if (m_socket->state() == QAbstractSocket::ConnectingState) { - return; + return; } m_socket->connectToHost(m_hostAddress, 1255); } @@ -75,6 +78,21 @@ bool Heos::connected() return m_socket->isOpen(); } +void Heos::setAddress(QHostAddress address) +{ + qCDebug(dcDenon()) << "Heos: Set address" << address.toString(); + if (address != m_hostAddress) { + m_hostAddress = address; + m_socket->disconnectFromHost(); + // Reconnect after the disconnect event has been emitted + } +} + +QHostAddress Heos::getAddress() +{ + return m_hostAddress; +} + void Heos::disconnectDevice() { @@ -532,24 +550,18 @@ quint32 Heos::playUrl(int playerId, const QUrl &mediaUrl) return sequence; } -void Heos::onStateChanged(QAbstractSocket::SocketState state) +void Heos::onConnected() { - switch (state) { - case QAbstractSocket::ConnectedState: - qCDebug(dcDenon()) << "connected successfully to" << m_hostAddress.toString(); - m_reconnectTimer->stop(); - emit connectionStatusChanged(true); - break; - case QAbstractSocket::ConnectingState: - break; - case QAbstractSocket::UnconnectedState: - m_reconnectTimer->start(); - qCDebug(dcDenon()) << "Disconnected from" << m_hostAddress.toString() << "try reconnecting in 5 seconds"; - emit connectionStatusChanged(false); - break; - default: - emit connectionStatusChanged(false); - } + qCDebug(dcDenon()) << "Heos: Connected successfully to" << m_hostAddress.toString(); + m_reconnectTimer->stop(); + emit connectionStatusChanged(true); +} + +void Heos::onDisconnected() +{ + m_reconnectTimer->start(); + qCDebug(dcDenon()) << "Heos: Disconnected from" << m_hostAddress.toString() << "try reconnecting in 5 seconds"; + emit connectionStatusChanged(false); } quint32 Heos::addContainerToQueue(int playerId, const QString &sourceId, const QString &containerId, ADD_CRITERIA addCriteria) @@ -571,7 +583,7 @@ quint32 Heos::addContainerToQueue(int playerId, const QString &sourceId, const Q void Heos::onError(QAbstractSocket::SocketError socketError) { - qCWarning(dcDenon) << "socket error:" << socketError << m_socket->errorString(); + qCWarning(dcDenon) << "Heos: Socket error:" << socketError << m_socket->errorString(); } void Heos::readData() diff --git a/denon/heos.h b/denon/heos.h index f663027e..132ca910 100644 --- a/denon/heos.h +++ b/denon/heos.h @@ -164,7 +164,8 @@ signals: void userChanged(bool signedIn, const QString &userName); private slots: - void onStateChanged(QAbstractSocket::SocketState state); + void onConnected(); + void onDisconnected(); void onError(QAbstractSocket::SocketError socketError); void readData(); diff --git a/denon/integrationplugindenon.cpp b/denon/integrationplugindenon.cpp index 90d31ac0..fb15edf4 100644 --- a/denon/integrationplugindenon.cpp +++ b/denon/integrationplugindenon.cpp @@ -117,37 +117,39 @@ void IntegrationPluginDenon::discoverThings(ThingDiscoveryInfo *info) * The HEOS product IP address can also be set statically and manually programmed into the control system. * Search target name (ST) in M-SEARCH discovery request is 'urn:schemas-denon-com:thing:ACT-Denon:1'. */ + if (!hardwareManager()->upnpDiscovery()->available()) { + qCDebug(dcDenon()) << "UPnP discovery not available"; + info->finish(Thing::ThingErrorHardwareNotAvailable, "UPnP discovery not possible"); + return; + } UpnpDiscoveryReply *reply = hardwareManager()->upnpDiscovery()->discoverDevices(); + connect(reply, &UpnpDiscoveryReply::finished, reply, &UpnpDiscoveryReply::deleteLater); connect(reply, &UpnpDiscoveryReply::finished, info, [this, reply, info](){ - reply->deleteLater(); if (reply->error() != UpnpDiscoveryReply::UpnpDiscoveryReplyErrorNoError) { qCWarning(dcDenon()) << "Upnp discovery error" << reply->error(); info->finish(Thing::ThingErrorHardwareFailure, QT_TR_NOOP("UPnP discovery failed.")); return; } - + m_heosIpAddresses.clear(); foreach (const UpnpDeviceDescriptor &upnpThing, reply->deviceDescriptors()) { - qCDebug(dcDenon) << "UPnP thing found:" << upnpThing.modelDescription() << upnpThing.friendlyName() << upnpThing.hostAddress().toString() << upnpThing.modelName() << upnpThing.manufacturer() << upnpThing.serialNumber(); + if (upnpThing.modelName().contains("HEOS", Qt::CaseSensitivity::CaseInsensitive) && upnpThing.serialNumber() != "0000001") { + // child things have serial number 0000001 + qCDebug(dcDenon) << "uPnP thing found:" << upnpThing.modelDescription() << upnpThing.friendlyName() << upnpThing.hostAddress().toString() << upnpThing.modelName() << upnpThing.manufacturer() << upnpThing.serialNumber(); - if (upnpThing.modelName().contains("HEOS", Qt::CaseSensitivity::CaseInsensitive)) { - QString serialNumber = upnpThing.serialNumber(); - if (serialNumber != "0000001") { - // child things have serial number 0000001 - ThingDescriptor descriptor(heosThingClassId, upnpThing.modelName(), serialNumber); - ParamList params; - foreach (Thing *existingThing, myThings()) { - if (existingThing->paramValue(heosThingSerialNumberParamTypeId).toString().contains(serialNumber, Qt::CaseSensitivity::CaseInsensitive)) { - descriptor.setThingId(existingThing->id()); - break; - } + m_heosIpAddresses.insert(upnpThing.serialNumber(), upnpThing.hostAddress()); + ThingDescriptor descriptor(heosThingClassId, upnpThing.modelName(), upnpThing.serialNumber()); + ParamList params; + foreach (Thing *existingThing, myThings()) { + if (existingThing->paramValue(heosThingSerialNumberParamTypeId).toString().contains(upnpThing.serialNumber(), Qt::CaseSensitivity::CaseInsensitive)) { + descriptor.setThingId(existingThing->id()); + break; } - params.append(Param(heosThingModelNameParamTypeId, upnpThing.modelName())); - params.append(Param(heosThingIpParamTypeId, upnpThing.hostAddress().toString())); - params.append(Param(heosThingSerialNumberParamTypeId, serialNumber)); - descriptor.setParams(params); - info->addThingDescriptor(descriptor); } + params.append(Param(heosThingModelNameParamTypeId, upnpThing.modelName())); + params.append(Param(heosThingSerialNumberParamTypeId, upnpThing.serialNumber())); + descriptor.setParams(params); + info->addThingDescriptor(descriptor); } } info->finish(Thing::ThingErrorNoError); @@ -172,21 +174,30 @@ void IntegrationPluginDenon::confirmPairing(ThingPairingInfo *info, const QStrin return info->finish(Thing::ThingErrorNoError); } - QHostAddress address(info->params().paramValue(heosThingIpParamTypeId).toString()); - Heos *heos = createHeosConnection(address); - m_unfinishedHeosConnections.insert(info->thingId(), heos); - m_unfinishedHeosPairings.insert(heos, info); - connect(info, &ThingPairingInfo::aborted, this, [heos, this] { - m_unfinishedHeosPairings.remove(heos); - heos->deleteLater(); - }); - heos->connectDevice(); - heos->setUserAccount(username, password); + Q_FOREACH(const QString &serialNumber, m_heosIpAddresses.keys()) { + if (serialNumber == info->params().paramValue(heosThingSerialNumberParamTypeId).toString()) { + ThingId thingId = info->thingId(); + Heos *heos = createHeosConnection(m_heosIpAddresses.value(serialNumber)); + m_unfinishedHeosConnections.insert(thingId, heos); + m_unfinishedHeosPairings.insert(heos, info); + connect(heos, &Heos::destroyed, this, [this, thingId, heos] { + qCDebug(dcDenon()) << "Heos connection deleted, cleaning up"; + m_unfinishedHeosPairings.remove(heos); + m_unfinishedHeosConnections.remove(thingId); + }); + connect(info, &ThingPairingInfo::aborted, this, [heos] { + qCDebug(dcDenon()) << "ThingPairingInfo aborted, deleting heos connection"; + heos->deleteLater(); + }); + heos->connectDevice(); + heos->setUserAccount(username, password); - pluginStorage()->beginGroup(info->thingId().toString()); - pluginStorage()->setValue("username", username); - pluginStorage()->setValue("password", password); - pluginStorage()->endGroup(); + pluginStorage()->beginGroup(info->thingId().toString()); + pluginStorage()->setValue("username", username); + pluginStorage()->setValue("password", password); + pluginStorage()->endGroup(); + } + } } } @@ -195,7 +206,7 @@ void IntegrationPluginDenon::setupThing(ThingSetupInfo *info) Thing *thing = info->thing(); if (thing->thingClassId() == AVRX1000ThingClassId) { - + qCDebug(dcDenon) << "Setup AVR X1000 thing" << thing->name(); if (m_avrConnections.contains(thing->id())) { qCDebug(dcDenon()) << "Setup after reconfiguration, cleaning up ..."; @@ -240,7 +251,7 @@ void IntegrationPluginDenon::setupThing(ThingSetupInfo *info) return; } else if (thing->thingClassId() == heosThingClassId) { - qCDebug(dcDenon) << "Setup Denon thing" << thing->name(); + qCDebug(dcDenon) << "Setup Heos connection thing" << thing->name(); QString serialnumber = thing->paramValue(heosThingSerialNumberParamTypeId).toString(); if (serialnumber.isEmpty()) { qCWarning(dcDenon) << "Serial number is empty"; @@ -254,26 +265,32 @@ void IntegrationPluginDenon::setupThing(ThingSetupInfo *info) } if (m_unfinishedHeosConnections.contains(thing->id())) { + qCDebug(dcDenon()) << "Setup after discovery"; Heos *heos = m_unfinishedHeosConnections.take(thing->id()); m_heosConnections.insert(thing->id(), heos); info->finish(Thing::ThingErrorNoError); } else { - + qCDebug(dcDenon()) << "Starting Heos discovery"; + if (!hardwareManager()->upnpDiscovery()->available()) { + qCDebug(dcDenon()) << "UPnP discovery not available"; + info->finish(Thing::ThingErrorHardwareNotAvailable, "Discovery not possible"); + return; + } UpnpDiscoveryReply *reply = hardwareManager()->upnpDiscovery()->discoverDevices(); connect(reply, &UpnpDiscoveryReply::finished, reply, &UpnpDiscoveryReply::deleteLater); connect(reply, &UpnpDiscoveryReply::finished, info, [this, reply, info] { if (reply->error() != UpnpDiscoveryReply::UpnpDiscoveryReplyErrorNoError) { qCWarning(dcDenon()) << "Upnp discovery error" << reply->error(); - info->finish(Thing::ThingErrorHardwareFailure, QT_TR_NOOP("UPnP discovery failed.")); + info->finish(Thing::ThingErrorHardwareFailure, QT_TR_NOOP("Device discovery failed.")); return; } - - foreach (const UpnpDeviceDescriptor &upnpThing, reply->deviceDescriptors()) { + qCDebug(dcDenon()) << "UPnP discovery finished, found" << reply->deviceDescriptors().count() << "uPnP devices"; + Q_FOREACH (const UpnpDeviceDescriptor &upnpThing, reply->deviceDescriptors()) { if (upnpThing.modelName().contains("HEOS", Qt::CaseSensitivity::CaseInsensitive)) { QString serialNumber = info->thing()->paramValue(heosThingSerialNumberParamTypeId).toString(); if (serialNumber == upnpThing.serialNumber()) { - ThingId thingId= info->thing()->id(); - info->thing()->setParamValue(heosThingIpParamTypeId, upnpThing.hostAddress().toString()); + ThingId thingId = info->thing()->id(); + qCDebug(dcDenon()) << "Found Heos device, creating Heos connection"; Heos *heos = createHeosConnection(upnpThing.hostAddress()); m_heosConnections.insert(thingId, heos); m_asyncHeosSetups.insert(heos, info); @@ -284,14 +301,32 @@ void IntegrationPluginDenon::setupThing(ThingSetupInfo *info) m_heosConnections.remove(thingId); }); heos->connectDevice(); - break; + return; } } } + qCDebug(dcDenon()) << "Device not found"; + info->finish(Thing::ThingErrorHardwareNotAvailable); + return; }); } } else if (thing->thingClassId() == heosPlayerThingClassId) { - info->finish(Thing::ThingErrorNoError); + + qCDebug(dcDenon) << "Setup Heos player" << thing->name(); + Thing *parentThing = myThings().findById(thing->parentId()); + if (!parentThing) { + qCWarning(dcDenon()) << "Parent thing not found for Heos player" << thing->name(); + return; + } + if (parentThing->setupStatus() == Thing::ThingSetupStatusComplete) { + info->finish(Thing::ThingErrorNoError); + } else { + connect(parentThing, &Thing::setupStatusChanged, info, [info, parentThing] { + if (parentThing->setupStatus() == Thing::ThingSetupStatusComplete) { + info->finish(Thing::ThingErrorNoError); + } + }); + } } else { info->finish(Thing::ThingErrorThingClassNotFound); } @@ -521,6 +556,8 @@ void IntegrationPluginDenon::executeAction(ThingActionInfo *info) void IntegrationPluginDenon::postSetupThing(Thing *thing) { + qCDebug(dcDenon()) << "Post setup thing" << thing->name(); + if (thing->thingClassId() == AVRX1000ThingClassId) { AvrConnection *avrConnection = m_avrConnections.value(thing->id()); thing->setStateValue(AVRX1000ConnectedStateTypeId, avrConnection->connected()); @@ -537,15 +574,6 @@ void IntegrationPluginDenon::postSetupThing(Thing *thing) } else if (thing->thingClassId() == heosThingClassId) { Heos *heos = m_heosConnections.value(thing->id()); thing->setStateValue(heosConnectedStateTypeId, heos->connected()); - if (pluginStorage()->childGroups().contains(thing->id().toString())) { - pluginStorage()->beginGroup(thing->id().toString()); - QString username = pluginStorage()->value("username").toString(); - QString password = pluginStorage()->value("password").toString(); - pluginStorage()->endGroup(); - heos->setUserAccount(username, password); - } else { - qCWarning(dcDenon()) << "Plugin storage doesn't contain this deviceId"; - } heos->getPlayers(); heos->getGroups(); @@ -562,6 +590,7 @@ void IntegrationPluginDenon::postSetupThing(Thing *thing) } if (!m_pluginTimer) { + qCDebug(dcDenon()) << "Creating plugin timer"; m_pluginTimer = hardwareManager()->pluginTimerManager()->registerTimer(60); connect(m_pluginTimer, &PluginTimer::timeout, this, &IntegrationPluginDenon::onPluginTimer); } @@ -588,13 +617,11 @@ void IntegrationPluginDenon::onPluginTimer() } } - foreach(Thing *thing, myThings()) { + foreach(Thing *thing, myThings().filterByThingClassId(heosThingClassId)) { - if (thing->thingClassId() == heosThingClassId) { - Heos *heos = m_heosConnections.value(thing->id()); - heos->getPlayers(); - heos->registerForChangeEvents(true); - } + Heos *heos = m_heosConnections.value(thing->id()); + heos->getPlayers(); + heos->registerForChangeEvents(true); } } @@ -855,6 +882,7 @@ void IntegrationPluginDenon::onHeosConnectionChanged(bool status) if (!thing) return; + qCDebug(dcDenon()) << "Heos connection changed" << thing->name(); if (thing->thingClassId() == heosThingClassId) { if (pluginStorage()->childGroups().contains(thing->id().toString())) { @@ -864,12 +892,17 @@ void IntegrationPluginDenon::onHeosConnectionChanged(bool status) pluginStorage()->endGroup(); heos->setUserAccount(username, password); } else { - qCWarning(dcDenon()) << "Plugin storage doesn't contain this deviceId"; + qCWarning(dcDenon()) << "Plugin storage doesn't contain this thingId"; } if (!status) { thing->setStateValue(heosLoggedInStateTypeId, false); thing->setStateValue(heosUserDisplayNameStateTypeId, ""); + + qCDebug(dcDenon()) << "Starting Heos discovery"; + UpnpDiscoveryReply *reply = hardwareManager()->upnpDiscovery()->discoverDevices(); + connect(reply, &UpnpDiscoveryReply::finished, reply, &UpnpDiscoveryReply::deleteLater); + connect(reply, &UpnpDiscoveryReply::finished, this, &IntegrationPluginDenon::onHeosDiscoveryFinished); } thing->setStateValue(heosConnectedStateTypeId, status); // update connection status for all child things @@ -896,6 +929,10 @@ void IntegrationPluginDenon::onHeosPlayersReceived(QList heosPlaye } QList heosPlayerDescriptors; + if (heosPlayers.isEmpty()) { + qCWarning(dcDenon()) << "Received empty player list, this is likely because of a bug in the Heos API, ignoring"; + return; + } foreach (HeosPlayer *player, heosPlayers) { ThingDescriptor descriptor(heosPlayerThingClassId, player->name(), player->playerModel(), thing->id()); ParamList params; @@ -923,6 +960,7 @@ void IntegrationPluginDenon::onHeosPlayersReceived(QList heosPlaye } } if (!playerAvailable) { + qCDebug(dcDenon()) << "Heos player vanished, removing" << thing->name(); autoThingDisappeared(existingThing->id()); m_playerBuffer.remove(playerId); } @@ -1220,7 +1258,6 @@ void IntegrationPluginDenon::onHeosGroupsChanged() void IntegrationPluginDenon::onHeosUserChanged(bool signedIn, const QString &userName) { - Q_UNUSED(userName) Heos *heos = static_cast(sender()); //This is to check if the credentials are correct @@ -1242,6 +1279,30 @@ void IntegrationPluginDenon::onHeosUserChanged(bool signedIn, const QString &use } } +void IntegrationPluginDenon::onHeosDiscoveryFinished() +{ + UpnpDiscoveryReply *reply = static_cast(sender()); + + if (reply->error() != UpnpDiscoveryReply::UpnpDiscoveryReplyErrorNoError) { + qCWarning(dcDenon()) << "Upnp discovery error" << reply->error(); + return; + } + + Q_FOREACH(const UpnpDeviceDescriptor &upnpThing, reply->deviceDescriptors()) { + Q_FOREACH(Thing *thing, myThings().filterByThingClassId(heosThingClassId)) { + QString serialNumber = thing->paramValue(heosThingSerialNumberParamTypeId).toString(); + if (serialNumber == upnpThing.serialNumber()) { + Heos *heos = m_heosConnections.value(thing->id()); + if (!heos) { + qCWarning(dcDenon()) << "On heos discovery, heos connection not found for" << thing->name(); + return; + } + heos->setAddress(upnpThing.hostAddress()); + } + } + } +} + void IntegrationPluginDenon::onPluginConfigurationChanged(const ParamTypeId ¶mTypeId, const QVariant &value) { qCDebug(dcDenon()) << "Plugin configuration changed"; diff --git a/denon/integrationplugindenon.h b/denon/integrationplugindenon.h index 3c1ae354..432a0a36 100644 --- a/denon/integrationplugindenon.h +++ b/denon/integrationplugindenon.h @@ -102,6 +102,8 @@ private: QHash m_groupBuffer; QHash m_playerBuffer; + QHash m_heosIpAddresses; + Heos *createHeosConnection(const QHostAddress &address); QHostAddress findAvrById(const QString &id); @@ -127,6 +129,7 @@ private slots: void onHeosGroupsReceived(QList groups); void onHeosGroupsChanged(); void onHeosUserChanged(bool signedIn, const QString &userName); + void onHeosDiscoveryFinished(); void onAvrConnectionChanged(bool status); void onAvrSocketError(); diff --git a/denon/integrationplugindenon.json b/denon/integrationplugindenon.json index ab4dc52b..c57c0ad5 100644 --- a/denon/integrationplugindenon.json +++ b/denon/integrationplugindenon.json @@ -313,13 +313,6 @@ "setupMethod": "userandpassword", "interfaces": ["gateway"], "paramTypes": [ - { - "id": "a54b98b4-b78f-41dd-a257-14425c6cf9ab", - "name": "ip", - "displayName": "IPv4 address", - "type" : "QString", - "readOnly": true - }, { "id": "f796664d-6cb7-4f29-9d05-771968d82a32", "name": "serialNumber", diff --git a/denon/translations/cd758269-dbbb-4ef0-80ab-48bd9a8a2765-de.ts b/denon/translations/cd758269-dbbb-4ef0-80ab-48bd9a8a2765-de.ts index b6d24188..caeeaadb 100644 --- a/denon/translations/cd758269-dbbb-4ef0-80ab-48bd9a8a2765-de.ts +++ b/denon/translations/cd758269-dbbb-4ef0-80ab-48bd9a8a2765-de.ts @@ -4,8 +4,8 @@ Denon - - + + Denon The name of the vendor ({cf0a9644-2c13-4daf-85c1-ad88d6745b42}) ---------- @@ -13,16 +13,16 @@ The name of the plugin Denon ({cd758269-dbbb-4ef0-80ab-48bd9a8a2765})Denon - + AVR X1000 The name of the ThingClass ({1cd3d67e-aba0-450e-9e2a-483a1527aba6}) AVR X1000 - - - - + + + + Album The name of the ParamType (ThingClass: heosPlayer, EventType: collection, ID: {9cd60864-f141-4e03-a85b-357690cad1b8}) ---------- @@ -34,8 +34,8 @@ The name of the StateType ({d4f14d93-8cae-4e1b-9ee7-a5c21c0211df}) of ThingClass Album - - + + Album changed The name of the EventType ({9cd60864-f141-4e03-a85b-357690cad1b8}) of ThingClass heosPlayer ---------- @@ -43,16 +43,16 @@ The name of the EventType ({d4f14d93-8cae-4e1b-9ee7-a5c21c0211df}) of ThingClass Album geändert - + Alert The name of the ActionType ({db8e001a-fcae-4c41-9811-325e14c06109}) of ThingClass heosPlayer Alarm - - - - + + + + Artist The name of the ParamType (ThingClass: heosPlayer, EventType: artist, ID: {0a9183a4-b633-4773-ba7a-f4266895157e}) ---------- @@ -64,8 +64,8 @@ The name of the StateType ({50b34df4-90f7-41aa-9a57-6f2d31a18430}) of ThingClass Künstler - - + + Artist changed The name of the EventType ({0a9183a4-b633-4773-ba7a-f4266895157e}) of ThingClass heosPlayer ---------- @@ -73,10 +73,10 @@ The name of the EventType ({50b34df4-90f7-41aa-9a57-6f2d31a18430}) of ThingClass Künstler geändert - - - - + + + + Artwork The name of the ParamType (ThingClass: heosPlayer, EventType: artwork, ID: {a7f0ba95-383a-4efd-adc5-a36e50a04018}) ---------- @@ -88,8 +88,8 @@ The name of the StateType ({6c4a208b-5b04-40cc-b14b-8f79aff30307}) of ThingClass Artwork - - + + Artwork changed The name of the EventType ({a7f0ba95-383a-4efd-adc5-a36e50a04018}) of ThingClass heosPlayer ---------- @@ -97,9 +97,9 @@ The name of the EventType ({6c4a208b-5b04-40cc-b14b-8f79aff30307}) of ThingClass Artwork geändert - - - + + + Bass The name of the ParamType (ThingClass: AVRX1000, ActionType: bass, ID: {2c92b22e-d5b2-4991-a523-64222bffc9e7}) ---------- @@ -109,15 +109,15 @@ The name of the StateType ({2c92b22e-d5b2-4991-a523-64222bffc9e7}) of ThingClass Bass - + Bass changed The name of the EventType ({2c92b22e-d5b2-4991-a523-64222bffc9e7}) of ThingClass AVRX1000 Bass geändert - - - + + + Channel The name of the ParamType (ThingClass: AVRX1000, ActionType: inputSource, ID: {f29ffa2c-31d6-4d88-b160-a38288c82ce1}) ---------- @@ -127,18 +127,18 @@ The name of the StateType ({f29ffa2c-31d6-4d88-b160-a38288c82ce1}) of ThingClass Kanal - + Channel changed The name of the EventType ({f29ffa2c-31d6-4d88-b160-a38288c82ce1}) of ThingClass AVRX1000 Kanal geändert - - - - - - + + + + + + Connected The name of the ParamType (ThingClass: heosPlayer, EventType: connected, ID: {9a4e527e-057c-4b19-8a02-605cc8349f5e}) ---------- @@ -154,9 +154,9 @@ The name of the StateType ({fc1dee8b-8fcc-4ec2-8fe6-6be4f5f47a5c}) of ThingClass Verbunden - - - + + + Connected changed The name of the EventType ({9a4e527e-057c-4b19-8a02-605cc8349f5e}) of ThingClass heosPlayer ---------- @@ -166,8 +166,8 @@ The name of the EventType ({fc1dee8b-8fcc-4ec2-8fe6-6be4f5f47a5c}) of ThingClass Verbunden geändert - - + + Decrease volume The name of the ActionType ({e19cc4e0-00ef-4df4-8314-85902017d095}) of ThingClass heosPlayer ---------- @@ -175,32 +175,26 @@ The name of the ActionType ({d3752c32-92e3-4396-8e2f-ab5e57c6cfb1}) of ThingClas Lautstärke verringern - + Heos The name of the ThingClass ({28bbf4c6-dfd8-4d9d-aa27-5daf2c25d63c}) Heos - + Heos player The name of the ThingClass ({fce5247f-4c6d-408f-ac62-e5973dc6adfa}) Heos Player - + ID The name of the ParamType (ThingClass: AVRX1000, Type: thing, ID: {2e8806cb-f6f3-4e9a-b6ea-0b35f75e61c5}) ID - - IPv4 address - The name of the ParamType (ThingClass: heos, Type: thing, ID: {a54b98b4-b78f-41dd-a257-14425c6cf9ab}) - IPv4 Adresse - - - - + + Increase volume The name of the ActionType ({ebdc35f8-24a2-4984-855e-4c1a158289b7}) of ThingClass heosPlayer ---------- @@ -208,14 +202,14 @@ The name of the ActionType ({4ae686d6-2307-40a0-bd38-2cd3a92342cc}) of ThingClas Lautstärke verringern - + Join group The name of the Browser Item ActionType ({73112a01-84c7-4b1d-8b86-71672c110d06}) of ThingClass heosPlayer Gruppe beitreten - - + + Logged in The name of the ParamType (ThingClass: heos, EventType: loggedIn, ID: {ab689a6e-eb71-4a41-a267-ba1afe7e2f56}) ---------- @@ -223,30 +217,30 @@ The name of the StateType ({ab689a6e-eb71-4a41-a267-ba1afe7e2f56}) of ThingClass Eingelogged - + Logged in changed The name of the EventType ({ab689a6e-eb71-4a41-a267-ba1afe7e2f56}) of ThingClass heos Eingelogged geändert - + Model The name of the ParamType (ThingClass: heosPlayer, Type: thing, ID: {e760f92b-8fca-4f20-aead-a52045505b81}) Modell - + Model name The name of the ParamType (ThingClass: heos, Type: thing, ID: {ab1a0be8-e3a5-4f95-b9b7-893de1ca4cf7}) Modellname - - - - - - + + + + + + Mute The name of the ParamType (ThingClass: heosPlayer, ActionType: mute, ID: {fcc89c7c-b793-4b6f-a3dc-0e0e3a86748f}) ---------- @@ -262,8 +256,8 @@ The name of the StateType ({3e11470d-a5b7-499c-be55-9b1b4fe5eedf}) of ThingClass Stumm - - + + Mute changed The name of the EventType ({fcc89c7c-b793-4b6f-a3dc-0e0e3a86748f}) of ThingClass heosPlayer ---------- @@ -271,14 +265,14 @@ The name of the EventType ({3e11470d-a5b7-499c-be55-9b1b4fe5eedf}) of ThingClass Stumm geändert - + Notification url The name of the ParamType (ThingClass: denon, Type: plugin, ID: {5a3cd3eb-8ff5-4110-aef0-7b0608450e60}) Benachrichtigungs-Url - - + + Pause The name of the ActionType ({21c1cbe6-278f-4688-a65f-6620be1ee5ea}) of ThingClass heosPlayer ---------- @@ -286,8 +280,8 @@ The name of the ActionType ({3de38047-006f-4d97-9326-08bb5ad79b05}) of ThingClas Pause - - + + Play The name of the ActionType ({c64964e4-cea0-468a-a9bf-8f69657b74e9}) of ThingClass heosPlayer ---------- @@ -295,12 +289,12 @@ The name of the ActionType ({d04eb30b-838d-4fbd-b781-c01005b59756}) of ThingClas Play - - - - - - + + + + + + Playback status The name of the ParamType (ThingClass: heosPlayer, ActionType: playbackStatus, ID: {6db3b484-4cd4-477b-b822-275865d308db}) ---------- @@ -316,8 +310,8 @@ The name of the StateType ({8ef6708c-812a-4e6a-a608-9e480aa3b7bf}) of ThingClass Wiedergabestatus - - + + Playback status changed The name of the EventType ({6db3b484-4cd4-477b-b822-275865d308db}) of ThingClass heosPlayer ---------- @@ -325,16 +319,16 @@ The name of the EventType ({8ef6708c-812a-4e6a-a608-9e480aa3b7bf}) of ThingClass Wiedergabestatus geändert - + Player ID The name of the ParamType (ThingClass: heosPlayer, Type: thing, ID: {89629008-6ad8-4e92-863d-b86e0e012d0b}) Player ID - - - - + + + + Player type The name of the ParamType (ThingClass: heosPlayer, EventType: playerType, ID: {c59835ac-ee6e-4e6c-aa20-aeb3501937c5}) ---------- @@ -346,8 +340,8 @@ The name of the StateType ({2f372374-16f3-4900-afdc-834f51075d07}) of ThingClass Playertyp - - + + Player type changed The name of the EventType ({c59835ac-ee6e-4e6c-aa20-aeb3501937c5}) of ThingClass heosPlayer ---------- @@ -355,9 +349,9 @@ The name of the EventType ({2f372374-16f3-4900-afdc-834f51075d07}) of ThingClass Playertyp geändert - - - + + + Power The name of the ParamType (ThingClass: AVRX1000, ActionType: power, ID: {1cdb6b54-6831-4900-95b2-c78f64497701}) ---------- @@ -367,24 +361,24 @@ The name of the StateType ({1cdb6b54-6831-4900-95b2-c78f64497701}) of ThingClass Eingeschalten - + Power changed The name of the EventType ({1cdb6b54-6831-4900-95b2-c78f64497701}) of ThingClass AVRX1000 Eingeschalten geändert - + Reboot The name of the ActionType ({4f8b7fe8-7a18-483a-859d-ed5acb0b9a20}) of ThingClass heos Neustarten - - - - - - + + + + + + Repeat mode The name of the ParamType (ThingClass: heosPlayer, ActionType: repeat, ID: {4e60cd17-5845-4351-aa2c-2504610e1532}) ---------- @@ -400,8 +394,8 @@ The name of the StateType ({9478987b-14e4-4572-a059-a18a5a9db229}) of ThingClass Wiederholungsmodus - - + + Repeat mode changed The name of the EventType ({4e60cd17-5845-4351-aa2c-2504610e1532}) of ThingClass heosPlayer ---------- @@ -409,8 +403,8 @@ The name of the EventType ({9478987b-14e4-4572-a059-a18a5a9db229}) of ThingClass Wiederholungsmodus geändert - - + + Serial number The name of the ParamType (ThingClass: heosPlayer, Type: thing, ID: {866e8d6a-953f-4bdc-8d85-8d92e51e8592}) ---------- @@ -418,14 +412,14 @@ The name of the ParamType (ThingClass: heos, Type: thing, ID: {f796664d-6cb7-4f2 Seriennummer - + Set bass The name of the ActionType ({2c92b22e-d5b2-4991-a523-64222bffc9e7}) of ThingClass AVRX1000 Setze Bass - - + + Set mute The name of the ActionType ({fcc89c7c-b793-4b6f-a3dc-0e0e3a86748f}) of ThingClass heosPlayer ---------- @@ -433,8 +427,8 @@ The name of the ActionType ({3e11470d-a5b7-499c-be55-9b1b4fe5eedf}) of ThingClas Setze Stumm - - + + Set playback status The name of the ActionType ({6db3b484-4cd4-477b-b822-275865d308db}) of ThingClass heosPlayer ---------- @@ -442,8 +436,8 @@ The name of the ActionType ({8ef6708c-812a-4e6a-a608-9e480aa3b7bf}) of ThingClas Setze Wiedergabemodus - - + + Set repeat mode The name of the ActionType ({4e60cd17-5845-4351-aa2c-2504610e1532}) of ThingClass heosPlayer ---------- @@ -451,8 +445,8 @@ The name of the ActionType ({9478987b-14e4-4572-a059-a18a5a9db229}) of ThingClas Setze Wiederholungsmodus - - + + Set shuffle The name of the ActionType ({4b581237-acf5-4d8f-9e83-9b24e9ac900a}) of ThingClass heosPlayer ---------- @@ -460,30 +454,30 @@ The name of the ActionType ({8ad33cb9-e758-433d-a013-2e4d43157c92}) of ThingClas Setze Zufallswiedergabe - + Set surround mode The name of the ActionType ({4f203bdd-691c-4384-a934-2d49a5448f0a}) of ThingClass AVRX1000 Setze Surroundmodus - + Set tone control The name of the ActionType ({d57c1e5e-2cc9-4638-999c-1523f16dbb83}) of ThingClass AVRX1000 Setze Tonkontrolle - + Set treble The name of the ActionType ({38a3be02-6ed4-4a84-903e-eb923b933989}) of ThingClass AVRX1000 Setze Höhen - - - - - - + + + + + + Shuffle The name of the ParamType (ThingClass: heosPlayer, ActionType: shuffle, ID: {4b581237-acf5-4d8f-9e83-9b24e9ac900a}) ---------- @@ -499,8 +493,8 @@ The name of the StateType ({8ad33cb9-e758-433d-a013-2e4d43157c92}) of ThingClass Zufallswiedergabe - - + + Shuffle changed The name of the EventType ({4b581237-acf5-4d8f-9e83-9b24e9ac900a}) of ThingClass heosPlayer ---------- @@ -508,8 +502,8 @@ The name of the EventType ({8ad33cb9-e758-433d-a013-2e4d43157c92}) of ThingClass Zufallswiedergabe geändert - - + + Skip back The name of the ActionType ({a718f7e9-0b54-4403-b661-49f7b0d13085}) of ThingClass heosPlayer ---------- @@ -517,8 +511,8 @@ The name of the ActionType ({3f2eb789-918c-475a-a295-14c0c24338b8}) of ThingClas Zurück - - + + Skip next The name of the ActionType ({57697e9c-ce5e-4b8f-b42e-16662829ceb2}) of ThingClass heosPlayer ---------- @@ -526,8 +520,8 @@ The name of the ActionType ({bf9664e4-a53e-474c-afcc-88f25e6fe365}) of ThingClas Nächstes - - + + Source The name of the ParamType (ThingClass: heosPlayer, EventType: source, ID: {eee22722-3ee5-48f7-8af8-275dc04b21eb}) ---------- @@ -535,16 +529,16 @@ The name of the StateType ({eee22722-3ee5-48f7-8af8-275dc04b21eb}) of ThingClass Quelle - + Source changed The name of the EventType ({eee22722-3ee5-48f7-8af8-275dc04b21eb}) of ThingClass heosPlayer Quelle geändert - - - - + + + + Step size The name of the ParamType (ThingClass: heosPlayer, ActionType: decreaseVolume, ID: {ef5a252b-3d28-4817-a668-1dacf0ed1f8a}) ---------- @@ -556,8 +550,8 @@ The name of the ParamType (ThingClass: AVRX1000, ActionType: increaseVolume, ID: Schrittgröße - - + + Stop The name of the ActionType ({c4b29c09-e3b3-4843-b6d9-e032f3fc1d78}) of ThingClass heosPlayer ---------- @@ -565,9 +559,9 @@ The name of the ActionType ({ddab0869-5b90-4fd4-9c40-9ad57101b87c}) of ThingClas Stop - - - + + + Surround mode The name of the ParamType (ThingClass: AVRX1000, ActionType: surroundMode, ID: {4f203bdd-691c-4384-a934-2d49a5448f0a}) ---------- @@ -577,16 +571,16 @@ The name of the StateType ({4f203bdd-691c-4384-a934-2d49a5448f0a}) of ThingClass Surroundmodus - + Surround mode changed The name of the EventType ({4f203bdd-691c-4384-a934-2d49a5448f0a}) of ThingClass AVRX1000 Surroundmodus geädert - - - - + + + + Title The name of the ParamType (ThingClass: heosPlayer, EventType: title, ID: {bbeecf30-6feb-48d5-ade3-57b2a4eea05f}) ---------- @@ -598,8 +592,8 @@ The name of the StateType ({d32493d8-5faf-4c7a-ba94-847dc9b81615}) of ThingClass Title - - + + Title changed The name of the EventType ({bbeecf30-6feb-48d5-ade3-57b2a4eea05f}) of ThingClass heosPlayer ---------- @@ -607,9 +601,9 @@ The name of the EventType ({d32493d8-5faf-4c7a-ba94-847dc9b81615}) of ThingClass Title geändert - - - + + + Tone control The name of the ParamType (ThingClass: AVRX1000, ActionType: toneControl, ID: {d57c1e5e-2cc9-4638-999c-1523f16dbb83}) ---------- @@ -619,15 +613,15 @@ The name of the StateType ({d57c1e5e-2cc9-4638-999c-1523f16dbb83}) of ThingClass Tonkontrolle - + Tone control changed The name of the EventType ({d57c1e5e-2cc9-4638-999c-1523f16dbb83}) of ThingClass AVRX1000 Tonkontroller geändert - - - + + + Treble The name of the ParamType (ThingClass: AVRX1000, ActionType: treble, ID: {38a3be02-6ed4-4a84-903e-eb923b933989}) ---------- @@ -637,20 +631,20 @@ The name of the StateType ({38a3be02-6ed4-4a84-903e-eb923b933989}) of ThingClass Höhen - + Treble changed The name of the EventType ({38a3be02-6ed4-4a84-903e-eb923b933989}) of ThingClass AVRX1000 Höhen geändert - + Unjoin group The name of the Browser Item ActionType ({1b866b95-1fc7-4b45-ad71-c85e43fcc367}) of ThingClass heosPlayer Gruppe verlassen - - + + User name The name of the ParamType (ThingClass: heos, EventType: userDisplayName, ID: {77756132-5fa4-409e-969e-d23bcee72356}) ---------- @@ -658,24 +652,24 @@ The name of the StateType ({77756132-5fa4-409e-969e-d23bcee72356}) of ThingClass Benutzername - + User name changed The name of the EventType ({77756132-5fa4-409e-969e-d23bcee72356}) of ThingClass heos Benutzername geändert - + Version The name of the ParamType (ThingClass: heosPlayer, Type: thing, ID: {aa1158f7-b451-456a-840f-4f0c63b2b7f0}) Version - - - - - - + + + + + + Volume The name of the ParamType (ThingClass: heosPlayer, ActionType: volume, ID: {6d4886a1-fa5d-4889-96c5-7a1c206f59be}) ---------- @@ -691,8 +685,8 @@ The name of the StateType ({773636b9-304d-463a-8755-fc7488dc0ff3}) of ThingClass Lautstärke - - + + Volume changed The name of the EventType ({6d4886a1-fa5d-4889-96c5-7a1c206f59be}) of ThingClass heosPlayer ---------- @@ -700,14 +694,14 @@ The name of the EventType ({773636b9-304d-463a-8755-fc7488dc0ff3}) of ThingClass Lautstärke geändert - + Set power The name of the ActionType ({1cdb6b54-6831-4900-95b2-c78f64497701}) of ThingClass AVRX1000 Schalte ein - - + + Set volume The name of the ActionType ({6d4886a1-fa5d-4889-96c5-7a1c206f59be}) of ThingClass heosPlayer ---------- @@ -715,7 +709,7 @@ The name of the ActionType ({773636b9-304d-463a-8755-fc7488dc0ff3}) of ThingClas Setze Lautstärke - + Set channel The name of the ActionType ({f29ffa2c-31d6-4d88-b160-a38288c82ce1}) of ThingClass AVRX1000 Wähle Kanal @@ -724,28 +718,32 @@ The name of the ActionType ({773636b9-304d-463a-8755-fc7488dc0ff3}) of ThingClas IntegrationPluginDenon - - + UPnP discovery failed. UPnP Gerätesuche fehlgeschlagen. - + Please enter your HEOS account credentials. Leave empty if you doesn't have any. Some features like music browsing won't be available. Bitte geben Sie Ihre HEOS-Kontoanmeldeinformationen ein. Lassen Sie sie leer wenn Sie keine haben, einige Funktionen wie das Durchsuchen von Musik sind dann nicht verfügbar. - + Serial number is not set - + + Device discovery failed. + + + + Service is not available Service ist nicht verfügbar - + Wrong username or password Falscher Benutzername oder Passwort diff --git a/denon/translations/cd758269-dbbb-4ef0-80ab-48bd9a8a2765-en_US.ts b/denon/translations/cd758269-dbbb-4ef0-80ab-48bd9a8a2765-en_US.ts index 35b8c679..208b79d4 100644 --- a/denon/translations/cd758269-dbbb-4ef0-80ab-48bd9a8a2765-en_US.ts +++ b/denon/translations/cd758269-dbbb-4ef0-80ab-48bd9a8a2765-en_US.ts @@ -4,8 +4,8 @@ Denon - - + + Denon The name of the vendor ({cf0a9644-2c13-4daf-85c1-ad88d6745b42}) ---------- @@ -13,16 +13,16 @@ The name of the plugin Denon ({cd758269-dbbb-4ef0-80ab-48bd9a8a2765}) - + AVR X1000 The name of the ThingClass ({1cd3d67e-aba0-450e-9e2a-483a1527aba6}) - - - - + + + + Album The name of the ParamType (ThingClass: heosPlayer, EventType: collection, ID: {9cd60864-f141-4e03-a85b-357690cad1b8}) ---------- @@ -34,8 +34,8 @@ The name of the StateType ({d4f14d93-8cae-4e1b-9ee7-a5c21c0211df}) of ThingClass - - + + Album changed The name of the EventType ({9cd60864-f141-4e03-a85b-357690cad1b8}) of ThingClass heosPlayer ---------- @@ -43,16 +43,16 @@ The name of the EventType ({d4f14d93-8cae-4e1b-9ee7-a5c21c0211df}) of ThingClass - + Alert The name of the ActionType ({db8e001a-fcae-4c41-9811-325e14c06109}) of ThingClass heosPlayer - - - - + + + + Artist The name of the ParamType (ThingClass: heosPlayer, EventType: artist, ID: {0a9183a4-b633-4773-ba7a-f4266895157e}) ---------- @@ -64,8 +64,8 @@ The name of the StateType ({50b34df4-90f7-41aa-9a57-6f2d31a18430}) of ThingClass - - + + Artist changed The name of the EventType ({0a9183a4-b633-4773-ba7a-f4266895157e}) of ThingClass heosPlayer ---------- @@ -73,10 +73,10 @@ The name of the EventType ({50b34df4-90f7-41aa-9a57-6f2d31a18430}) of ThingClass - - - - + + + + Artwork The name of the ParamType (ThingClass: heosPlayer, EventType: artwork, ID: {a7f0ba95-383a-4efd-adc5-a36e50a04018}) ---------- @@ -88,8 +88,8 @@ The name of the StateType ({6c4a208b-5b04-40cc-b14b-8f79aff30307}) of ThingClass - - + + Artwork changed The name of the EventType ({a7f0ba95-383a-4efd-adc5-a36e50a04018}) of ThingClass heosPlayer ---------- @@ -97,9 +97,9 @@ The name of the EventType ({6c4a208b-5b04-40cc-b14b-8f79aff30307}) of ThingClass - - - + + + Bass The name of the ParamType (ThingClass: AVRX1000, ActionType: bass, ID: {2c92b22e-d5b2-4991-a523-64222bffc9e7}) ---------- @@ -109,15 +109,15 @@ The name of the StateType ({2c92b22e-d5b2-4991-a523-64222bffc9e7}) of ThingClass - + Bass changed The name of the EventType ({2c92b22e-d5b2-4991-a523-64222bffc9e7}) of ThingClass AVRX1000 - - - + + + Channel The name of the ParamType (ThingClass: AVRX1000, ActionType: inputSource, ID: {f29ffa2c-31d6-4d88-b160-a38288c82ce1}) ---------- @@ -127,18 +127,18 @@ The name of the StateType ({f29ffa2c-31d6-4d88-b160-a38288c82ce1}) of ThingClass - + Channel changed The name of the EventType ({f29ffa2c-31d6-4d88-b160-a38288c82ce1}) of ThingClass AVRX1000 - - - - - - + + + + + + Connected The name of the ParamType (ThingClass: heosPlayer, EventType: connected, ID: {9a4e527e-057c-4b19-8a02-605cc8349f5e}) ---------- @@ -154,9 +154,9 @@ The name of the StateType ({fc1dee8b-8fcc-4ec2-8fe6-6be4f5f47a5c}) of ThingClass - - - + + + Connected changed The name of the EventType ({9a4e527e-057c-4b19-8a02-605cc8349f5e}) of ThingClass heosPlayer ---------- @@ -166,8 +166,8 @@ The name of the EventType ({fc1dee8b-8fcc-4ec2-8fe6-6be4f5f47a5c}) of ThingClass - - + + Decrease volume The name of the ActionType ({e19cc4e0-00ef-4df4-8314-85902017d095}) of ThingClass heosPlayer ---------- @@ -175,32 +175,26 @@ The name of the ActionType ({d3752c32-92e3-4396-8e2f-ab5e57c6cfb1}) of ThingClas - + Heos The name of the ThingClass ({28bbf4c6-dfd8-4d9d-aa27-5daf2c25d63c}) - + Heos player The name of the ThingClass ({fce5247f-4c6d-408f-ac62-e5973dc6adfa}) - + ID The name of the ParamType (ThingClass: AVRX1000, Type: thing, ID: {2e8806cb-f6f3-4e9a-b6ea-0b35f75e61c5}) - - IPv4 address - The name of the ParamType (ThingClass: heos, Type: thing, ID: {a54b98b4-b78f-41dd-a257-14425c6cf9ab}) - - - - - + + Increase volume The name of the ActionType ({ebdc35f8-24a2-4984-855e-4c1a158289b7}) of ThingClass heosPlayer ---------- @@ -208,14 +202,14 @@ The name of the ActionType ({4ae686d6-2307-40a0-bd38-2cd3a92342cc}) of ThingClas - + Join group The name of the Browser Item ActionType ({73112a01-84c7-4b1d-8b86-71672c110d06}) of ThingClass heosPlayer - - + + Logged in The name of the ParamType (ThingClass: heos, EventType: loggedIn, ID: {ab689a6e-eb71-4a41-a267-ba1afe7e2f56}) ---------- @@ -223,30 +217,30 @@ The name of the StateType ({ab689a6e-eb71-4a41-a267-ba1afe7e2f56}) of ThingClass - + Logged in changed The name of the EventType ({ab689a6e-eb71-4a41-a267-ba1afe7e2f56}) of ThingClass heos - + Model The name of the ParamType (ThingClass: heosPlayer, Type: thing, ID: {e760f92b-8fca-4f20-aead-a52045505b81}) - + Model name The name of the ParamType (ThingClass: heos, Type: thing, ID: {ab1a0be8-e3a5-4f95-b9b7-893de1ca4cf7}) - - - - - - + + + + + + Mute The name of the ParamType (ThingClass: heosPlayer, ActionType: mute, ID: {fcc89c7c-b793-4b6f-a3dc-0e0e3a86748f}) ---------- @@ -262,8 +256,8 @@ The name of the StateType ({3e11470d-a5b7-499c-be55-9b1b4fe5eedf}) of ThingClass - - + + Mute changed The name of the EventType ({fcc89c7c-b793-4b6f-a3dc-0e0e3a86748f}) of ThingClass heosPlayer ---------- @@ -271,14 +265,14 @@ The name of the EventType ({3e11470d-a5b7-499c-be55-9b1b4fe5eedf}) of ThingClass - + Notification url The name of the ParamType (ThingClass: denon, Type: plugin, ID: {5a3cd3eb-8ff5-4110-aef0-7b0608450e60}) - - + + Pause The name of the ActionType ({21c1cbe6-278f-4688-a65f-6620be1ee5ea}) of ThingClass heosPlayer ---------- @@ -286,8 +280,8 @@ The name of the ActionType ({3de38047-006f-4d97-9326-08bb5ad79b05}) of ThingClas - - + + Play The name of the ActionType ({c64964e4-cea0-468a-a9bf-8f69657b74e9}) of ThingClass heosPlayer ---------- @@ -295,12 +289,12 @@ The name of the ActionType ({d04eb30b-838d-4fbd-b781-c01005b59756}) of ThingClas - - - - - - + + + + + + Playback status The name of the ParamType (ThingClass: heosPlayer, ActionType: playbackStatus, ID: {6db3b484-4cd4-477b-b822-275865d308db}) ---------- @@ -316,8 +310,8 @@ The name of the StateType ({8ef6708c-812a-4e6a-a608-9e480aa3b7bf}) of ThingClass - - + + Playback status changed The name of the EventType ({6db3b484-4cd4-477b-b822-275865d308db}) of ThingClass heosPlayer ---------- @@ -325,16 +319,16 @@ The name of the EventType ({8ef6708c-812a-4e6a-a608-9e480aa3b7bf}) of ThingClass - + Player ID The name of the ParamType (ThingClass: heosPlayer, Type: thing, ID: {89629008-6ad8-4e92-863d-b86e0e012d0b}) - - - - + + + + Player type The name of the ParamType (ThingClass: heosPlayer, EventType: playerType, ID: {c59835ac-ee6e-4e6c-aa20-aeb3501937c5}) ---------- @@ -346,8 +340,8 @@ The name of the StateType ({2f372374-16f3-4900-afdc-834f51075d07}) of ThingClass - - + + Player type changed The name of the EventType ({c59835ac-ee6e-4e6c-aa20-aeb3501937c5}) of ThingClass heosPlayer ---------- @@ -355,9 +349,9 @@ The name of the EventType ({2f372374-16f3-4900-afdc-834f51075d07}) of ThingClass - - - + + + Power The name of the ParamType (ThingClass: AVRX1000, ActionType: power, ID: {1cdb6b54-6831-4900-95b2-c78f64497701}) ---------- @@ -367,24 +361,24 @@ The name of the StateType ({1cdb6b54-6831-4900-95b2-c78f64497701}) of ThingClass - + Power changed The name of the EventType ({1cdb6b54-6831-4900-95b2-c78f64497701}) of ThingClass AVRX1000 - + Reboot The name of the ActionType ({4f8b7fe8-7a18-483a-859d-ed5acb0b9a20}) of ThingClass heos - - - - - - + + + + + + Repeat mode The name of the ParamType (ThingClass: heosPlayer, ActionType: repeat, ID: {4e60cd17-5845-4351-aa2c-2504610e1532}) ---------- @@ -400,8 +394,8 @@ The name of the StateType ({9478987b-14e4-4572-a059-a18a5a9db229}) of ThingClass - - + + Repeat mode changed The name of the EventType ({4e60cd17-5845-4351-aa2c-2504610e1532}) of ThingClass heosPlayer ---------- @@ -409,8 +403,8 @@ The name of the EventType ({9478987b-14e4-4572-a059-a18a5a9db229}) of ThingClass - - + + Serial number The name of the ParamType (ThingClass: heosPlayer, Type: thing, ID: {866e8d6a-953f-4bdc-8d85-8d92e51e8592}) ---------- @@ -418,14 +412,14 @@ The name of the ParamType (ThingClass: heos, Type: thing, ID: {f796664d-6cb7-4f2 - + Set bass The name of the ActionType ({2c92b22e-d5b2-4991-a523-64222bffc9e7}) of ThingClass AVRX1000 - - + + Set mute The name of the ActionType ({fcc89c7c-b793-4b6f-a3dc-0e0e3a86748f}) of ThingClass heosPlayer ---------- @@ -433,8 +427,8 @@ The name of the ActionType ({3e11470d-a5b7-499c-be55-9b1b4fe5eedf}) of ThingClas - - + + Set playback status The name of the ActionType ({6db3b484-4cd4-477b-b822-275865d308db}) of ThingClass heosPlayer ---------- @@ -442,8 +436,8 @@ The name of the ActionType ({8ef6708c-812a-4e6a-a608-9e480aa3b7bf}) of ThingClas - - + + Set repeat mode The name of the ActionType ({4e60cd17-5845-4351-aa2c-2504610e1532}) of ThingClass heosPlayer ---------- @@ -451,8 +445,8 @@ The name of the ActionType ({9478987b-14e4-4572-a059-a18a5a9db229}) of ThingClas - - + + Set shuffle The name of the ActionType ({4b581237-acf5-4d8f-9e83-9b24e9ac900a}) of ThingClass heosPlayer ---------- @@ -460,30 +454,30 @@ The name of the ActionType ({8ad33cb9-e758-433d-a013-2e4d43157c92}) of ThingClas - + Set surround mode The name of the ActionType ({4f203bdd-691c-4384-a934-2d49a5448f0a}) of ThingClass AVRX1000 - + Set tone control The name of the ActionType ({d57c1e5e-2cc9-4638-999c-1523f16dbb83}) of ThingClass AVRX1000 - + Set treble The name of the ActionType ({38a3be02-6ed4-4a84-903e-eb923b933989}) of ThingClass AVRX1000 - - - - - - + + + + + + Shuffle The name of the ParamType (ThingClass: heosPlayer, ActionType: shuffle, ID: {4b581237-acf5-4d8f-9e83-9b24e9ac900a}) ---------- @@ -499,8 +493,8 @@ The name of the StateType ({8ad33cb9-e758-433d-a013-2e4d43157c92}) of ThingClass - - + + Shuffle changed The name of the EventType ({4b581237-acf5-4d8f-9e83-9b24e9ac900a}) of ThingClass heosPlayer ---------- @@ -508,8 +502,8 @@ The name of the EventType ({8ad33cb9-e758-433d-a013-2e4d43157c92}) of ThingClass - - + + Skip back The name of the ActionType ({a718f7e9-0b54-4403-b661-49f7b0d13085}) of ThingClass heosPlayer ---------- @@ -517,8 +511,8 @@ The name of the ActionType ({3f2eb789-918c-475a-a295-14c0c24338b8}) of ThingClas - - + + Skip next The name of the ActionType ({57697e9c-ce5e-4b8f-b42e-16662829ceb2}) of ThingClass heosPlayer ---------- @@ -526,8 +520,8 @@ The name of the ActionType ({bf9664e4-a53e-474c-afcc-88f25e6fe365}) of ThingClas - - + + Source The name of the ParamType (ThingClass: heosPlayer, EventType: source, ID: {eee22722-3ee5-48f7-8af8-275dc04b21eb}) ---------- @@ -535,16 +529,16 @@ The name of the StateType ({eee22722-3ee5-48f7-8af8-275dc04b21eb}) of ThingClass - + Source changed The name of the EventType ({eee22722-3ee5-48f7-8af8-275dc04b21eb}) of ThingClass heosPlayer - - - - + + + + Step size The name of the ParamType (ThingClass: heosPlayer, ActionType: decreaseVolume, ID: {ef5a252b-3d28-4817-a668-1dacf0ed1f8a}) ---------- @@ -556,8 +550,8 @@ The name of the ParamType (ThingClass: AVRX1000, ActionType: increaseVolume, ID: - - + + Stop The name of the ActionType ({c4b29c09-e3b3-4843-b6d9-e032f3fc1d78}) of ThingClass heosPlayer ---------- @@ -565,9 +559,9 @@ The name of the ActionType ({ddab0869-5b90-4fd4-9c40-9ad57101b87c}) of ThingClas - - - + + + Surround mode The name of the ParamType (ThingClass: AVRX1000, ActionType: surroundMode, ID: {4f203bdd-691c-4384-a934-2d49a5448f0a}) ---------- @@ -577,16 +571,16 @@ The name of the StateType ({4f203bdd-691c-4384-a934-2d49a5448f0a}) of ThingClass - + Surround mode changed The name of the EventType ({4f203bdd-691c-4384-a934-2d49a5448f0a}) of ThingClass AVRX1000 - - - - + + + + Title The name of the ParamType (ThingClass: heosPlayer, EventType: title, ID: {bbeecf30-6feb-48d5-ade3-57b2a4eea05f}) ---------- @@ -598,8 +592,8 @@ The name of the StateType ({d32493d8-5faf-4c7a-ba94-847dc9b81615}) of ThingClass - - + + Title changed The name of the EventType ({bbeecf30-6feb-48d5-ade3-57b2a4eea05f}) of ThingClass heosPlayer ---------- @@ -607,9 +601,9 @@ The name of the EventType ({d32493d8-5faf-4c7a-ba94-847dc9b81615}) of ThingClass - - - + + + Tone control The name of the ParamType (ThingClass: AVRX1000, ActionType: toneControl, ID: {d57c1e5e-2cc9-4638-999c-1523f16dbb83}) ---------- @@ -619,15 +613,15 @@ The name of the StateType ({d57c1e5e-2cc9-4638-999c-1523f16dbb83}) of ThingClass - + Tone control changed The name of the EventType ({d57c1e5e-2cc9-4638-999c-1523f16dbb83}) of ThingClass AVRX1000 - - - + + + Treble The name of the ParamType (ThingClass: AVRX1000, ActionType: treble, ID: {38a3be02-6ed4-4a84-903e-eb923b933989}) ---------- @@ -637,20 +631,20 @@ The name of the StateType ({38a3be02-6ed4-4a84-903e-eb923b933989}) of ThingClass - + Treble changed The name of the EventType ({38a3be02-6ed4-4a84-903e-eb923b933989}) of ThingClass AVRX1000 - + Unjoin group The name of the Browser Item ActionType ({1b866b95-1fc7-4b45-ad71-c85e43fcc367}) of ThingClass heosPlayer - - + + User name The name of the ParamType (ThingClass: heos, EventType: userDisplayName, ID: {77756132-5fa4-409e-969e-d23bcee72356}) ---------- @@ -658,24 +652,24 @@ The name of the StateType ({77756132-5fa4-409e-969e-d23bcee72356}) of ThingClass - + User name changed The name of the EventType ({77756132-5fa4-409e-969e-d23bcee72356}) of ThingClass heos - + Version The name of the ParamType (ThingClass: heosPlayer, Type: thing, ID: {aa1158f7-b451-456a-840f-4f0c63b2b7f0}) - - - - - - + + + + + + Volume The name of the ParamType (ThingClass: heosPlayer, ActionType: volume, ID: {6d4886a1-fa5d-4889-96c5-7a1c206f59be}) ---------- @@ -691,8 +685,8 @@ The name of the StateType ({773636b9-304d-463a-8755-fc7488dc0ff3}) of ThingClass - - + + Volume changed The name of the EventType ({6d4886a1-fa5d-4889-96c5-7a1c206f59be}) of ThingClass heosPlayer ---------- @@ -700,14 +694,14 @@ The name of the EventType ({773636b9-304d-463a-8755-fc7488dc0ff3}) of ThingClass - + Set power The name of the ActionType ({1cdb6b54-6831-4900-95b2-c78f64497701}) of ThingClass AVRX1000 - - + + Set volume The name of the ActionType ({6d4886a1-fa5d-4889-96c5-7a1c206f59be}) of ThingClass heosPlayer ---------- @@ -715,7 +709,7 @@ The name of the ActionType ({773636b9-304d-463a-8755-fc7488dc0ff3}) of ThingClas - + Set channel The name of the ActionType ({f29ffa2c-31d6-4d88-b160-a38288c82ce1}) of ThingClass AVRX1000 @@ -724,28 +718,32 @@ The name of the ActionType ({773636b9-304d-463a-8755-fc7488dc0ff3}) of ThingClas IntegrationPluginDenon - - + UPnP discovery failed. - + Please enter your HEOS account credentials. Leave empty if you doesn't have any. Some features like music browsing won't be available. - + Serial number is not set - + + Device discovery failed. + + + + Service is not available - + Wrong username or password