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 89b65a29..fb15edf4 100644 --- a/denon/integrationplugindenon.cpp +++ b/denon/integrationplugindenon.cpp @@ -84,7 +84,7 @@ void IntegrationPluginDenon::discoverThings(ThingDiscoveryInfo *info) QStringList discoveredIds; foreach (const ZeroConfServiceEntry &service, m_serviceBrowser->serviceEntries()) { - qCDebug(dcDenon()) << "mDNS service entry:" << service; + qCDebug(dcDenon()) << "mDNS service entry:" << service; if (service.txt().contains("am=AVRX1000")) { QString id = service.name().split("@").first(); @@ -96,7 +96,6 @@ void IntegrationPluginDenon::discoverThings(ThingDiscoveryInfo *info) discoveredIds.append(id); ThingDescriptor thingDescriptor(AVRX1000ThingClassId, name, address); ParamList params; - params.append(Param(AVRX1000ThingIpParamTypeId, address)); params.append(Param(AVRX1000ThingIdParamTypeId, id)); thingDescriptor.setParams(params); foreach (Thing *existingThing, myThings().filterByThingClassId(AVRX1000ThingClassId)) { @@ -118,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); @@ -173,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(); + } + } } } @@ -196,12 +206,17 @@ void IntegrationPluginDenon::setupThing(ThingSetupInfo *info) Thing *thing = info->thing(); if (thing->thingClassId() == AVRX1000ThingClassId) { - qCDebug(dcDenon) << "Setup Denon thing" << thing->paramValue(AVRX1000ThingIpParamTypeId).toString(); + qCDebug(dcDenon) << "Setup AVR X1000 thing" << thing->name(); - QHostAddress address(thing->paramValue(AVRX1000ThingIpParamTypeId).toString()); + if (m_avrConnections.contains(thing->id())) { + qCDebug(dcDenon()) << "Setup after reconfiguration, cleaning up ..."; + m_avrConnections.take(thing->id())->deleteLater(); + + } + QString id = thing->paramValue(AVRX1000ThingIdParamTypeId).toString(); + QHostAddress address = findAvrById(id); if (address.isNull()) { - qCWarning(dcDenon) << "Could not parse ip address" << thing->paramValue(AVRX1000ThingIpParamTypeId).toString(); - info->finish(Thing::ThingErrorInvalidParameter, QT_TR_NOOP("The given IP address is not valid.")); + info->finish(Thing::ThingErrorHardwareNotAvailable); return; } @@ -235,32 +250,83 @@ void IntegrationPluginDenon::setupThing(ThingSetupInfo *info) denonConnection->connectDevice(); return; } else if (thing->thingClassId() == heosThingClassId) { - qCDebug(dcDenon) << "Setup Denon thing" << thing->paramValue(heosThingIpParamTypeId).toString(); - QHostAddress address(thing->paramValue(heosThingIpParamTypeId).toString()); - if (address.isNull()) { - qCWarning(dcDenon) << "Could not parse ip address" << thing->paramValue(heosThingIpParamTypeId).toString(); - info->finish(Thing::ThingErrorInvalidParameter, QT_TR_NOOP("The given IP address is not valid.")); + qCDebug(dcDenon) << "Setup Heos connection thing" << thing->name(); + QString serialnumber = thing->paramValue(heosThingSerialNumberParamTypeId).toString(); + if (serialnumber.isEmpty()) { + qCWarning(dcDenon) << "Serial number is empty"; + info->finish(Thing::ThingErrorInvalidParameter, QT_TR_NOOP("Serial number is not set")); return; } - Heos *heos; + if (m_heosConnections.contains(thing->id())) { + qCDebug(dcDenon()) << "Setup after reconfiguration, cleaning up ..."; + m_heosConnections.take(thing->id())->deleteLater(); + } + if (m_unfinishedHeosConnections.contains(thing->id())) { - heos = m_unfinishedHeosConnections.take(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 { - heos = createHeosConnection(address); - m_heosConnections.insert(thing->id(), heos); - m_asyncHeosSetups.insert(heos, info); - // In case the setup is cancelled before we finish it... - connect(info, &QObject::destroyed, this, [=]() {m_asyncHeosSetups.remove(heos);}); - heos->connectDevice(); + 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("Device discovery failed.")); + return; + } + 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(); + qCDebug(dcDenon()) << "Found Heos device, creating Heos connection"; + Heos *heos = createHeosConnection(upnpThing.hostAddress()); + m_heosConnections.insert(thingId, heos); + m_asyncHeosSetups.insert(heos, info); + // In case the setup is cancelled before we finish it... + connect(info, &ThingSetupInfo::aborted, heos, &Heos::deleteLater); + connect(heos, &Heos::destroyed, this, [thingId, heos, this] { + m_asyncHeosSetups.remove(heos); + m_heosConnections.remove(thingId); + }); + heos->connectDevice(); + return; + } + } + } + qCDebug(dcDenon()) << "Device not found"; + info->finish(Thing::ThingErrorHardwareNotAvailable); + return; + }); } - return; } else if (thing->thingClassId() == heosPlayerThingClassId) { - info->finish(Thing::ThingErrorNoError); - return; + + 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); } @@ -490,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()); @@ -506,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(); @@ -531,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); } @@ -557,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); } } @@ -590,6 +648,14 @@ void IntegrationPluginDenon::onAvrConnectionChanged(bool status) if (thing->thingClassId() == AVRX1000ThingClassId) { thing->setStateValue(AVRX1000ConnectedStateTypeId, denonConnection->connected()); + + if (!status) { + QString id = thing->paramValue(AVRX1000ThingIdParamTypeId).toString(); + QHostAddress address = findAvrById(id); + if (!address.isNull()){ + denonConnection->setHostAddress(address); + } + } } } @@ -816,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())) { @@ -825,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 @@ -857,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; @@ -884,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); } @@ -1181,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 @@ -1203,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"; @@ -1416,3 +1516,15 @@ Heos *IntegrationPluginDenon::createHeosConnection(const QHostAddress &address) connect(heos, &Heos::userChanged, this, &IntegrationPluginDenon::onHeosUserChanged); return heos; } + +QHostAddress IntegrationPluginDenon::findAvrById(const QString &id) +{ + foreach (const ZeroConfServiceEntry &service, m_serviceBrowser->serviceEntries()) { + if (service.txt().contains("am=AVRX1000")) { + if (service.name().split("@").first() == id) { + return service.hostAddress(); + } + } + } + return QHostAddress(); +} diff --git a/denon/integrationplugindenon.h b/denon/integrationplugindenon.h index bcd8333f..432a0a36 100644 --- a/denon/integrationplugindenon.h +++ b/denon/integrationplugindenon.h @@ -102,7 +102,10 @@ private: QHash m_groupBuffer; QHash m_playerBuffer; + QHash m_heosIpAddresses; + Heos *createHeosConnection(const QHostAddress &address); + QHostAddress findAvrById(const QString &id); private slots: void onPluginTimer(); @@ -126,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 45b984fc..c57c0ad5 100644 --- a/denon/integrationplugindenon.json +++ b/denon/integrationplugindenon.json @@ -24,18 +24,12 @@ "createMethods": ["discovery"], "interfaces": ["mediaplayer", "mediacontroller", "volumecontroller", "mediametadataprovider", "connectable", "power"], "paramTypes": [ - { - "id": "cb6eeeb0-3d75-43b6-8177-b5ac19648557", - "name": "ip", - "displayName": "IPv4 address", - "type" : "QString", - "inputType": "IPv4Address" - }, { "id": "2e8806cb-f6f3-4e9a-b6ea-0b35f75e61c5", "name": "id", "displayName": "ID", - "type" : "QString" + "type" : "QString", + "readOnly": true } ], "stateTypes": [ @@ -319,24 +313,19 @@ "setupMethod": "userandpassword", "interfaces": ["gateway"], "paramTypes": [ - { - "id": "a54b98b4-b78f-41dd-a257-14425c6cf9ab", - "name": "ip", - "displayName": "IPv4 address", - "type" : "QString", - "inputType": "IPv4Address" - }, { "id": "f796664d-6cb7-4f29-9d05-771968d82a32", "name": "serialNumber", "displayName": "Serial number", - "type" : "QString" + "type" : "QString", + "readOnly": true }, { "id": "ab1a0be8-e3a5-4f95-b9b7-893de1ca4cf7", "name": "modelName", "displayName": "Model name", - "type" : "QString" + "type" : "QString", + "readOnly": true } ], "stateTypes": [ diff --git a/denon/translations/cd758269-dbbb-4ef0-80ab-48bd9a8a2765-de.ts b/denon/translations/cd758269-dbbb-4ef0-80ab-48bd9a8a2765-de.ts index 66a967b5..caeeaadb 100644 --- a/denon/translations/cd758269-dbbb-4ef0-80ab-48bd9a8a2765-de.ts +++ b/denon/translations/cd758269-dbbb-4ef0-80ab-48bd9a8a2765-de.ts @@ -195,15 +195,6 @@ The name of the ActionType ({d3752c32-92e3-4396-8e2f-ab5e57c6cfb1}) of ThingClas - IPv4 address - The name of the ParamType (ThingClass: heos, Type: thing, ID: {a54b98b4-b78f-41dd-a257-14425c6cf9ab}) ----------- -The name of the ParamType (ThingClass: AVRX1000, Type: thing, ID: {cb6eeeb0-3d75-43b6-8177-b5ac19648557}) - IPv4 Adresse - - - - Increase volume The name of the ActionType ({ebdc35f8-24a2-4984-855e-4c1a158289b7}) of ThingClass heosPlayer ---------- @@ -211,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}) ---------- @@ -226,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}) ---------- @@ -265,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 ---------- @@ -274,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 ---------- @@ -289,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 ---------- @@ -298,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}) ---------- @@ -319,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 ---------- @@ -328,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}) ---------- @@ -349,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 ---------- @@ -358,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}) ---------- @@ -370,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}) ---------- @@ -403,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 ---------- @@ -412,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}) ---------- @@ -421,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 ---------- @@ -436,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 ---------- @@ -445,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 ---------- @@ -454,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 ---------- @@ -463,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}) ---------- @@ -502,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 ---------- @@ -511,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 ---------- @@ -520,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 ---------- @@ -529,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}) ---------- @@ -538,18 +529,24 @@ 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}) ---------- -The name of the ParamType (ThingClass: heosPlayer, ActionType: increaseVolume, ID: {0770da3f-61c3-4145-b0d8-348f42a8cf0d}) +The name of the ParamType (ThingClass: heosPlayer, ActionType: increaseVolume, ID: {0770da3f-61c3-4145-b0d8-348f42a8cf0d}) +---------- +The name of the ParamType (ThingClass: AVRX1000, ActionType: decreaseVolume, ID: {0731daad-e689-40f6-8685-6d6362b715ec}) +---------- +The name of the ParamType (ThingClass: AVRX1000, ActionType: increaseVolume, ID: {f24e4e9d-5f7b-4b5c-ad0a-eb6316d86408}) Schrittgröße @@ -697,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 ---------- @@ -712,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 @@ -721,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. - - - The given IP address is not valid. - Die eingegebene IP-Adresse ist nicht gültig. + + 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 06dd8803..208b79d4 100644 --- a/denon/translations/cd758269-dbbb-4ef0-80ab-48bd9a8a2765-en_US.ts +++ b/denon/translations/cd758269-dbbb-4ef0-80ab-48bd9a8a2765-en_US.ts @@ -195,15 +195,6 @@ The name of the ActionType ({d3752c32-92e3-4396-8e2f-ab5e57c6cfb1}) of ThingClas - IPv4 address - The name of the ParamType (ThingClass: heos, Type: thing, ID: {a54b98b4-b78f-41dd-a257-14425c6cf9ab}) ----------- -The name of the ParamType (ThingClass: AVRX1000, Type: thing, ID: {cb6eeeb0-3d75-43b6-8177-b5ac19648557}) - - - - - Increase volume The name of the ActionType ({ebdc35f8-24a2-4984-855e-4c1a158289b7}) of ThingClass heosPlayer ---------- @@ -211,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}) ---------- @@ -226,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}) ---------- @@ -265,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 ---------- @@ -274,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 ---------- @@ -289,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 ---------- @@ -298,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}) ---------- @@ -319,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 ---------- @@ -328,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}) ---------- @@ -349,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 ---------- @@ -358,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}) ---------- @@ -370,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}) ---------- @@ -403,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 ---------- @@ -412,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}) ---------- @@ -421,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 ---------- @@ -436,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 ---------- @@ -445,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 ---------- @@ -454,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 ---------- @@ -463,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}) ---------- @@ -502,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 ---------- @@ -511,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 ---------- @@ -520,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 ---------- @@ -529,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}) ---------- @@ -538,18 +529,24 @@ 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}) ---------- -The name of the ParamType (ThingClass: heosPlayer, ActionType: increaseVolume, ID: {0770da3f-61c3-4145-b0d8-348f42a8cf0d}) +The name of the ParamType (ThingClass: heosPlayer, ActionType: increaseVolume, ID: {0770da3f-61c3-4145-b0d8-348f42a8cf0d}) +---------- +The name of the ParamType (ThingClass: AVRX1000, ActionType: decreaseVolume, ID: {0731daad-e689-40f6-8685-6d6362b715ec}) +---------- +The name of the ParamType (ThingClass: AVRX1000, ActionType: increaseVolume, ID: {f24e4e9d-5f7b-4b5c-ad0a-eb6316d86408}) @@ -697,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 ---------- @@ -712,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 @@ -721,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. - - - The given IP address is not valid. + + Serial number is not set - + + Device discovery failed. + + + + Service is not available - + Wrong username or password