diff --git a/denon/README.md b/denon/README.md index 50df7958..5d950e2e 100644 --- a/denon/README.md +++ b/denon/README.md @@ -1,3 +1,18 @@ # Denon -This pluging provides support for the [Denon AV Amplifier AVR-X1000](http://www.denon.de/de/product/hometheater/avreceivers/avrx1000) device. +This pluging integrates audio products from Denon. + +## Supported Things + +* AVR-X1000 +* Heos built-in products + +## Requirements + +* nymea and the Denon device must be in the same local area network. +* The package "nymea-plugin-denon" must be installed. +* TCP connection on port 1255 must not be block by the router. + +## More + +http://www.denon.com diff --git a/denon/integrationplugindenon.cpp b/denon/integrationplugindenon.cpp index 9cfb5fa8..92051848 100644 --- a/denon/integrationplugindenon.cpp +++ b/denon/integrationplugindenon.cpp @@ -425,16 +425,16 @@ void IntegrationPluginDenon::onPluginTimer() heos->getPlayers(); heos->registerForChangeEvents(true); } else if (thing->thingClassId() == heosPlayerThingClassId) { - Thing *heosThing = myThings().findById(thing->parentId()); - Heos *heos = m_heosConnections.value(heosThing->id()); - int playerId = thing->paramValue(heosPlayerThingPlayerIdParamTypeId).toInt(); + //Thing *heosThing = myThings().findById(thing->parentId()); + //Heos *heos = m_heosConnections.value(heosThing->id()); + //int playerId = thing->paramValue(heosPlayerThingPlayerIdParamTypeId).toInt(); //TODO check if event stream is sufficent and remove polling - heos->getPlayerState(playerId); - heos->getPlayMode(playerId); - heos->getVolume(playerId); - heos->getMute(playerId); - heos->getNowPlayingMedia(playerId); + //heos->getPlayerState(playerId); + //heos->getPlayMode(playerId); + //heos->getVolume(playerId); + //heos->getMute(playerId); + //heos->getNowPlayingMedia(playerId); } } } @@ -600,10 +600,20 @@ void IntegrationPluginDenon::onHeosPlayersReceived(QList heosPlaye heosPlayerDescriptors.append(descriptor); } - //TODO remove things - //autoThingDisappeared(); - //TODO remove player from player Buffer - autoThingsAppeared(heosPlayerDescriptors); + foreach(Thing *existingThing, myThings().filterByParentId(thing->id())) { + bool playerAvailable = false; + int playerId = existingThing->paramValue(heosPlayerThingPlayerIdParamTypeId).toInt(); + foreach (HeosPlayer *player, heosPlayers) { + if (player->playerId() == playerId) { + playerAvailable = true; + break; + } + } + if (!playerAvailable) { + autoThingDisappeared(existingThing->id()); + m_playerBuffer.remove(playerId); + } + } } void IntegrationPluginDenon::onHeosPlayerInfoRecieved(HeosPlayer *heosPlayer) @@ -698,32 +708,41 @@ void IntegrationPluginDenon::onHeosMusicSourcesReceived(quint32 sequenceNumber, item.setIcon(BrowserItem::BrowserIconMusic); if (source.name == "Amazon") { item.setMediaIcon(MediaBrowserItem::MediaBrowserIconAmazon); + //result->addItem(item); } else if (source.name == "Deezer") { item.setMediaIcon(MediaBrowserItem::MediaBrowserIconDeezer); + //result->addItem(item); } else if (source.name == "Napster") { item.setMediaIcon(MediaBrowserItem::MediaBrowserIconNapster); + //result->addItem(item); } else if (source.name == "SoundCloud") { item.setMediaIcon(MediaBrowserItem::MediaBrowserIconSoundCloud); + //result->addItem(item); } else if (source.name == "Tidal") { item.setMediaIcon(MediaBrowserItem::MediaBrowserIconTidal); + //result->addItem(item); } else if (source.name == "TuneIn") { item.setMediaIcon(MediaBrowserItem::MediaBrowserIconTuneIn); item.setBrowsable(true); item.setDescription(source.serviceUsername); + result->addItem(item); } else if (source.name == "Local Music") { item.setMediaIcon(MediaBrowserItem::MediaBrowserIconDisk); + //result->addItem(item); } else if (source.name == "Playlists") { item.setMediaIcon(MediaBrowserItem::MediaBrowserIconPlaylist); } else if (source.name == "History") { + //result->addItem(item); item.setMediaIcon(MediaBrowserItem::MediaBrowserIconRecentlyPlayed); } else if (source.name == "AUX Input") { item.setMediaIcon(MediaBrowserItem::MediaBrowserIconAux); + //result->addItem(item); } else if (source.name == "Favorites") { item.setIcon(BrowserItem::BrowserIconFavorites); + result->addItem(item); } else { item.setThumbnail(source.image_url); } - result->addItem(item); qDebug(dcDenon()) << "Music source received:" << source.name << source.type << source.sourceId << source.image_url; } result->finish(Thing::ThingErrorNoError); @@ -767,34 +786,44 @@ void IntegrationPluginDenon::onHeosBrowseRequestReceived(quint32 sequenceNumber, qDebug(dcDenon()) << "Adding Item" << source.name << source.sourceId; item.setId("source=" + QString::number(source.sourceId)); item.setIcon(BrowserItem::BrowserIconMusic); + item.setExecutable(false); + item.setBrowsable(true); if (source.name.contains("Amazon")) { item.setMediaIcon(MediaBrowserItem::MediaBrowserIconAmazon); + //result->addItem(item); } else if (source.name == "Deezer") { item.setMediaIcon(MediaBrowserItem::MediaBrowserIconDeezer); + //result->addItem(item); } else if (source.name == "Napster") { item.setMediaIcon(MediaBrowserItem::MediaBrowserIconNapster); + //result->addItem(item); } else if (source.name == "SoundCloud") { item.setMediaIcon(MediaBrowserItem::MediaBrowserIconSoundCloud); + //result->addItem(item); } else if (source.name == "Tidal") { item.setMediaIcon(MediaBrowserItem::MediaBrowserIconTidal); + //result->addItem(item); } else if (source.name == "TuneIn") { item.setMediaIcon(MediaBrowserItem::MediaBrowserIconTuneIn); + result->addItem(item); } else if (source.name == "Local Music") { item.setMediaIcon(MediaBrowserItem::MediaBrowserIconDisk); + //result->addItem(item); } else if (source.name == "Playlists") { item.setMediaIcon(MediaBrowserItem::MediaBrowserIconPlaylist); + //result->addItem(item); } else if (source.name == "History") { item.setMediaIcon(MediaBrowserItem::MediaBrowserIconRecentlyPlayed); + //result->addItem(item); } else if (source.name == "AUX Input") { item.setMediaIcon(MediaBrowserItem::MediaBrowserIconAux); + //result->addItem(item); } else if (source.name == "Favorites") { item.setIcon(BrowserItem::BrowserIconFavorites); + result->addItem(item); } else { item.setThumbnail(source.image_url); } - item.setExecutable(false); - item.setBrowsable(true); - result->addItem(item); } result->finish(Thing::ThingErrorNoError); } else {