From 51e87ffa88138a54bc2cfde8575153facede324b Mon Sep 17 00:00:00 2001 From: Micke Prag Date: Wed, 26 Oct 2011 16:02:33 +0200 Subject: [PATCH] Add initial version of Sensors plugin, see #96 --- telldus-gui/Plugins/CMakeLists.txt | 5 + telldus-gui/Plugins/Sensors/CMakeLists.txt | 28 +++++ telldus-gui/Plugins/Sensors/__init__.js | 79 ++++++++++++++ telldus-gui/Plugins/Sensors/icon.png | Bin 0 -> 3885 bytes telldus-gui/Plugins/Sensors/main.qml | 20 ++++ telldus-gui/Plugins/Sensors/qmldir | 0 telldus-gui/Plugins/Sensors/sensor.cpp | 97 ++++++++++++++++++ telldus-gui/Plugins/Sensors/sensor.h | 66 ++++++++++++ telldus-gui/Plugins/Sensors/sensorsplugin.cpp | 31 ++++++ telldus-gui/Plugins/Sensors/sensorsplugin.h | 16 +++ 10 files changed, 342 insertions(+) create mode 100644 telldus-gui/Plugins/Sensors/CMakeLists.txt create mode 100644 telldus-gui/Plugins/Sensors/__init__.js create mode 100644 telldus-gui/Plugins/Sensors/icon.png create mode 100644 telldus-gui/Plugins/Sensors/main.qml create mode 100644 telldus-gui/Plugins/Sensors/qmldir create mode 100644 telldus-gui/Plugins/Sensors/sensor.cpp create mode 100644 telldus-gui/Plugins/Sensors/sensor.h create mode 100644 telldus-gui/Plugins/Sensors/sensorsplugin.cpp create mode 100644 telldus-gui/Plugins/Sensors/sensorsplugin.h diff --git a/telldus-gui/Plugins/CMakeLists.txt b/telldus-gui/Plugins/CMakeLists.txt index 2eb95b96..f6a1b8ab 100644 --- a/telldus-gui/Plugins/CMakeLists.txt +++ b/telldus-gui/Plugins/CMakeLists.txt @@ -12,6 +12,7 @@ SET(BUILD_PLUGIN_DBUS FALSE CACHE BOOL "Build plugin 'DBus'") SET(BUILD_PLUGIN_LIVE FALSE CACHE BOOL "Build plugin 'Telldus Live!'") SET(BUILD_PLUGIN_XPL FALSE CACHE BOOL "Build plugin 'xPL'") SET(BUILD_PLUGIN_SCHEDULERGUISIMPLE FALSE CACHE BOOL "Build plugin 'Simple Scheduler GUI'") +SET(BUILD_PLUGIN_SENSORS FALSE CACHE BOOL "Build plugin 'Sensors'") ADD_SUBDIRECTORY(telldus) @@ -35,6 +36,10 @@ IF(BUILD_PLUGIN_LIVE) ADD_SUBDIRECTORY(Live) ENDIF(BUILD_PLUGIN_LIVE) +IF(BUILD_PLUGIN_SENSORS) + ADD_SUBDIRECTORY(Sensors) +ENDIF() + IF(BUILD_PLUGIN_XPL) ADD_SUBDIRECTORY(xPL) ENDIF(BUILD_PLUGIN_XPL) diff --git a/telldus-gui/Plugins/Sensors/CMakeLists.txt b/telldus-gui/Plugins/Sensors/CMakeLists.txt new file mode 100644 index 00000000..065b7d97 --- /dev/null +++ b/telldus-gui/Plugins/Sensors/CMakeLists.txt @@ -0,0 +1,28 @@ +SET(REQUIRE_PLUGIN_QML TRUE PARENT_SCOPE) +SET(REQUIRE_PLUGIN_SETTINGS TRUE PARENT_SCOPE) + +SET( Plugin_NAME "sensors" ) + + +SET( Plugin_SRCS + sensor.cpp + sensorsplugin.cpp +) + +SET( Plugin_HDRS + sensorsplugin.h +) + +SET( Plugin_MOC_HDRS + sensor.h +) + +SET( Plugin_PATH "com.telldus.sensors" ) + +SET( Plugin_EXTRA + icon.png + main.qml + qmldir +) + +INCLUDE( ../TelldusCenterPlugin.cmake NO_POLICY_SCOPE ) diff --git a/telldus-gui/Plugins/Sensors/__init__.js b/telldus-gui/Plugins/Sensors/__init__.js new file mode 100644 index 00000000..b6b11054 --- /dev/null +++ b/telldus-gui/Plugins/Sensors/__init__.js @@ -0,0 +1,79 @@ +/** Sensors **/ +__setupPackage__( __extension__ ); + +__postInit__ = function() { + application.allDoneLoading.connect( com.telldus.sensors.init ); +} + +com.telldus.sensors = function() { + var sensorList = new com.telldus.qml.array(); + + function init() { + var sensorData = 0; + while(sensorData = com.telldus.core.sensor()) { + var p = sensorData["protocol"]; + var m = sensorData["model"]; + var id = sensorData["sensorId"]; + var types = sensorData["dataTypes"]; + + var tryFetchValue = function(p, m, id, types, type) { + if (types & type) { + sensorValue = com.telldus.core.sensorValue(p, m, id, type); + sensorEvent(p, m, id, type, sensorValue["value"], sensorValue["timestamp"]); + } + } + tryFetchValue(p, m, id, types, com.telldus.core.TELLSTICK_TEMPERATURE); + tryFetchValue(p, m, id, types, com.telldus.core.TELLSTICK_HUMIDITY); + + } + + //com.telldus.core.sensorEvent.connect(sensorEvent); + view = new com.telldus.qml.view({ + }); + + view.setProperty('sensorModel', sensorList); + view.load("main.qml"); + application.addWidget("sensors.gui", "icon.png", view); + } + + function sensorEvent(protocol, model, id, dataType, value, timestamp) { + var sensor = 0; + for (var i = 0; i < sensorList.length; ++i) { + if (sensorList.get(i).protocol != protocol) { + continue; + } + if (sensorList.get(i).model != model) { + continue; + } + if (sensorList.get(i).id != id) { + continue; + } + sensor = sensorList.get(i); + break; + } + + if (!sensor) { + sensor = new com.telldus.sensors.sensor(); + sensor.protocol = protocol; + sensor.model = model; + sensor.id = id; + sensorList.push(sensor); + print("Create new"); + } else { + print("Update"); + } + + if (dataType == com.telldus.core.TELLSTICK_TEMPERATURE) { + sensor.temperature = value; + } else if (dataType == com.telldus.core.TELLSTICK_HUMIDITY) { + sensor.humidity = value; + } + + print("Sensor event", protocol, model, id, dataType, value, timestamp); + } + + return { //Public functions + init:init + } + +}(); diff --git a/telldus-gui/Plugins/Sensors/icon.png b/telldus-gui/Plugins/Sensors/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e71391cf9ca6f7ff541022a80aa33646af3ad6dd GIT binary patch literal 3885 zcmV+|57O|7P)EX>4Tx0C?J+Q+HUC_ZB|i_hk=OLfG)Jmu!ImA|tE_$Pihg5Rw34gb)%y#f69p zRumNxoJdu~g4GI0orvO~D7a@qiilc^Ra`jkAKa(4eR}Wh?fcjJyyu+f{LXpL4}cL8 zCXwc%Y5+M>g*-agACFH+#L2yY0u@N$1RxOR%fe>`#Q*^C19^CUbg)1C0k3ZW0swH; zE+i7i;s1lWP$pLZAdvvzA`<5d0gzGv$SzdK6adH=0I*ZDWC{S3003-xd_p1ssto|_ z^hrJi0NAOM+!p}Yq8zCR0F40vnJ7mj0zkU}U{!%qECRs70HCZuA}$2Lt^t5qwlYTo zfV~9(c8*w(4?ti5fSE!p%m5%b0suoE6U_r4Oaq`W(!b!TUvP!ENC5!A%azTSOVTqG zxRuZvck=My;vwR~Y_URN7by^C3FIQ2mzyIKNaq7g&I|wm8u`(|{y0C7=jP<$=4R(? z@ASo@{%i1WB0eGU-~POe0t5gMPS5Y!U*+Z218~Oyuywy{sapWrRsd+<`CT*H37}dE z(0cicc{uz)9-g64$UGe!3JVMEC1RnyFyo6p|1;rl;ER6t{6HT5+j{T-ahgDxt-zy$ z{c&M#cCJ#6=gR~_F>d$gBmT#QfBlXr(c(0*Tr3re@mPttP$EsodAU-NL?OwQ;u7h9 zGVvdl{RxwI4FIf$Pry#L2er#=z<%xl0*ek<(slqqe)BDi8VivC5N9+pdG`PSlfU_o zKq~;2Moa!tiTSO!5zH77Xo1hL_iEAz&sE_ z2IPPo3ZWR5K^auQI@koYumc*P5t`u;w81er4d>tzT!HIw7Y1M$p28Tsh6w~g$Osc* zAv%Z=Vvg7%&IlKojszlMNHmgwq#)^t6j36@$a16tsX}UzT}UJHEpik&ja)$bklV;0 zGK&0)yhkyVfwEBp)B<%txu_o+ipHRG(R4HqU4WLNYtb6C9zB4zqNmYI=yh}eeTt4_ zfYC7yW{lZkT#ScBV2M~7CdU?I?5=ix(HVZgM=}{CnA%mPqZa^68Xe5gFH?u96Et<2 zCC!@_L(8Nsqt(!wX=iEoXfNq>x(VHb9z~bXm(pwK2kGbOgYq4YG!XMxcgB zqf}$J#u<$v7REAV@mNCEa#jQDENhreVq3EL>`ZnA`x|yIdrVV9bE;;nW|3x{=5fsd z4#u(I@HyF>O3oq94bFQl11&!-vDRv>X03j$H`;pIzS?5#a_tuF>)P*iaGgM%ES>c_ zZ94aL3A#4AQM!e?+jYlFJ5+DSzi0S9#6BJCZ5(XZOGfi zTj0IRdtf>~J!SgN=>tB-J_4V5pNGDtz9Qc}z9W9tewls;{GR(e`pf-~_`l(K@)q$< z1z-We0p$U`ff|9c18V~x1epY-2Q>wa1-k|>3_cY?3<(WcA99m#z!&lx`C~KOXDpi0 z70L*m6G6C?@k ziR8rC#65}Qa{}jVnlqf_npBo_W3J`gqPZ95>CVfZcRX1&S&)1jiOPpx423?lIEROmG(H@JAFg?XogQlb;dIZPf{y+kr|S? zBlAsGMAqJ{&)IR=Ejg5&l$@hd4QZCNE7vf$D7Q~$D=U)?Nn}(WA6du22pZOfRS_cv~1-c(_QtNLti0-)8>m`6CO07JR*suu!$(^sg%jf zZm#rNxnmV!m1I@#YM0epR(~oNm0zrItf;Q|utvD%;#W>z)qM4NZQ9!2O1H}G>qzUQ z>u#*~S--DJy=p<#(1!30tsC);y-IHSJr>wyfLop*ExT zdYyk=%U1oZtGB+{Cfe4&-FJKQ4uc&PJKpb5^_C@dOYIJXG+^@gCvI%WcHjN%gI&kHifN$EH?V5MBa9S!3!a?Q1 zC*P)gd*e{(q0YnH!_D8Bf4B7r>qvPk(mKC&tSzH$pgp0z@92!9ogH2sN4~fJe(y2k zV|B+hk5`_cohUu=`Q(C=R&z?UQbnZ;IU-!xL z-sg{9@Vs#JBKKn3CAUkhJ+3`ResKNaNUvLO>t*-L?N>ambo5Q@JJIjcfBI^`)pOVQ z*DhV3dA;w(>>IakCfyvkCA#(acJ}QTcM9%I++BK)c(44v+WqPW`VZ=VwEnSWz-{38 zV8CF{!&wjS4he^z{*?dIhvCvk%tzHDMk9@nogW_?4H~`jWX_Y}r?RIL&&qyQ|9R_k ztLNYS;`>X_Sp3-V3;B!Bzpi@JsGmcu#U+m9||O%j&_y?@X1e$R8B_eNlm;g=`54<0i6`TBpk}BEOs8!|B%M@sKam2;((-Z-h?C}hErH9!Uk#B0wDcHI zD)aG7@k08NS--cU?is6Vl7IJHDQ(xAasTCp&u5b-S_!^t@9!No3~B_9gK__$iEg7M z_|sj9?*GbT#30Z5y6#kjk3`copodi&4NUSv>TJkG5s+C@9sAA z+S1#d^|Q@iuz-{`nq%CE87Ku90vYH`BL_MU?V(E|;I(fWcB*7-a#d>=Xw)jwJZw9B z`q?d=b9rOl0#b^uDAunGDYscH5UUD8J1gsyGUS7~zB6wD2~p}}ae;nboxS}S7QLEW z?dm^zYG?f9lFa;xdTm&}PLD^*zQxMxEtp-|RQ+!_n^R9lT^_mU4m^PTwF&zOc=I0c zc=@;!BSX^ui80%3aZ;(`J3@r_#@ud|XaYX2`8oUPhgXE_1_m)TAs+OOvGB>$}Kol*(i@vhrD^^W-A6MmE_B=LF@R~aKXJ8tHYTB4EY2A z00|+4QVD{jP80_imObOkxm3euGm$ETV2q>NPCl3R*UX!o_8cT|2>=Kogdk!yA|}aw zWv&G`-b-aQiS>O3{HVB$UTf*V<5 zADV6u-_RB0_K@ko7rT>&25lC}fYowdpu#JN2$WKwNY4f<6j=d&e!OVsxadX)vIZR} z0|H<`>fdy5)7tpEW`m3(Q$YZdfe>UEhDZo=SRELcC;BFo5CXo+K=4zCbM<|Ow{^n? zRuG_uQkqN=0TBrx9-1rptOOLc_HCZDn!qacsXpD*wyQK_V?U3ynMb1V1_)s#lH`cxs;c=;*NhH~ zw6|vPg7BDICeO^ zTxDFeb9?k`N!<0ec6|Pw{QccV!tC5wLVa|??T_PmvMd6aW) vxYcuqw&;3`;s1!+J>BP;d+)rum>jhasTemperature = false; + d->hasHumidity = false; + d->id = 0; +} + +Sensor::~Sensor() { + delete d; +} + +QString Sensor::humidity() const { + return d->humidity; +} + +void Sensor::setHumidity(const QString &humidity) { + d->humidity = humidity; + d->hasHumidity = true; + emit humidityChanged(); + emit hasHumidityChanged(); +} + +bool Sensor::hasHumidity() const { + return d->hasHumidity; +} + +int Sensor::id() const { + return d->id; +} + +void Sensor::setId(int id) { + d->id = id; + emit idChanged(); +} + +QDateTime Sensor::lastUpdated() const { + return d->lastUpdated; +} + +void Sensor::setLastUpdated(const QDateTime &lastUpdated) { + d->lastUpdated = lastUpdated; + emit lastUpdatedChanged(); +} + +QString Sensor::model() const { + return d->model; +} + +void Sensor::setModel(const QString &model) { + d->model = model; + emit modelChanged(); +} + +QString Sensor::name() const { + return d->name; +} + +void Sensor::setName(const QString &name) { + d->name = name; + emit nameChanged(); +} + +QString Sensor::protocol() const { + return d->protocol; +} + +void Sensor::setProtocol(const QString &protocol) { + d->protocol = protocol; + emit protocolChanged(); +} + +QString Sensor::temperature() const { + return d->temperature; +} + +void Sensor::setTemperature(const QString &temperature) { + d->temperature = temperature; + d->hasTemperature = true; + emit temperatureChanged(); + emit hasTemperatureChanged(); +} + +bool Sensor::hasTemperature() const { + return d->hasTemperature; +} diff --git a/telldus-gui/Plugins/Sensors/sensor.h b/telldus-gui/Plugins/Sensors/sensor.h new file mode 100644 index 00000000..41c2260f --- /dev/null +++ b/telldus-gui/Plugins/Sensors/sensor.h @@ -0,0 +1,66 @@ +#ifndef SENSOR_H +#define SENSOR_H + +#include +#include +#include +#include + +class Sensor : public QObject +{ + Q_OBJECT + Q_PROPERTY(bool hasHumidity READ hasHumidity NOTIFY hasHumidityChanged) + Q_PROPERTY(bool hasTemperature READ hasTemperature NOTIFY hasTemperatureChanged) + Q_PROPERTY(QString humidity READ humidity WRITE setHumidity NOTIFY humidityChanged) + Q_PROPERTY(int id READ id WRITE setId NOTIFY idChanged) + Q_PROPERTY(QDateTime lastUpdated READ lastUpdated WRITE setLastUpdated NOTIFY lastUpdatedChanged) + Q_PROPERTY(QString model READ model WRITE setModel NOTIFY modelChanged) + Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged) + Q_PROPERTY(QString protocol READ protocol WRITE setProtocol NOTIFY protocolChanged) + Q_PROPERTY(QString temperature READ temperature WRITE setTemperature NOTIFY temperatureChanged) +public: + explicit Sensor(QObject *parent = 0); + ~Sensor(); + + QString humidity() const; + void setHumidity(const QString &humidity); + bool hasHumidity() const; + + int id() const; + void setId(int id); + + QDateTime lastUpdated() const; + void setLastUpdated(const QDateTime &lastUpdated); + + QString model() const; + void setModel(const QString &model); + + QString name() const; + void setName(const QString &name); + + QString protocol() const; + void setProtocol(const QString &protocol); + + QString temperature() const; + void setTemperature(const QString &temperature); + bool hasTemperature() const; + +signals: + void idChanged(); + void hasHumidityChanged(); + void hasTemperatureChanged(); + void humidityChanged(); + void lastUpdatedChanged(); + void modelChanged(); + void nameChanged(); + void protocolChanged(); + void temperatureChanged(); + +private: + class PrivateData; + PrivateData *d; +}; + +Q_DECLARE_METATYPE(Sensor*) + +#endif // SENSOR_H diff --git a/telldus-gui/Plugins/Sensors/sensorsplugin.cpp b/telldus-gui/Plugins/Sensors/sensorsplugin.cpp new file mode 100644 index 00000000..51d869c3 --- /dev/null +++ b/telldus-gui/Plugins/Sensors/sensorsplugin.cpp @@ -0,0 +1,31 @@ +#include "sensorsplugin.h" +#include "sensor.h" +#include + +QScriptValue SensorCTor(QScriptContext *context, QScriptEngine *engine) { + if (!context->isCalledAsConstructor()) { + return engine->undefinedValue(); + } + return engine->newQObject(new Sensor(), QScriptEngine::ScriptOwnership); +} + +SensorsPlugin::SensorsPlugin ( QObject * parent ) + :QScriptExtensionPlugin( parent ) +{ +} + +SensorsPlugin::~SensorsPlugin() { +} + +void SensorsPlugin::initialize ( const QString & key, QScriptEngine * engine ) { + if (key == "com.telldus.sensors") { + QScriptValue qml = engine->globalObject().property("com").property("telldus").property("sensors"); + qml.setProperty("sensor", engine->newFunction(SensorCTor)); + } +} + +QStringList SensorsPlugin::keys () const { + return QStringList() << "com.telldus.sensors"; +} + +Q_EXPORT_PLUGIN2(SensorsInterface, SensorsPlugin) diff --git a/telldus-gui/Plugins/Sensors/sensorsplugin.h b/telldus-gui/Plugins/Sensors/sensorsplugin.h new file mode 100644 index 00000000..a473e466 --- /dev/null +++ b/telldus-gui/Plugins/Sensors/sensorsplugin.h @@ -0,0 +1,16 @@ +#ifndef SENSORSPLUGIN_H +#define SENSORSPLUGIN_H + +#include + +class SensorsPlugin : public QScriptExtensionPlugin { +public: + SensorsPlugin ( QObject * parent = 0 ); + ~SensorsPlugin (); + + virtual void initialize ( const QString & key, QScriptEngine * engine ); + virtual QStringList keys () const; +}; + + +#endif // SENSORSPLUGIN_H