diff --git a/coinmarketcap/README.md b/coinmarketcap/README.md
new file mode 100644
index 00000000..e69de29b
diff --git a/coinmarketcap/coinmarketcap.pro b/coinmarketcap/coinmarketcap.pro
new file mode 100644
index 00000000..ad3216c7
--- /dev/null
+++ b/coinmarketcap/coinmarketcap.pro
@@ -0,0 +1,12 @@
+include(../plugins.pri)
+
+QT += network
+
+TARGET = $$qtLibraryTarget(nymea_deviceplugincoinmarketcap)
+
+SOURCES += \
+ deviceplugincoinmarketcap.cpp \
+
+HEADERS += \
+ deviceplugincoinmarketcap.h \
+
diff --git a/coinmarketcap/compile_commands.json b/coinmarketcap/compile_commands.json
new file mode 100644
index 00000000..9a444d29
--- /dev/null
+++ b/coinmarketcap/compile_commands.json
@@ -0,0 +1,86 @@
+[
+{
+ "arguments": [
+ "clang++",
+ "-c",
+ "-m64",
+ "-target",
+ "x86_64-linux-gnu",
+ "-std=c++11",
+ "-fcxx-exceptions",
+ "-fexceptions",
+ "-DQT_QML_DEBUG",
+ "-DQT_PLUGIN",
+ "-DQT_GUI_LIB",
+ "-DQT_NETWORK_LIB",
+ "-DQT_CORE_LIB",
+ "-DBOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING=(39, 1, true, \"T = \")",
+ "-fPIC",
+ "-I",
+ "/home/nymea/Developer/nymea-coinmarketcapplugin",
+ "-I",
+ "/usr/include/nymea",
+ "-I",
+ "/usr/include/x86_64-linux-gnu/qt5",
+ "-I",
+ "/usr/include/x86_64-linux-gnu/qt5/QtGui",
+ "-I",
+ "/usr/include/x86_64-linux-gnu/qt5/QtNetwork",
+ "-I",
+ "/usr/include/x86_64-linux-gnu/qt5/QtCore",
+ "-I",
+ "/home/nymea/Developer/build-coinmarketcap-Desktop-Debug",
+ "-I",
+ "/usr/include/libdrm",
+ "-I",
+ "/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++",
+ "-x",
+ "c++",
+ "/home/nymea/Developer/nymea-coinmarketcapplugin/deviceplugincoinmarketcap.cpp"
+ ],
+ "directory": "/home/nymea/Developer/build-coinmarketcap-Desktop-Debug",
+ "file": "/home/nymea/Developer/nymea-coinmarketcapplugin/deviceplugincoinmarketcap.cpp"
+},
+{
+ "arguments": [
+ "clang",
+ "-c",
+ "-m64",
+ "-target",
+ "x86_64-linux-gnu",
+ "-std=c++11",
+ "-fcxx-exceptions",
+ "-fexceptions",
+ "-DQT_QML_DEBUG",
+ "-DQT_PLUGIN",
+ "-DQT_GUI_LIB",
+ "-DQT_NETWORK_LIB",
+ "-DQT_CORE_LIB",
+ "-DBOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING=(39, 1, true, \"T = \")",
+ "-fPIC",
+ "-I",
+ "/home/nymea/Developer/nymea-coinmarketcapplugin",
+ "-I",
+ "/usr/include/nymea",
+ "-I",
+ "/usr/include/x86_64-linux-gnu/qt5",
+ "-I",
+ "/usr/include/x86_64-linux-gnu/qt5/QtGui",
+ "-I",
+ "/usr/include/x86_64-linux-gnu/qt5/QtNetwork",
+ "-I",
+ "/usr/include/x86_64-linux-gnu/qt5/QtCore",
+ "-I",
+ "/home/nymea/Developer/build-coinmarketcap-Desktop-Debug",
+ "-I",
+ "/usr/include/libdrm",
+ "-I",
+ "/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++",
+ "-x",
+ "c++-header",
+ "/home/nymea/Developer/nymea-coinmarketcapplugin/deviceplugincoinmarketcap.h"
+ ],
+ "directory": "/home/nymea/Developer/build-coinmarketcap-Desktop-Debug",
+ "file": "/home/nymea/Developer/nymea-coinmarketcapplugin/deviceplugincoinmarketcap.h"
+}
+]
\ No newline at end of file
diff --git a/coinmarketcap/deviceplugincoinmarketcap.cpp b/coinmarketcap/deviceplugincoinmarketcap.cpp
new file mode 100644
index 00000000..ce468653
--- /dev/null
+++ b/coinmarketcap/deviceplugincoinmarketcap.cpp
@@ -0,0 +1,166 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * *
+ * Copyright (C) 2019 Bernhard Trinnes . *
+ * *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "deviceplugincoinmarketcap.h"
+#include "network/networkaccessmanager.h"
+#include "plugininfo.h"
+
+#include
+
+DevicePluginCoinMarketCap::DevicePluginCoinMarketCap()
+{
+}
+
+DeviceManager::DeviceSetupStatus DevicePluginCoinMarketCap::setupDevice(Device *device)
+{
+ if(!m_pluginTimer) {
+ m_pluginTimer = hardwareManager()->pluginTimerManager()->registerTimer(60);
+ connect(m_pluginTimer, &PluginTimer::timeout, this, &DevicePluginCoinMarketCap::onPluginTimer);
+ }
+
+ if (device->deviceClassId() == currentPricesDeviceClassId) {
+ getPriceCall(device);
+ return DeviceManager::DeviceSetupStatusSuccess;
+ }
+ return DeviceManager::DeviceSetupStatusFailure;
+}
+
+void DevicePluginCoinMarketCap::deviceRemoved(Device *device)
+{
+ while (m_httpRequests.values().contains(device)) {
+ QNetworkReply *reply = m_httpRequests.key(device);
+ m_httpRequests.remove(reply);
+ reply->deleteLater();
+ }
+
+ if (myDevices().empty()) {
+ hardwareManager()->pluginTimerManager()->unregisterTimer(m_pluginTimer);
+ }
+}
+
+void DevicePluginCoinMarketCap::onPluginTimer()
+{
+ foreach (Device *device, myDevices()) {
+ if (device->deviceClassId() == currentPricesDeviceClassId) {
+ getPriceCall(device);
+ }
+ }
+}
+
+void DevicePluginCoinMarketCap::onPriceCallFinished()
+{
+ QNetworkReply *reply = static_cast(sender());
+ qCDebug(dcCoinMarketCap()) << "GET reply finished";
+ int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
+
+ if (!m_httpRequests.contains(reply)) {
+ reply->deleteLater();
+ return;
+ }
+
+ Device *device = m_httpRequests.take(reply);
+
+ // Check HTTP status code
+ if (status != 200 || reply->error() != QNetworkReply::NoError) {
+ qCWarning(dcCoinMarketCap()) << "Request error:" << status << reply->errorString();
+ device->setStateValue(currentPricesConnectedStateTypeId, false);
+ }
+ reply->deleteLater();
+
+ // check JSON file
+ QJsonParseError error;
+ QJsonDocument jsonResponse = QJsonDocument::fromJson(reply->readAll(), &error);
+ qDebug(dcCoinMarketCap()) << jsonResponse;
+ if (error.error != QJsonParseError::NoError) {
+ qCWarning(dcCoinMarketCap()) << "Update reply JSON error:" << error.errorString();
+ reply->deleteLater();
+ return;
+ }
+
+ QVariantList list = jsonResponse.toVariant().toList();
+
+ foreach (QVariant element, list) {
+ QVariantMap elementMap = element.toMap();
+ device->setStateValue(currentPricesConnectedStateTypeId, true);
+ double price;
+
+ if (elementMap.value("id").toString() == "bitcoin") {
+ price = elementMap.value(QString("price_%1").arg(QString(device->paramValue(currentPricesDeviceFiatParamTypeId).toString()).toLower())).toDouble();
+ qDebug(dcCoinMarketCap()) << "Bitcoin Price in" << QString(device->paramValue(currentPricesDeviceFiatParamTypeId).toString()).toLower() << price;
+ device->setStateValue(currentPricesBtcStateTypeId, price);
+
+ } else if (elementMap.value("id").toString() == "ethereum") {
+ price = elementMap.value(QString("price_%1").arg(QString(device->paramValue(currentPricesDeviceFiatParamTypeId).toString()).toLower())).toDouble();
+ qDebug(dcCoinMarketCap()) << "Etherium Price in" << QString(device->paramValue(currentPricesDeviceFiatParamTypeId).toString()).toLower() << price;
+ device->setStateValue(currentPricesEthStateTypeId, price);
+
+ } else if (elementMap.value("id").toString() == "ripple") {
+ price = elementMap.value(QString("price_%1").arg(QString(device->paramValue(currentPricesDeviceFiatParamTypeId).toString()).toLower())).toDouble();
+ qDebug(dcCoinMarketCap()) << "Ripple Price in" << QString(device->paramValue(currentPricesDeviceFiatParamTypeId).toString()).toLower() << price;
+ device->setStateValue(currentPricesXrpStateTypeId, price);
+
+ } else if (elementMap.value("id").toString() == "bitcoin-cash") {
+ price = elementMap.value(QString("price_%1").arg(QString(device->paramValue(currentPricesDeviceFiatParamTypeId).toString()).toLower())).toDouble();
+ qDebug(dcCoinMarketCap()) << "Bitcoin-cash Price in" << QString(device->paramValue(currentPricesDeviceFiatParamTypeId).toString()).toLower() << price;
+ device->setStateValue(currentPricesBchStateTypeId, price);
+
+ } else if (elementMap.value("id").toString() == "litecoin") {
+ price = elementMap.value(QString("price_%1").arg(QString(device->paramValue(currentPricesDeviceFiatParamTypeId).toString()).toLower())).toDouble();
+ qDebug(dcCoinMarketCap()) << "Litecoin Price in" << QString(device->paramValue(currentPricesDeviceFiatParamTypeId).toString()).toLower() << price;
+ device->setStateValue(currentPricesLtcStateTypeId, price);
+
+ } else if (elementMap.value("id").toString() == "nem") {
+ price = elementMap.value(QString("price_%1").arg(QString(device->paramValue(currentPricesDeviceFiatParamTypeId).toString()).toLower())).toDouble();
+ qDebug(dcCoinMarketCap()) << "Nem Price in" << QString(device->paramValue(currentPricesDeviceFiatParamTypeId).toString()).toLower() << price;
+ device->setStateValue(currentPricesXemStateTypeId, price);
+
+ } else if (elementMap.value("id").toString() == "ethereum-classic") {
+ price = elementMap.value(QString("price_%1").arg(QString(device->paramValue(currentPricesDeviceFiatParamTypeId).toString()).toLower())).toDouble();
+ qDebug(dcCoinMarketCap()) << "Ethereum Classic Price in" << QString(device->paramValue(currentPricesDeviceFiatParamTypeId).toString()).toLower() << price;
+ device->setStateValue(currentPricesEtcStateTypeId, price);
+
+ } else if (elementMap.value("id").toString() == "dash") {
+ price = elementMap.value(QString("price_%1").arg(QString(device->paramValue(currentPricesDeviceFiatParamTypeId).toString()).toLower())).toDouble();
+ device->setStateValue(currentPricesDashStateTypeId, price);
+
+ } else if (elementMap.value("id").toString() == "iota") {
+ price = elementMap.value(QString("price_%1").arg(QString(device->paramValue(currentPricesDeviceFiatParamTypeId).toString()).toLower())).toDouble();
+ device->setStateValue(currentPricesMiotaStateTypeId, price);
+
+ } else if (elementMap.value("id").toString() == "neo") {
+ price = elementMap.value(QString("price_%1").arg(QString(device->paramValue(currentPricesDeviceFiatParamTypeId).toString()).toLower())).toDouble();
+ device->setStateValue(currentPricesAnsStateTypeId, price);
+ }
+ }
+}
+
+void DevicePluginCoinMarketCap::getPriceCall(Device *device)
+{
+ QUrl url;
+ url.setUrl(QString("https://api.coinmarketcap.com/v1/ticker/?convert=%1&limit=30").arg(QString(device->paramValue(currentPricesDeviceFiatParamTypeId).toString()).toLower()));
+ QNetworkRequest request;
+ request.setUrl(url);
+ request.setRawHeader("User-Agent", "nymea 1.0");
+
+ QNetworkReply *reply = hardwareManager()->networkManager()->get(request);
+ connect(reply, &QNetworkReply::finished, this, &DevicePluginCoinMarketCap::onPriceCallFinished);
+
+ m_httpRequests.insert(reply, device);
+}
diff --git a/coinmarketcap/deviceplugincoinmarketcap.h b/coinmarketcap/deviceplugincoinmarketcap.h
new file mode 100644
index 00000000..7f2fedd7
--- /dev/null
+++ b/coinmarketcap/deviceplugincoinmarketcap.h
@@ -0,0 +1,57 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * *
+ * Copyright (C) 2019 Bernhard Trinnes . *
+ * *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef DEVICEPLUGINCOINMARKETCAP_H
+#define DEVICEPLUGINCOINMARKETCAP_H
+
+#include "plugin/deviceplugin.h"
+#include "devicemanager.h"
+#include "plugintimer.h"
+
+#include
+#include
+
+class DevicePluginCoinMarketCap : public DevicePlugin
+{
+ Q_OBJECT
+
+ Q_PLUGIN_METADATA(IID "io.nymea.DevicePlugin" FILE "deviceplugincoinmarketcap.json")
+ Q_INTERFACES(DevicePlugin)
+
+public:
+ explicit DevicePluginCoinMarketCap();
+
+ DeviceManager::DeviceSetupStatus setupDevice(Device *device) override;
+ void deviceRemoved(Device *device) override;
+
+private:
+ PluginTimer *m_pluginTimer = nullptr;
+
+ QHash m_priceRequests;
+ QHash m_httpRequests;
+
+ void getPriceCall(Device *device);
+
+private slots:
+ void onPluginTimer();
+ void onPriceCallFinished();
+};
+
+#endif // DEVICEPLUGINCOINMARKETCAP_H
diff --git a/coinmarketcap/deviceplugincoinmarketcap.json b/coinmarketcap/deviceplugincoinmarketcap.json
new file mode 100644
index 00000000..dcb6941f
--- /dev/null
+++ b/coinmarketcap/deviceplugincoinmarketcap.json
@@ -0,0 +1,140 @@
+{
+ "displayName": "Coin market cap",
+ "name": "coinMarketCap",
+ "id": "532757cf-fc6f-4ce5-ae5b-e6f5bdb67fb4",
+ "vendors": [
+ {
+ "displayName": "Coin Market Cap",
+ "name": "coinMarketCap",
+ "id": "28eeecbd-4178-45aa-81a6-fd95851444fd",
+ "deviceClasses": [
+ {
+ "id": "f5b794f7-7e2a-4409-8445-23ead80f2a8f",
+ "name": "currentPrices",
+ "displayName": "Crypto Prices",
+ "createMethods": ["user"],
+ "interfaces": ["connectable"],
+ "paramTypes": [
+ {
+ "id": "92747d75-d18a-4915-bd48-0edd5cc5f19a",
+ "name": "fiat",
+ "displayName": "Fiat Currency",
+ "type": "QString",
+ "allowedValues": [
+ "USD",
+ "AUD",
+ "BRL",
+ "CAD",
+ "CHF",
+ "CNY",
+ "EUR",
+ "GBP",
+ "HKD",
+ "IDR",
+ "INR",
+ "JPY",
+ "KRW",
+ "MXN",
+ "RUB"
+ ],
+ "defaultValue": "EUR"
+ }
+ ],
+ "stateTypes":[
+ {
+ "id": "19f079f0-1654-44c3-ab10-e7d7f9742e09",
+ "name": "connected",
+ "displayName": "Connected",
+ "type": "bool",
+ "defaultValue": false,
+ "displayNameEvent": "Connection status changed"
+ },
+ {
+ "id": "721c91c8-8eb1-402e-8bfc-8e2d496be032",
+ "name": "btc",
+ "displayName": "Bitcoin",
+ "type": "double",
+ "defaultValue": 0.00,
+ "displayNameEvent": "bitcoin value changed"
+ },
+ {
+ "id": "5c58bb9f-dcdf-47c9-a0b7-f0ffc968f824",
+ "name": "eth",
+ "displayName": "Ethereum",
+ "type": "double",
+ "defaultValue": 0.00,
+ "displayNameEvent": "ethereum value changed"
+ },
+ {
+ "id": "d8517cf8-2ebd-4be3-8573-00b595cc2ab5",
+ "name": "xrp",
+ "displayName": "Ripple",
+ "type": "double",
+ "defaultValue": 0.00,
+ "displayNameEvent": "ripple value changed"
+ },
+ {
+ "id": "cc5b4fe5-aa43-43b3-952f-90c0e3e20740",
+ "name": "bch",
+ "displayName": "Bitcoin Cash",
+ "type": "double",
+ "defaultValue": 0.00,
+ "displayNameEvent": "bitcoin cash value changed"
+ },
+ {
+ "id": "f591f699-ae68-4f64-a221-254f836a31d3",
+ "name": "ltc",
+ "displayName": "Litecoin",
+ "type": "double",
+ "defaultValue": 0.00,
+ "displayNameEvent": "Litecoin value changed"
+ },
+ {
+ "id": "adecda44-fade-4dba-8b41-cfb07579dea9",
+ "name": "xem",
+ "displayName": "NEM",
+ "type": "double",
+ "defaultValue": 0.00,
+ "displayNameEvent": "NEM cash value changed"
+ },
+ {
+ "id": "fc9a61b7-c3df-4f13-ba31-d7743f3d2dc2",
+ "name": "etc",
+ "displayName": "Ethereum Classic",
+ "type": "double",
+ "defaultValue": 0.00,
+ "displayNameEvent": "etherium classic value changed"
+ },
+ {
+ "id": "0b602f14-1596-4091-a0ab-6c5efa087a3f",
+ "name": "dash",
+ "displayName": "Dash",
+ "type": "double",
+ "defaultValue": 0.00,
+ "displayNameEvent": "Dash value changed"
+ },
+ {
+ "id": "2c6e341f-5940-40bb-b495-89c3ecaaf9e7",
+ "name": "miota",
+ "displayName": "IOTA",
+ "type": "double",
+ "defaultValue": 0.00,
+ "displayNameEvent": "IOTA value changed"
+ },
+ {
+ "id": "7583c720-1786-4c32-9552-e731578ff113",
+ "name": "ans",
+ "displayName": "NEO",
+ "type": "double",
+ "defaultValue": 0.00,
+ "displayNameEvent": "NEO value changed"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
+
+
+
diff --git a/coinmarketcap/plugins.pri b/coinmarketcap/plugins.pri
new file mode 100644
index 00000000..afa12598
--- /dev/null
+++ b/coinmarketcap/plugins.pri
@@ -0,0 +1,58 @@
+TEMPLATE = lib
+CONFIG += plugin
+
+QMAKE_CXXFLAGS += -Werror -std=c++11 -g
+QMAKE_LFLAGS += -std=c++11
+
+CONFIG += link_pkgconfig
+PKGCONFIG += nymea
+
+HEADERS += $${OUT_PWD}/plugininfo.h \
+ $${OUT_PWD}/extern-plugininfo.h
+
+# Check if this is a snap build
+snappy{
+ INCLUDEPATH+=$$(SNAPCRAFT_STAGE)/usr/include/nymea
+}
+
+# Make the device plugin json file visible in the Qt Creator
+OTHER_FILES += $$PWD/deviceplugin"$$TARGET".json
+
+# NOTE: if the code includes "plugininfo.h", it would fail if we only give it a compiler for $$OUT_PWD/plugininfo.h
+# Let's add a dummy target with the plugininfo.h file without any path to allow the developer to just include it like that.
+
+# Create plugininfo file
+plugininfo.target = $$OUT_PWD/plugininfo.h
+plugininfo_dummy.target = plugininfo.h
+plugininfo.depends = FORCE
+plugininfo.commands = nymea-generateplugininfo --filetype i --jsonfile $$PWD/deviceplugin"$$TARGET".json --output plugininfo.h --builddir $$OUT_PWD
+plugininfo_dummy.commands = $$plugininfo.commands
+QMAKE_EXTRA_TARGETS += plugininfo plugininfo_dummy
+
+# Create extern-plugininfo file
+extern_plugininfo.target = $$OUT_PWD/extern-plugininfo.h
+extern_plugininfo_dummy.target = extern-plugininfo.h
+extern_plugininfo.depends = FORCE
+extern_plugininfo.commands = nymea-generateplugininfo --filetype e --jsonfile $$PWD/deviceplugin"$$TARGET".json --output extern-plugininfo.h --builddir $$OUT_PWD
+extern_plugininfo_dummy.commands = $$extern_plugininfo.commands
+QMAKE_EXTRA_TARGETS += extern_plugininfo extern_plugininfo_dummy
+
+# Clean up autogenerated plugin info files
+plugininfo_clean.commands = rm -fv $$OUT_PWD/plugininfo.h $$OUT_PWD/extern-plugininfo.h
+clean.depends = plugininfo_clean
+QMAKE_EXTRA_TARGETS += clean plugininfo_clean
+
+# Install translation files
+TRANSLATIONS *= $$files($${PWD}/translations/*ts, true)
+lupdate.depends = FORCE
+lupdate.depends += plugininfo.h
+lupdate.commands = lupdate -recursive -no-obsolete $$PWD/"$$TARGET".pro;
+QMAKE_EXTRA_TARGETS += lupdate
+
+translations.path = /usr/share/nymea/translations
+translations.files = $$[QT_SOURCE_TREE]/translations/*.qm
+TRANSLATIONS += $$files($$[QT_SOURCE_TREE]/translations/*.ts, true)
+
+# Install plugin
+target.path = $$[QT_INSTALL_LIBS]/nymea/plugins/
+INSTALLS += target translations
diff --git a/coinmarketcap/translations/532757cf-fc6f-4ce5-ae5b-e6f5bdb67fb4-en_US.ts b/coinmarketcap/translations/532757cf-fc6f-4ce5-ae5b-e6f5bdb67fb4-en_US.ts
new file mode 100644
index 00000000..f7f66d85
--- /dev/null
+++ b/coinmarketcap/translations/532757cf-fc6f-4ce5-ae5b-e6f5bdb67fb4-en_US.ts
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/coinmarketcap/translations/de_DE.ts b/coinmarketcap/translations/de_DE.ts
new file mode 100644
index 00000000..c929d0ad
--- /dev/null
+++ b/coinmarketcap/translations/de_DE.ts
@@ -0,0 +1,175 @@
+
+
+
+
+ CoinMarketCap
+
+
+ coin market cap
+ The name of the plugin coin market cap (532757cf-fc6f-4ce5-ae5b-e6f5bdb67fb4)
+
+
+
+
+ Server Url
+ The name of the paramType (45e920d7-804c-4242-8435-ba4d2e6d06f7) of coin market cap
+
+
+
+
+ Coin Market Cap
+ The name of the vendor (28eeecbd-4178-45aa-81a6-fd95851444fd)
+
+
+
+
+ Current Prices
+ The name of the DeviceClass (f5b794f7-7e2a-4409-8445-23ead80f2a8f)
+
+
+
+
+ Fiat Currency
+ The name of the paramType (92747d75-d18a-4915-bd48-0edd5cc5f19a) of Current Prices
+
+
+
+
+ reachable status changed
+ The name of the autocreated EventType (19f079f0-1654-44c3-ab10-e7d7f9742e09)
+
+
+
+
+ Server Reachable
+ The name of the ParamType of StateType (19f079f0-1654-44c3-ab10-e7d7f9742e09) of DeviceClass Current Prices
+
+
+
+
+ bitcoin value changed
+ The name of the autocreated EventType (721c91c8-8eb1-402e-8bfc-8e2d496be032)
+
+
+
+
+ Bitcoin
+ The name of the ParamType of StateType (721c91c8-8eb1-402e-8bfc-8e2d496be032) of DeviceClass Current Prices
+
+
+
+
+ ethereum value changed
+ The name of the autocreated EventType (5c58bb9f-dcdf-47c9-a0b7-f0ffc968f824)
+
+
+
+
+ Ethereum
+ The name of the ParamType of StateType (5c58bb9f-dcdf-47c9-a0b7-f0ffc968f824) of DeviceClass Current Prices
+
+
+
+
+ ripple value changed
+ The name of the autocreated EventType (d8517cf8-2ebd-4be3-8573-00b595cc2ab5)
+
+
+
+
+ Ripple
+ The name of the ParamType of StateType (d8517cf8-2ebd-4be3-8573-00b595cc2ab5) of DeviceClass Current Prices
+
+
+
+
+ bitcoin cash value changed
+ The name of the autocreated EventType (cc5b4fe5-aa43-43b3-952f-90c0e3e20740)
+
+
+
+
+ Bitcoin Cash
+ The name of the ParamType of StateType (cc5b4fe5-aa43-43b3-952f-90c0e3e20740) of DeviceClass Current Prices
+
+
+
+
+ Litecoin value changed
+ The name of the autocreated EventType (f591f699-ae68-4f64-a221-254f836a31d3)
+
+
+
+
+ Litecoin
+ The name of the ParamType of StateType (f591f699-ae68-4f64-a221-254f836a31d3) of DeviceClass Current Prices
+
+
+
+
+ NEM cash value changed
+ The name of the autocreated EventType (adecda44-fade-4dba-8b41-cfb07579dea9)
+
+
+
+
+ NEM
+ The name of the ParamType of StateType (adecda44-fade-4dba-8b41-cfb07579dea9) of DeviceClass Current Prices
+
+
+
+
+ etherium classic value changed
+ The name of the autocreated EventType (fc9a61b7-c3df-4f13-ba31-d7743f3d2dc2)
+
+
+
+
+ Ethereum Classic
+ The name of the ParamType of StateType (fc9a61b7-c3df-4f13-ba31-d7743f3d2dc2) of DeviceClass Current Prices
+
+
+
+
+ Dash value changed
+ The name of the autocreated EventType (0b602f14-1596-4091-a0ab-6c5efa087a3f)
+
+
+
+
+ Dash
+ The name of the ParamType of StateType (0b602f14-1596-4091-a0ab-6c5efa087a3f) of DeviceClass Current Prices
+
+
+
+
+ IOTA value changed
+ The name of the autocreated EventType (2c6e341f-5940-40bb-b495-89c3ecaaf9e7)
+
+
+
+
+ IOTA
+ The name of the ParamType of StateType (2c6e341f-5940-40bb-b495-89c3ecaaf9e7) of DeviceClass Current Prices
+
+
+
+
+ NEO value changed
+ The name of the autocreated EventType (7583c720-1786-4c32-9552-e731578ff113)
+
+
+
+
+ NEO
+ The name of the ParamType of StateType (7583c720-1786-4c32-9552-e731578ff113) of DeviceClass Current Prices
+
+
+
+
+ refresh
+ The name of the ActionType 11eb83d4-aa95-4a9c-a314-da7ee2d0786a of deviceClass Current Prices
+
+
+
+
diff --git a/coinmarketcap/translations/en_US.ts b/coinmarketcap/translations/en_US.ts
new file mode 100644
index 00000000..fcf95c9a
--- /dev/null
+++ b/coinmarketcap/translations/en_US.ts
@@ -0,0 +1,175 @@
+
+
+
+
+ CoinMarketCap
+
+
+ coin market cap
+ The name of the plugin coin market cap (532757cf-fc6f-4ce5-ae5b-e6f5bdb67fb4)
+
+
+
+
+ Server Url
+ The name of the paramType (45e920d7-804c-4242-8435-ba4d2e6d06f7) of coin market cap
+
+
+
+
+ Coin Market Cap
+ The name of the vendor (28eeecbd-4178-45aa-81a6-fd95851444fd)
+
+
+
+
+ Current Prices
+ The name of the DeviceClass (f5b794f7-7e2a-4409-8445-23ead80f2a8f)
+
+
+
+
+ Fiat Currency
+ The name of the paramType (92747d75-d18a-4915-bd48-0edd5cc5f19a) of Current Prices
+
+
+
+
+ reachable status changed
+ The name of the autocreated EventType (19f079f0-1654-44c3-ab10-e7d7f9742e09)
+
+
+
+
+ Server Reachable
+ The name of the ParamType of StateType (19f079f0-1654-44c3-ab10-e7d7f9742e09) of DeviceClass Current Prices
+
+
+
+
+ bitcoin value changed
+ The name of the autocreated EventType (721c91c8-8eb1-402e-8bfc-8e2d496be032)
+
+
+
+
+ Bitcoin
+ The name of the ParamType of StateType (721c91c8-8eb1-402e-8bfc-8e2d496be032) of DeviceClass Current Prices
+
+
+
+
+ ethereum value changed
+ The name of the autocreated EventType (5c58bb9f-dcdf-47c9-a0b7-f0ffc968f824)
+
+
+
+
+ Ethereum
+ The name of the ParamType of StateType (5c58bb9f-dcdf-47c9-a0b7-f0ffc968f824) of DeviceClass Current Prices
+
+
+
+
+ ripple value changed
+ The name of the autocreated EventType (d8517cf8-2ebd-4be3-8573-00b595cc2ab5)
+
+
+
+
+ Ripple
+ The name of the ParamType of StateType (d8517cf8-2ebd-4be3-8573-00b595cc2ab5) of DeviceClass Current Prices
+
+
+
+
+ bitcoin cash value changed
+ The name of the autocreated EventType (cc5b4fe5-aa43-43b3-952f-90c0e3e20740)
+
+
+
+
+ Bitcoin Cash
+ The name of the ParamType of StateType (cc5b4fe5-aa43-43b3-952f-90c0e3e20740) of DeviceClass Current Prices
+
+
+
+
+ Litecoin value changed
+ The name of the autocreated EventType (f591f699-ae68-4f64-a221-254f836a31d3)
+
+
+
+
+ Litecoin
+ The name of the ParamType of StateType (f591f699-ae68-4f64-a221-254f836a31d3) of DeviceClass Current Prices
+
+
+
+
+ NEM cash value changed
+ The name of the autocreated EventType (adecda44-fade-4dba-8b41-cfb07579dea9)
+
+
+
+
+ NEM
+ The name of the ParamType of StateType (adecda44-fade-4dba-8b41-cfb07579dea9) of DeviceClass Current Prices
+
+
+
+
+ etherium classic value changed
+ The name of the autocreated EventType (fc9a61b7-c3df-4f13-ba31-d7743f3d2dc2)
+
+
+
+
+ Ethereum Classic
+ The name of the ParamType of StateType (fc9a61b7-c3df-4f13-ba31-d7743f3d2dc2) of DeviceClass Current Prices
+
+
+
+
+ Dash value changed
+ The name of the autocreated EventType (0b602f14-1596-4091-a0ab-6c5efa087a3f)
+
+
+
+
+ Dash
+ The name of the ParamType of StateType (0b602f14-1596-4091-a0ab-6c5efa087a3f) of DeviceClass Current Prices
+
+
+
+
+ IOTA value changed
+ The name of the autocreated EventType (2c6e341f-5940-40bb-b495-89c3ecaaf9e7)
+
+
+
+
+ IOTA
+ The name of the ParamType of StateType (2c6e341f-5940-40bb-b495-89c3ecaaf9e7) of DeviceClass Current Prices
+
+
+
+
+ NEO value changed
+ The name of the autocreated EventType (7583c720-1786-4c32-9552-e731578ff113)
+
+
+
+
+ NEO
+ The name of the ParamType of StateType (7583c720-1786-4c32-9552-e731578ff113) of DeviceClass Current Prices
+
+
+
+
+ refresh
+ The name of the ActionType 11eb83d4-aa95-4a9c-a314-da7ee2d0786a of deviceClass Current Prices
+
+
+
+
diff --git a/nymea-plugins.pro b/nymea-plugins.pro
index 9addd3f2..c5d3f1ae 100644
--- a/nymea-plugins.pro
+++ b/nymea-plugins.pro
@@ -6,6 +6,7 @@ PLUGIN_DIRS = \
awattar \
boblight \
bose \
+ coinmarketcap \
commandlauncher \
conrad \
datetime \