diff --git a/denon/avrconnection.cpp b/denon/avrconnection.cpp index 43d69652..836242e6 100644 --- a/denon/avrconnection.cpp +++ b/denon/avrconnection.cpp @@ -1,4 +1,4 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright 2013 - 2020, nymea GmbH * Contact: contact@nymea.io @@ -43,6 +43,23 @@ AvrConnection::AvrConnection(const QHostAddress &hostAddress, const int &port, Q connect(m_socket, &QTcpSocket::readyRead, this, &AvrConnection::readData); // Note: error signal will be interpreted as function, not as signal in C++11 connect(m_socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onError(QAbstractSocket::SocketError))); + + m_commandTimer = new QTimer(this); + m_commandTimer->start(50); // 50ms is the minimum request interval specified + + connect(m_commandTimer, &QTimer::timeout, this, [this] { + if (!m_commandBuffer.isEmpty()) { + QPair command = m_commandBuffer.takeFirst(); + if (m_socket->write(command.second) == -1) { + emit commandExecuted(command.first, false); + qCWarning(dcDenon()) << "Could not execute command" << command.second; + } else { + emit commandExecuted(command.first, true); + } + } else { + m_commandTimer->stop(); + } + }); } AvrConnection::~AvrConnection() @@ -68,66 +85,90 @@ QHostAddress AvrConnection::hostAddress() const return m_hostAddress; } +void AvrConnection::setHostAddress(const QHostAddress &hostAddress) +{ + if (m_hostAddress != hostAddress) { + disconnectDevice(); + m_hostAddress = hostAddress; + connectDevice(); + } +} + int AvrConnection::port() const { return m_port; } +void AvrConnection::setPort(int port) +{ + if (m_port != port) { + disconnectDevice(); + m_port = port; + connectDevice(); + } +} + bool AvrConnection::connected() { return m_socket->isOpen(); } -void AvrConnection::getAllStatus() +QUuid AvrConnection::getChannel() { - sendCommand("PW?\rSI?\rMV?\rMS?\rMU?\r"); + return sendCommand("SI?\r"); } -void AvrConnection::getChannel() +QUuid AvrConnection::getVolume() { - sendCommand("SI?\r"); + return sendCommand("MV?\r"); } -void AvrConnection::getVolume() +QUuid AvrConnection::getMute() { - sendCommand("MV?\r"); + return sendCommand("MU?\r"); } -void AvrConnection::getMute() +QUuid AvrConnection::getPower() { - sendCommand("MU?\r"); + return sendCommand("PW?\r"); } -void AvrConnection::getPower() +QUuid AvrConnection::getSurroundMode() { - sendCommand("PW?\r"); + return sendCommand("MS?\r"); } -void AvrConnection::getSurroundMode() +QUuid AvrConnection::getPlayBackInfo() { - sendCommand("MS?\r"); + return sendCommand("NSE\r"); } -void AvrConnection::sendCommand(const QByteArray &message) +QUuid AvrConnection::sendCommand(const QByteArray &message) { - m_socket->write(message); + QUuid commandId = QUuid::createUuid(); + + if (!m_commandTimer->isActive()) + m_commandTimer->start(50); + + m_commandBuffer.append(QPair(commandId, message)); + return commandId; } -void AvrConnection::setChannel(const QByteArray &channel) +QUuid AvrConnection::setChannel(const QByteArray &channel) { QByteArray cmd = "SI" + channel + "\r"; - qCDebug(dcDenon) << "Change to channel:" << cmd; - sendCommand(cmd); + qCDebug(dcDenon) << "Change to channel:" << channel; + return sendCommand(cmd); } -void AvrConnection::setVolume(int volume) +QUuid AvrConnection::setVolume(int volume) { qCDebug(dcDenon) << "Set volume" << volume; QByteArray cmd = "MV" + QByteArray::number(volume) + "\r"; - sendCommand(cmd); + return sendCommand(cmd); } -void AvrConnection::setMute(bool mute) +QUuid AvrConnection::setMute(bool mute) { qCDebug(dcDenon) << "Set mute" << mute; QByteArray cmd; @@ -136,10 +177,10 @@ void AvrConnection::setMute(bool mute) } else { cmd = "MUOFF\r"; } - sendCommand(cmd); + return sendCommand(cmd); } -void AvrConnection::setPower(bool power) +QUuid AvrConnection::setPower(bool power) { qCDebug(dcDenon) << "Set power" << power; QByteArray cmd; @@ -148,28 +189,125 @@ void AvrConnection::setPower(bool power) } else { cmd = "PWSTANDBY\r"; } - sendCommand(cmd); + return sendCommand(cmd); } -void AvrConnection::setSurroundMode(const QByteArray &surroundMode) +QUuid AvrConnection::setSurroundMode(const QByteArray &surroundMode) { qCDebug(dcDenon) << "Set surround mode" << surroundMode; QByteArray cmd = "MS" + surroundMode + "\r"; - sendCommand(cmd); + return sendCommand(cmd); } -void AvrConnection::increaseVolume() +QUuid AvrConnection::enableToneControl(bool enabled) +{ + QByteArray cmd; + if (enabled) { + cmd = "PSTONE CTRL ON\r"; + } else { + cmd = "PSTONE CTRL OFF\r"; + } + return sendCommand(cmd); +} + +QUuid AvrConnection::setBassLevel(int level) +{ + QByteArray cmd; + cmd = "PSBAS "; + cmd.append(50 + level); + cmd.append("\r"); + return sendCommand(cmd); +} + +QUuid AvrConnection::setTrebleLevel(int level) +{ + QByteArray cmd; + cmd = "PSTRE "; + cmd.append(50 + level); + cmd.append("\r"); + return sendCommand(cmd); +} + +QUuid AvrConnection::getBassLevel() +{ + return sendCommand("PSBAS ?\r"); +} + +QUuid AvrConnection::getTrebleLevel() +{ + return sendCommand("PSTRE ?\r"); +} + +QUuid AvrConnection::getToneControl() +{ + return sendCommand("PSTONE CTRL ?\r"); +} + +QUuid AvrConnection::play() +{ + return sendCommand("NS9A\r"); +} + +QUuid AvrConnection::pause() +{ + return sendCommand("NS9B\r"); +} + +QUuid AvrConnection::stop() +{ + return sendCommand("NS9C\r"); +} + +QUuid AvrConnection::skipNext() +{ + return sendCommand("NS9D\r"); +} + +QUuid AvrConnection::skipBack() +{ + return sendCommand("NS9E\r"); +} + +QUuid AvrConnection::setRandom(bool on) +{ + QByteArray cmd; + if (on) { + cmd = "NS9K\r"; + } else { + cmd = "NS9M\r"; + } + return sendCommand(cmd); +} + +QUuid AvrConnection::setRepeat(AvrConnection::RepeatMode mode) +{ + QByteArray cmd; + switch (mode) { + case RepeatModeRepeatAll: + cmd = "NS9I\r"; + break; + case RepeatModeRepeatOne: + cmd = "NS9H\r"; + break; + case RepeatModeRepeatNone: + cmd = "NS9J\r"; + break; + } + return sendCommand(cmd); +} + +QUuid AvrConnection::increaseVolume() { qCDebug(dcDenon) << "Execute volume increase"; QByteArray cmd = "MVUP\r"; - sendCommand(cmd); + return sendCommand(cmd); } -void AvrConnection::decreaseVolume() +QUuid AvrConnection::decreaseVolume() { qCDebug(dcDenon) << "Execute volume decrease"; QByteArray cmd = "MVDOWN\r"; - sendCommand(cmd); + return sendCommand(cmd); } void AvrConnection::onConnected() @@ -192,77 +330,112 @@ void AvrConnection::onError(QAbstractSocket::SocketError socketError) void AvrConnection::readData() { - QByteArray data = m_socket->readAll(); - qCDebug(dcDenon) << "Data received" << data; + QString data = QString(m_socket->readAll()); - if (data.contains("MV") && !data.contains("MAX")){ - int index = data.indexOf("MV"); - int volume = data.mid(index+2, 2).toInt(); - emit volumeChanged(volume); - } + QStringList lines = data.split('\r'); + foreach (QString line, lines) { + if(line.isEmpty()) + continue; - if (data.left(2).contains("SI")) { - QByteArray cmd; - if (data.contains("TUNER")) { - cmd = "TUNER"; - } else if (data.contains("DVD")) { - cmd = "DVD"; - } else if (data.contains("BD")) { - cmd = "BD"; - } else if (data.contains("TV")) { - cmd = "TV"; - } else if (data.contains("SAT/CBL")) { - cmd = "SAT/CBL"; - } else if (data.contains("MPLAY")) { - cmd = "MPLAY"; - } else if (data.contains("GAME")) { - cmd = "GAME"; - } else if (data.contains("AUX1")) { - cmd = "AUX1"; - } else if (data.contains("NET")) { - cmd = "NET"; - } else if (data.contains("PANDORA")) { - cmd = "PANDORA"; - } else if (data.contains("SIRIUSXM")) { - cmd = "SIRIUSXM"; - } else if (data.contains("SPOTIFY")) { - cmd = "SPOTIFY"; - } else if (data.contains("FLICKR")) { - cmd = "FLICKR"; - } else if (data.contains("FAVORITES")) { - cmd = "FAVORITES"; - } else if (data.contains("IRADIO")) { - cmd = "IRADIO"; - } else if (data.contains("SERVER")) { - cmd = "SERVER"; - } else if (data.contains("USB/IPOD")) { - cmd = "USB/IPOD"; - } else if (data.contains("IPD")) { - cmd = "IPD"; - } else if (data.contains("IRP")) { - cmd = "IRP"; - } else if (data.contains("FVP")) { - cmd = "FVP"; + qCDebug(dcDenon) << "Data received" << line; + if (line.contains("MV") && !data.contains("MAX")){ + int index = data.indexOf("MV"); + int volume = data.mid(index+2, 2).toInt(); + emit volumeChanged(volume); + + } else if (line.left(2).contains("SI")) { + QByteArray cmd; + if (data.contains("TUNER")) { + cmd = "TUNER"; + } else if (data.contains("DVD")) { + cmd = "DVD"; + } else if (data.contains("BD")) { + cmd = "BD"; + } else if (data.contains("TV")) { + cmd = "TV"; + } else if (data.contains("SAT/CBL")) { + cmd = "SAT/CBL"; + } else if (data.contains("MPLAY")) { + cmd = "MPLAY"; + } else if (data.contains("GAME")) { + cmd = "GAME"; + } else if (data.contains("AUX1")) { + cmd = "AUX1"; + } else if (data.contains("NET")) { + cmd = "NET"; + } else if (data.contains("PANDORA")) { + cmd = "PANDORA"; + } else if (data.contains("SIRIUSXM")) { + cmd = "SIRIUSXM"; + } else if (data.contains("SPOTIFY")) { + cmd = "SPOTIFY"; + } else if (data.contains("FLICKR")) { + cmd = "FLICKR"; + } else if (data.contains("FAVORITES")) { + cmd = "FAVORITES"; + } else if (data.contains("IRADIO")) { + cmd = "IRADIO"; + } else if (data.contains("SERVER")) { + cmd = "SERVER"; + } else if (data.contains("USB/IPOD")) { + cmd = "USB/IPOD"; + } else if (data.contains("IPD")) { + cmd = "IPD"; + } else if (data.contains("IRP")) { + cmd = "IRP"; + } else if (data.contains("FVP")) { + cmd = "FVP"; + } + emit channelChanged(cmd); + } else if (data.contains("PWON")) { + emit powerChanged(true); + } else if (data.contains("PWSTANDBY")) { + emit powerChanged(false); + } else if (data.contains("MUON")) { + emit muteChanged(true); + } else if (data.contains("MUOFF")) { + emit muteChanged(false); + } else if (data.left(2).contains("MS")) { + QString surroundMode = data.remove(0, 2).trimmed(); + qCDebug(dcDenon()) << "Surround mode changed" << surroundMode; + emit surroundModeChanged(surroundMode); + + } else if (data.left(4).contains("NSE0")) { + QString nowPlaying = QString(data).remove(0, 4).trimmed(); + qCDebug(dcDenon()) << "Playbackstatus" << nowPlaying; + if (nowPlaying.contains("Now Playing")) { + emit playBackModeChanged(PlayBackMode::PlayBackModePlaying); + } else { + emit playBackModeChanged(PlayBackMode::PlayBackModeStopped); + } + } else if (data.left(4).contains("NSE1")) { + QString song = QString(data).remove(0, 5).trimmed(); + qCDebug(dcDenon()) << "Song" << song; + emit songChanged(song); + } else if (data.left(4).contains("NSE2")) { + QString artist = QString(data).remove(0, 5).trimmed(); + qCDebug(dcDenon()) << "Artist" << artist; + emit artistChanged(artist); + } else if (data.left(4).contains("NSE4")) { + QString album = QString(data).remove(0, 5).trimmed(); + qCDebug(dcDenon()) << "Album" << album; + emit albumChanged(album); + } else if (data.contains("PSTONE CTRL ON")) { + qCDebug(dcDenon()) << "Tone control is on"; + emit toneControlEnabledChanged(true); + } else if (data.contains("PSTONE CTRL OFF")) { + qCDebug(dcDenon()) << "Tone control is off"; + emit toneControlEnabledChanged(false); + } else if (data.contains("PSBAS")) { + int index = data.indexOf("PSBAS"); + int bass = data.mid(index+6, 2).toInt() - 50; + qCDebug(dcDenon()) << "Bass level" << bass; + emit bassLevelChanged(bass); + } else if (data.contains("PSTRE")) { + int index = data.indexOf("PSTRE"); + int treble = data.mid(index+6, 2).toInt() - 50; + qCDebug(dcDenon()) << "Treble level" << treble; + emit trebleLevelChanged(treble); } - emit channelChanged(cmd); - } - - if (data.contains("PWON")) { - emit powerChanged(true); - } - if (data.contains("PWSTANDBY")) { - emit powerChanged(false); - } - if (data.contains("MUON")) { - emit muteChanged(false); - } - if (data.contains("MUOFF")) { - emit muteChanged(false); - } - - if (data.left(2).contains("MS")) { - data.remove(0, 2); - QByteArray cmd = data; - emit surroundModeChanged(cmd); } } diff --git a/denon/avrconnection.h b/denon/avrconnection.h index d51c71a3..32529817 100644 --- a/denon/avrconnection.h +++ b/denon/avrconnection.h @@ -34,11 +34,25 @@ #include #include #include +#include +#include class AvrConnection : public QObject { Q_OBJECT public: + enum RepeatMode { + RepeatModeRepeatAll, + RepeatModeRepeatOne, + RepeatModeRepeatNone + }; + + enum PlayBackMode { + PlayBackModePlaying, + PlayBackModeStopped, + PlayBackModePaused + }; + explicit AvrConnection(const QHostAddress &hostAddress, const int &port = 23, QObject *parent = nullptr); ~AvrConnection(); @@ -46,30 +60,49 @@ public: void disconnectDevice(); QHostAddress hostAddress() const; + void setHostAddress(const QHostAddress &hostAddress); int port() const; + void setPort(int port); bool connected(); - void getAllStatus(); - void getChannel(); - void getVolume(); - void getMute(); - void getPower(); - void getSurroundMode(); + QUuid getChannel(); + QUuid getVolume(); + QUuid getMute(); + QUuid getPower(); + QUuid getSurroundMode(); + QUuid getPlayBackInfo(); - void setChannel(const QByteArray &channel); - void setVolume(int volume); - void setMute(bool mute); - void setPower(bool power); - void setSurroundMode(const QByteArray &surroundMode); + QUuid setChannel(const QByteArray &channel); + QUuid setVolume(int volume); + QUuid setMute(bool mute); + QUuid setPower(bool power); + QUuid setSurroundMode(const QByteArray &surroundMode); + QUuid enableToneControl(bool enabled); + QUuid setBassLevel(int level); //-6 to +6 + QUuid setTrebleLevel(int level); //-6 to +6 - void increaseVolume(); - void decreaseVolume(); + QUuid getBassLevel(); + QUuid getTrebleLevel(); + QUuid getToneControl(); + + QUuid play(); + QUuid pause(); + QUuid stop(); + QUuid skipNext(); + QUuid skipBack(); + QUuid setRandom(bool on); + QUuid setRepeat(RepeatMode mode); + + QUuid increaseVolume(); + QUuid decreaseVolume(); private: + QTimer *m_commandTimer = nullptr; QTcpSocket *m_socket = nullptr; QHostAddress m_hostAddress; int m_port; + QList> m_commandBuffer; - void sendCommand(const QByteArray &message); + QUuid sendCommand(const QByteArray &message); private slots: void onConnected(); @@ -80,11 +113,19 @@ private slots: signals: void socketErrorOccured(QAbstractSocket::SocketError socketError); void connectionStatusChanged(bool status); + void commandExecuted(const QUuid &commandId, bool success); void volumeChanged(int volume); void muteChanged(bool mute); - void channelChanged(const QByteArray &channel); + void channelChanged(const QString &channel); void powerChanged(bool power); - void surroundModeChanged(const QByteArray &surroundMode); + void surroundModeChanged(const QString &surroundMode); + void songChanged(const QString &song); + void artistChanged(const QString &artist); + void albumChanged(const QString &album); + void playBackModeChanged(AvrConnection::PlayBackMode); + void bassLevelChanged(int level); + void trebleLevelChanged(int level); + void toneControlEnabledChanged(bool enabled); }; #endif // AVRCONNECTION_H diff --git a/denon/integrationplugindenon.cpp b/denon/integrationplugindenon.cpp index c3a26110..b1618917 100644 --- a/denon/integrationplugindenon.cpp +++ b/denon/integrationplugindenon.cpp @@ -53,51 +53,63 @@ void IntegrationPluginDenon::init() { m_notificationUrl = QUrl(configValue(denonPluginNotificationUrlParamTypeId).toString()); connect(this, &IntegrationPluginDenon::configValueChanged, this, &IntegrationPluginDenon::onPluginConfigurationChanged); + + m_serviceBrowser = hardwareManager()->zeroConfController()->createServiceBrowser(); + connect(m_serviceBrowser, &ZeroConfServiceBrowser::serviceEntryAdded, this, [=](const ZeroConfServiceEntry &entry){ + foreach (Thing *thing, myThings().filterByThingClassId(AVRX1000ThingClassId)) { + + if (entry.txt().contains("am=AVRX1000")) { + QString existingId = thing->paramValue(AVRX1000ThingIdParamTypeId).toString(); + QString discoveredId = entry.name().split("@").first(); + QHostAddress address = entry.hostAddress(); + if (existingId == discoveredId && m_avrConnections.contains(thing->id())) { + AvrConnection *avrConnection = m_avrConnections.value(thing->id()); + avrConnection->setHostAddress(address); + } + } + } + }); } void IntegrationPluginDenon::discoverThings(ThingDiscoveryInfo *info) { if (info->thingClassId() == AVRX1000ThingClassId) { - if (!hardwareManager()->zeroConfController()->available() || !hardwareManager()->zeroConfController()->enabled()) { - //: Error discovering Denon things - info->finish(Thing::ThingErrorHardwareNotAvailable, QT_TR_NOOP("Thing discovery is not available.")); + + if (!hardwareManager()->zeroConfController()->available()) { + qCDebug(dcDenon()) << "Error discovering Denon things. Available:" << hardwareManager()->zeroConfController()->available(); + info->finish(Thing::ThingErrorHardwareNotAvailable, "Thing discovery not possible"); return; } - if (!m_serviceBrowser) { - m_serviceBrowser = hardwareManager()->zeroConfController()->createServiceBrowser();; - } + QStringList discoveredIds; - QTimer::singleShot(2000, info, [this, info](){ - QStringList discoveredIds; + foreach (const ZeroConfServiceEntry &service, m_serviceBrowser->serviceEntries()) { + qCDebug(dcDenon()) << "mDNS service entry:" << service; + if (service.txt().contains("am=AVRX1000")) { - foreach (const ZeroConfServiceEntry &service, m_serviceBrowser->serviceEntries()) { - if (service.txt().contains("am=AVRX1000")) { - - QString id = service.name().split("@").first(); - QString name = service.name().split("@").last(); - QString address = service.hostAddress().toString(); - qCDebug(dcDenon) << "service discovered" << name << "ID:" << id; - if (discoveredIds.contains(id)) + QString id = service.name().split("@").first(); + QString name = service.name().split("@").last(); + QString address = service.hostAddress().toString(); + qCDebug(dcDenon) << "service discovered" << name << "ID:" << id; + if (discoveredIds.contains(id)) + break; + 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)) { + if (existingThing->paramValue(AVRX1000ThingIdParamTypeId).toString() == id) { + thingDescriptor.setThingId(existingThing->id()); break; - 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()) { - if (existingThing->paramValue(AVRX1000ThingIdParamTypeId).toString() == id) { - thingDescriptor.setThingId(existingThing->id()); - break; - } } - info->addThingDescriptor(thingDescriptor); } + info->addThingDescriptor(thingDescriptor); } - info->finish(Thing::ThingErrorNoError); - }); - return; + } + info->finish(Thing::ThingErrorNoError); + } else if (info->thingClassId() == heosThingClassId) { /* * The HEOS products can be discovered using the UPnP SSDP protocol. Through discovery, @@ -196,16 +208,30 @@ void IntegrationPluginDenon::setupThing(ThingSetupInfo *info) AvrConnection *denonConnection = new AvrConnection(address, 23, this); connect(denonConnection, &AvrConnection::connectionStatusChanged, this, &IntegrationPluginDenon::onAvrConnectionChanged); connect(denonConnection, &AvrConnection::socketErrorOccured, this, &IntegrationPluginDenon::onAvrSocketError); + connect(denonConnection, &AvrConnection::commandExecuted, this, &IntegrationPluginDenon::onAvrCommandExecuted); connect(denonConnection, &AvrConnection::channelChanged, this, &IntegrationPluginDenon::onAvrChannelChanged); connect(denonConnection, &AvrConnection::powerChanged, this, &IntegrationPluginDenon::onAvrPowerChanged); connect(denonConnection, &AvrConnection::volumeChanged, this, &IntegrationPluginDenon::onAvrVolumeChanged); connect(denonConnection, &AvrConnection::surroundModeChanged, this, &IntegrationPluginDenon::onAvrSurroundModeChanged); connect(denonConnection, &AvrConnection::muteChanged, this, &IntegrationPluginDenon::onAvrMuteChanged); + connect(denonConnection, &AvrConnection::artistChanged, this, &IntegrationPluginDenon::onAvrArtistChanged); + connect(denonConnection, &AvrConnection::albumChanged, this, &IntegrationPluginDenon::onAvrAlbumChanged); + connect(denonConnection, &AvrConnection::songChanged, this, &IntegrationPluginDenon::onAvrSongChanged); + connect(denonConnection, &AvrConnection::playBackModeChanged, this, &IntegrationPluginDenon::onAvrPlayBackModeChanged); + connect(denonConnection, &AvrConnection::bassLevelChanged, this, &IntegrationPluginDenon::onAvrBassLevelChanged); + connect(denonConnection, &AvrConnection::trebleLevelChanged, this, &IntegrationPluginDenon::onAvrTrebleLevelChanged); + connect(denonConnection, &AvrConnection::toneControlEnabledChanged, this, &IntegrationPluginDenon::onAvrToneControlEnabledChanged); m_avrConnections.insert(thing->id(), denonConnection); m_asyncAvrSetups.insert(denonConnection, info); // In case the setup is cancelled before we finish it... connect(info, &QObject::destroyed, this, [this, denonConnection]() { m_asyncAvrSetups.remove(denonConnection); }); + connect(info, &ThingSetupInfo::aborted, this, [this, thing] () { + if (m_avrConnections.contains(thing->id())) { + AvrConnection *connection = m_avrConnections.take(thing->id()); + connection->deleteLater(); + } + }); denonConnection->connectDevice(); return; } else if (thing->thingClassId() == heosThingClassId) { @@ -246,9 +272,9 @@ void IntegrationPluginDenon::thingRemoved(Thing *thing) if (thing->thingClassId() == AVRX1000ThingClassId) { if (m_avrConnections.contains(thing->id())) { - AvrConnection *denonConnection = m_avrConnections.take(thing->id()); - denonConnection->disconnectDevice(); - denonConnection->deleteLater(); + AvrConnection *avrConnection = m_avrConnections.take(thing->id()); + avrConnection->disconnectDevice(); + avrConnection->deleteLater(); } } else if (thing->thingClassId() == heosThingClassId) { if (m_heosConnections.contains(thing->id())) { @@ -273,48 +299,120 @@ void IntegrationPluginDenon::executeAction(ThingActionInfo *info) if (thing->thingClassId() == AVRX1000ThingClassId) { AvrConnection *avrConnection = m_avrConnections.value(thing->id()); - if (action.actionTypeId() == AVRX1000PowerActionTypeId) { - + if (action.actionTypeId() == AVRX1000PlayActionTypeId) { + QUuid commandId = avrConnection->play(); + connect(info, &ThingActionInfo::aborted, [this, commandId] {m_avrPendingActions.remove(commandId);}); + m_avrPendingActions.insert(commandId, info); + } else if (action.actionTypeId() == AVRX1000PauseActionTypeId) { + QUuid commandId = avrConnection->pause(); + connect(info, &ThingActionInfo::aborted, [this, commandId] {m_avrPendingActions.remove(commandId);}); + m_avrPendingActions.insert(commandId, info); + } else if (action.actionTypeId() == AVRX1000StopActionTypeId) { + QUuid commandId = avrConnection->stop(); + connect(info, &ThingActionInfo::aborted, [this, commandId] {m_avrPendingActions.remove(commandId);}); + m_avrPendingActions.insert(commandId, info); + } else if (action.actionTypeId() == AVRX1000SkipNextActionTypeId) { + QUuid commandId = avrConnection->skipNext(); + connect(info, &ThingActionInfo::aborted, [this, commandId] {m_avrPendingActions.remove(commandId);}); + m_avrPendingActions.insert(commandId, info); + } else if (action.actionTypeId() == AVRX1000SkipBackActionTypeId) { + QUuid commandId = avrConnection->skipBack(); + connect(info, &ThingActionInfo::aborted, [this, commandId] {m_avrPendingActions.remove(commandId);}); + m_avrPendingActions.insert(commandId, info); + } else if (action.actionTypeId() == AVRX1000PowerActionTypeId) { bool power = action.param(AVRX1000PowerActionPowerParamTypeId).value().toBool(); - avrConnection->setPower(power); - return info->finish(Thing::ThingErrorNoError); - + QUuid commandId = avrConnection->setPower(power); + connect(info, &ThingActionInfo::aborted, [this, commandId] {m_avrPendingActions.remove(commandId);}); + m_avrPendingActions.insert(commandId, info); } else if (action.actionTypeId() == AVRX1000VolumeActionTypeId) { - int vol = action.param(AVRX1000VolumeActionVolumeParamTypeId).value().toInt(); - avrConnection->setVolume(vol); - return info->finish(Thing::ThingErrorNoError); - + QUuid commandId = avrConnection->setVolume(vol); + connect(info, &ThingActionInfo::aborted, [this, commandId] {m_avrPendingActions.remove(commandId);}); + m_avrPendingActions.insert(commandId, info); } else if (action.actionTypeId() == AVRX1000ChannelActionTypeId) { - - qCDebug(dcDenon) << "Execute update action"; QByteArray channel = action.param(AVRX1000ChannelActionChannelParamTypeId).value().toByteArray(); - avrConnection->setChannel(channel); - return info->finish(Thing::ThingErrorNoError); - + QUuid commandId = avrConnection->setChannel(channel); + connect(info, &ThingActionInfo::aborted, [this, commandId] {m_avrPendingActions.remove(commandId);}); + m_avrPendingActions.insert(commandId, info); } else if (action.actionTypeId() == AVRX1000IncreaseVolumeActionTypeId) { - - avrConnection->increaseVolume(); - return info->finish(Thing::ThingErrorNoError); - + QUuid commandId = avrConnection->increaseVolume(); + connect(info, &ThingActionInfo::aborted, [this, commandId] {m_avrPendingActions.remove(commandId);}); + m_avrPendingActions.insert(commandId, info); } else if (action.actionTypeId() == AVRX1000DecreaseVolumeActionTypeId) { - - avrConnection->decreaseVolume(); - return info->finish(Thing::ThingErrorNoError); - + QUuid commandId = avrConnection->decreaseVolume(); + connect(info, &ThingActionInfo::aborted, [this, commandId] {m_avrPendingActions.remove(commandId);}); + m_avrPendingActions.insert(commandId, info); } else if (action.actionTypeId() == AVRX1000SurroundModeActionTypeId) { - QByteArray surroundMode = action.param(AVRX1000SurroundModeActionSurroundModeParamTypeId).value().toByteArray(); - avrConnection->setSurroundMode(surroundMode); - return info->finish(Thing::ThingErrorNoError); + QUuid commandId = avrConnection->setSurroundMode(surroundMode); + connect(info, &ThingActionInfo::aborted, [this, commandId] {m_avrPendingActions.remove(commandId);}); + m_avrPendingActions.insert(commandId, info); + } else if (action.actionTypeId() == AVRX1000MuteActionTypeId) { + bool mute = action.param(AVRX1000MuteActionMuteParamTypeId).value().toBool(); + QUuid commandId = avrConnection->setMute(mute); + connect(info, &ThingActionInfo::aborted, [this, commandId] {m_avrPendingActions.remove(commandId);}); + m_avrPendingActions.insert(commandId, info); + } else if (action.actionTypeId() == AVRX1000RepeatActionTypeId) { + QString repeatMode = action.param(AVRX1000RepeatActionRepeatParamTypeId).value().toString(); + QUuid commandId; + if (repeatMode == "One") { + commandId = avrConnection->setRepeat(AvrConnection::RepeatModeRepeatOne); + } else if (repeatMode == "All") { + commandId = avrConnection->setRepeat(AvrConnection::RepeatModeRepeatAll); + } else { + commandId = avrConnection->setRepeat(AvrConnection::RepeatModeRepeatNone); + } + connect(info, &ThingActionInfo::aborted, [this, commandId] {m_avrPendingActions.remove(commandId);}); + m_avrPendingActions.insert(commandId, info); + } else if (action.actionTypeId() == AVRX1000ShuffleActionTypeId) { + bool shuffle = action.param(AVRX1000ShuffleActionShuffleParamTypeId).value().toBool(); + QUuid commandId = avrConnection->setRandom(shuffle); + connect(info, &ThingActionInfo::aborted, [this, commandId] {m_avrPendingActions.remove(commandId);}); + m_avrPendingActions.insert(commandId, info); + } else if (action.actionTypeId() == AVRX1000PlaybackStatusActionTypeId) { + QString playbackStatus = action.param(AVRX1000PlaybackStatusActionPlaybackStatusParamTypeId).value().toString(); + QUuid commandId; + if (playbackStatus == "Playing") { + commandId = avrConnection->play(); + } else if (playbackStatus == "Stopped") { + commandId = avrConnection->stop(); + } else if (playbackStatus == "Paused") { + commandId = avrConnection->pause(); + } else { + qCWarning(dcDenon()) << "Unrecognized playback status" << playbackStatus; + return info->finish(Thing::ThingErrorHardwareFailure, "Unrecognized command"); + } + connect(info, &ThingActionInfo::aborted, [this, commandId] {m_avrPendingActions.remove(commandId);}); + m_avrPendingActions.insert(commandId, info); + } else if (action.actionTypeId() == AVRX1000ToneControlActionTypeId) { + bool enable = action.param(AVRX1000ToneControlActionToneControlParamTypeId).value().toBool(); + QUuid commandId = avrConnection->enableToneControl(enable); + connect(info, &ThingActionInfo::aborted, [this, commandId] {m_avrPendingActions.remove(commandId);}); + m_avrPendingActions.insert(commandId, info); + } else if (action.actionTypeId() == AVRX1000BassActionTypeId) { + int bass = action.param(AVRX1000BassActionBassParamTypeId).value().toInt(); + QUuid commandId = avrConnection->setBassLevel(bass); + connect(info, &ThingActionInfo::aborted, [this, commandId] {m_avrPendingActions.remove(commandId);}); + m_avrPendingActions.insert(commandId, info); + } else if (action.actionTypeId() == AVRX1000TrebleActionTypeId) { + int treble = action.param(AVRX1000TrebleActionTrebleParamTypeId).value().toInt(); + QUuid commandId = avrConnection->setTrebleLevel(treble); + connect(info, &ThingActionInfo::aborted, [this, commandId] {m_avrPendingActions.remove(commandId);}); + m_avrPendingActions.insert(commandId, info); + } else { + qCWarning(dcDenon()) << "ActionType not found" << thing->thingClass().name() << action.actionTypeId() ; + return info->finish(Thing::ThingErrorActionTypeNotFound); } - return info->finish(Thing::ThingErrorActionTypeNotFound); + } else if (thing->thingClassId() == heosThingClassId) { Heos *heos = m_heosConnections.value(thing->id()); if (action.actionTypeId() == heosRebootActionTypeId) { heos->rebootSpeaker(); return info->finish(Thing::ThingErrorNoError); + } else { + qCWarning(dcDenon()) << "ActionType not found" << thing->thingClass().name() << action.actionTypeId() ; + return info->finish(Thing::ThingErrorActionTypeNotFound); } } else if (thing->thingClassId() == heosPlayerThingClassId) { @@ -369,16 +467,31 @@ void IntegrationPluginDenon::executeAction(ThingActionInfo *info) heos->playNext(playerId); return info->finish(Thing::ThingErrorNoError); } else { + qCWarning(dcDenon()) << "ActionType not found" << thing->thingClass().name() << action.actionTypeId() ; return info->finish(Thing::ThingErrorActionTypeNotFound); } } else { + qCWarning(dcDenon()) << "ThingClass not found" << thing->thingClass().name() << thing->thingClassId() ; return info->finish(Thing::ThingErrorThingClassNotFound); } } void IntegrationPluginDenon::postSetupThing(Thing *thing) { - if (thing->thingClassId() == heosThingClassId) { + if (thing->thingClassId() == AVRX1000ThingClassId) { + AvrConnection *avrConnection = m_avrConnections.value(thing->id()); + thing->setStateValue(AVRX1000ConnectedStateTypeId, avrConnection->connected()); + avrConnection->getPower(); + avrConnection->getMute(); + avrConnection->getVolume(); + avrConnection->getChannel(); + avrConnection->getSurroundMode(); + avrConnection->getPlayBackInfo(); + avrConnection->getBassLevel(); + avrConnection->getTrebleLevel(); + avrConnection->getToneControl(); + + } else if (thing->thingClassId() == heosThingClassId) { Heos *heos = m_heosConnections.value(thing->id()); thing->setStateValue(heosConnectedStateTypeId, heos->connected()); if (pluginStorage()->childGroups().contains(thing->id().toString())) { @@ -414,13 +527,21 @@ void IntegrationPluginDenon::postSetupThing(Thing *thing) void IntegrationPluginDenon::onPluginTimer() { - foreach(AvrConnection *denonConnection, m_avrConnections.values()) { - if (!denonConnection->connected()) { - denonConnection->connectDevice(); + foreach(AvrConnection *avrConnection, m_avrConnections.values()) { + if (!avrConnection->connected()) { + avrConnection->connectDevice(); } - Thing *thing = myThings().findById(m_avrConnections.key(denonConnection)); + Thing *thing = myThings().findById(m_avrConnections.key(avrConnection)); if (thing->thingClassId() == AVRX1000ThingClassId) { - denonConnection->getAllStatus(); + avrConnection->getPower(); + avrConnection->getMute(); + avrConnection->getVolume(); + avrConnection->getChannel(); + avrConnection->getSurroundMode(); + avrConnection->getPlayBackInfo(); + avrConnection->getBassLevel(); + avrConnection->getTrebleLevel(); + avrConnection->getToneControl(); } } @@ -437,19 +558,25 @@ void IntegrationPluginDenon::onPluginTimer() void IntegrationPluginDenon::onAvrConnectionChanged(bool status) { AvrConnection *denonConnection = static_cast(sender()); - Thing *thing = myThings().findById(m_avrConnections.key(denonConnection)); - if (!thing) + + // if the thing and from the first setup + if (m_asyncAvrSetups.contains(denonConnection)) { + // and ist connected + if (status) { + ThingSetupInfo *info = m_asyncAvrSetups.take(denonConnection); + info->thing()->setStateValue(AVRX1000ConnectedStateTypeId, true); + info->finish(Thing::ThingErrorNoError); + } return; + } + + Thing *thing = myThings().findById(m_avrConnections.key(denonConnection)); + if (!thing) { + qCWarning(dcDenon()) << "Could not find a thing associated to this AVR connection"; + return; + } if (thing->thingClassId() == AVRX1000ThingClassId) { - // if the thing is connected - if (status) { - // and from the first setup - if (m_asyncAvrSetups.contains(denonConnection)) { - ThingSetupInfo *info = m_asyncAvrSetups.take(denonConnection); - info->finish(Thing::ThingErrorNoError); - } - } thing->setStateValue(AVRX1000ConnectedStateTypeId, denonConnection->connected()); } } @@ -458,15 +585,17 @@ void IntegrationPluginDenon::onAvrVolumeChanged(int volume) { AvrConnection *denonConnection = static_cast(sender()); Thing *thing = myThings().findById(m_avrConnections.key(denonConnection)); - if (!thing) + if (!thing) { + qCWarning(dcDenon()) << "Could not find a thing associated to this AVR connection"; return; + } if (thing->thingClassId() == AVRX1000ThingClassId) { thing->setStateValue(AVRX1000VolumeStateTypeId, volume); } } -void IntegrationPluginDenon::onAvrChannelChanged(const QByteArray &channel) +void IntegrationPluginDenon::onAvrChannelChanged(const QString &channel) { AvrConnection *denonConnection = static_cast(sender()); Thing *thing = myThings().findById(m_avrConnections.key(denonConnection)); @@ -482,8 +611,10 @@ void IntegrationPluginDenon::onAvrMuteChanged(bool mute) { AvrConnection *denonConnection = static_cast(sender()); Thing *thing = myThings().findById(m_avrConnections.key(denonConnection)); - if (!thing) + if (!thing) { + qCWarning(dcDenon()) << "Could not find a thing associated to this AVR connection"; return; + } if (thing->thingClassId() == AVRX1000ThingClassId) { thing->setStateValue(AVRX1000MuteStateTypeId, mute); @@ -502,37 +633,158 @@ void IntegrationPluginDenon::onAvrPowerChanged(bool power) } } -void IntegrationPluginDenon::onAvrSurroundModeChanged(const QByteArray &surroundMode) +void IntegrationPluginDenon::onAvrSurroundModeChanged(const QString &surroundMode) { AvrConnection *denonConnection = static_cast(sender()); Thing *thing = myThings().findById(m_avrConnections.key(denonConnection)); - if (!thing) + if (!thing){ + qCWarning(dcDenon()) << "Could not find a thing associated to this AVR connection"; return; - + } if (thing->thingClassId() == AVRX1000ThingClassId) { thing->setStateValue(AVRX1000SurroundModeStateTypeId, surroundMode); } } +void IntegrationPluginDenon::onAvrSongChanged(const QString &song) +{ + AvrConnection *denonConnection = static_cast(sender()); + Thing *thing = myThings().findById(m_avrConnections.key(denonConnection)); + if (!thing){ + qCWarning(dcDenon()) << "Could not find a thing associated to this AVR connection"; + return; + } + + if (thing->thingClassId() == AVRX1000ThingClassId) { + thing->setStateValue(AVRX1000TitleStateTypeId, song); + } +} + +void IntegrationPluginDenon::onAvrArtistChanged(const QString &artist) +{ + AvrConnection *denonConnection = static_cast(sender()); + Thing *thing = myThings().findById(m_avrConnections.key(denonConnection)); + if (!thing){ + qCWarning(dcDenon()) << "Could not find a thing associated to this AVR connection"; + return; + } + + if (thing->thingClassId() == AVRX1000ThingClassId) { + thing->setStateValue(AVRX1000ArtistStateTypeId, artist); + } +} + +void IntegrationPluginDenon::onAvrAlbumChanged(const QString &album) +{ + AvrConnection *denonConnection = static_cast(sender()); + Thing *thing = myThings().findById(m_avrConnections.key(denonConnection)); + if (!thing){ + qCWarning(dcDenon()) << "Could not find a thing associated to this AVR connection"; + return; + } + if (thing->thingClassId() == AVRX1000ThingClassId) { + thing->setStateValue(AVRX1000CollectionStateTypeId, album); + } +} + +void IntegrationPluginDenon::onAvrBassLevelChanged(int level) +{ + AvrConnection *denonConnection = static_cast(sender()); + Thing *thing = myThings().findById(m_avrConnections.key(denonConnection)); + if (!thing){ + qCWarning(dcDenon()) << "Could not find a thing associated to this AVR connection"; + return; + } + if (thing->thingClassId() == AVRX1000ThingClassId) { + thing->setStateValue(AVRX1000BassStateTypeId, level); + } +} + +void IntegrationPluginDenon::onAvrTrebleLevelChanged(int level) +{ + AvrConnection *denonConnection = static_cast(sender()); + Thing *thing = myThings().findById(m_avrConnections.key(denonConnection)); + if (!thing){ + qCWarning(dcDenon()) << "Could not find a thing associated to this AVR connection"; + return; + } + if (thing->thingClassId() == AVRX1000ThingClassId) { + thing->setStateValue(AVRX1000TrebleStateTypeId, level); + } +} + +void IntegrationPluginDenon::onAvrToneControlEnabledChanged(bool enabled) +{ + AvrConnection *denonConnection = static_cast(sender()); + Thing *thing = myThings().findById(m_avrConnections.key(denonConnection)); + if (!thing){ + qCWarning(dcDenon()) << "Could not find a thing associated to this AVR connection"; + return; + } + if (thing->thingClassId() == AVRX1000ThingClassId) { + thing->setStateValue(AVRX1000ToneControlStateTypeId, enabled); + } +} + +void IntegrationPluginDenon::onAvrPlayBackModeChanged(AvrConnection::PlayBackMode mode) +{ + AvrConnection *denonConnection = static_cast(sender()); + Thing *thing = myThings().findById(m_avrConnections.key(denonConnection)); + if (!thing){ + qCWarning(dcDenon()) << "Could not find a thing associated to this AVR connection"; + return; + } + + if (thing->thingClassId() == AVRX1000ThingClassId) { + switch (mode) { + case AvrConnection::PlayBackModePlaying: + thing->setStateValue(AVRX1000PlaybackStatusStateTypeId, "Playing"); + break; + case AvrConnection::PlayBackModePaused: + thing->setStateValue(AVRX1000PlaybackStatusStateTypeId, "Paused"); + break; + case AvrConnection::PlayBackModeStopped: + thing->setStateValue(AVRX1000PlaybackStatusStateTypeId, "Stopped"); + break; + } + } +} + void IntegrationPluginDenon::onAvrSocketError() { - AvrConnection *denonConnection = static_cast(sender()); - Thing *thing = myThings().findById(m_avrConnections.key(denonConnection)); - if (!thing) - return; + AvrConnection *avrConnection = static_cast(sender()); - if (thing->thingClassId() == AVRX1000ThingClassId) { + // Check if setup running for this thing + if (m_asyncAvrSetups.contains(avrConnection)) { + ThingSetupInfo *info = m_asyncAvrSetups.take(avrConnection); + m_avrConnections.remove(info->thing()->id()); + qCWarning(dcDenon()) << "Could not add thing. The setup failed."; + info->finish(Thing::ThingErrorHardwareFailure); + // Delete the connection, the thing will not be added and + // the connection will be created in the next setup + avrConnection->deleteLater(); + } +} - // Check if setup running for this thing - if (m_asyncAvrSetups.contains(denonConnection)) { - ThingSetupInfo *info = m_asyncAvrSetups.take(denonConnection); - qCWarning(dcDenon()) << "Could not add thing. The setup failed."; - info->finish(Thing::ThingErrorHardwareFailure); - // Delete the connection, the thing will not be added and - // the connection will be created in the next setup - denonConnection->deleteLater(); - m_avrConnections.remove(thing->id()); +void IntegrationPluginDenon::onAvrCommandExecuted(const QUuid &commandId, bool success) +{ + if (m_avrPendingActions.contains(commandId)) { + ThingActionInfo *info = m_avrPendingActions.take(commandId); + if (success){ + if(info->action().actionTypeId() == AVRX1000PlayActionTypeId) { + info->thing()->setStateValue(AVRX1000PlaybackStatusStateTypeId, "Playing"); + } else if(info->action().actionTypeId() == AVRX1000PauseActionTypeId) { + info->thing()->setStateValue(AVRX1000PlaybackStatusStateTypeId, "Paused"); + } else if(info->action().actionTypeId() == AVRX1000StopActionTypeId) { + info->thing()->setStateValue(AVRX1000PlaybackStatusStateTypeId, "Stopped"); + } else if(info->action().actionTypeId() == AVRX1000PlaybackStatusActionTypeId) { + info->thing()->setStateValue(AVRX1000PlaybackStatusStateTypeId, info->action().param(AVRX1000PlaybackStatusActionPlaybackStatusParamTypeId).value()); + } + info->finish(Thing::ThingErrorNoError); + + } else { + info->finish(Thing::ThingErrorHardwareNotAvailable); } } } @@ -663,7 +915,7 @@ void IntegrationPluginDenon::onHeosRepeatModeReceived(int playerId, REPEAT_MODE void IntegrationPluginDenon::onHeosShuffleModeReceived(int playerId, bool shuffle) { foreach(Thing *thing, myThings().filterByParam(heosPlayerThingPlayerIdParamTypeId, playerId)) { - thing->setStateValue(heosPlayerMuteStateTypeId, shuffle); + thing->setStateValue(heosPlayerShuffleStateTypeId, shuffle); break; } } diff --git a/denon/integrationplugindenon.h b/denon/integrationplugindenon.h index 6c1b661a..bcd8333f 100644 --- a/denon/integrationplugindenon.h +++ b/denon/integrationplugindenon.h @@ -90,7 +90,8 @@ private: QHash m_asyncActions; QUrl m_notificationUrl; - QHash m_pendingActions; + QHash m_heosPendingActions; + QHash m_avrPendingActions; QHash m_pendingGetSourcesRequest; QHash m_pendingBrowseResult; // QString = containerId or sourceId @@ -128,11 +129,20 @@ private slots: void onAvrConnectionChanged(bool status); void onAvrSocketError(); + void onAvrCommandExecuted(const QUuid &commandId, bool success); + void onAvrVolumeChanged(int volume); - void onAvrChannelChanged(const QByteArray &channel); + void onAvrChannelChanged(const QString &channel); void onAvrMuteChanged(bool mute); void onAvrPowerChanged(bool power); - void onAvrSurroundModeChanged(const QByteArray &surroundMode); + void onAvrSurroundModeChanged(const QString &surroundMode); + void onAvrSongChanged(const QString &song); + void onAvrArtistChanged(const QString &artist); + void onAvrAlbumChanged(const QString &album); + void onAvrPlayBackModeChanged(AvrConnection::PlayBackMode mode); + void onAvrBassLevelChanged(int level); + void onAvrTrebleLevelChanged(int level); + void onAvrToneControlEnabledChanged(bool enabled); void onPluginConfigurationChanged(const ParamTypeId ¶mTypeId, const QVariant &value); }; diff --git a/denon/integrationplugindenon.json b/denon/integrationplugindenon.json index 68c8d78c..d7283e95 100644 --- a/denon/integrationplugindenon.json +++ b/denon/integrationplugindenon.json @@ -22,7 +22,7 @@ "name": "AVRX1000", "displayName": "AVR X1000", "createMethods": ["discovery"], - "interfaces": ["extendedvolumecontroller", "connectable", "power"], + "interfaces": ["mediaplayer", "mediacontroller", "extendedvolumecontroller", "mediametadataprovider", "shufflerepeat", "connectable", "power"], "paramTypes": [ { "id": "cb6eeeb0-3d75-43b6-8177-b5ac19648557", @@ -49,7 +49,7 @@ "cached": false }, { - "displayName": "power", + "displayName": "Power", "id": "1cdb6b54-6831-4900-95b2-c78f64497701", "name": "power", "displayNameEvent": "Power changed", @@ -80,6 +80,40 @@ "maxValue": 100, "writable": true }, + { + "displayName": "Tone control", + "id": "d57c1e5e-2cc9-4638-999c-1523f16dbb83", + "name": "toneControl", + "displayNameEvent": "Tone control changed", + "displayNameAction": "Set tone control", + "type": "bool", + "defaultValue": false, + "writable": true + }, + { + "displayName": "Bass", + "id": "2c92b22e-d5b2-4991-a523-64222bffc9e7", + "name": "bass", + "displayNameEvent": "Bass changed", + "displayNameAction": "Set bass", + "type": "int", + "defaultValue": 0, + "minValue": -50, + "maxValue": 49, + "writable": true + }, + { + "displayName": "Treble", + "id": "38a3be02-6ed4-4a84-903e-eb923b933989", + "name": "treble", + "displayNameEvent": "Treble changed", + "displayNameAction": "Set treble", + "type": "int", + "defaultValue": 0, + "minValue": -50, + "maxValue": 49, + "writable": true + }, { "displayName": "Channel", "id": "f29ffa2c-31d6-4d88-b160-a38288c82ce1", @@ -136,6 +170,85 @@ "MATRIX" ], "defaultValue": "MOVIE" + }, + { + "id": "50b34df4-90f7-41aa-9a57-6f2d31a18430", + "name": "artist", + "displayName": "Artist", + "displayNameEvent": "Artist changed", + "type": "QString", + "defaultValue": "" + }, + { + "id": "d4f14d93-8cae-4e1b-9ee7-a5c21c0211df", + "name": "collection", + "displayName": "Album", + "displayNameEvent": "Album changed", + "type": "QString", + "defaultValue": "" + }, + { + "id": "d32493d8-5faf-4c7a-ba94-847dc9b81615", + "name": "title", + "displayName": "Title", + "displayNameEvent": "Title changed", + "type": "QString", + "defaultValue": "" + }, + { + "id": "6c4a208b-5b04-40cc-b14b-8f79aff30307", + "name": "artwork", + "displayName": "Artwork", + "displayNameEvent": "Artwork changed", + "type": "QString", + "defaultValue": "" + }, + { + "id": "2f372374-16f3-4900-afdc-834f51075d07", + "name": "playerType", + "displayName": "Player type", + "displayNameEvent": "Player type changed", + "possibleValues": [ + "audio", + "video" + ], + "type": "QString", + "defaultValue": "audio" + }, + { + "id": "8ef6708c-812a-4e6a-a608-9e480aa3b7bf", + "name": "playbackStatus", + "displayName": "Playback status", + "displayNameEvent": "Playback status changed", + "displayNameAction": "Set playback status", + "type": "QString", + "defaultValue": "Stopped", + "possibleValues": ["Playing", "Paused", "Stopped"], + "cached": false, + "writable": true + }, + { + "id": "8ad33cb9-e758-433d-a013-2e4d43157c92", + "name": "shuffle", + "displayName": "Shuffle", + "displayNameEvent": "Shuffle changed", + "displayNameAction": "Set shuffle", + "type": "bool", + "defaultValue": false, + "cached": false, + "writable": true + }, + { + "id": "9478987b-14e4-4572-a059-a18a5a9db229", + "name": "repeat", + "displayName": "Repeat mode", + "displayNameEvent": "Repeat mode changed", + "displayNameAction": "Set repeat mode", + "type": "QString", + "defaultValue": "None", + "possibleValues": ["None", "One", "All"], + "cached": false, + "writable": true } ], "actionTypes": [ @@ -164,6 +277,31 @@ "type": "int" } ] + }, + { + "id": "3f2eb789-918c-475a-a295-14c0c24338b8", + "name": "skipBack", + "displayName": "Skip back" + }, + { + "id": "ddab0869-5b90-4fd4-9c40-9ad57101b87c", + "name": "stop", + "displayName": "Stop" + }, + { + "id": "d04eb30b-838d-4fbd-b781-c01005b59756", + "name": "play", + "displayName": "Play" + }, + { + "id": "3de38047-006f-4d97-9326-08bb5ad79b05", + "name": "pause", + "displayName": "Pause" + }, + { + "id": "bf9664e4-a53e-474c-afcc-88f25e6fe365", + "name": "skipNext", + "displayName": "Skip next" } ] }, diff --git a/denon/translations/cd758269-dbbb-4ef0-80ab-48bd9a8a2765-de.ts b/denon/translations/cd758269-dbbb-4ef0-80ab-48bd9a8a2765-de.ts index 63a36e9a..51673511 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,87 +13,132 @@ 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}) ---------- -The name of the StateType ({9cd60864-f141-4e03-a85b-357690cad1b8}) of ThingClass heosPlayer - +The name of the StateType ({9cd60864-f141-4e03-a85b-357690cad1b8}) of ThingClass heosPlayer +---------- +The name of the ParamType (ThingClass: AVRX1000, EventType: collection, ID: {d4f14d93-8cae-4e1b-9ee7-a5c21c0211df}) +---------- +The name of the StateType ({d4f14d93-8cae-4e1b-9ee7-a5c21c0211df}) of ThingClass AVRX1000 + Album - + + Album changed - The name of the EventType ({9cd60864-f141-4e03-a85b-357690cad1b8}) of ThingClass heosPlayer - + The name of the EventType ({9cd60864-f141-4e03-a85b-357690cad1b8}) of ThingClass heosPlayer +---------- +The name of the EventType ({d4f14d93-8cae-4e1b-9ee7-a5c21c0211df}) of ThingClass AVRX1000 + 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}) ---------- -The name of the StateType ({0a9183a4-b633-4773-ba7a-f4266895157e}) of ThingClass heosPlayer - +The name of the StateType ({0a9183a4-b633-4773-ba7a-f4266895157e}) of ThingClass heosPlayer +---------- +The name of the ParamType (ThingClass: AVRX1000, EventType: artist, ID: {50b34df4-90f7-41aa-9a57-6f2d31a18430}) +---------- +The name of the StateType ({50b34df4-90f7-41aa-9a57-6f2d31a18430}) of ThingClass AVRX1000 + Künstler - + + Artist changed - The name of the EventType ({0a9183a4-b633-4773-ba7a-f4266895157e}) of ThingClass heosPlayer - + The name of the EventType ({0a9183a4-b633-4773-ba7a-f4266895157e}) of ThingClass heosPlayer +---------- +The name of the EventType ({50b34df4-90f7-41aa-9a57-6f2d31a18430}) of ThingClass AVRX1000 + Künstler geändert - - + + + + Artwork The name of the ParamType (ThingClass: heosPlayer, EventType: artwork, ID: {a7f0ba95-383a-4efd-adc5-a36e50a04018}) ---------- -The name of the StateType ({a7f0ba95-383a-4efd-adc5-a36e50a04018}) of ThingClass heosPlayer - +The name of the StateType ({a7f0ba95-383a-4efd-adc5-a36e50a04018}) of ThingClass heosPlayer +---------- +The name of the ParamType (ThingClass: AVRX1000, EventType: artwork, ID: {6c4a208b-5b04-40cc-b14b-8f79aff30307}) +---------- +The name of the StateType ({6c4a208b-5b04-40cc-b14b-8f79aff30307}) of ThingClass AVRX1000 + Artwork - + + Artwork changed - The name of the EventType ({a7f0ba95-383a-4efd-adc5-a36e50a04018}) of ThingClass heosPlayer - + The name of the EventType ({a7f0ba95-383a-4efd-adc5-a36e50a04018}) of ThingClass heosPlayer +---------- +The name of the EventType ({6c4a208b-5b04-40cc-b14b-8f79aff30307}) of ThingClass AVRX1000 + Artwork geändert - - - + + + + Bass + The name of the ParamType (ThingClass: AVRX1000, ActionType: bass, ID: {2c92b22e-d5b2-4991-a523-64222bffc9e7}) +---------- +The name of the ParamType (ThingClass: AVRX1000, EventType: bass, ID: {2c92b22e-d5b2-4991-a523-64222bffc9e7}) +---------- +The name of the StateType ({2c92b22e-d5b2-4991-a523-64222bffc9e7}) of ThingClass AVRX1000 + 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: channel, ID: {f29ffa2c-31d6-4d88-b160-a38288c82ce1}) ---------- The name of the ParamType (ThingClass: AVRX1000, EventType: channel, ID: {f29ffa2c-31d6-4d88-b160-a38288c82ce1}) ---------- The name of the StateType ({f29ffa2c-31d6-4d88-b160-a38288c82ce1}) of ThingClass AVRX1000 - + 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}) ---------- @@ -106,99 +151,99 @@ The name of the StateType ({4d1790bf-28c6-4c1f-8892-ba1a0ef140f5}) of ThingClass The name of the ParamType (ThingClass: AVRX1000, EventType: connected, ID: {fc1dee8b-8fcc-4ec2-8fe6-6be4f5f47a5c}) ---------- The name of the StateType ({fc1dee8b-8fcc-4ec2-8fe6-6be4f5f47a5c}) of ThingClass AVRX1000 - + Verbunden - - - + + + Connected changed The name of the EventType ({9a4e527e-057c-4b19-8a02-605cc8349f5e}) of ThingClass heosPlayer ---------- The name of the EventType ({4d1790bf-28c6-4c1f-8892-ba1a0ef140f5}) of ThingClass heos ---------- The name of the EventType ({fc1dee8b-8fcc-4ec2-8fe6-6be4f5f47a5c}) of ThingClass AVRX1000 - + Verbunden geändert - + Decrease volume The name of the ActionType ({d3752c32-92e3-4396-8e2f-ab5e57c6cfb1}) of ThingClass AVRX1000 - + 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}) ---------- The name of the ParamType (ThingClass: AVRX1000, Type: thing, ID: {cb6eeeb0-3d75-43b6-8177-b5ac19648557}) - + IPv4 Adresse - + Increase volume The name of the ActionType ({4ae686d6-2307-40a0-bd38-2cd3a92342cc}) of ThingClass AVRX1000 - + 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}) ---------- The name of the StateType ({ab689a6e-eb71-4a41-a267-ba1afe7e2f56}) of ThingClass heos - + 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}) ---------- @@ -211,273 +256,417 @@ The name of the ParamType (ThingClass: AVRX1000, ActionType: mute, ID: {3e11470d The name of the ParamType (ThingClass: AVRX1000, EventType: mute, ID: {3e11470d-a5b7-499c-be55-9b1b4fe5eedf}) ---------- The name of the StateType ({3e11470d-a5b7-499c-be55-9b1b4fe5eedf}) of ThingClass AVRX1000 - + Stumm - - + + Mute changed The name of the EventType ({fcc89c7c-b793-4b6f-a3dc-0e0e3a86748f}) of ThingClass heosPlayer ---------- The name of the EventType ({3e11470d-a5b7-499c-be55-9b1b4fe5eedf}) of ThingClass AVRX1000 - + 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 - + The name of the ActionType ({21c1cbe6-278f-4688-a65f-6620be1ee5ea}) of ThingClass heosPlayer +---------- +The name of the ActionType ({3de38047-006f-4d97-9326-08bb5ad79b05}) of ThingClass AVRX1000 + Pause - + + Play - The name of the ActionType ({c64964e4-cea0-468a-a9bf-8f69657b74e9}) of ThingClass heosPlayer - + The name of the ActionType ({c64964e4-cea0-468a-a9bf-8f69657b74e9}) of ThingClass heosPlayer +---------- +The name of the ActionType ({d04eb30b-838d-4fbd-b781-c01005b59756}) of ThingClass AVRX1000 + Play - - - + + + + + + Playback status The name of the ParamType (ThingClass: heosPlayer, ActionType: playbackStatus, ID: {6db3b484-4cd4-477b-b822-275865d308db}) ---------- The name of the ParamType (ThingClass: heosPlayer, EventType: playbackStatus, ID: {6db3b484-4cd4-477b-b822-275865d308db}) ---------- -The name of the StateType ({6db3b484-4cd4-477b-b822-275865d308db}) of ThingClass heosPlayer - +The name of the StateType ({6db3b484-4cd4-477b-b822-275865d308db}) of ThingClass heosPlayer +---------- +The name of the ParamType (ThingClass: AVRX1000, ActionType: playbackStatus, ID: {8ef6708c-812a-4e6a-a608-9e480aa3b7bf}) +---------- +The name of the ParamType (ThingClass: AVRX1000, EventType: playbackStatus, ID: {8ef6708c-812a-4e6a-a608-9e480aa3b7bf}) +---------- +The name of the StateType ({8ef6708c-812a-4e6a-a608-9e480aa3b7bf}) of ThingClass AVRX1000 + Wiedergabestatus - + + Playback status changed - The name of the EventType ({6db3b484-4cd4-477b-b822-275865d308db}) of ThingClass heosPlayer - + The name of the EventType ({6db3b484-4cd4-477b-b822-275865d308db}) of ThingClass heosPlayer +---------- +The name of the EventType ({8ef6708c-812a-4e6a-a608-9e480aa3b7bf}) of ThingClass AVRX1000 + 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}) ---------- -The name of the StateType ({c59835ac-ee6e-4e6c-aa20-aeb3501937c5}) of ThingClass heosPlayer - +The name of the StateType ({c59835ac-ee6e-4e6c-aa20-aeb3501937c5}) of ThingClass heosPlayer +---------- +The name of the ParamType (ThingClass: AVRX1000, EventType: playerType, ID: {2f372374-16f3-4900-afdc-834f51075d07}) +---------- +The name of the StateType ({2f372374-16f3-4900-afdc-834f51075d07}) of ThingClass AVRX1000 + Playertyp - + + Player type changed - The name of the EventType ({c59835ac-ee6e-4e6c-aa20-aeb3501937c5}) of ThingClass heosPlayer - + The name of the EventType ({c59835ac-ee6e-4e6c-aa20-aeb3501937c5}) of ThingClass heosPlayer +---------- +The name of the EventType ({2f372374-16f3-4900-afdc-834f51075d07}) of ThingClass AVRX1000 + Playertyp geändert - + + + + Power + The name of the ParamType (ThingClass: AVRX1000, ActionType: power, ID: {1cdb6b54-6831-4900-95b2-c78f64497701}) +---------- +The name of the ParamType (ThingClass: AVRX1000, EventType: power, ID: {1cdb6b54-6831-4900-95b2-c78f64497701}) +---------- +The name of the StateType ({1cdb6b54-6831-4900-95b2-c78f64497701}) of ThingClass AVRX1000 + 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}) ---------- The name of the ParamType (ThingClass: heosPlayer, EventType: repeat, ID: {4e60cd17-5845-4351-aa2c-2504610e1532}) ---------- -The name of the StateType ({4e60cd17-5845-4351-aa2c-2504610e1532}) of ThingClass heosPlayer - +The name of the StateType ({4e60cd17-5845-4351-aa2c-2504610e1532}) of ThingClass heosPlayer +---------- +The name of the ParamType (ThingClass: AVRX1000, ActionType: repeat, ID: {9478987b-14e4-4572-a059-a18a5a9db229}) +---------- +The name of the ParamType (ThingClass: AVRX1000, EventType: repeat, ID: {9478987b-14e4-4572-a059-a18a5a9db229}) +---------- +The name of the StateType ({9478987b-14e4-4572-a059-a18a5a9db229}) of ThingClass AVRX1000 + Wiederholungsmodus - + + Repeat mode changed - The name of the EventType ({4e60cd17-5845-4351-aa2c-2504610e1532}) of ThingClass heosPlayer - + The name of the EventType ({4e60cd17-5845-4351-aa2c-2504610e1532}) of ThingClass heosPlayer +---------- +The name of the EventType ({9478987b-14e4-4572-a059-a18a5a9db229}) of ThingClass AVRX1000 + Wiederholungsmodus geändert - - + + Serial number The name of the ParamType (ThingClass: heosPlayer, Type: thing, ID: {866e8d6a-953f-4bdc-8d85-8d92e51e8592}) ---------- The name of the ParamType (ThingClass: heos, Type: thing, ID: {f796664d-6cb7-4f29-9d05-771968d82a32}) - + 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 ---------- The name of the ActionType ({3e11470d-a5b7-499c-be55-9b1b4fe5eedf}) of ThingClass AVRX1000 - + Setze Stumm - + + Set playback status - The name of the ActionType ({6db3b484-4cd4-477b-b822-275865d308db}) of ThingClass heosPlayer - + The name of the ActionType ({6db3b484-4cd4-477b-b822-275865d308db}) of ThingClass heosPlayer +---------- +The name of the ActionType ({8ef6708c-812a-4e6a-a608-9e480aa3b7bf}) of ThingClass AVRX1000 + Setze Wiedergabemodus - + + Set repeat mode - The name of the ActionType ({4e60cd17-5845-4351-aa2c-2504610e1532}) of ThingClass heosPlayer - + The name of the ActionType ({4e60cd17-5845-4351-aa2c-2504610e1532}) of ThingClass heosPlayer +---------- +The name of the ActionType ({9478987b-14e4-4572-a059-a18a5a9db229}) of ThingClass AVRX1000 + Setze Wiederholungsmodus - + + Set shuffle - The name of the ActionType ({4b581237-acf5-4d8f-9e83-9b24e9ac900a}) of ThingClass heosPlayer - + The name of the ActionType ({4b581237-acf5-4d8f-9e83-9b24e9ac900a}) of ThingClass heosPlayer +---------- +The name of the ActionType ({8ad33cb9-e758-433d-a013-2e4d43157c92}) of ThingClass AVRX1000 + 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}) ---------- The name of the ParamType (ThingClass: heosPlayer, EventType: shuffle, ID: {4b581237-acf5-4d8f-9e83-9b24e9ac900a}) ---------- -The name of the StateType ({4b581237-acf5-4d8f-9e83-9b24e9ac900a}) of ThingClass heosPlayer - +The name of the StateType ({4b581237-acf5-4d8f-9e83-9b24e9ac900a}) of ThingClass heosPlayer +---------- +The name of the ParamType (ThingClass: AVRX1000, ActionType: shuffle, ID: {8ad33cb9-e758-433d-a013-2e4d43157c92}) +---------- +The name of the ParamType (ThingClass: AVRX1000, EventType: shuffle, ID: {8ad33cb9-e758-433d-a013-2e4d43157c92}) +---------- +The name of the StateType ({8ad33cb9-e758-433d-a013-2e4d43157c92}) of ThingClass AVRX1000 + Zufallswiedergabe - + + Shuffle changed - The name of the EventType ({4b581237-acf5-4d8f-9e83-9b24e9ac900a}) of ThingClass heosPlayer - + The name of the EventType ({4b581237-acf5-4d8f-9e83-9b24e9ac900a}) of ThingClass heosPlayer +---------- +The name of the EventType ({8ad33cb9-e758-433d-a013-2e4d43157c92}) of ThingClass AVRX1000 + Zufallswiedergabe geändert - + + Skip back - The name of the ActionType ({a718f7e9-0b54-4403-b661-49f7b0d13085}) of ThingClass heosPlayer - + The name of the ActionType ({a718f7e9-0b54-4403-b661-49f7b0d13085}) of ThingClass heosPlayer +---------- +The name of the ActionType ({3f2eb789-918c-475a-a295-14c0c24338b8}) of ThingClass AVRX1000 + Zurück - + + Skip next - The name of the ActionType ({57697e9c-ce5e-4b8f-b42e-16662829ceb2}) of ThingClass heosPlayer - + The name of the ActionType ({57697e9c-ce5e-4b8f-b42e-16662829ceb2}) of ThingClass heosPlayer +---------- +The name of the ActionType ({bf9664e4-a53e-474c-afcc-88f25e6fe365}) of ThingClass AVRX1000 + Nächstes - - + + Source The name of the ParamType (ThingClass: heosPlayer, EventType: source, ID: {eee22722-3ee5-48f7-8af8-275dc04b21eb}) ---------- The name of the StateType ({eee22722-3ee5-48f7-8af8-275dc04b21eb}) of ThingClass heosPlayer - + Quelle - + Source changed The name of the EventType ({eee22722-3ee5-48f7-8af8-275dc04b21eb}) of ThingClass heosPlayer - + Quelle geändert - - + + Step The name of the ParamType (ThingClass: AVRX1000, ActionType: decreaseVolume, ID: {1d54fda8-336c-436f-ab2b-e8bd549f830c}) ---------- The name of the ParamType (ThingClass: AVRX1000, ActionType: increaseVolume, ID: {765c7e2a-9eb6-46fc-a880-4e96c81f8d1e}) - + - + + Stop - The name of the ActionType ({c4b29c09-e3b3-4843-b6d9-e032f3fc1d78}) of ThingClass heosPlayer - + The name of the ActionType ({c4b29c09-e3b3-4843-b6d9-e032f3fc1d78}) of ThingClass heosPlayer +---------- +The name of the ActionType ({ddab0869-5b90-4fd4-9c40-9ad57101b87c}) of ThingClass AVRX1000 + Stop - - - + + + Surround mode The name of the ParamType (ThingClass: AVRX1000, ActionType: surroundMode, ID: {4f203bdd-691c-4384-a934-2d49a5448f0a}) ---------- The name of the ParamType (ThingClass: AVRX1000, EventType: surroundMode, ID: {4f203bdd-691c-4384-a934-2d49a5448f0a}) ---------- The name of the StateType ({4f203bdd-691c-4384-a934-2d49a5448f0a}) of ThingClass AVRX1000 - + 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}) ---------- -The name of the StateType ({bbeecf30-6feb-48d5-ade3-57b2a4eea05f}) of ThingClass heosPlayer - +The name of the StateType ({bbeecf30-6feb-48d5-ade3-57b2a4eea05f}) of ThingClass heosPlayer +---------- +The name of the ParamType (ThingClass: AVRX1000, EventType: title, ID: {d32493d8-5faf-4c7a-ba94-847dc9b81615}) +---------- +The name of the StateType ({d32493d8-5faf-4c7a-ba94-847dc9b81615}) of ThingClass AVRX1000 + Title - + + Title changed - The name of the EventType ({bbeecf30-6feb-48d5-ade3-57b2a4eea05f}) of ThingClass heosPlayer - + The name of the EventType ({bbeecf30-6feb-48d5-ade3-57b2a4eea05f}) of ThingClass heosPlayer +---------- +The name of the EventType ({d32493d8-5faf-4c7a-ba94-847dc9b81615}) of ThingClass AVRX1000 + Title geändert - + + + + Tone control + The name of the ParamType (ThingClass: AVRX1000, ActionType: toneControl, ID: {d57c1e5e-2cc9-4638-999c-1523f16dbb83}) +---------- +The name of the ParamType (ThingClass: AVRX1000, EventType: toneControl, ID: {d57c1e5e-2cc9-4638-999c-1523f16dbb83}) +---------- +The name of the StateType ({d57c1e5e-2cc9-4638-999c-1523f16dbb83}) of ThingClass AVRX1000 + 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}) +---------- +The name of the ParamType (ThingClass: AVRX1000, EventType: treble, ID: {38a3be02-6ed4-4a84-903e-eb923b933989}) +---------- +The name of the StateType ({38a3be02-6ed4-4a84-903e-eb923b933989}) of ThingClass AVRX1000 + 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}) ---------- The name of the StateType ({77756132-5fa4-409e-969e-d23bcee72356}) of ThingClass heos - + 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}) ---------- @@ -490,38 +679,26 @@ The name of the ParamType (ThingClass: AVRX1000, ActionType: volume, ID: {773636 The name of the ParamType (ThingClass: AVRX1000, EventType: volume, ID: {773636b9-304d-463a-8755-fc7488dc0ff3}) ---------- The name of the StateType ({773636b9-304d-463a-8755-fc7488dc0ff3}) of ThingClass AVRX1000 - + Lautstärke - - + + Volume changed The name of the EventType ({6d4886a1-fa5d-4889-96c5-7a1c206f59be}) of ThingClass heosPlayer ---------- The name of the EventType ({773636b9-304d-463a-8755-fc7488dc0ff3}) of ThingClass AVRX1000 - + Lautstärke geändert - - - - power - The name of the ParamType (ThingClass: AVRX1000, ActionType: power, ID: {1cdb6b54-6831-4900-95b2-c78f64497701}) ----------- -The name of the ParamType (ThingClass: AVRX1000, EventType: power, ID: {1cdb6b54-6831-4900-95b2-c78f64497701}) ----------- -The name of the StateType ({1cdb6b54-6831-4900-95b2-c78f64497701}) of ThingClass AVRX1000 - Eingeschalten - - - + 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 ---------- @@ -529,7 +706,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 @@ -538,36 +715,30 @@ The name of the ActionType ({773636b9-304d-463a-8755-fc7488dc0ff3}) of ThingClas IntegrationPluginDenon - - Thing discovery is not available. - Error discovering Denon things - - - - + 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. - + 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 1b3e9efb..aa83c8e5 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,66 +13,111 @@ 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}) ---------- -The name of the StateType ({9cd60864-f141-4e03-a85b-357690cad1b8}) of ThingClass heosPlayer +The name of the StateType ({9cd60864-f141-4e03-a85b-357690cad1b8}) of ThingClass heosPlayer +---------- +The name of the ParamType (ThingClass: AVRX1000, EventType: collection, ID: {d4f14d93-8cae-4e1b-9ee7-a5c21c0211df}) +---------- +The name of the StateType ({d4f14d93-8cae-4e1b-9ee7-a5c21c0211df}) of ThingClass AVRX1000 - + + Album changed - The name of the EventType ({9cd60864-f141-4e03-a85b-357690cad1b8}) of ThingClass heosPlayer + The name of the EventType ({9cd60864-f141-4e03-a85b-357690cad1b8}) of ThingClass heosPlayer +---------- +The name of the EventType ({d4f14d93-8cae-4e1b-9ee7-a5c21c0211df}) of ThingClass AVRX1000 - + 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}) ---------- -The name of the StateType ({0a9183a4-b633-4773-ba7a-f4266895157e}) of ThingClass heosPlayer +The name of the StateType ({0a9183a4-b633-4773-ba7a-f4266895157e}) of ThingClass heosPlayer +---------- +The name of the ParamType (ThingClass: AVRX1000, EventType: artist, ID: {50b34df4-90f7-41aa-9a57-6f2d31a18430}) +---------- +The name of the StateType ({50b34df4-90f7-41aa-9a57-6f2d31a18430}) of ThingClass AVRX1000 - + + Artist changed - The name of the EventType ({0a9183a4-b633-4773-ba7a-f4266895157e}) of ThingClass heosPlayer + The name of the EventType ({0a9183a4-b633-4773-ba7a-f4266895157e}) of ThingClass heosPlayer +---------- +The name of the EventType ({50b34df4-90f7-41aa-9a57-6f2d31a18430}) of ThingClass AVRX1000 - - + + + + Artwork The name of the ParamType (ThingClass: heosPlayer, EventType: artwork, ID: {a7f0ba95-383a-4efd-adc5-a36e50a04018}) ---------- -The name of the StateType ({a7f0ba95-383a-4efd-adc5-a36e50a04018}) of ThingClass heosPlayer +The name of the StateType ({a7f0ba95-383a-4efd-adc5-a36e50a04018}) of ThingClass heosPlayer +---------- +The name of the ParamType (ThingClass: AVRX1000, EventType: artwork, ID: {6c4a208b-5b04-40cc-b14b-8f79aff30307}) +---------- +The name of the StateType ({6c4a208b-5b04-40cc-b14b-8f79aff30307}) of ThingClass AVRX1000 - + + Artwork changed - The name of the EventType ({a7f0ba95-383a-4efd-adc5-a36e50a04018}) of ThingClass heosPlayer + The name of the EventType ({a7f0ba95-383a-4efd-adc5-a36e50a04018}) of ThingClass heosPlayer +---------- +The name of the EventType ({6c4a208b-5b04-40cc-b14b-8f79aff30307}) of ThingClass AVRX1000 - - - + + + + Bass + The name of the ParamType (ThingClass: AVRX1000, ActionType: bass, ID: {2c92b22e-d5b2-4991-a523-64222bffc9e7}) +---------- +The name of the ParamType (ThingClass: AVRX1000, EventType: bass, ID: {2c92b22e-d5b2-4991-a523-64222bffc9e7}) +---------- +The name of the StateType ({2c92b22e-d5b2-4991-a523-64222bffc9e7}) of ThingClass AVRX1000 + + + + + Bass changed + The name of the EventType ({2c92b22e-d5b2-4991-a523-64222bffc9e7}) of ThingClass AVRX1000 + + + + + + Channel The name of the ParamType (ThingClass: AVRX1000, ActionType: channel, ID: {f29ffa2c-31d6-4d88-b160-a38288c82ce1}) ---------- @@ -82,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}) ---------- @@ -109,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 ---------- @@ -121,32 +166,32 @@ The name of the EventType ({fc1dee8b-8fcc-4ec2-8fe6-6be4f5f47a5c}) of ThingClass - + Decrease volume The name of the ActionType ({d3752c32-92e3-4396-8e2f-ab5e57c6cfb1}) of ThingClass AVRX1000 - + 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}) ---------- @@ -154,20 +199,20 @@ The name of the ParamType (ThingClass: AVRX1000, Type: thing, ID: {cb6eeeb0-3d75 - + Increase volume The name of the ActionType ({4ae686d6-2307-40a0-bd38-2cd3a92342cc}) of ThingClass AVRX1000 - + 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}) ---------- @@ -175,30 +220,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}) ---------- @@ -214,8 +259,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 ---------- @@ -223,95 +268,146 @@ 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 + The name of the ActionType ({21c1cbe6-278f-4688-a65f-6620be1ee5ea}) of ThingClass heosPlayer +---------- +The name of the ActionType ({3de38047-006f-4d97-9326-08bb5ad79b05}) of ThingClass AVRX1000 - + + Play - The name of the ActionType ({c64964e4-cea0-468a-a9bf-8f69657b74e9}) of ThingClass heosPlayer + The name of the ActionType ({c64964e4-cea0-468a-a9bf-8f69657b74e9}) of ThingClass heosPlayer +---------- +The name of the ActionType ({d04eb30b-838d-4fbd-b781-c01005b59756}) of ThingClass AVRX1000 - - - + + + + + + Playback status The name of the ParamType (ThingClass: heosPlayer, ActionType: playbackStatus, ID: {6db3b484-4cd4-477b-b822-275865d308db}) ---------- The name of the ParamType (ThingClass: heosPlayer, EventType: playbackStatus, ID: {6db3b484-4cd4-477b-b822-275865d308db}) ---------- -The name of the StateType ({6db3b484-4cd4-477b-b822-275865d308db}) of ThingClass heosPlayer +The name of the StateType ({6db3b484-4cd4-477b-b822-275865d308db}) of ThingClass heosPlayer +---------- +The name of the ParamType (ThingClass: AVRX1000, ActionType: playbackStatus, ID: {8ef6708c-812a-4e6a-a608-9e480aa3b7bf}) +---------- +The name of the ParamType (ThingClass: AVRX1000, EventType: playbackStatus, ID: {8ef6708c-812a-4e6a-a608-9e480aa3b7bf}) +---------- +The name of the StateType ({8ef6708c-812a-4e6a-a608-9e480aa3b7bf}) of ThingClass AVRX1000 - + + Playback status changed - The name of the EventType ({6db3b484-4cd4-477b-b822-275865d308db}) of ThingClass heosPlayer + The name of the EventType ({6db3b484-4cd4-477b-b822-275865d308db}) of ThingClass heosPlayer +---------- +The name of the EventType ({8ef6708c-812a-4e6a-a608-9e480aa3b7bf}) of ThingClass AVRX1000 - + 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}) ---------- -The name of the StateType ({c59835ac-ee6e-4e6c-aa20-aeb3501937c5}) of ThingClass heosPlayer +The name of the StateType ({c59835ac-ee6e-4e6c-aa20-aeb3501937c5}) of ThingClass heosPlayer +---------- +The name of the ParamType (ThingClass: AVRX1000, EventType: playerType, ID: {2f372374-16f3-4900-afdc-834f51075d07}) +---------- +The name of the StateType ({2f372374-16f3-4900-afdc-834f51075d07}) of ThingClass AVRX1000 - + + Player type changed - The name of the EventType ({c59835ac-ee6e-4e6c-aa20-aeb3501937c5}) of ThingClass heosPlayer + The name of the EventType ({c59835ac-ee6e-4e6c-aa20-aeb3501937c5}) of ThingClass heosPlayer +---------- +The name of the EventType ({2f372374-16f3-4900-afdc-834f51075d07}) of ThingClass AVRX1000 - + + + + Power + The name of the ParamType (ThingClass: AVRX1000, ActionType: power, ID: {1cdb6b54-6831-4900-95b2-c78f64497701}) +---------- +The name of the ParamType (ThingClass: AVRX1000, EventType: power, ID: {1cdb6b54-6831-4900-95b2-c78f64497701}) +---------- +The name of the StateType ({1cdb6b54-6831-4900-95b2-c78f64497701}) of ThingClass AVRX1000 + + + + 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}) ---------- The name of the ParamType (ThingClass: heosPlayer, EventType: repeat, ID: {4e60cd17-5845-4351-aa2c-2504610e1532}) ---------- -The name of the StateType ({4e60cd17-5845-4351-aa2c-2504610e1532}) of ThingClass heosPlayer +The name of the StateType ({4e60cd17-5845-4351-aa2c-2504610e1532}) of ThingClass heosPlayer +---------- +The name of the ParamType (ThingClass: AVRX1000, ActionType: repeat, ID: {9478987b-14e4-4572-a059-a18a5a9db229}) +---------- +The name of the ParamType (ThingClass: AVRX1000, EventType: repeat, ID: {9478987b-14e4-4572-a059-a18a5a9db229}) +---------- +The name of the StateType ({9478987b-14e4-4572-a059-a18a5a9db229}) of ThingClass AVRX1000 - + + Repeat mode changed - The name of the EventType ({4e60cd17-5845-4351-aa2c-2504610e1532}) of ThingClass heosPlayer + The name of the EventType ({4e60cd17-5845-4351-aa2c-2504610e1532}) of ThingClass heosPlayer +---------- +The name of the EventType ({9478987b-14e4-4572-a059-a18a5a9db229}) of ThingClass AVRX1000 - - + + Serial number The name of the ParamType (ThingClass: heosPlayer, Type: thing, ID: {866e8d6a-953f-4bdc-8d85-8d92e51e8592}) ---------- @@ -319,8 +415,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 ---------- @@ -328,62 +430,101 @@ 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 + The name of the ActionType ({6db3b484-4cd4-477b-b822-275865d308db}) of ThingClass heosPlayer +---------- +The name of the ActionType ({8ef6708c-812a-4e6a-a608-9e480aa3b7bf}) of ThingClass AVRX1000 - + + Set repeat mode - The name of the ActionType ({4e60cd17-5845-4351-aa2c-2504610e1532}) of ThingClass heosPlayer + The name of the ActionType ({4e60cd17-5845-4351-aa2c-2504610e1532}) of ThingClass heosPlayer +---------- +The name of the ActionType ({9478987b-14e4-4572-a059-a18a5a9db229}) of ThingClass AVRX1000 - + + Set shuffle - The name of the ActionType ({4b581237-acf5-4d8f-9e83-9b24e9ac900a}) of ThingClass heosPlayer + The name of the ActionType ({4b581237-acf5-4d8f-9e83-9b24e9ac900a}) of ThingClass heosPlayer +---------- +The name of the ActionType ({8ad33cb9-e758-433d-a013-2e4d43157c92}) of ThingClass AVRX1000 - + 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}) ---------- The name of the ParamType (ThingClass: heosPlayer, EventType: shuffle, ID: {4b581237-acf5-4d8f-9e83-9b24e9ac900a}) ---------- -The name of the StateType ({4b581237-acf5-4d8f-9e83-9b24e9ac900a}) of ThingClass heosPlayer +The name of the StateType ({4b581237-acf5-4d8f-9e83-9b24e9ac900a}) of ThingClass heosPlayer +---------- +The name of the ParamType (ThingClass: AVRX1000, ActionType: shuffle, ID: {8ad33cb9-e758-433d-a013-2e4d43157c92}) +---------- +The name of the ParamType (ThingClass: AVRX1000, EventType: shuffle, ID: {8ad33cb9-e758-433d-a013-2e4d43157c92}) +---------- +The name of the StateType ({8ad33cb9-e758-433d-a013-2e4d43157c92}) of ThingClass AVRX1000 - + + Shuffle changed - The name of the EventType ({4b581237-acf5-4d8f-9e83-9b24e9ac900a}) of ThingClass heosPlayer + The name of the EventType ({4b581237-acf5-4d8f-9e83-9b24e9ac900a}) of ThingClass heosPlayer +---------- +The name of the EventType ({8ad33cb9-e758-433d-a013-2e4d43157c92}) of ThingClass AVRX1000 - + + Skip back - The name of the ActionType ({a718f7e9-0b54-4403-b661-49f7b0d13085}) of ThingClass heosPlayer + The name of the ActionType ({a718f7e9-0b54-4403-b661-49f7b0d13085}) of ThingClass heosPlayer +---------- +The name of the ActionType ({3f2eb789-918c-475a-a295-14c0c24338b8}) of ThingClass AVRX1000 - + + Skip next - The name of the ActionType ({57697e9c-ce5e-4b8f-b42e-16662829ceb2}) of ThingClass heosPlayer + The name of the ActionType ({57697e9c-ce5e-4b8f-b42e-16662829ceb2}) of ThingClass heosPlayer +---------- +The name of the ActionType ({bf9664e4-a53e-474c-afcc-88f25e6fe365}) of ThingClass AVRX1000 - - + + Source The name of the ParamType (ThingClass: heosPlayer, EventType: source, ID: {eee22722-3ee5-48f7-8af8-275dc04b21eb}) ---------- @@ -391,14 +532,14 @@ 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 The name of the ParamType (ThingClass: AVRX1000, ActionType: decreaseVolume, ID: {1d54fda8-336c-436f-ab2b-e8bd549f830c}) ---------- @@ -406,15 +547,18 @@ The name of the ParamType (ThingClass: AVRX1000, ActionType: increaseVolume, ID: - + + Stop - The name of the ActionType ({c4b29c09-e3b3-4843-b6d9-e032f3fc1d78}) of ThingClass heosPlayer + The name of the ActionType ({c4b29c09-e3b3-4843-b6d9-e032f3fc1d78}) of ThingClass heosPlayer +---------- +The name of the ActionType ({ddab0869-5b90-4fd4-9c40-9ad57101b87c}) of ThingClass AVRX1000 - - - + + + Surround mode The name of the ParamType (ThingClass: AVRX1000, ActionType: surroundMode, ID: {4f203bdd-691c-4384-a934-2d49a5448f0a}) ---------- @@ -424,35 +568,80 @@ 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}) ---------- -The name of the StateType ({bbeecf30-6feb-48d5-ade3-57b2a4eea05f}) of ThingClass heosPlayer +The name of the StateType ({bbeecf30-6feb-48d5-ade3-57b2a4eea05f}) of ThingClass heosPlayer +---------- +The name of the ParamType (ThingClass: AVRX1000, EventType: title, ID: {d32493d8-5faf-4c7a-ba94-847dc9b81615}) +---------- +The name of the StateType ({d32493d8-5faf-4c7a-ba94-847dc9b81615}) of ThingClass AVRX1000 - + + Title changed - The name of the EventType ({bbeecf30-6feb-48d5-ade3-57b2a4eea05f}) of ThingClass heosPlayer + The name of the EventType ({bbeecf30-6feb-48d5-ade3-57b2a4eea05f}) of ThingClass heosPlayer +---------- +The name of the EventType ({d32493d8-5faf-4c7a-ba94-847dc9b81615}) of ThingClass AVRX1000 - + + + + Tone control + The name of the ParamType (ThingClass: AVRX1000, ActionType: toneControl, ID: {d57c1e5e-2cc9-4638-999c-1523f16dbb83}) +---------- +The name of the ParamType (ThingClass: AVRX1000, EventType: toneControl, ID: {d57c1e5e-2cc9-4638-999c-1523f16dbb83}) +---------- +The name of the StateType ({d57c1e5e-2cc9-4638-999c-1523f16dbb83}) of ThingClass AVRX1000 + + + + + 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}) +---------- +The name of the ParamType (ThingClass: AVRX1000, EventType: treble, ID: {38a3be02-6ed4-4a84-903e-eb923b933989}) +---------- +The name of the StateType ({38a3be02-6ed4-4a84-903e-eb923b933989}) of ThingClass AVRX1000 + + + + + 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}) ---------- @@ -460,24 +649,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}) ---------- @@ -493,8 +682,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 ---------- @@ -502,26 +691,14 @@ The name of the EventType ({773636b9-304d-463a-8755-fc7488dc0ff3}) of ThingClass - - - - power - The name of the ParamType (ThingClass: AVRX1000, ActionType: power, ID: {1cdb6b54-6831-4900-95b2-c78f64497701}) ----------- -The name of the ParamType (ThingClass: AVRX1000, EventType: power, ID: {1cdb6b54-6831-4900-95b2-c78f64497701}) ----------- -The name of the StateType ({1cdb6b54-6831-4900-95b2-c78f64497701}) of ThingClass AVRX1000 - - - - + 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 ---------- @@ -529,7 +706,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 @@ -538,34 +715,28 @@ The name of the ActionType ({773636b9-304d-463a-8755-fc7488dc0ff3}) of ThingClas IntegrationPluginDenon - - Thing discovery is not available. - Error discovering Denon things - - - - + 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. - + Service is not available - + Wrong username or password