diff --git a/denon/avrconnection.cpp b/denon/avrconnection.cpp index 22041957..73b16d5a 100644 --- a/denon/avrconnection.cpp +++ b/denon/avrconnection.cpp @@ -85,11 +85,23 @@ QHostAddress AvrConnection::hostAddress() const return m_hostAddress; } +void AvrConnection::setHostAddress(const QHostAddress &hostAddress) +{ + m_hostAddress = hostAddress; + connectDevice(); +} + int AvrConnection::port() const { return m_port; } +void AvrConnection::setPort(int port) +{ + m_port = port; + connectDevice(); +} + bool AvrConnection::connected() { return m_socket->isOpen(); @@ -391,15 +403,15 @@ void AvrConnection::readData() emit playBackModeChanged(PlayBackMode::PlayBackModeStopped); } } else if (data.left(4).contains("NSE1")) { - QString song = QString(data).remove(0, 4).trimmed(); + 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, 4).trimmed(); + 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, 4).trimmed(); + QString album = QString(data).remove(0, 5).trimmed(); qCDebug(dcDenon()) << "Album" << album; emit albumChanged(album); } else if (data.contains("PSTONE CTRL ON")) { diff --git a/denon/avrconnection.h b/denon/avrconnection.h index 37e4400f..32529817 100644 --- a/denon/avrconnection.h +++ b/denon/avrconnection.h @@ -60,7 +60,9 @@ public: void disconnectDevice(); QHostAddress hostAddress() const; + void setHostAddress(const QHostAddress &hostAddress); int port() const; + void setPort(int port); bool connected(); QUuid getChannel(); diff --git a/denon/integrationplugindenon.cpp b/denon/integrationplugindenon.cpp index 88e10f2e..23dcb458 100644 --- a/denon/integrationplugindenon.cpp +++ b/denon/integrationplugindenon.cpp @@ -53,52 +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 thingId = thing->paramValue(AVRX1000ThingIdParamTypeId).toString(); + QString id = entry.name().split("@").first(); + QHostAddress address = entry.hostAddress(); + if (thingId == id) { + AvrConnection *avrConnection = m_avrConnections.value(thing->id()); + avrConnection->setHostAddress(address); + } + } + } + }); } void IntegrationPluginDenon::discoverThings(ThingDiscoveryInfo *info) { if (info->thingClassId() == AVRX1000ThingClassId) { - if (!m_serviceBrowser) { - m_serviceBrowser = hardwareManager()->zeroConfController()->createServiceBrowser(); - } - if (!hardwareManager()->zeroConfController()->available()) { qCDebug(dcDenon()) << "Error discovering Denon things. Available:" << hardwareManager()->zeroConfController()->available(); info->finish(Thing::ThingErrorHardwareNotAvailable, "Thing discovery not possible"); return; } - QTimer::singleShot(2000, info, [this, info](){ - QStringList discoveredIds; + QStringList discoveredIds; - foreach (const ZeroConfServiceEntry &service, m_serviceBrowser->serviceEntries()) { - if (service.txt().contains("am=AVRX1000")) { + foreach (const ZeroConfServiceEntry &service, m_serviceBrowser->serviceEntries()) { + qCDebug(dcDenon()) << "mDNS service entry:" << service; + 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, @@ -261,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())) { @@ -763,11 +774,11 @@ void IntegrationPluginDenon::onAvrCommandExecuted(const QUuid &commandId, bool s if(info->action().actionTypeId() == AVRX1000PlayActionTypeId) { info->thing()->setStateValue(AVRX1000PlaybackStatusStateTypeId, "Playing"); } else if(info->action().actionTypeId() == AVRX1000PauseActionTypeId) { - info->thing()->setStateValue(AVRX1000PlaybackStatusStateTypeId, "Paused"); + info->thing()->setStateValue(AVRX1000PlaybackStatusStateTypeId, "Paused"); } else if(info->action().actionTypeId() == AVRX1000StopActionTypeId) { - info->thing()->setStateValue(AVRX1000PlaybackStatusStateTypeId, "Stopped"); + info->thing()->setStateValue(AVRX1000PlaybackStatusStateTypeId, "Stopped"); } else if(info->action().actionTypeId() == AVRX1000PlaybackStatusActionTypeId) { - info->thing()->setStateValue(AVRX1000PlaybackStatusStateTypeId, info->action().param(AVRX1000PlaybackStatusActionPlaybackStatusParamTypeId).value()); + info->thing()->setStateValue(AVRX1000PlaybackStatusStateTypeId, info->action().param(AVRX1000PlaybackStatusActionPlaybackStatusParamTypeId).value()); } info->finish(Thing::ThingErrorNoError); diff --git a/denon/integrationplugindenon.json b/denon/integrationplugindenon.json index a01614da..d7283e95 100644 --- a/denon/integrationplugindenon.json +++ b/denon/integrationplugindenon.json @@ -91,28 +91,28 @@ "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": "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": "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",