Skip to content

Commit 1728c61

Browse files
committed
Merge remote-tracking branch 'origin/master' into secure_message_decoding
2 parents d1f6e26 + 2b321ce commit 1728c61

16 files changed

+206
-74
lines changed

History.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
Version 2.3xxx
2+
- Implemented: Blockly, now possible to use expressions in notifications/email/SMS like "My temperature is {{temperaturedevice[1234]}} degrees" (see http://www.domoticz.com/wiki/Events)
3+
- Implemented: Blockly, now possible to send a notification with a user variable/device as subject/body
24
- Implemented: Day display in energy/gas/water/temp report
5+
- Implemented: Dummy Hardware, Option to supply name, sensor is now also directly added to the system
36
- Implemented: Dummy Hardware, Wind+Temp+Chill
47
- Implemented: Log View, added options to display All/Status/Error
58
- Implemented: Macedonian translation (Big thanks to jocogvg!!!)
@@ -40,6 +43,7 @@ Version 2.3xxx
4043
- Fixed: Manual add LightwaveRF type (DeviceID was wrong)
4144
- Fixed: Month temperature report avarage is now calculated by the daily avarage value
4245
- Fixed: Nest Thermostat, setting set point in Fahrenheit
46+
- Fixed: RFXCom (433) protocol setup, Home Comfort checkbox did not show correct state
4347
- Fixed: RGB sensor now also uses the RGB popup system
4448
- Fixed: S0 Meter, fix for reloading totals of (#179)
4549
- Fixed: Thermosmart unpauze

hardware/Dummy.cpp

Lines changed: 42 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,9 @@ namespace http {
5454
}
5555

5656
std::string idx = request::findValue(&req, "idx");
57+
std::string ssensorname = request::findValue(&req, "sensorname");
5758
std::string ssensortype = request::findValue(&req, "sensortype");
58-
if ((idx == "") || (ssensortype == ""))
59+
if ((idx == "") || (ssensortype.empty()) || (ssensorname.empty()))
5960
return;
6061

6162
bool bCreated = false;
@@ -81,15 +82,15 @@ namespace http {
8182

8283
bool bPrevAcceptNewHardware = m_sql.m_bAcceptNewHardware;
8384
m_sql.m_bAcceptNewHardware = true;
84-
85+
unsigned long long DeviceRowIdx = -1;
8586
switch (iSensorType)
8687
{
8788
case 1:
8889
//Pressure (Bar)
8990
{
9091
std::string rID = std::string(ID);
9192
padLeft(rID, 8, '0');
92-
m_sql.UpdateValue(HwdID, rID.c_str(), 1, pTypeGeneral, sTypePressure, 12, 255, 0, "0.0", devname);
93+
DeviceRowIdx=DeviceRowIdx=m_sql.UpdateValue(HwdID, rID.c_str(), 1, pTypeGeneral, sTypePressure, 12, 255, 0, "0.0", devname);
9394
bCreated = true;
9495
}
9596
break;
@@ -98,21 +99,21 @@ namespace http {
9899
{
99100
std::string rID = std::string(ID);
100101
padLeft(rID, 8, '0');
101-
m_sql.UpdateValue(HwdID, rID.c_str(), 1, pTypeGeneral, sTypePercentage, 12, 255, 0, "0.0", devname);
102+
DeviceRowIdx=m_sql.UpdateValue(HwdID, rID.c_str(), 1, pTypeGeneral, sTypePercentage, 12, 255, 0, "0.0", devname);
102103
bCreated = true;
103104
}
104105
break;
105106
case 3:
106107
//Gas
107-
m_sql.UpdateValue(HwdID, ID, 1, pTypeP1Gas, sTypeP1Gas, 12, 255, 0, "0", devname);
108+
DeviceRowIdx=m_sql.UpdateValue(HwdID, ID, 1, pTypeP1Gas, sTypeP1Gas, 12, 255, 0, "0", devname);
108109
bCreated = true;
109110
break;
110111
case 4:
111112
//Voltage
112113
{
113114
std::string rID = std::string(ID);
114115
padLeft(rID, 8, '0');
115-
m_sql.UpdateValue(HwdID, rID.c_str(), 1, pTypeGeneral, sTypeVoltage, 12, 255, 0, "0.000", devname);
116+
DeviceRowIdx=m_sql.UpdateValue(HwdID, rID.c_str(), 1, pTypeGeneral, sTypeVoltage, 12, 255, 0, "0.000", devname);
116117
bCreated = true;
117118
}
118119
break;
@@ -121,7 +122,7 @@ namespace http {
121122
{
122123
std::string rID = std::string(ID);
123124
padLeft(rID, 8, '0');
124-
m_sql.UpdateValue(HwdID, rID.c_str(), 1, pTypeGeneral, sTypeTextStatus, 12, 255, 0, "Hello World", devname);
125+
DeviceRowIdx=m_sql.UpdateValue(HwdID, rID.c_str(), 1, pTypeGeneral, sTypeTextStatus, 12, 255, 0, "Hello World", devname);
125126
bCreated = true;
126127
}
127128
break;
@@ -133,13 +134,13 @@ namespace http {
133134
unsigned char ID3 = (unsigned char)((nid & 0x0000FF00) >> 8);
134135
unsigned char ID4 = (unsigned char)((nid & 0x000000FF));
135136
sprintf(ID, "%X%02X%02X%02X", ID1, ID2, ID3, ID4);
136-
m_sql.UpdateValue(HwdID, ID, 1, pTypeLighting2, sTypeAC, 12, 255, 0, "15", devname);
137+
DeviceRowIdx=m_sql.UpdateValue(HwdID, ID, 1, pTypeLighting2, sTypeAC, 12, 255, 0, "15", devname);
137138
bCreated = true;
138139
}
139140
break;
140141
case 7:
141142
//Alert
142-
m_sql.UpdateValue(HwdID, ID, 1, pTypeGeneral, sTypeAlert, 12, 255, 0, "No Alert!", devname);
143+
DeviceRowIdx=m_sql.UpdateValue(HwdID, ID, 1, pTypeGeneral, sTypeAlert, 12, 255, 0, "No Alert!", devname);
143144
bCreated = true;
144145
break;
145146
case 8:
@@ -151,20 +152,20 @@ namespace http {
151152
unsigned char ID4 = (unsigned char)((nid & 0x000000FF));
152153
sprintf(ID, "%X%02X%02X%02X", ID1, ID2, ID3, ID4);
153154
}
154-
m_sql.UpdateValue(HwdID, ID, 1, pTypeThermostat, sTypeThermSetpoint, 12, 255, 0, "20.5", devname);
155+
DeviceRowIdx=m_sql.UpdateValue(HwdID, ID, 1, pTypeThermostat, sTypeThermSetpoint, 12, 255, 0, "20.5", devname);
155156
bCreated = true;
156157
break;
157158
case 9:
158159
//Current/Ampere
159-
m_sql.UpdateValue(HwdID, ID, 1, pTypeCURRENT, sTypeELEC1, 12, 255, 0, "0.0;0.0;0.0", devname);
160+
DeviceRowIdx=m_sql.UpdateValue(HwdID, ID, 1, pTypeCURRENT, sTypeELEC1, 12, 255, 0, "0.0;0.0;0.0", devname);
160161
bCreated = true;
161162
break;
162163
case 10:
163164
//Sound Level
164165
{
165166
std::string rID = std::string(ID);
166167
padLeft(rID, 8, '0');
167-
m_sql.UpdateValue(HwdID, rID.c_str(), 1, pTypeGeneral, sTypeSoundLevel, 12, 255, 0, "65", devname);
168+
DeviceRowIdx=m_sql.UpdateValue(HwdID, rID.c_str(), 1, pTypeGeneral, sTypeSoundLevel, 12, 255, 0, "65", devname);
168169
bCreated = true;
169170
}
170171
break;
@@ -173,34 +174,34 @@ namespace http {
173174
{
174175
std::string rID = std::string(ID);
175176
padLeft(rID, 8, '0');
176-
m_sql.UpdateValue(HwdID, rID.c_str(), 1, pTypeGeneral, sTypeBaro, 12, 255, 0, "1021.34;0", devname);
177+
DeviceRowIdx=m_sql.UpdateValue(HwdID, rID.c_str(), 1, pTypeGeneral, sTypeBaro, 12, 255, 0, "1021.34;0", devname);
177178
bCreated = true;
178179
}
179180
break;
180181
case 12:
181182
//Visibility (km)
182-
m_sql.UpdateValue(HwdID, ID, 1, pTypeGeneral, sTypeVisibility, 12, 255, 0, "10.3", devname);
183+
DeviceRowIdx=m_sql.UpdateValue(HwdID, ID, 1, pTypeGeneral, sTypeVisibility, 12, 255, 0, "10.3", devname);
183184
bCreated = true;
184185
break;
185186
case 13:
186187
//Distance (cm)
187188
{
188189
std::string rID = std::string(ID);
189190
padLeft(rID, 8, '0');
190-
m_sql.UpdateValue(HwdID, rID.c_str(), 1, pTypeGeneral, sTypeDistance, 12, 255, 0, "123.4", devname);
191+
DeviceRowIdx=m_sql.UpdateValue(HwdID, rID.c_str(), 1, pTypeGeneral, sTypeDistance, 12, 255, 0, "123.4", devname);
191192
bCreated = true;
192193
}
193194
break;
194195
case 14: //Counter Incremental
195-
m_sql.UpdateValue(HwdID, ID, 1, pTypeGeneral, sTypeCounterIncremental, 12, 255, 0, "0", devname);
196+
DeviceRowIdx=m_sql.UpdateValue(HwdID, ID, 1, pTypeGeneral, sTypeCounterIncremental, 12, 255, 0, "0", devname);
196197
bCreated = true;
197198
break;
198199
case 15:
199200
//Soil Moisture
200201
{
201202
std::string rID = std::string(ID);
202203
padLeft(rID, 8, '0');
203-
m_sql.UpdateValue(HwdID, rID.c_str(), 1, pTypeGeneral, sTypeSoilMoisture, 12, 255, 3, devname);
204+
DeviceRowIdx=m_sql.UpdateValue(HwdID, rID.c_str(), 1, pTypeGeneral, sTypeSoilMoisture, 12, 255, 3, devname);
204205
bCreated = true;
205206
}
206207
break;
@@ -209,7 +210,7 @@ namespace http {
209210
{
210211
std::string rID = std::string(ID);
211212
padLeft(rID, 8, '0');
212-
m_sql.UpdateValue(HwdID, rID.c_str(), 1, pTypeGeneral, sTypeLeafWetness, 12, 255, 2, devname);
213+
DeviceRowIdx=m_sql.UpdateValue(HwdID, rID.c_str(), 1, pTypeGeneral, sTypeLeafWetness, 12, 255, 2, devname);
213214
bCreated = true;
214215
}
215216
break;
@@ -218,7 +219,7 @@ namespace http {
218219
{
219220
std::string rID = std::string(ID);
220221
padLeft(rID, 8, '0');
221-
m_sql.UpdateValue(HwdID, rID.c_str(), 1, pTypeGeneral, sTypeZWaveClock, 12, 255, 0, "24:12:00", devname);
222+
DeviceRowIdx=m_sql.UpdateValue(HwdID, rID.c_str(), 1, pTypeGeneral, sTypeZWaveClock, 12, 255, 0, "24:12:00", devname);
222223
bCreated = true;
223224
}
224225
break;
@@ -227,7 +228,7 @@ namespace http {
227228
{
228229
std::string rID = std::string(ID);
229230
padLeft(rID, 8, '0');
230-
m_sql.UpdateValue(HwdID, rID.c_str(), 1, pTypeGeneral, sTypeKwh, 12, 255, 0, "0;0.0", devname);
231+
DeviceRowIdx=m_sql.UpdateValue(HwdID, rID.c_str(), 1, pTypeGeneral, sTypeKwh, 12, 255, 0, "0;0.0", devname);
231232
bCreated = true;
232233
}
233234
break;
@@ -236,7 +237,7 @@ namespace http {
236237
{
237238
std::string rID = std::string(ID);
238239
padLeft(rID, 8, '0');
239-
m_sql.UpdateValue(HwdID, rID.c_str(), 1, pTypeGeneral, sTypeCurrent, 12, 255, 0, "6.4", devname);
240+
DeviceRowIdx=m_sql.UpdateValue(HwdID, rID.c_str(), 1, pTypeGeneral, sTypeCurrent, 12, 255, 0, "6.4", devname);
240241
bCreated = true;
241242
}
242243
break;
@@ -245,7 +246,7 @@ namespace http {
245246
{
246247
std::string rID = std::string(ID);
247248
padLeft(rID, 8, '0');
248-
unsigned long long devidx = m_sql.UpdateValue(HwdID, rID.c_str(), 1, pTypeLimitlessLights, sTypeLimitlessRGB, 12, 255, 1, devname);
249+
unsigned long long devidx = DeviceRowIdx=m_sql.UpdateValue(HwdID, rID.c_str(), 1, pTypeLimitlessLights, sTypeLimitlessRGB, 12, 255, 1, devname);
249250
if (devidx != -1)
250251
{
251252
//Set switch type to dimmer
@@ -255,65 +256,65 @@ namespace http {
255256
}
256257
break;
257258
case pTypeTEMP:
258-
m_sql.UpdateValue(HwdID, ID, 1, pTypeTEMP, sTypeTEMP1, 12, 255, 0, "0.0", devname);
259+
DeviceRowIdx=m_sql.UpdateValue(HwdID, ID, 1, pTypeTEMP, sTypeTEMP1, 12, 255, 0, "0.0", devname);
259260
bCreated = true;
260261
break;
261262
case pTypeHUM:
262-
m_sql.UpdateValue(HwdID, ID, 1, pTypeHUM, sTypeTEMP1, 12, 255, 50, "1", devname);
263+
DeviceRowIdx=m_sql.UpdateValue(HwdID, ID, 1, pTypeHUM, sTypeTEMP1, 12, 255, 50, "1", devname);
263264
bCreated = true;
264265
break;
265266
case pTypeTEMP_HUM:
266-
m_sql.UpdateValue(HwdID, ID, 1, pTypeTEMP_HUM, sTypeTH1, 12, 255, 0, "0.0;50;1", devname);
267+
DeviceRowIdx=m_sql.UpdateValue(HwdID, ID, 1, pTypeTEMP_HUM, sTypeTH1, 12, 255, 0, "0.0;50;1", devname);
267268
bCreated = true;
268269
break;
269270
case pTypeTEMP_HUM_BARO:
270-
m_sql.UpdateValue(HwdID, ID, 1, pTypeTEMP_HUM_BARO, sTypeTHB1, 12, 255, 0, "0.0;50;1;1010;1", devname);
271+
DeviceRowIdx=m_sql.UpdateValue(HwdID, ID, 1, pTypeTEMP_HUM_BARO, sTypeTHB1, 12, 255, 0, "0.0;50;1;1010;1", devname);
271272
bCreated = true;
272273
break;
273274
case pTypeWIND:
274-
m_sql.UpdateValue(HwdID, ID, 1, pTypeWIND, sTypeWIND1, 12, 255, 0, "0;N;0;0;0;0", devname);
275+
DeviceRowIdx=m_sql.UpdateValue(HwdID, ID, 1, pTypeWIND, sTypeWIND1, 12, 255, 0, "0;N;0;0;0;0", devname);
275276
bCreated = true;
276277
break;
277278
case pTypeRAIN:
278-
m_sql.UpdateValue(HwdID, ID, 1, pTypeRAIN, sTypeRAIN3, 12, 255, 0, "0;0", devname);
279+
DeviceRowIdx=m_sql.UpdateValue(HwdID, ID, 1, pTypeRAIN, sTypeRAIN3, 12, 255, 0, "0;0", devname);
279280
bCreated = true;
280281
break;
281282
case pTypeUV:
282-
m_sql.UpdateValue(HwdID, ID, 1, pTypeUV, sTypeUV1, 12, 255, 0, "0;0", devname);
283+
DeviceRowIdx=m_sql.UpdateValue(HwdID, ID, 1, pTypeUV, sTypeUV1, 12, 255, 0, "0;0", devname);
283284
bCreated = true;
284285
break;
285286
case pTypeRFXMeter:
286-
m_sql.UpdateValue(HwdID, ID, 1, pTypeRFXMeter, sTypeRFXMeterCount, 10, 255, 0, "0", devname);
287+
DeviceRowIdx=m_sql.UpdateValue(HwdID, ID, 1, pTypeRFXMeter, sTypeRFXMeterCount, 10, 255, 0, "0", devname);
287288
bCreated = true;
288289
break;
289290
case pTypeAirQuality:
290-
m_sql.UpdateValue(HwdID, ID, 1, pTypeAirQuality, sTypeVoltcraft, 12, 255, 0, devname);
291+
DeviceRowIdx=m_sql.UpdateValue(HwdID, ID, 1, pTypeAirQuality, sTypeVoltcraft, 12, 255, 0, devname);
291292
bCreated = true;
292293
break;
293294
case pTypeUsage:
294-
m_sql.UpdateValue(HwdID, ID, 1, pTypeUsage, sTypeElectric, 12, 255, 0, "0", devname);
295+
DeviceRowIdx=m_sql.UpdateValue(HwdID, ID, 1, pTypeUsage, sTypeElectric, 12, 255, 0, "0", devname);
295296
bCreated = true;
296297
break;
297298
case pTypeLux:
298-
m_sql.UpdateValue(HwdID, ID, 1, pTypeLux, sTypeLux, 12, 255, 0, "0", devname);
299+
DeviceRowIdx=m_sql.UpdateValue(HwdID, ID, 1, pTypeLux, sTypeLux, 12, 255, 0, "0", devname);
299300
bCreated = true;
300301
break;
301302
case pTypeP1Power:
302-
m_sql.UpdateValue(HwdID, ID, 1, pTypeP1Power, sTypeP1Power, 12, 255, 0, "0;0;0;0;0;0", devname);
303+
DeviceRowIdx=m_sql.UpdateValue(HwdID, ID, 1, pTypeP1Power, sTypeP1Power, 12, 255, 0, "0;0;0;0;0;0", devname);
303304
bCreated = true;
304305
break;
305306
case 1000:
306307
//Waterflow
307308
{
308309
std::string rID = std::string(ID);
309310
padLeft(rID, 8, '0');
310-
m_sql.UpdateValue(HwdID, rID.c_str(), 1, pTypeGeneral, sTypeWaterflow, 12, 255, 0, "0.0", devname);
311+
DeviceRowIdx=m_sql.UpdateValue(HwdID, rID.c_str(), 1, pTypeGeneral, sTypeWaterflow, 12, 255, 0, "0.0", devname);
311312
bCreated = true;
312313
}
313314
break;
314315
case 1001:
315316
//Wind + Temp + Chill
316-
m_sql.UpdateValue(HwdID, ID, 1, pTypeWIND, sTypeWIND4, 12, 255, 0, "0;N;0;0;0;0", devname);
317+
DeviceRowIdx=m_sql.UpdateValue(HwdID, ID, 1, pTypeWIND, sTypeWIND4, 12, 255, 0, "0;N;0;0;0;0", devname);
317318
bCreated = true;
318319
break;
319320
case 1002:
@@ -324,7 +325,7 @@ namespace http {
324325
unsigned char ID3 = (unsigned char)((nid & 0x0000FF00) >> 8);
325326
unsigned char ID4 = (unsigned char)((nid & 0x000000FF));
326327
sprintf(ID, "%02X%02X%02X%02X", ID1, ID2, ID3, ID4);
327-
unsigned long long devidx = m_sql.UpdateValue(HwdID, ID, 1, pTypeGeneralSwitch, sSwitchTypeSelector, 12, 255, 0, "0", devname);
328+
unsigned long long devidx = DeviceRowIdx=m_sql.UpdateValue(HwdID, ID, 1, pTypeGeneralSwitch, sSwitchTypeSelector, 12, 255, 0, "0", devname);
328329
if (devidx != -1)
329330
{
330331
//Set switch type to selector
@@ -344,6 +345,10 @@ namespace http {
344345
root["status"] = "OK";
345346
root["title"] = "CreateVirtualSensor";
346347
}
348+
if (DeviceRowIdx != -1)
349+
{
350+
m_sql.safe_query("UPDATE DeviceStatus SET Name='%q', Used=1 WHERE (ID==%llu)", ssensorname.c_str(), DeviceRowIdx);
351+
}
347352
}
348353
}
349354
}

hardware/Kodi.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,9 @@ void CKodiNode::handleMessage(std::string& pMessage)
440440
case 1009: //SetVolume response
441441
_log.Log(LOG_NORM, "Kodi: (%s) Volume set to %d.", m_Name.c_str(), root["result"].asInt());
442442
break;
443+
case 1010: //Execute Addon response
444+
_log.Log(LOG_NORM, "Kodi: (%s) Executed Addon %s.", m_Name.c_str(), root["result"].asString().c_str());
445+
break;
443446
// 2000+ messages relate to playlist triggering functionality
444447
case 2000: // clear video playlist response
445448
handleWrite("{\"jsonrpc\":\"2.0\",\"method\":\"Playlist.Clear\",\"params\":{\"playlistid\":1},\"id\":2001}");
@@ -765,6 +768,15 @@ void CKodiNode::SendCommand(const std::string &command, const int iValue)
765768
sMessage = "{\"jsonrpc\":\"2.0\",\"method\":\"Playlist.Clear\",\"params\":{\"playlistid\":0},\"id\":2000}";
766769
}
767770

771+
if (command == "execute")
772+
{
773+
sKodiCall = "Execute Addon " + m_ExecuteCommand;
774+
// ssMessage << "{\"jsonrpc\":\"2.0\",\"method\":\"Addons.GetAddons\",\"id\":1010}";
775+
ssMessage << "{\"jsonrpc\":\"2.0\",\"method\":\"Addons.ExecuteAddon\",\"params\":{\"addonid\":\"" << m_ExecuteCommand << "\"},\"id\":1010}";
776+
sMessage = ssMessage.str();
777+
m_ExecuteCommand = "";
778+
}
779+
768780
if (sMessage.length())
769781
{
770782
if (m_Socket != NULL)
@@ -806,6 +818,11 @@ void CKodiNode::SetPlaylist(const std::string& playlist)
806818
}
807819
}
808820

821+
void CKodiNode::SetExecuteCommand(const std::string& command)
822+
{
823+
m_ExecuteCommand = command;
824+
}
825+
809826
std::vector<boost::shared_ptr<CKodiNode> > CKodi::m_pNodes;
810827

811828
CKodi::CKodi(const int ID, const int PollIntervalsec, const int PingTimeoutms) : m_stoprequested(false)
@@ -959,6 +976,9 @@ bool CKodi::WriteToHardware(const char *pdata, const unsigned char length)
959976
case gswitch_sPlayPlaylist:
960977
(*itt)->SendCommand("playlist", iParam);
961978
return true;
979+
case gswitch_sExecute:
980+
(*itt)->SendCommand("execute", iParam);
981+
return true;
962982
default:
963983
return true;
964984
}
@@ -1128,6 +1148,20 @@ bool CKodi::SetPlaylist(const int ID, const std::string &playlist)
11281148
return false;
11291149
}
11301150

1151+
bool CKodi::SetExecuteCommand(const int ID, const std::string &command)
1152+
{
1153+
std::vector<boost::shared_ptr<CKodiNode> >::iterator itt;
1154+
for (itt = m_pNodes.begin(); itt != m_pNodes.end(); ++itt)
1155+
{
1156+
if ((*itt)->m_ID == ID)
1157+
{
1158+
(*itt)->SetExecuteCommand(command);
1159+
return true;
1160+
}
1161+
}
1162+
return false;
1163+
}
1164+
11311165
//Webserver helpers
11321166
namespace http {
11331167
namespace server {

hardware/Kodi.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ class CKodiNode : public boost::enable_shared_from_this<CKodiNode>
7474
void SendCommand(const std::string&);
7575
void SendCommand(const std::string&, const int iValue);
7676
void SetPlaylist(const std::string& playlist);
77+
void SetExecuteCommand(const std::string& command);
7778
bool SendShutdown();
7879
void StopRequest() { m_stoprequested = true; };
7980
bool IsBusy() { return m_Busy; };
@@ -109,6 +110,8 @@ class CKodiNode : public boost::enable_shared_from_this<CKodiNode>
109110
std::string m_Playlist;
110111
int m_PlaylistPosition;
111112

113+
std::string m_ExecuteCommand;
114+
112115
std::string m_RetainedData;
113116

114117
int m_iTimeoutCnt;
@@ -135,6 +138,7 @@ class CKodi : public CDomoticzHardwareBase
135138
void Restart();
136139
void SendCommand(const int ID, const std::string &command);
137140
bool SetPlaylist(const int ID, const std::string &playlist);
141+
bool SetExecuteCommand(const int ID, const std::string &command);
138142
private:
139143
void Do_Work();
140144

0 commit comments

Comments
 (0)