diff --git a/denon/heos.cpp b/denon/heos.cpp index a98a857e..de394833 100644 --- a/denon/heos.cpp +++ b/denon/heos.cpp @@ -297,14 +297,15 @@ void Heos::clearQueue(int playerId) void Heos::moveQueue(int playerId, int sourcQueueId, int destinationQueueId) { - QUrl url("player"); - url.setScheme("heos"); - url.setPath("move_queue_item"); - url.setQuery(QString("pid=%1").arg(playerId)); - url.setQuery(QString("sqid=%1").arg(sourcQueueId)); - url.setQuery(QString("dqid=%1").arg(destinationQueueId)); - qCDebug(dcDenon) << "moving queue:" << url; - m_socket->write(url.toEncoded()); + QByteArray cmd("heos://player/move_queue_item?"); + QUrlQuery queryParams; + queryParams.addQueryItem("pid", QString::number(playerId)); + queryParams.addQueryItem("sqid", QString::number(sourcQueueId)); + queryParams.addQueryItem("dqid", QString::number(destinationQueueId)); + cmd.append(queryParams.toString()); + cmd.append("\r\n"); + qCDebug(dcDenon) << "moving queue:" << cmd; + m_socket->write(cmd); } void Heos::checkForFirmwareUpdate(int playerId) @@ -382,49 +383,53 @@ void Heos::browseSource(SOURCE_ID sourceId) void Heos::playStation(int playerId, const QString &sourceId, const QString &containerId, const QString &mediaId, const QString &stationName) { - QUrl url("browse"); - url.setScheme("heos"); - url.setPath("play_stream"); - url.setQuery(QString("pid=%1").arg(playerId)); - url.setQuery(QString("sid=%1").arg(sourceId)); - url.setQuery(QString("cid=%1").arg(containerId)); - url.setQuery(QString("mid=%1").arg(mediaId)); - url.setQuery(QString("name=%1").arg(stationName)); - qCDebug(dcDenon) << "playing url:" << url; - m_socket->write(url.toEncoded()); + QByteArray cmd("heos://browse/play_stream?"); + QUrlQuery queryParams; + queryParams.addQueryItem("pid", QString::number(playerId)); + queryParams.addQueryItem("sid", sourceId); + queryParams.addQueryItem("cid", containerId); + queryParams.addQueryItem("mid", mediaId); + queryParams.addQueryItem("name", stationName); + cmd.append(queryParams.toString()); + cmd.append("\r\n"); + qCDebug(dcDenon) << "playing station:" << cmd; + m_socket->write(cmd); } void Heos::playPresetStation(int playerId, int presetNumber) { - QUrl url("browse"); - url.setScheme("heos"); - url.setPath("play_preset"); - url.setQuery(QString("pid=%1").arg(playerId)); - url.setQuery(QString("preset=%1").arg(presetNumber)); - qCDebug(dcDenon) << "playing url:" << url; - m_socket->write(url.toEncoded()); + QByteArray cmd("heos://browse/play_preset?"); + QUrlQuery queryParams; + queryParams.addQueryItem("pid", QString::number(playerId)); + queryParams.addQueryItem("preset", QString::number(presetNumber)); + cmd.append(queryParams.toString()); + cmd.append("\r\n"); + qCDebug(dcDenon) << "playing preset station:" << cmd; + m_socket->write(cmd); } void Heos::playInputSource(int playerId, const QString &inputName) { - QUrl url("browse"); - url.setScheme("heos"); - url.setPath("play_input"); - url.setQuery(QString("pid=%1").arg(playerId)); - url.setQuery(QString("input=%1").arg(inputName)); - qCDebug(dcDenon) << "playing url:" << url; - m_socket->write(url.toEncoded()); + QByteArray cmd("heos://browse/play_input?"); + QUrlQuery queryParams; + queryParams.addQueryItem("pid", QString::number(playerId)); + queryParams.addQueryItem("input", inputName); + cmd.append(queryParams.toString()); + cmd.append("\r\n"); + qCDebug(dcDenon) << "playing input source:" << cmd; + m_socket->write(cmd); } void Heos::playUrl(int playerId, const QUrl &mediaUrl) { - QUrl url("browse"); - url.setScheme("heos"); - url.setPath("play_stream"); - url.setQuery(QString("pid=%1").arg(playerId)); - url.setQuery(QString("url=%1").arg(mediaUrl.toString())); - qCDebug(dcDenon) << "playing url:" << url; - m_socket->write(url.toEncoded()); + QByteArray cmd("heos://browse/play_stream?"); + QUrlQuery queryParams; + queryParams.addQueryItem("pid", QString::number(playerId)); + queryParams.addQueryItem("url", mediaUrl.toString()); + cmd.append(queryParams.toString()); + cmd.append("\r\n"); + qCDebug(dcDenon) << "playing url:" << cmd; + m_socket->write(cmd); } /* This command is used to perform the following actions: diff --git a/denon/integrationplugindenon.cpp b/denon/integrationplugindenon.cpp index da0e6897..6e8893ec 100644 --- a/denon/integrationplugindenon.cpp +++ b/denon/integrationplugindenon.cpp @@ -67,6 +67,7 @@ IntegrationPluginDenon::IntegrationPluginDenon() { } + void IntegrationPluginDenon::discoverThings(ThingDiscoveryInfo *info) { if (info->thingClassId() == AVRX1000ThingClassId) { @@ -306,7 +307,7 @@ void IntegrationPluginDenon::executeAction(ThingActionInfo *info) int playerId = thing->paramValue(heosPlayerThingPlayerIdParamTypeId).toInt(); if (action.actionTypeId() == heosPlayerAlertActionTypeId) { - heos->playUrl(playerId, QUrl("https://downloads.nymea.io/notification-sounds/definite.mp3")); + heos->playUrl(playerId, m_notificationUrl); return Device::DeviceErrorNoError; } @@ -738,3 +739,14 @@ void IntegrationPluginDenon::onAvahiServiceEntryRemoved(const ZeroConfServiceEnt { qCDebug(dcDenon()) << "Avahi service entry removed:" << serviceEntry; } + +void DevicePluginDenon::onPluginConfigurationChanged(const ParamTypeId ¶mTypeId, const QVariant &value) +{ + qCDebug(dcDenon()) << "Plugin configuration changed"; + + // Check advanced mode + if (paramTypeId == denonPluginNotificationUrlParamTypeId) { + qCDebug(dcDenon()) << "Advanced mode" << (value.toBool() ? "enabled." : "disabled."); + m_notificationUrl = value.toUrl(); + } +} diff --git a/denon/integrationplugindenon.h b/denon/integrationplugindenon.h index 37c35e53..6d0221cf 100644 --- a/denon/integrationplugindenon.h +++ b/denon/integrationplugindenon.h @@ -56,6 +56,7 @@ class IntegrationPluginDenon : public IntegrationPlugin public: explicit IntegrationPluginDenon(); + void init() override; void discoverThings(ThingDiscoveryInfo *info) override; void setupThing(ThingSetupInfo *info) override; void postSetupThing(Thing *thing) override; @@ -75,6 +76,7 @@ private: QHash m_playerIds; QHash m_discoveredPlayerIds; QHash m_asyncActions; + QUrl m_notificationUrl; private slots: @@ -98,6 +100,8 @@ private slots: void onAvrMuteChanged(bool mute); void onAvrPowerChanged(bool power); void onAvrSurroundModeChanged(const QByteArray &surroundMode); + + void onPluginConfigurationChanged(const ParamTypeId ¶mTypeId, const QVariant &value); }; #endif // INTEGRATIONPLUGINDENON_H diff --git a/denon/integrationplugindenon.json b/denon/integrationplugindenon.json index 0d00025e..daac1f90 100644 --- a/denon/integrationplugindenon.json +++ b/denon/integrationplugindenon.json @@ -2,6 +2,15 @@ "displayName": "Denon", "name": "Denon", "id": "cd758269-dbbb-4ef0-80ab-48bd9a8a2765", + "paramTypes": [ + { + "id": "5a3cd3eb-8ff5-4110-aef0-7b0608450e60", + "name": "notificationUrl", + "displayName": "Notification url", + "type" : "QString", + "defaultValue": "https://downloads.nymea.io/notification-sounds/doorbell.mp3" + } + ], "vendors": [ { "id": "cf0a9644-2c13-4daf-85c1-ad88d6745b42",