diff --git a/nymea-plugins.pro b/nymea-plugins.pro
index f0d5856d..82a638c5 100644
--- a/nymea-plugins.pro
+++ b/nymea-plugins.pro
@@ -33,6 +33,7 @@ PLUGIN_DIRS = \
osdomotics \
philipshue \
pushbullet \
+ systemmonitor \
remotessh \
senic \
serialportcommander \
diff --git a/systemmonitor/devicepluginsystemmonitor.cpp b/systemmonitor/devicepluginsystemmonitor.cpp
new file mode 100644
index 00000000..6acd62c0
--- /dev/null
+++ b/systemmonitor/devicepluginsystemmonitor.cpp
@@ -0,0 +1,90 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * *
+ * Copyright (C) 2018 Michael Zanetti . *
+ * *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "devicepluginsystemmonitor.h"
+#include "plugininfo.h"
+
+
+DevicePluginSystemMonitor::DevicePluginSystemMonitor()
+{
+
+}
+
+DevicePluginSystemMonitor::~DevicePluginSystemMonitor()
+{
+ if (m_refreshTimer) {
+ hardwareManager()->pluginTimerManager()->unregisterTimer(m_refreshTimer);
+ }
+}
+
+DeviceManager::DeviceSetupStatus DevicePluginSystemMonitor::setupDevice(Device *device)
+{
+ Q_UNUSED(device)
+
+ if (!m_refreshTimer) {
+ m_refreshTimer = hardwareManager()->pluginTimerManager()->registerTimer(2);
+ connect(m_refreshTimer, &PluginTimer::timeout, this, &DevicePluginSystemMonitor::onRefreshTimer);
+ }
+
+
+ return DeviceManager::DeviceSetupStatusSuccess;
+}
+
+void DevicePluginSystemMonitor::deviceRemoved(Device *device)
+{
+ Q_UNUSED(device)
+
+ if (myDevices().isEmpty()) {
+ hardwareManager()->pluginTimerManager()->unregisterTimer(m_refreshTimer);
+ m_refreshTimer = nullptr;
+
+ }
+}
+
+void DevicePluginSystemMonitor::onRefreshTimer()
+{
+ QProcess *p = new QProcess(this);
+ connect(p, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(onProcessFinished(int,QProcess::ExitStatus)));
+ p->start("ps", {"-C", "nymead", "-o", "rss="});
+}
+
+void DevicePluginSystemMonitor::onProcessFinished(int exitCode, QProcess::ExitStatus exitStatus)
+{
+ QProcess *p = static_cast(sender());
+ p->deleteLater();
+
+ if (exitCode != 0 || exitStatus != QProcess::NormalExit) {
+ qWarning(dcSystemMonitor) << "Error reading process memory usage:" << p->readAllStandardError();
+ return;
+ }
+ QByteArray data = p->readAllStandardOutput().trimmed();
+ bool ok;
+ qreal rssMem = data.toDouble(&ok);
+ if (!ok) {
+ qWarning(dcSystemMonitor) << "Failed to parse RSS memory value to a number:" << data;
+ return;
+ }
+ foreach (Device *dev, myDevices()) {
+ dev->setStateValue(systemMonitorRssMemoryStateTypeId, rssMem);
+ }
+}
+
diff --git a/systemmonitor/devicepluginsystemmonitor.h b/systemmonitor/devicepluginsystemmonitor.h
new file mode 100644
index 00000000..7d69e0a9
--- /dev/null
+++ b/systemmonitor/devicepluginsystemmonitor.h
@@ -0,0 +1,56 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * *
+ * Copyright (C) 2018 Michael Zanetti . *
+ * *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef DEVICEPLUGINSYSTEMMONITOR_H
+#define DEVICEPLUGINSYSTEMMONITOR_H
+
+#include "devicemanager.h"
+#include "plugin/deviceplugin.h"
+#include "plugintimer.h"
+
+#include
+#include
+#include
+
+
+class DevicePluginSystemMonitor: public DevicePlugin {
+ Q_OBJECT
+ Q_PLUGIN_METADATA(IID "io.nymea.DevicePlugin" FILE "devicepluginsystemmonitor.json")
+ Q_INTERFACES(DevicePlugin)
+
+public:
+ explicit DevicePluginSystemMonitor();
+ ~DevicePluginSystemMonitor();
+
+ DeviceManager::DeviceSetupStatus setupDevice(Device *device) override;
+ void deviceRemoved(Device *device) override;
+
+private slots:
+ void onRefreshTimer();
+ void onProcessFinished(int exitCode, QProcess::ExitStatus exitStatus);
+
+private:
+ PluginTimer *m_refreshTimer = nullptr;
+
+};
+
+#endif // DEVICEPLUGINSYSTEMMONITOR_H
diff --git a/systemmonitor/devicepluginsystemmonitor.json b/systemmonitor/devicepluginsystemmonitor.json
new file mode 100644
index 00000000..6c4e13b1
--- /dev/null
+++ b/systemmonitor/devicepluginsystemmonitor.json
@@ -0,0 +1,31 @@
+{
+ "name": "systemMonitor",
+ "displayName": "System Monitor",
+ "id": "908b4f18-dc0c-4940-a6f7-c0c01a2861b8",
+ "vendors": [
+ {
+ "displayName": "guh GmbH",
+ "name": "guh",
+ "id": "2062d64d-3232-433c-88bc-0d33c0ba2ba6",
+ "deviceClasses": [
+ {
+ "id": "a3a15700-c251-4803-a608-0f3ddfcbd7a8",
+ "name": "systemMonitor",
+ "displayName": "System monitor",
+ "createMethods": [ "manual" ],
+ "paramTypes": [ ],
+ "stateTypes": [
+ {
+ "id": "d9671ee3-51be-4cf8-8601-125c0684aec9",
+ "name": "rssMemory",
+ "displayName": "RSS memory usage",
+ "displayNameEvent": "RSS memory usage changed",
+ "type": "double",
+ "defaultValue": 0
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/systemmonitor/systemmonitor.pro b/systemmonitor/systemmonitor.pro
new file mode 100644
index 00000000..3d40dee4
--- /dev/null
+++ b/systemmonitor/systemmonitor.pro
@@ -0,0 +1,9 @@
+include(../plugins.pri)
+
+TARGET = $$qtLibraryTarget(nymea_devicepluginsystemmonitor)
+
+SOURCES += \
+ devicepluginsystemmonitor.cpp \
+
+HEADERS += \
+ devicepluginsystemmonitor.h \
diff --git a/systemmonitor/translations/908b4f18-dc0c-4940-a6f7-c0c01a2861b8-en_US.ts b/systemmonitor/translations/908b4f18-dc0c-4940-a6f7-c0c01a2861b8-en_US.ts
new file mode 100644
index 00000000..f7f66d85
--- /dev/null
+++ b/systemmonitor/translations/908b4f18-dc0c-4940-a6f7-c0c01a2861b8-en_US.ts
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/systemmonitor/translations/b82bce59-59bf-48b3-b781-54a6f45800f3-en_US.ts b/systemmonitor/translations/b82bce59-59bf-48b3-b781-54a6f45800f3-en_US.ts
new file mode 100644
index 00000000..f7f66d85
--- /dev/null
+++ b/systemmonitor/translations/b82bce59-59bf-48b3-b781-54a6f45800f3-en_US.ts
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file