diff --git a/BaseFiles/Common/Common.csproj b/BaseFiles/Common/Common.csproj index b3f4c69c2..cc2834da8 100644 --- a/BaseFiles/Common/Common.csproj +++ b/BaseFiles/Common/Common.csproj @@ -3087,30 +3087,6 @@ lib\shared\NCrontab.pdb PreserveNewest - - lib\shared\Nmqtt.dll - PreserveNewest - - - lib\shared\Nmqtt.dll.mdb - PreserveNewest - - - lib\shared\System.Reactive.Core.dll - PreserveNewest - - - lib\shared\System.Reactive.Interfaces.dll - PreserveNewest - - - lib\shared\System.Reactive.Linq.dll - PreserveNewest - - - lib\shared\System.Reactive.PlatformServices.dll - PreserveNewest - lib\shared\UPnP.dll PreserveNewest @@ -3517,6 +3493,14 @@ PreserveNewest + + lib\shared\M2Mqtt.Net.dll + PreserveNewest + + + lib\shared\M2Mqtt.Net.dll.mdb + PreserveNewest + diff --git a/BaseFiles/Common/homegenie_factory_config.zip b/BaseFiles/Common/homegenie_factory_config.zip index ea898dd14..c50d193b1 100644 Binary files a/BaseFiles/Common/homegenie_factory_config.zip and b/BaseFiles/Common/homegenie_factory_config.zip differ diff --git a/BaseFiles/Common/html/js/api/homegenie.automation.js b/BaseFiles/Common/html/js/api/homegenie.automation.js index 837cb77eb..a829e58f1 100644 --- a/BaseFiles/Common/html/js/api/homegenie.automation.js +++ b/BaseFiles/Common/html/js/api/homegenie.automation.js @@ -211,16 +211,6 @@ HG.Automation.Programs.ArduinoFileList = function (pid, callback) { }); }; -HG.Automation.Programs.PostBack = function(postbackId, program, module, property, value, callback) { - $.get('/' + HG.WebApp.Data.ServiceKey + '/' + program.Domain + '/' + program.Address + '/' + postbackId + '/' + module.Domain + '/' + module.Address + '/' + property + '/' + encodeURIComponent(value) + '/', function (data) { - if (typeof callback != 'undefined') { - callback(data); - } - }).fail(function () { - if (typeof (callback) != 'undefined') callback(null); - }); -}; - // // namespace : HG.Automation.Scheduling namespace // info : - diff --git a/BaseFiles/Common/html/pages/configure/groups/_groupmodules.js b/BaseFiles/Common/html/pages/configure/groups/_groupmodules.js index 3c9930889..0878e1781 100644 --- a/BaseFiles/Common/html/pages/configure/groups/_groupmodules.js +++ b/BaseFiles/Common/html/pages/configure/groups/_groupmodules.js @@ -715,11 +715,6 @@ HG.WebApp.GroupModules.FeatureUpdate = function (context, value) { var property = context.parameter.Name; var mp = HG.WebApp.Utility.GetModulePropertyByName(module, property); HG.WebApp.Utility.SetModulePropertyByName(module, property, value); - // postback value change to the automation program - HG.Automation.Programs.PostBack('ui/feature', program, module, property, value, function(res){ - // TODO: think about how the response could be used (eg. field value validation and such) - }); - //property.Changed = true; }; HG.WebApp.GroupModules.ShowModuleOptions = function (domain, address) { diff --git a/BaseFiles/Common/html/pages/events/_events.js b/BaseFiles/Common/html/pages/events/_events.js index 004189730..967042464 100644 --- a/BaseFiles/Common/html/pages/events/_events.js +++ b/BaseFiles/Common/html/pages/events/_events.js @@ -250,7 +250,7 @@ HG.WebApp.Events.SendEventToUi = function (module, eventLog) { text: '', timestamp: date }; - } else if (eventLog.Property != 'Program.UiRefresh') { + } else if (!HG.WebApp.Events.IsBlacklisted(eventLog.Property)) { //var name = module.Domain.substring(module.Domain.indexOf('.') + 1) + ' ' + module.Address; //if (module.Name != '') name = module.Name; popupdata = { @@ -278,7 +278,7 @@ HG.WebApp.Events.SendEventToUi = function (module, eventLog) { // continue to default processing default: - if (module != null && eventLog.Property != 'Meter.Watts') { + if (module != null && !HG.WebApp.Events.IsBlacklisted(eventLog.Property)) { var iconImage = HG.Ui.GetModuleIcon(module, null); if ((module.Address == 'RF' || module.Address == 'IR') && eventLog.Value != '') { @@ -360,7 +360,9 @@ HG.WebApp.Events.SendEventToUi = function (module, eventLog) { break; } - if (popupdata != null && !HG.WebApp.Events.PopupHasIgnore(eventLog.Domain, eventLog.Source, eventLog.Property) && eventLog.Description.indexOf(':nopopup:') < 0) { + if (popupdata != null + && !HG.WebApp.Events.PopupHasIgnore(eventLog.Domain, eventLog.Source, eventLog.Property) && eventLog.Description.indexOf(':nopopup:') < 0 + && !HG.WebApp.Events.IsBlacklisted(eventLog.Property)) { HG.WebApp.Events.ShowEventPopup(popupdata, eventLog); @@ -368,6 +370,12 @@ HG.WebApp.Events.SendEventToUi = function (module, eventLog) { }; +HG.WebApp.Events.IsBlacklisted = function(property) { + if (property == 'Meter.Watts' || property.startsWith('ConfigureOptions.') || property == 'Program.UiRefresh') + return true; + return false; +}; + HG.WebApp.Events.PopupRefreshIgnore = function () { var ignoreList = dataStore.get('UI.EventPopupIgnore'); if (ignoreList == null) return; diff --git a/BaseFiles/Common/modules.xml b/BaseFiles/Common/modules.xml index 36c0b22e3..833731728 100644 --- a/BaseFiles/Common/modules.xml +++ b/BaseFiles/Common/modules.xml @@ -1109,102 +1109,18 @@ HomeAutomation.PhilipsHue
1
- - EnergyManagement.EnergySavingMode - - - 2014-07-25T21:31:08.815446Z - HomeGenie.LevelMemory gYT4Z6v1sEmFqc/ettaDQw== 2015-01-03T14:02:11.110588Z - - HomeGenie.ScheduleControl - - - 2014-07-25T21:31:08.81546Z - - - HomeGenie.ScheduleOff - aP5xXbpLvanu8smp3kJ85NtxHptqcyoOFcs8Xp0ONEA= - - 2015-01-03T14:02:11.110766Z - - - HomeGenie.ScheduleOn - cTOF8mIugpfgzfgDPpbH5b3Oftjy6p0QkFUy7HCT8vg= - - 2015-01-03T14:02:11.110943Z - - - HomeGenie.SecurityAlarm - - - 2014-07-25T21:31:08.815484Z - - - HomeGenie.SmartLights.CheckLuminosity - - - 2014-07-25T21:31:08.815486Z - - - HomeGenie.SmartLights.Enable - - - 2014-07-25T21:31:08.815487Z - - - HomeGenie.SmartLights.OnMotionDetect - - - 2014-07-25T21:31:08.815489Z - - - HomeGenie.SmartLights.SwitchOffTimeout - - - 2014-07-25T21:31:08.815491Z - - - HomeGenie.SunRiseOff - - - 2014-02-23T16:17:21.6399216Z - - - HomeGenie.SunSetOn - - - 2014-02-23T16:17:21.6409205Z - - - HomeGenie.TouchlessToggle - - - 2014-02-23T17:02:26.8571012Z - - - HomeGenie.TurnOffDelay - x7W6TCAxBXz/CDUi+lC+ZQ== - - 2015-01-03T14:02:11.111119Z - Meter.Watts 1bJd8AxkP04ggqA73hoY+w== 2015-01-03T14:02:11.111295Z - - MobileNotification.SendChanges - - - 2014-07-25T21:31:08.815512Z - Scenarios.SunriseColors gYT4Z6v1sEmFqc/ettaDQw== @@ -1217,12 +1133,6 @@ 2015-01-03T14:02:11.111661Z - - Status.LastLevel - 1bJd8AxkP04ggqA73hoY+w== - - 2015-01-03T14:02:11.11184Z - Status.Level 1bJd8AxkP04ggqA73hoY+w== @@ -1263,102 +1173,18 @@ HomeAutomation.PhilipsHue
2
- - EnergyManagement.EnergySavingMode - - - 2014-07-25T21:31:14.187955Z - HomeGenie.LevelMemory gYT4Z6v1sEmFqc/ettaDQw== 2015-01-03T14:02:11.112553Z - - HomeGenie.ScheduleControl - - - 2014-07-25T21:31:14.187963Z - - - HomeGenie.ScheduleOff - - - 2014-07-25T21:31:14.187963Z - - - HomeGenie.ScheduleOn - - - 2014-07-25T21:31:14.187964Z - - - HomeGenie.SecurityAlarm - - - 2014-07-25T21:31:14.187965Z - - - HomeGenie.SmartLights.CheckLuminosity - - - 2014-07-25T21:31:14.187966Z - - - HomeGenie.SmartLights.Enable - - - 2014-07-25T21:31:14.187967Z - - - HomeGenie.SmartLights.OnMotionDetect - - - 2014-07-25T21:31:14.187969Z - - - HomeGenie.SmartLights.SwitchOffTimeout - - - 2014-07-25T21:31:14.18797Z - - - HomeGenie.SunRiseOff - - - 2014-02-09T17:41:54.018871Z - - - HomeGenie.SunSetOn - - - 2014-02-09T17:41:54.018786Z - - - HomeGenie.TouchlessToggle - - - 2014-02-09T17:41:54.018165Z - - - HomeGenie.TurnOffDelay - - - 2014-07-25T21:31:14.187974Z - Meter.Watts 1bJd8AxkP04ggqA73hoY+w== 2015-01-03T14:02:11.112734Z - - MobileNotification.SendChanges - - - 2014-07-25T21:31:14.187977Z - Scenarios.SunriseColors gYT4Z6v1sEmFqc/ettaDQw== @@ -1371,12 +1197,6 @@ 2015-01-03T14:02:11.113098Z - - Status.LastLevel - 1bJd8AxkP04ggqA73hoY+w== - - 2015-01-03T14:02:11.114522Z - Status.Level 1bJd8AxkP04ggqA73hoY+w== @@ -1417,102 +1237,18 @@ HomeAutomation.PhilipsHue
3
- - EnergyManagement.EnergySavingMode - - - 2014-07-25T21:31:21.618876Z - HomeGenie.LevelMemory gYT4Z6v1sEmFqc/ettaDQw== 2015-01-03T14:02:11.11527Z - - HomeGenie.ScheduleControl - - - 2014-07-25T21:31:21.618891Z - - - HomeGenie.ScheduleOff - - - 2014-07-25T21:31:21.618893Z - - - HomeGenie.ScheduleOn - - - 2014-07-25T21:31:21.618897Z - - - HomeGenie.SecurityAlarm - - - 2014-07-25T21:31:21.618898Z - - - HomeGenie.SmartLights.CheckLuminosity - - - 2014-07-25T21:31:21.6189Z - - - HomeGenie.SmartLights.Enable - - - 2014-07-25T21:31:21.618901Z - - - HomeGenie.SmartLights.OnMotionDetect - - - 2014-07-25T21:31:21.618903Z - - - HomeGenie.SmartLights.SwitchOffTimeout - - - 2014-07-25T21:31:21.618905Z - - - HomeGenie.SunRiseOff - - - 2014-02-09T17:41:54.021388Z - - - HomeGenie.SunSetOn - - - 2014-02-09T17:41:54.021286Z - - - HomeGenie.TouchlessToggle - - - 2014-02-09T17:41:54.020571Z - - - HomeGenie.TurnOffDelay - - - 2014-07-25T21:31:21.618913Z - Meter.Watts 1bJd8AxkP04ggqA73hoY+w== 2015-01-03T14:02:11.11545Z - - MobileNotification.SendChanges - - - 2014-07-25T21:31:21.618917Z - Scenarios.SunriseColors gYT4Z6v1sEmFqc/ettaDQw== @@ -1525,12 +1261,6 @@ 2015-01-03T14:02:11.115809Z - - Status.LastLevel - 1bJd8AxkP04ggqA73hoY+w== - - 2015-01-03T14:02:11.115987Z - Status.Level 1bJd8AxkP04ggqA73hoY+w== @@ -1571,78 +1301,12 @@ HomeAutomation.PhilipsHue
4
- - EnergyManagement.EnergySavingMode - - - 2014-07-25T22:13:05.33672Z - HomeGenie.LevelMemory 2014-07-25T22:13:05.336747Z - - HomeGenie.ScheduleControl - - - 2014-07-25T22:13:05.336757Z - - - HomeGenie.ScheduleOff - - - 2014-07-25T22:13:05.336794Z - - - HomeGenie.ScheduleOn - - - 2014-07-25T22:13:05.336765Z - - - HomeGenie.SecurityAlarm - - - 2014-07-25T22:13:05.336812Z - - - HomeGenie.SmartLights.CheckLuminosity - - - 2014-07-25T22:13:05.336884Z - - - HomeGenie.SmartLights.Enable - - - 2014-07-25T22:13:05.336849Z - - - HomeGenie.SmartLights.OnMotionDetect - - - 2014-07-25T22:13:05.336867Z - - - HomeGenie.SmartLights.SwitchOffTimeout - - - 2014-07-25T22:13:05.336901Z - - - HomeGenie.TurnOffDelay - - - 2014-07-25T22:13:05.336949Z - - - MobileNotification.SendChanges - - - 2014-07-25T22:13:05.336967Z - Scenarios.SunriseColors @@ -1677,78 +1341,12 @@ HomeAutomation.PhilipsHue
5
- - EnergyManagement.EnergySavingMode - - - 2014-07-25T22:13:19.754293Z - HomeGenie.LevelMemory 2014-07-25T22:13:19.754302Z - - HomeGenie.ScheduleControl - - - 2014-07-25T22:13:19.754311Z - - - HomeGenie.ScheduleOff - - - 2014-07-25T22:13:19.754327Z - - - HomeGenie.ScheduleOn - - - 2014-07-25T22:13:19.754319Z - - - HomeGenie.SecurityAlarm - - - 2014-07-25T22:13:19.754336Z - - - HomeGenie.SmartLights.CheckLuminosity - - - 2014-07-25T22:13:19.754365Z - - - HomeGenie.SmartLights.Enable - - - 2014-07-25T22:13:19.754347Z - - - HomeGenie.SmartLights.OnMotionDetect - - - 2014-07-25T22:13:19.754355Z - - - HomeGenie.SmartLights.SwitchOffTimeout - - - 2014-07-25T22:13:19.754373Z - - - HomeGenie.TurnOffDelay - - - 2014-07-25T22:13:19.75439Z - - - MobileNotification.SendChanges - - - 2014-07-25T22:13:19.754398Z - Scenarios.SunriseColors diff --git a/BaseFiles/Common/programs.xml b/BaseFiles/Common/programs.xml index 91a3d8ac1..db9ccf125 100644 --- a/BaseFiles/Common/programs.xml +++ b/BaseFiles/Common/programs.xml @@ -220,7 +220,7 @@ When.WebServiceCallReceived("HomeAutomation.PhilipsHue", ( args ) => { bridgeapicall(lightnumber, "{ \"bri\" : " + ((int)(double.Parse(parameter) * 2.5)).ToString(CultureInfo.InvariantCulture) + " }"); var color = GetHsb(module.Parameter("Status.ColorHsb").Value); var bri = (double.Parse(parameter) / 100D).ToString(CultureInfo.InvariantCulture); - module.Parameter("Status.ColorHsb").Value = color.H+','+color.S+','+bri; + Program.RaiseEvent(module, "Status.ColorHsb", color.H+','+color.S+','+bri, "Hue Light"); Program.RaiseEvent(module, "Status.Level", bri, "Hue Light"); } break; diff --git a/BaseFiles/Common/programs/112.dll b/BaseFiles/Common/programs/112.dll index bae957879..c43fbf196 100755 Binary files a/BaseFiles/Common/programs/112.dll and b/BaseFiles/Common/programs/112.dll differ diff --git a/BaseFiles/Common/programs/121.dll b/BaseFiles/Common/programs/121.dll index 922114f14..29013166c 100755 Binary files a/BaseFiles/Common/programs/121.dll and b/BaseFiles/Common/programs/121.dll differ diff --git a/BaseFiles/Common/programs/142.dll b/BaseFiles/Common/programs/142.dll index a310ac433..b74588096 100755 Binary files a/BaseFiles/Common/programs/142.dll and b/BaseFiles/Common/programs/142.dll differ diff --git a/BaseFiles/Common/programs/145.dll b/BaseFiles/Common/programs/145.dll index bdc137b4c..467f16410 100755 Binary files a/BaseFiles/Common/programs/145.dll and b/BaseFiles/Common/programs/145.dll differ diff --git a/BaseFiles/Common/programs/16.dll b/BaseFiles/Common/programs/16.dll index 60269025c..cc1b7baa4 100755 Binary files a/BaseFiles/Common/programs/16.dll and b/BaseFiles/Common/programs/16.dll differ diff --git a/BaseFiles/Common/programs/180.dll b/BaseFiles/Common/programs/180.dll index dafaef065..67226690f 100755 Binary files a/BaseFiles/Common/programs/180.dll and b/BaseFiles/Common/programs/180.dll differ diff --git a/BaseFiles/Common/programs/200.dll b/BaseFiles/Common/programs/200.dll index 6980708fb..866cc5fa0 100755 Binary files a/BaseFiles/Common/programs/200.dll and b/BaseFiles/Common/programs/200.dll differ diff --git a/BaseFiles/Common/programs/26.dll b/BaseFiles/Common/programs/26.dll index c0199b396..1ac164d50 100755 Binary files a/BaseFiles/Common/programs/26.dll and b/BaseFiles/Common/programs/26.dll differ diff --git a/BaseFiles/Common/programs/29.dll b/BaseFiles/Common/programs/29.dll index c89f335cc..f3229f0df 100755 Binary files a/BaseFiles/Common/programs/29.dll and b/BaseFiles/Common/programs/29.dll differ diff --git a/BaseFiles/Common/programs/34.dll b/BaseFiles/Common/programs/34.dll index 45c865b45..d400a26dc 100755 Binary files a/BaseFiles/Common/programs/34.dll and b/BaseFiles/Common/programs/34.dll differ diff --git a/BaseFiles/Common/programs/35.dll b/BaseFiles/Common/programs/35.dll index a64c1e690..8025d53d8 100755 Binary files a/BaseFiles/Common/programs/35.dll and b/BaseFiles/Common/programs/35.dll differ diff --git a/BaseFiles/Common/programs/36.dll b/BaseFiles/Common/programs/36.dll index 30e7c053c..946404c89 100755 Binary files a/BaseFiles/Common/programs/36.dll and b/BaseFiles/Common/programs/36.dll differ diff --git a/BaseFiles/Common/programs/39.dll b/BaseFiles/Common/programs/39.dll index 303e5e68b..9bfc0c33b 100755 Binary files a/BaseFiles/Common/programs/39.dll and b/BaseFiles/Common/programs/39.dll differ diff --git a/BaseFiles/Common/programs/40.dll b/BaseFiles/Common/programs/40.dll index ac1d58453..00307a5a9 100755 Binary files a/BaseFiles/Common/programs/40.dll and b/BaseFiles/Common/programs/40.dll differ diff --git a/BaseFiles/Common/programs/505.dll b/BaseFiles/Common/programs/505.dll index 762bbb6d2..6e5669368 100755 Binary files a/BaseFiles/Common/programs/505.dll and b/BaseFiles/Common/programs/505.dll differ diff --git a/BaseFiles/Common/programs/6.dll b/BaseFiles/Common/programs/6.dll index 6700e5c2e..699ea8764 100755 Binary files a/BaseFiles/Common/programs/6.dll and b/BaseFiles/Common/programs/6.dll differ diff --git a/BaseFiles/Common/programs/7.dll b/BaseFiles/Common/programs/7.dll index 596ca3637..8c564ae48 100755 Binary files a/BaseFiles/Common/programs/7.dll and b/BaseFiles/Common/programs/7.dll differ diff --git a/BaseFiles/Common/programs/73.dll b/BaseFiles/Common/programs/73.dll index 4cb278a9c..2be1fdc45 100755 Binary files a/BaseFiles/Common/programs/73.dll and b/BaseFiles/Common/programs/73.dll differ diff --git a/BaseFiles/Common/programs/74.dll b/BaseFiles/Common/programs/74.dll index ee83a12c5..681ff9986 100755 Binary files a/BaseFiles/Common/programs/74.dll and b/BaseFiles/Common/programs/74.dll differ diff --git a/BaseFiles/Common/programs/75.dll b/BaseFiles/Common/programs/75.dll index 86c4215de..404d6f09c 100755 Binary files a/BaseFiles/Common/programs/75.dll and b/BaseFiles/Common/programs/75.dll differ diff --git a/BaseFiles/Common/programs/76.dll b/BaseFiles/Common/programs/76.dll index a95c0a88a..a27fd3841 100755 Binary files a/BaseFiles/Common/programs/76.dll and b/BaseFiles/Common/programs/76.dll differ diff --git a/BaseFiles/Common/programs/77.dll b/BaseFiles/Common/programs/77.dll index 135082198..a70b6b3c2 100755 Binary files a/BaseFiles/Common/programs/77.dll and b/BaseFiles/Common/programs/77.dll differ diff --git a/BaseFiles/Common/programs/78.dll b/BaseFiles/Common/programs/78.dll index 39742278e..16bb36cc8 100755 Binary files a/BaseFiles/Common/programs/78.dll and b/BaseFiles/Common/programs/78.dll differ diff --git a/BaseFiles/Common/programs/8.dll b/BaseFiles/Common/programs/8.dll index ea7a6cbe8..76977d495 100755 Binary files a/BaseFiles/Common/programs/8.dll and b/BaseFiles/Common/programs/8.dll differ diff --git a/BaseFiles/Common/programs/81.dll b/BaseFiles/Common/programs/81.dll index a39b4ea68..8da304522 100755 Binary files a/BaseFiles/Common/programs/81.dll and b/BaseFiles/Common/programs/81.dll differ diff --git a/BaseFiles/Common/programs/82.dll b/BaseFiles/Common/programs/82.dll index ccd105bce..fe47ff5b7 100755 Binary files a/BaseFiles/Common/programs/82.dll and b/BaseFiles/Common/programs/82.dll differ diff --git a/BaseFiles/Common/programs/84.dll b/BaseFiles/Common/programs/84.dll index 5311c77bb..6d5f11120 100755 Binary files a/BaseFiles/Common/programs/84.dll and b/BaseFiles/Common/programs/84.dll differ diff --git a/BaseFiles/Common/programs/88.dll b/BaseFiles/Common/programs/88.dll index 40077b424..3901be278 100755 Binary files a/BaseFiles/Common/programs/88.dll and b/BaseFiles/Common/programs/88.dll differ diff --git a/BaseFiles/Common/programs/90.dll b/BaseFiles/Common/programs/90.dll index da1bd6045..30b07c869 100755 Binary files a/BaseFiles/Common/programs/90.dll and b/BaseFiles/Common/programs/90.dll differ diff --git a/BaseFiles/Common/programs/91.dll b/BaseFiles/Common/programs/91.dll index cd93f097b..8bd6ec6f4 100755 Binary files a/BaseFiles/Common/programs/91.dll and b/BaseFiles/Common/programs/91.dll differ diff --git a/BaseFiles/Common/programs/92.dll b/BaseFiles/Common/programs/92.dll index 3bf0d21a7..3ef263dcf 100755 Binary files a/BaseFiles/Common/programs/92.dll and b/BaseFiles/Common/programs/92.dll differ diff --git a/BaseFiles/Common/programs/93.dll b/BaseFiles/Common/programs/93.dll index 5db9044ef..80a403bba 100755 Binary files a/BaseFiles/Common/programs/93.dll and b/BaseFiles/Common/programs/93.dll differ diff --git a/CREDITS.TXT b/CREDITS.TXT index 43cb7be8d..39b18cdcc 100644 --- a/CREDITS.TXT +++ b/CREDITS.TXT @@ -18,5 +18,6 @@ HomeGenie is using: - LIRC http://lirc.org - LAME http://lame.sourceforge.net - Pepper One Z-Wave DB http://www.pepper1.net/ +- M2Mqtt http://m2mqtt.wordpress.com Z-Wave driver (ZWaveLib) originarly based on article "An introduction to Z-Wave programming in C#" (http://www.digiwave.dk/en/programming/an-introduction-to-z-wave-programming-in-c/). diff --git a/Externals/M2Mqtt.Net/LICENSE b/Externals/M2Mqtt.Net/LICENSE new file mode 100644 index 000000000..3260e4f23 --- /dev/null +++ b/Externals/M2Mqtt.Net/LICENSE @@ -0,0 +1,204 @@ +Eclipse Public License - v 1.0 + +THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC +LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM +CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + +a) in the case of the initial Contributor, the initial code and documentation + distributed under this Agreement, and +b) in the case of each subsequent Contributor: + i) changes to the Program, and + ii) additions to the Program; + + where such changes and/or additions to the Program originate from and are + distributed by that particular Contributor. A Contribution 'originates' + from a Contributor if it was added to the Program by such Contributor + itself or anyone acting on such Contributor's behalf. Contributions do not + include additions to the Program which: (i) are separate modules of + software distributed in conjunction with the Program under their own + license agreement, and (ii) are not derivative works of the Program. + +"Contributor" means any person or entity that distributes the Program. + +"Licensed Patents" mean patent claims licensable by a Contributor which are +necessarily infringed by the use or sale of its Contribution alone or when +combined with the Program. + +"Program" means the Contributions distributed in accordance with this +Agreement. + +"Recipient" means anyone who receives the Program under this Agreement, +including all Contributors. + +2. GRANT OF RIGHTS + a) Subject to the terms of this Agreement, each Contributor hereby grants + Recipient a non-exclusive, worldwide, royalty-free copyright license to + reproduce, prepare derivative works of, publicly display, publicly + perform, distribute and sublicense the Contribution of such Contributor, + if any, and such derivative works, in source code and object code form. + b) Subject to the terms of this Agreement, each Contributor hereby grants + Recipient a non-exclusive, worldwide, royalty-free patent license under + Licensed Patents to make, use, sell, offer to sell, import and otherwise + transfer the Contribution of such Contributor, if any, in source code and + object code form. This patent license shall apply to the combination of + the Contribution and the Program if, at the time the Contribution is + added by the Contributor, such addition of the Contribution causes such + combination to be covered by the Licensed Patents. The patent license + shall not apply to any other combinations which include the Contribution. + No hardware per se is licensed hereunder. + c) Recipient understands that although each Contributor grants the licenses + to its Contributions set forth herein, no assurances are provided by any + Contributor that the Program does not infringe the patent or other + intellectual property rights of any other entity. Each Contributor + disclaims any liability to Recipient for claims brought by any other + entity based on infringement of intellectual property rights or + otherwise. As a condition to exercising the rights and licenses granted + hereunder, each Recipient hereby assumes sole responsibility to secure + any other intellectual property rights needed, if any. For example, if a + third party patent license is required to allow Recipient to distribute + the Program, it is Recipient's responsibility to acquire that license + before distributing the Program. + d) Each Contributor represents that to its knowledge it has sufficient + copyright rights in its Contribution, if any, to grant the copyright + license set forth in this Agreement. + +3. REQUIREMENTS + +A Contributor may choose to distribute the Program in object code form under +its own license agreement, provided that: + + a) it complies with the terms and conditions of this Agreement; and + b) its license agreement: + i) effectively disclaims on behalf of all Contributors all warranties + and conditions, express and implied, including warranties or + conditions of title and non-infringement, and implied warranties or + conditions of merchantability and fitness for a particular purpose; + ii) effectively excludes on behalf of all Contributors all liability for + damages, including direct, indirect, special, incidental and + consequential damages, such as lost profits; + iii) states that any provisions which differ from this Agreement are + offered by that Contributor alone and not by any other party; and + iv) states that source code for the Program is available from such + Contributor, and informs licensees how to obtain it in a reasonable + manner on or through a medium customarily used for software exchange. + +When the Program is made available in source code form: + + a) it must be made available under this Agreement; and + b) a copy of this Agreement must be included with each copy of the Program. + Contributors may not remove or alter any copyright notices contained + within the Program. + +Each Contributor must identify itself as the originator of its Contribution, +if +any, in a manner that reasonably allows subsequent Recipients to identify the +originator of the Contribution. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities with +respect to end users, business partners and the like. While this license is +intended to facilitate the commercial use of the Program, the Contributor who +includes the Program in a commercial product offering should do so in a manner +which does not create potential liability for other Contributors. Therefore, +if a Contributor includes the Program in a commercial product offering, such +Contributor ("Commercial Contributor") hereby agrees to defend and indemnify +every other Contributor ("Indemnified Contributor") against any losses, +damages and costs (collectively "Losses") arising from claims, lawsuits and +other legal actions brought by a third party against the Indemnified +Contributor to the extent caused by the acts or omissions of such Commercial +Contributor in connection with its distribution of the Program in a commercial +product offering. The obligations in this section do not apply to any claims +or Losses relating to any actual or alleged intellectual property +infringement. In order to qualify, an Indemnified Contributor must: +a) promptly notify the Commercial Contributor in writing of such claim, and +b) allow the Commercial Contributor to control, and cooperate with the +Commercial Contributor in, the defense and any related settlement +negotiations. The Indemnified Contributor may participate in any such claim at +its own expense. + +For example, a Contributor might include the Program in a commercial product +offering, Product X. That Contributor is then a Commercial Contributor. If +that Commercial Contributor then makes performance claims, or offers +warranties related to Product X, those performance claims and warranties are +such Commercial Contributor's responsibility alone. Under this section, the +Commercial Contributor would have to defend claims against the other +Contributors related to those performance claims and warranties, and if a +court requires any other Contributor to pay any damages as a result, the +Commercial Contributor must pay those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR +IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, +NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each +Recipient is solely responsible for determining the appropriateness of using +and distributing the Program and assumes all risks associated with its +exercise of rights under this Agreement , including but not limited to the +risks and costs of program errors, compliance with applicable laws, damage to +or loss of data, programs or equipment, and unavailability or interruption of +operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY +CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION +LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE +EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under +applicable law, it shall not affect the validity or enforceability of the +remainder of the terms of this Agreement, and without further action by the +parties hereto, such provision shall be reformed to the minimum extent +necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Program itself +(excluding combinations of the Program with other software or hardware) +infringes such Recipient's patent(s), then such Recipient's rights granted +under Section 2(b) shall terminate as of the date such litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it fails to +comply with any of the material terms or conditions of this Agreement and does +not cure such failure in a reasonable period of time after becoming aware of +such noncompliance. If all Recipient's rights under this Agreement terminate, +Recipient agrees to cease use and distribution of the Program as soon as +reasonably practicable. However, Recipient's obligations under this Agreement +and any licenses granted by Recipient relating to the Program shall continue +and survive. + +Everyone is permitted to copy and distribute copies of this Agreement, but in +order to avoid inconsistency the Agreement is copyrighted and may only be +modified in the following manner. The Agreement Steward reserves the right to +publish new versions (including revisions) of this Agreement from time to +time. No one other than the Agreement Steward has the right to modify this +Agreement. The Eclipse Foundation is the initial Agreement Steward. The +Eclipse Foundation may assign the responsibility to serve as the Agreement +Steward to a suitable separate entity. Each new version of the Agreement will +be given a distinguishing version number. The Program (including +Contributions) may always be distributed subject to the version of the +Agreement under which it was received. In addition, after a new version of the +Agreement is published, Contributor may elect to distribute the Program +(including its Contributions) under the new version. Except as expressly +stated in Sections 2(a) and 2(b) above, Recipient receives no rights or +licenses to the intellectual property of any Contributor under this Agreement, +whether expressly, by implication, estoppel or otherwise. All rights in the +Program not expressly granted under this Agreement are reserved. + +This Agreement is governed by the laws of the State of New York and the +intellectual property laws of the United States of America. No party to this +Agreement will bring a legal action under this Agreement more than one year +after the cause of action arose. Each party waives its rights to a jury trial in +any resulting litigation. + diff --git a/Externals/M2Mqtt.Net/M2Mqtt.Net.dll b/Externals/M2Mqtt.Net/M2Mqtt.Net.dll new file mode 100755 index 000000000..385d1005b Binary files /dev/null and b/Externals/M2Mqtt.Net/M2Mqtt.Net.dll differ diff --git a/Externals/M2Mqtt.Net/M2Mqtt.Net.dll.mdb b/Externals/M2Mqtt.Net/M2Mqtt.Net.dll.mdb new file mode 100644 index 000000000..8c61051e7 Binary files /dev/null and b/Externals/M2Mqtt.Net/M2Mqtt.Net.dll.mdb differ diff --git a/Externals/M2Mqtt.Net/README.md b/Externals/M2Mqtt.Net/README.md new file mode 100644 index 000000000..932b30d68 --- /dev/null +++ b/Externals/M2Mqtt.Net/README.md @@ -0,0 +1,106 @@ +# M2Mqtt + +![](images/M2Mqtt_Short_Logo.png) + +MQTT Client Library for .Net and WinRT + +*Project Description* + +M2Mqtt is a MQTT client available for all .Net platforms (.Net Framework, .Net Compact Framework and .Net Micro Framework) and WinRT platforms (Windows 8.1 and Windows Phone 8.1) for Internet of Things and M2M communication. + +MQTT, short for Message Queue Telemetry Transport, is a light weight messaging protocol that enables embedded devices with limited resources to perform asynchronous communication on a constrained network. + +MQTT protocol is based on publish/subscribe pattern so that a client can subscribe to one or more topics and receive messages that other clients publish on these topics. + +This sample is a library contains an MQTT client that you can use to connect to any MQTT broker. It is developed in C# language and works on all the following .Net platforms : + +* .Net Framework (up to 4.5) +* .Net Compact Framework 3.5 & 3.9 (for Windows Embedded Compact 7 / 2013) +* .Net Micro Framework 4.2 & 4.3 +* Mono (for Linux O.S.) + +There is also the support for WinRT platforms : + +* Windows 8.1 +* Windows Phone 8.1 +* Windows 10 + +It can be used on Windows O.S, Windows Embedded Compact 7 / 2013 and Linux O.S. (thanks to Mono Project). + +The project has an official website here : http://www.m2mqtt.net + +The binaries for all platforms are also available as package from Nuget web site https://www.nuget.org/packages/M2Mqtt/ + +For all information about MQTT protocol, please visit official web site http://mqtt.org/. + +Follow the project on Twitter [@m2mqtt](https://twitter.com/M2Mqtt) and [Facebook](https://www.facebook.com/m2mqtt). + +*Building the source code* + +The library is available for the following solution and project files : + +* M2Mqtt.sln : solution for Visual Studio that contains projects file for .Net Framework, .Net Compact Framework 3.9, .Net Micro Framework 4.2, .Net Micro Framework 4.3 and WinRT (a portable class library) for Windows 8.1, Window Phone 8.1 and Windows 10 applications +* M2MqttVS2008.sln : solution for Visual Studio 2008 that contains project file for .Net Compact Framework 3.5; + +To build sample based on .Net Micro Framework (4.2 and 4.3) you need to download .Net Micro Framework SDK from the official CodePlex web site : https://netmf.codeplex.com/ + +To build sample based on .Net Compact Framework 3.9 you need to download Application Builder for Windows Embedded Compact 2013 from here : http://www.microsoft.com/en-us/download/details.aspx?id=38819 + +*SSL/TLS support* + +For SSL/TLS feature, the definition of the symbol "SSL" is needed before compile the project. +On the repository, this symbol is already defined and all assemblies (needed for SSL/TLS) are referenced (for Debug and Release configuration). +If you want to disable SSL/TLS feature, so that you can reduce memory occupation, you can delete "SSL" symbol and remove all assemblies referenced for SSL/TLS. +However, you can leave the default project configuration and set "secure" parameter to false and "cacert" to null for MqttClient constructor (these are already default if you don't specify any values). + +ATTENTION : .Net Micro Framework supports up to TLSV1 + +*Example* + +The M2Mqtt library provides a main class MqttClient that represents the MQTT client to connect to a broker. You can connect to the broker providing its IP address or host name and optionally some parameters related to MQTT protocol. + +After connecting to the broker you can use Publish() method to publish a message to a topic and Subscribe() method to subscribe to a topic and receive message published on it. The MqttClient class is events based so that you receive an event when a message is published to a topic you subscribed to. You can receive event when a message publishing is complete, you have subscribed or unsubscribed to a topic. + +Following an example of client subscriber to a topic : + +``` +... + +// create client instance +MqttClient client = new MqttClient(IPAddress.Parse(MQTT_BROKER_ADDRESS)); + +// register to message received +client.MqttMsgPublishReceived += client_MqttMsgPublishReceived; + +string clientId = Guid.NewGuid().ToString(); +client.Connect(clientId); + +// subscribe to the topic "/home/temperature" with QoS 2 +client.Subscribe(new string[] { "/home/temperature" }, new byte[] { MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE }); + +... + +static void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e) +{ +// handle message received +} +``` + +Following an example of client publisher to a topic : + +``` +... + +// create client instance +MqttClient client = new MqttClient(IPAddress.Parse(MQTT_BROKER_ADDRESS)); + +string clientId = Guid.NewGuid().ToString(); +client.Connect(clientId); + +string strValue = Convert.ToString(value); + +// publish a message on "/home/temperature" topic with QoS 2 +client.Publish("/home/temperature", Encoding.UTF8.GetBytes(strValue), MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, false); + +... +``` diff --git a/Externals/nmqtt/Common.Logging.Core.dll b/Externals/nmqtt/Common.Logging.Core.dll deleted file mode 100644 index f41a570b6..000000000 Binary files a/Externals/nmqtt/Common.Logging.Core.dll and /dev/null differ diff --git a/Externals/nmqtt/Common.Logging.dll b/Externals/nmqtt/Common.Logging.dll deleted file mode 100644 index f51870cbc..000000000 Binary files a/Externals/nmqtt/Common.Logging.dll and /dev/null differ diff --git a/Externals/nmqtt/LICENSE.txt b/Externals/nmqtt/LICENSE.txt deleted file mode 100644 index 614978112..000000000 --- a/Externals/nmqtt/LICENSE.txt +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2009 Mark Allanson & Contributors - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. diff --git a/Externals/nmqtt/Nmqtt.XML b/Externals/nmqtt/Nmqtt.XML deleted file mode 100644 index 512178f82..000000000 --- a/Externals/nmqtt/Nmqtt.XML +++ /dev/null @@ -1,3759 +0,0 @@ - - - - Nmqtt - - - - - Exception thrown when a client identifier included in a message is too long. - - - - - The client identifier that was incorrect. - - - - - Initializes a new instance of the class. - - The client identifier. - - - - Initializes a new instance of the class. - - The client identifier. - The inner exception. - - - - Initializes a new instance of the class. - - The client identifier. - The message. - - - - Initializes a new instance of the class. - - The client idenfitier that caused the problem. - The message. - The inner exception. - - - - Initializes a new instance of the class. - - - The that holds the serialized object data about the exception being thrown. - - - The that contains contextual information about the source or destination. - - - The parameter is null. - - - The class name is null or is zero (0). - - - - - When overridden in a derived class, sets the with information about the exception. - - - The that holds the serialized object data about the exception being thrown. - - - The that contains contextual information about the source or destination. - - - The parameter is a null reference (Nothing in Visual Basic). - - - - - - - - - Event Arguments that represent a connection dropped reason. - - - - - The exception that caused the connection to drop. - - The - - - - Initializes a new instance of the class. - - The Exception that describes the reason for disconnection. - - - - Closes a connection. - - - - - Connects to a message broker - - The broker servr to connect to - The port to connect to. - The connect message to use to initiate the connection. - - - - - - Register the specified callback to receive messages of a specific type. - - The type of message that the callback should be sent. - The callback function that will accept the message type. - - - - Sends a message to a message broker. - - The message to send to the broker. - - - - Gets the current connection state. - - - - - Unregisters the specified callbacks so it not longer receives messages of the specified type. - - The message type the callback currently receives. - The callback to unregister. - - - - Registers a callback to be executed whenever a message is sent by the connection handler. - - The callback to execute when any message is sent. - - - - UnRegisters a callback that is registerd to be executed whenever a message is sent by the connection handler. - - The callback to execute when any message is sent. - - - - Connection handler that performs connections and disconnections to the hostname in a synchronous manner. - - - - - Synchronously connect to the specific Mqtt Connection. - - The hostname hostnameto connect to. - The port on the host to connect to. - The connection message that should be used to initiate the connection. - - - - Disconnects the underlying connection object. - - - - - Processes the connect acknowledgement message. - - The connect acknowledgement message. - - - - Enumeration that indicates various client connection states - - - - - The MQTT Connection is in the process of disconnecting from the broker. - - - - - The MQTT Connection is not currently connected to any broker. - - - - - The MQTT Connection is in the process of connecting to the broker. - - - - - The MQTT Connection is currently connected to the broker. - - - - - The MQTT Connection is faulted and no longer communicating with the broker. - - - - - Abstract base that provides shared connection functionality to connection handler impementations. - - - - - Registry of message processors - - - - - Registry of sent message callbacks - - - - - Gets the current state of the connection handler. - - - - - Initializes a new instance of the class. - - - - - Gets the current conneciton state of the Mqtt Client. - - - - - Connect to the specific Mqtt Connection. - - The hostname to connect to. - The port to connect to. - The connect message to use as part of the connection process. - - - - Connect to the specific Mqtt Connection. - - The hostname to connect to. - The port to connect to. - The connect message to use as part of the connection process. - - - - Sends a message to the broker through the current connection. - - - - - - - Runs the disconnection process to stop communicating with a message broker. - - - - - - - Closes the connection to the Mqtt message broker. - - - - - Registers for the receipt of messages when they arrive. - - The message type to register for. - The callback function that will be executed when the message arrives. - - - - UnRegisters for the receipt of messages when they arrive. - - The message type to register for. - The MSG processor callback. - - - - Registers a callback to be called whenever a message is sent. - - The sent MSG callback. - - - - UnRegisters a callback that is called whenever a message is sent. - - The sent MSG callback. - - - - Handles the DataAvailable event of the connection control for handling non connection messages - - The source of the event. - - The instance containing the event data. - - - - - Cleans up the underlying raw connection to the hostname. - - - - - Exception thrown when a client identifier included in a message is too long. - - - - - The connection state that caused the exception. - - - - - Initializes a new instance of the class. - - State of the connection. - - - - Initializes a new instance of the class. - - State of the connection. - The inner exception. - - - - Initializes a new instance of the class. - - The message. - - - - Initializes a new instance of the class. - - The message. - The exception that caused the connection problem - - - - Initializes a new instance of the class. - - The message. - The current connection state. - - - - Initializes a new instance of the class. - - The message. - The inner exception. - The current connection state. - - - - Initializes a new instance of the class. - - - The that holds the serialized object data about the exception being thrown. - - - The that contains contextual information about the source or destination. - - - The parameter is null. - - - The class name is null or is zero (0). - - - - - When overridden in a derived class, sets the with information about the exception. - - - The that holds the serialized object data about the exception being thrown. - - - The that contains contextual information about the source or destination. - - - The parameter is a null reference (Nothing in Visual Basic). - - - - - - - - - Implementation of an MQTT rawTopic and all the validation that goes on inside it. - - - - - Creates a new instance of a rawTopic from a topic string. - - The rawTopic to represent. - - - - Validates all unqiue fragments in the topic match the MQTT spec requirements. - - - - - Validates the placement of the multi-wildcard character in subscription topics. - - The instance to check. - - - - Checks if the rawTopic matches the supplied rawTopic using the MQTT rawTopic matching rules. - - The rawTopic to match. - True if the rawTopic matches based on the MQTT rawTopic matching rules, otherwise false. - - - - Exception that is thrown when the payload of a message is not the correct size. - - - - - The topic that is invalid - - - - - Initializes a new instance of the class. - - The reason the topic is invalid. - The topic that was invalid. - - - - Initializes a new instance of the class. - - The reason the topic is invalid. - The topic that was invalid. - The inner exception. - - - - Initializes a new instance of the class. - - - The that holds the serialized object data about the exception being thrown. - - - The that contains contextual information about the source or destination. - - - The parameter is null. - - - The class name is null or is zero (0). - - - - - When overridden in a derived class, sets the with information about the exception. - - - The that holds the serialized object data about the exception being thrown. - - - The that contains contextual information about the source or destination. - - - The parameter is a null reference (Nothing in Visual Basic). - - - - - - - - - Implements message logging by observing the messages received and the messages sent. - - - - - Initializes a new instance of the class. - - The connection handler. - - - - Called whenever a message is sent from the client to the broker. - - The message that was sent. - true; always. - - - - Logs details of received messages. - - The message to log. - true, always. - - - - Logs a message to the message log - - The message to log. - Set to true if the message is inbound to the client. - - - - Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - - - - - Helper methods to provide functionality on Collection[T]. - - - - - Provides AddRange functionality to Collection[T] - - The collection to add a range of values to. - The range of valus to add to the collection. - - - - Provides AddRange functionality to Collection[T] - - The collection to add a range of values to. - The range of valus to add to the collection. - - - - Implements keepalive functionality on the Mqtt Connection, ensuring that the connection - remains active according to the keepalive seconds setting. - - - This class implements the keepalive by sending an MqttPingRequest to the broker if a message - has not been send or received within the keepalive period. - - - - - The threading timer that manages the ping callbacks. - - - - - Used to synchronise shutdown and poing operations. - - - - - Used to indicate that the class has been disposed and is awaiting GC. - - - - - Initializes a new instance of the class. - - The connection to keep alive. - The keep alive duration in seconds. - - - - Handles the MessageSent event of the connectionHandler control. - - - - - Pings the message broker if there has been no activity for the specified amount of idle time. - - - - - - - Signal to the keepalive that a ping request has been received from the message broker. - - - The effect of calling this method on the keepalive handler is the transmission of a ping response - message to the message broker on the current connection. - - - - - Processed ping response messages received from a message broker. - - - - - - - - - Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - - - - - Interface that defines the methods and properties that must be provided by classes - that interpret and convert inbound and outbound published message data. - - - - Types that implement this interface should be aware that for the purposes of converting - data from published messages (byte array to object model) that the MqttSubscriptionsManager - creates a single instance of the data converter and uses it for all messages that are - received. - - - The same is true for the publishing of data to a broker. The PublishingManager will - also cache instances of the converters until the MqttClient is disposed. - - - This means, in both cases you can store state in the data converters if you wish, and - that state will persist between messages received or published, but only a default empty - constructor is supported. - - - - - - Converts received data from a raw byte array to an object graph. - - The received data as an array of bytes. - The data processed and turned into the specified type. - - - - Converts sent data from an object graph to a byte array. - - The data to convert to the byte array. - A byte array representation of the data. - - - - Interface that defines how the punlishing manager publishes messages to the broker and - how it passed on messages that are received from the broker. - - - - - Publish a message to the broker on the specified topic. - - The topic to send the message to. - The QOS to use when publishing the message. - The message to send. - The message identifier assigned to the message. - - - - Event raised when a message has been successfully received and the - relevant QOS handshake has been completed. - - - - - Used to synchronise access - - - - - Gets the next message identifier for the specified key. - - The key. - - - - - - Message that indicates a connection acknowledgement. - - - Message that indicates a connection acknowledgement. - - - - - Sets the return code of the Variable Header. - - The return code to set. - The new MqttConnectAckMessage with the return code set. - - - - Gets or sets the variable header contents. Contains extended metadata about the message - - The variable header. - - - - Initializes a new instance of the class. - - - Only called via the MqttMessage.Create operation during processing of an Mqtt message stream. - - - - - Initializes a new instance of the class. - - The header. - The message stream positioned after the header. - - - - Reads a message from the supplied stream. - - The message stream. - - - - Writes a message to the supplied stream. - - The stream to write the message to. - - - - Returns a that represents the current . - - - A that represents the current . - - - - - Implementation of an MQTT Publish Acknowledgement Message, used to ACK a publish message that has it's QOS set to AtLeast or Exactly Once. - - - Implementation of an MQTT Publish Acknowledgement Message, used to ACK a publish message that has it's QOS set to AtLeast or Exactly Once. - - - - - Sets the message identifier of the MqttMessage. - - The ID of the message. - An updated instance of the message. - - - - Gets or sets the variable header contents. Contains extended metadata about the message - - The variable header. - - - - Initializes a new instance of the class. - - - Only called via the MqttMessage.Create operation during processing of an Mqtt message stream. - - - - - Initializes a new instance of the class. - - The header to use for the message. - The message stream positioned after the header. - - - - Returns a that represents the current . - - - A that represents the current . - - - - - Implementation of an MQTT Publish Complete Message. - - - Implementation of an MQTT Publish Complete Message. - - - - - Sets the message identifier on the publishComplete message. - - The ID of the message. - The updated instance of the MqttPublishCompleteMessage. - - - - Gets or sets the variable header contents. Contains extended metadata about the message - - The variable header. - - - - Initializes a new instance of the class. - - - Only called via the MqttMessage.Create operation during processing of an Mqtt message stream. - - - - - Initializes a new instance of the class. - - The header to use for the message. - The message stream positioned after the header. - - - - Writes the message to the supplied stream. - - The stream to write the message to. - - - - Returns a that represents the current . - - - A that represents the current . - - - - - Implementation of an MQTT Publish Received Message. - - - Implementation of an MQTT Publish Received Message. - - - - - Sets the message identifier on the publishReceived message. - - The ID of the message. - The updated instance of the MqttPublishReceivedMessage. - - - - Gets or sets the variable header contents. Contains extended metadata about the message - - The variable header. - - - - Initializes a new instance of the class. - - - Only called via the MqttMessage.Create operation during processing of an Mqtt message stream. - - - - - Initializes a new instance of the class. - - The header to use for the message. - The message stream positioned after the header. - - - - Writes the message to the supplied stream. - - The stream to write the message to. - - - - Returns a that represents the current . - - - A that represents the current . - - - - - Implementation of an MQTT Publish Release Message. - - - Implementation of an MQTT Publish Release Message. - - - - - Sets the message identifier on the publishrelease message. - - The ID of the message. - The updated instance of the MqttPublishReleaseMessage. - - - - Gets or sets the variable header contents. Contains extended metadata about the message - - The variable header. - - - - Initializes a new instance of the class. - - - Only called via the MqttMessage.Create operation during processing of an Mqtt message stream. - - - - - Initializes a new instance of the class. - - The header to use for the message. - The message stream positioned after the header. - - - - Writes the message to the supplied stream. - - The stream to write the message to. - - - - Returns a that represents the current . - - - A that represents the current . - - - - - Implementation of an MQTT Publish Message, used for publishing telemetry data along a live MQTT stream. - - - Implementation of an MQTT Publish Message, used for publishing telemetry data along a live MQTT stream. - - - - - Sets the topic to publish data to. - - The name of the topic to publish. - The updated instance of the message with the topic name set. - - - - Appends data to publish to the end of the current message payload. - - The data to append to the end of the published data - The updated instance of the message. - - - - Sets the message identifier of the message. - - The ID of the message. - An updated instance of the message. - - - - Sets the Qos of the published message. - - The qos to set. - The updated instance of the message. - - - - Removes the current published data. - - The updated instance of the message with published data cleared - - - - Gets or sets the variable header contents. Contains extended metadata about the message - - The variable header. - - - - Gets or sets the payload of the Mqtt Message. - - The payload of the Mqtt Message. - - - - Initializes a new instance of the class. - - - Only called via the MqttMessage.Create operation during processing of an Mqtt message stream. - - - - - Initializes a new instance of the class. - - The header to use for the message. - The message stream positioned after the header. - - - - Reads a message from the supplied stream. - - The message stream. - - - - ss the message to the supplied stream. - - The stream to write the message to. - - - - Returns a that represents the current . - - - A that represents the current . - - - - - Sets the message identifier on the subscribe acknowledgement message. - - The ID of the message. - The updated instance of the message. - - - - Adds a subscription grant to the message. - - The granted Qos to add. - The updated instance of the message. - - - - Gets or sets the variable header contents. Contains extended metadata about the message - - The variable header. - - - - Gets or sets the payload of the Mqtt Message. - - The payload of the Mqtt Message. - - - - Initializes a new instance of the class. - - - Only called via the MqttMessage.Create operation during processing of an Mqtt message stream. - - - - - Initializes a new instance of the class. - - The header to use for the message. - The message stream positioned after the header. - - - - Writes the message to the supplied stream. - - The stream to write the message to. - - - - Reads a message from the supplied stream. - - The message stream. - - - - Returns a that represents the current . - - - A that represents the current . - - - - - Adds a new subscription topic with the AtMostOnce Qos Level. If you want to change the - Qos level follow this call with a call to AtTopic(MqttQos) - - The topic to subscribe to. - An updated instance of the message. - - - - Sets the Qos level of the last topic added to the subscription list via a call to ToTopic(string) - - The Qos to set the last topic subscription to. - An update instance of the message. - - - - Sets the message identifier on the subscribe message. - - The ID of the message. - The updated instance of the message. - - - - Sets the message up to request acknowledgement from the broker for each topic subscription. - - An updated instance of the message. - - - - Sets the duplicate flag for the message to indicate its a duplicate of a previous message type - with the same message identifier. - - An updated version of the message. - - - - Gets or sets the variable header contents. Contains extended metadata about the message - - The variable header. - - - - Gets or sets the payload of the Mqtt Message. - - The payload of the Mqtt Message. - - - - Initializes a new instance of the class. - - - Only called via the MqttMessage.Create operation during processing of an Mqtt message stream. - - - - - Initializes a new instance of the class. - - The header to use for the message. - The message stream positioned after the header. - - - - Writes the message to the supplied stream. - - The stream to write the message to. - - - - Reads a message from the supplied stream. - - The message stream. - - - - Returns a that represents the current . - - - A that represents the current . - - - - - Implementation of an MQTT Unsubscribe ACK Message, used to acknowledge that an unsubscribe message has been processed. - - - Implementation of an MQTT Unsubscribe ACK Message, used to acknowledge that an unsubscribe message has been processed. - - - - - Sets the message identifier on the unsubscribe message. - - The ID of the message. - The updated instance of the MqttSubscribeAckMessage. - - - - Gets or sets the variable header contents. Contains extended metadata about the message - - The variable header. - - - - Initializes a new instance of the class. - - - Only called via the MqttMessage.Create operation during processing of an Mqtt message stream. - - - - - Initializes a new instance of the class. - - The header to use for the message. - The message stream positioned after the header. - - - - Reads a message from the supplied stream. - - The message stream. - - - - Writes the message to the supplied stream. - - The stream to write the message to. - - - - Returns a that represents the current . - - - A that represents the current . - - - - - Sets the message identifier on the unsubscribe message. - - The ID of the message. - The updated instance of the MqttSubscribeAckMessage. - - - - Adds a topic to the list of topics to unsubscribe from. - - The topic to unsubscribe. - An updated instance of the message. - - - - Sets the message up to request acknowledgement from the broker for each topic un-subscription. - - An updated instance of the message. - - - - Sets the duplicate flag for the message to indicate its a duplicate of a previous message type - with the same message identifier. - - An updated version of the message. - - - - Gets or sets the variable header contents. Contains extended metadata about the message - - The variable header. - - - - Gets or sets the payload of the Mqtt Message. - - The payload of the Mqtt Message. - - - - Initializes a new instance of the class. - - - Only called via the MqttMessage.Create operation during processing of an Mqtt message stream. - - - - - Initializes a new instance of the class. - - The header to use for the message. - The message stream positioned after the header. - - - - Writes the message to the supplied stream. - - The stream to write the message to. - - - - Reads a message from the supplied stream. - - The message stream. - - - - Returns a that represents the current . - - - A that represents the current . - - - - - Represents a MQTT message that has been received from a broker. - - The type of data the payload contains. - - - - The topic the message was received on. - - - - - The payload of the mesage received. - - - - - Initializes a new instance of an MqttReceivedMessage class. - - The topic the message was received on - The payload that was received. - - - - Event arguments that represent the data present within an invalid message. - - - - - Gets or sets the Exception that describes the invalid message problem. - - The data stream. - - - - Initializes a new instance of the class. - - The Exception that describes the message problem. - - - - Exception thrown when processing a Message that is invalid in some way. - - - - - Initializes a new instance of the class. - - ss - The message. - - - Initializes a new instance of the class. - - The message. - The inner exception. - - - - Initializes a new instance of the class. - - - The that holds the serialized object data about the exception being thrown. - - - The that contains contextual information about the source or destination. - - - The parameter is null. - - - The class name is null or is zero (0). - - - - - When overridden in a derived class, sets the with information about the exception. - - - The that holds the serialized object data about the exception being thrown. - - - The that contains contextual information about the source or destination. - - - The parameter is a null reference (Nothing in Visual Basic). - - - - - - - - - Event arguments for the Data Available event fired by the MqttConnection class. - - - - - Gets or sets the data stream that contains the data to read from. - - The data stream. - - - - Initializes a new instance of the class. - - A collection of bytes containing the message data. - - - - Encoding implementation that can encode and decode strings in the MQTT string format. - - - The MQTT string format is simply a pascal string with ANSI character encoding. The first 2 bytes define - the length of the string, and they are followed by the string itself. - - - - - When overridden in a derived class, encodes all the characters in the specified into a sequence of bytes. - - - - - A byte array containing the results of encoding the specified set of characters. - - - is null. - - - A fallback occurred (see Understanding Encodings for complete explanation) - -and- - is set to . - - - - - When overridden in a derived class, decodes all the bytes in the specified byte array into a string. - - The byte array containing the sequence of bytes to decode. - - A containing the results of decoding the specified sequence of bytes. - - - is null. - - - A fallback occurred (see Understanding Encodings for complete explanation) - -and- - is set to . - - - - - When overridden in a derived class, calculates the number of characters produced by decoding all the bytes in the specified byte array. - - The byte array containing the sequence of bytes to decode. - - The number of characters produced by decoding the specified sequence of bytes. - - - is null. - - - A fallback occurred (see Understanding Encodings for complete explanation) - -and- - is set to . - - - - - Calculates the number of bytes produced by encoding the characters in the specified . - - - The containing the set of characters to encode. - - - The number of bytes produced by encoding the specified characters. - - - is null. - - - The resulting number of bytes is greater than the maximum number that can be returned as an integer. - - - A fallback occurred (see Understanding Encodings for complete explanation) - -and- - is set to . - - - - - Validates the string to ensure it doesn't contain any characters invalid within the Mqtt string format. - - The s. - - - - Implementation of the variable header for an MQTT ConnectAck message. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - A stream containing the header of the message. - - - - Writes the variable header for an MQTT Connect message to the supplied stream. - - - - - - - Creates a variable header from the specified header stream. - - The header stream. - - - - Gets the length of the write data when WriteTo will be called. - - - The length of data witten by the call to GetWriteLength - - - This method is overriden by the ConnectAckVariableHeader because the variable header of this - message type, for some reason, contains an extra byte that is not present in the variable - header spec, meaning we have to do some custom serialization and deserialization. - - - - - Returns a that represents the current . - - - A that represents the current . - - - - - Implementation of an Mqtt Connect Message. Used to initiate a connection to an RSMB - - - An Mqtt message that is used to initiate a connection to a message broker. - - - - - Sets the name of the protocol to use. - - Name of the protocol. - - - - - - Sets the protocol version. (Defaults to v3, the only protcol version supported) - - The protocol version. - - - - - - Sets the startClean flag so that the broker drops any messages that were previously destined for us. - - - - - - - Sets the Will flag of the variable header - - - - - - - Sets the WillQos of the connect flag. - - The qos. - - - - - - Sets the WillRetain flag of the Connection Flags - - - - - - - Sets the client identifier of the message. - - The client ID. - - - - - - Sets the will message. - - The will message. - - - - - - Sets the Will Topic - - The Will Topic. - - - - - - Sets the authentication - - Username to authenticate as - Password to authenticate with - - - - - - Gets or sets the variable header contents. Contains extended metadata about the message - - The variable header. - - - - Gets or sets the payload of the Mqtt Message. - - The payload of the Mqtt Message. - - - - Initializes a new instance of the class. - - - Only called via the MqttMessage.Create operation during processing of an Mqtt message stream. - - - - - Initializes a new instance of the class. - - The header to use for the message. - The message stream positioned after the header. - - - - ss the message to the supplied stream. - - The stream to write the message to. - - - - Reads a message from the supplied stream. - - The message stream. - - - - Returns a that represents the current . - - - A that represents the current . - - - - - Class that contains details related to an MQTT Connect messages payload - - - - - The identifier of the client that is/has sent the connet message. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The variable header to use for the message. - The payload stream. - - - - Writes the connect message payload to the supplied stream. - - - - - A basic message has no Variable Header. - - - - - Creates a payload from the specified header stream. - - - - - - - Returns a string representation of the payload. - - A string representation of the payload. - - - - Implementation of the variable header for an MQTT Publish Received message. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - A stream containing the header of the message. - - - - Returns the read flags for the publish message (topic, messageid) - - - - - Returns the read flags for the publish message (topic, messageid) - - - - - Returns a that represents the current . - - - A that represents the current . - - - - - Implementation of the variable header for an MQTT Publish Release message. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - A stream containing the header of the message. - - - - Returns the read flags for the publish message (topic, messageid) - - - - - Returns the read flags for the publish message (topic, messageid) - - - - - Returns a that represents the current . - - - A that represents the current . - - - - - Implementation of the variable header for an MQTT Publish Complete message. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - A stream containing the header of the message. - - - - Returns the read flags for the publish message (topic, messageid) - - - - - Returns the read flags for the publish message (topic, messageid) - - - - - Returns a that represents the current . - - - A that represents the current . - - - - - Class that contains details related to an MQTT Unsubscribe messages payload - - - - - The collection of subscriptions, Key is the topic, Value is the qos - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The payload stream. - The header to use for the message. - The variable header to use for the message. - - - - Creates a payload from the specified header stream. - - - - - - - Writes the payload to the supplied stream. - - - - - - - Gets the length of the payload in bytes when written to a stream. - - The length of the payload in bytes. - - - - Adds a new subscription to the collection of subscriptions. - - The topic to Unsubscribe from. - - - - Clears the subscriptions. - - - - - Returns a string representation of the payload. - - A string representation of the payload. - - - - Implementation of the variable header for an MQTT Unsubscribe message. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - A stream containing the header of the message. - - - - Returns the read flags for the Unsubscribe variabe header (prot name, version, Unsubscribe, keepalive) - - - - - Returns the write flags for the Unsubscribe variabe header (prot name, version, Unsubscribe, keepalive) - - - - - Returns a that represents the current . - - - A that represents the current . - - - - - Class that contains details related to an MQTT Subscribe messages payload - - - - - The collection of subscriptions, Key is the topic, Value is the qos - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The header to use for the message. - The variable header to use for the message. - The payload stream. - - - - Writes the payload to the supplied stream. - - - - - A basic message has no Variable Header. - - - - - Creates a payload from the specified header stream. - - - - - - - Gets the length of the payload in bytes when written to a stream. - - The length of the payload in bytes. - - - - Adds a new subscription to the collection of subscriptions. - - The topic to subscribe to. - The qos level to subscribe at. - - - - Clears the subscriptions. - - - - - Returns a string representation of the payload. - - A string representation of the payload. - - - - Implementation of the variable header for an MQTT Subscribe message. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - A stream containing the header of the message. - - - - Returns the read flags for the Subscribe variabe header - - - - - Returns the write flags for the ListenTo variabe header (prot name, version, ListenTo, keepalive) - - - - - Returns a that represents the current . - - - A that represents the current . - - - - - Class that contains details related to an MQTT SubscribeAck messages payload - - - - - The collection of subscriptions, Key is the topic, Value is the qos - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The header to use for the message. - The variable header to use for the message. - The payload stream. - - - - Creates a payload from the specified header stream. - - - - - - - Writes the payload to the supplied stream. - - - - - - - Gets the length of the payload in bytes when written to a stream. - - The length of the payload in bytes. - - - - Adds a new subscription to the collection of subscriptions. - - The granted qos. - - - - Clears the subscriptions. - - - - - Returns a string representation of the payload. - - A string representation of the payload. - - - - Implementation of the variable header for an MQTT SubscribeAck message. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - A stream containing the header of the message. - - - - Returns the read flags for the SubscribeAck variabe header (prot name, version, SubscribeAck, keepalive) - - - - - Returns the write flags for the SubscribeAck variabe header (prot name, version, SubscribeAck, keepalive) - - - - - Returns a that represents the current . - - - A that represents the current . - - - - - Implementation of an MQTT Disconnect Message. - - - - - Initializes a new instance of the class. - - - Only called via the MqttMessage.Create operation during processing of an Mqtt message stream. - - - - - Initializes a new instance of the class. - - The message header. - - - - Returns a that represents the current . - - - A that represents the current . - - - - - Implementation of an MQTT Ping Request Message. - - - - - Initializes a new instance of the class. - - - Only called via the MqttMessage.Create operation during processing of an Mqtt message stream. - - - - - Initializes a new instance of the class. - - The message header. - - - - Returns a that represents the current . - - - A that represents the current . - - - - - Implementation of an MQTT Ping Response Message. - - - - - Initializes a new instance of the class. - - - Only called via the MqttMessage.Create operation during processing of an Mqtt message stream. - - - - - Initializes a new instance of the class. - - The ping message's header. - - - - Returns a that represents the current . - - - A that represents the current . - - - - - Implementation of the variable header for an MQTT Publish Acknowledgement message. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - A stream containing the header of the message. - - - - Returns the read flags for the publish message (topic, messageid) - - - - - Returns the read flags for the publish message (topic, messageid) - - - - - Returns a that represents the current . - - - A that represents the current . - - - - - Class that contains details related to an MQTT Connect messages payload - - - - - The message that forms the payload of the publish message. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The header of the message being process. - The variable header of the message being processed. - The payload stream. - - - - Creates a payload from the specified header stream. - - - - - - - Writes the payload to the supplied stream. - - - - - A basic message has no Variable Header. - - - - - Gets the length of the payload in bytes when written to a stream. - - The length of the payload in bytes. - - - - Returns a string representation of the payload. - - A string representation of the payload. - - - - Converts an array of bytes to a byte string. - - The message. - The message as an array of bytes - - - - Implementation of the variable header for an MQTT Connect message. - - - - - Stores the standard header - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The messages header. - A stream containing the header of the message. - - - - Returns the read flags for the publish message (topic, messageid) - - - - - Returns the read flags for the publish message (topic, messageid) - - - - - Returns a that represents the current . - - - A that represents the current . - - - - - Implementation of the variable header for an MQTT Publish Acknowledgement message. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - A stream containing the header of the message. - - - - Returns the read flags for the publish message (topic, messageid) - - - - - Returns the read flags for the publish message (topic, messageid) - - - - - Returns a that represents the current . - - - A that represents the current . - - - - - Represents the connect flags part of the MQTT Variable Header - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class configured as per the supplied stream. - - The connect flags stream. - - - - Writes the connect flag byte to the supplied stream. - - The stream to write to. - - - - Reads the connect flags from the underlying stream. - - The stream. - - - - Builds the byte that represents the current connect flags. - - - - - Gets the length of data written when WriteTo is called. - - - - - - - Returns a that represents the current . - - - A that represents the current . - - - - - The Maximum allowed message size as defined by the MQTT v3 Spec (256MB). - - - - - The Maximum allowed client identifier length. - - - - - The default Mqtt port to connect to. - - - - - The recommended length for usernames and passwords. - - - - - Provides stream extension methods useful for interacting with streams of MQTT messges. - - - - - Writes a short to the underlying stream. - - The stream to write to. - The value to write to the stream. - - - - Reads a short from the underlying stream. - - The stream to read from - A short value. - - - - Reads an MQTT string from the underlying stream. - - The stream to read the string from. - The Mqtt String. - - - - Writes the MQTT string. - - The stream containing the string to write. - The string to write. - - - - Implementation of the variable header for an MQTT Connect message. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - A stream containing the header of the message. - - - - Returns the read flags for the connect variabe header (prot name, version, connect, keepalive) - - - - - Returns the write flags for the connect variabe header (prot name, version, connect, keepalive) - - - - - Returns a that represents the current . - - - A that represents the current . - - - - - Exception thrown when processing a header that is invalid in some way. - - - - - Initializes a new instance of the class. - - The message. - - - - Initializes a new instance of the class. - - The message. - The inner exception. - - - - Initializes a new instance of the class. - - - The that holds the serialized object data about the exception being thrown. - - - The that contains contextual information about the source or destination. - - - The parameter is null. - - - The class name is null or is zero (0). - - - - - When overridden in a derived class, sets the with information about the exception. - - - The that holds the serialized object data about the exception being thrown. - - - The that contains contextual information about the source or destination. - - - The parameter is a null reference (Nothing in Visual Basic). - - - - - - - - - Exception that is thrown when the payload of a message is not the correct size. - - - - - Initializes a new instance of the class. - - Size of the payload. - The maximum allowed size of the payload. - - - - Initializes a new instance of the class. - - Size of the payload. - The maximum allowable size of the payload. - The inner exception. - - - - Initializes a new instance of the class. - - The message. - - - - Initializes a new instance of the class. - - The message. - The inner exception. - - - - Initializes a new instance of the class. - - - The that holds the serialized object data about the exception being thrown. - - - The that contains contextual information about the source or destination. - - - The parameter is null. - - - The class name is null or is zero (0). - - - - - When overridden in a derived class, sets the with information about the exception. - - - The that holds the serialized object data about the exception being thrown. - - - The that contains contextual information about the source or destination. - - - The parameter is a null reference (Nothing in Visual Basic). - - - - - - - - - The TcpClient that maintains the connection to the MQTT broker. - - - - - Sync lock object to ensure that only a single message is sent through the connection handler at once. - - - - - Initializes a new instance of the class. - - The server. - The port. - - - - Initiate a new connection to a message broker - - - - - - - - - Disconnects from the message broker - - - - - Sends the message in the stream to the broker. - - The message to send. - - - - Sends the message contained in the byte array to the broker. - - The message to send. - - - - Callback for when data has been read from the underlying network stream. - - The async result from the read. - - - - Raises the DataAvailable event, passing the raw message bytes to all subscribers. - - The raw content of the message received. - - - - Occurs when Data is available for processing from the underlying network stream. - - - - - Occurs when the connection to the remote server drops unexpectedly. - - - - - Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - - - - - Controls the read state used during async reads. - - - - - Reading a message header. - - - - - Reading message content. - - - - - State and logic used to read from the underlying network stream. - - - - - The read buffer size from the network - - - - - The total bytes expected to be read from from the header of content - - - - - The bytes associated with the message being read. - - - - - The network stream being read. - - - - - The amount of content to read during the next read. - - - - - The buffer the last stream read wrote into. - - - - - What is the connection currently reading. - - - - - A boolean that indicates whether the message read is complete - - - - - Creates a new ReadWrapper that wraps the state used to read a message from a stream. - - The stream being read. - - - - Recalculates the number of best to read given the expected total size and the amount read so far. - - - - - Enumeration of allowable connection request return codes. - - - - - Represents the Fixed Header of an MQTT message. - - - - - Sets the type of the message identified in the header. - - The type of message. - An instance of the header. - - - - Sets the Qos of the message header. - - The Qos to ser - An instance of the header. - - - - Sets the IsDuplicate flag of the header. - - An Instance of the header. - - - - Defines that the message should be retained. - - An instance of the header, - - - - Backing storage for the payload size. - - - - - Gets or sets the type of the MQTT message. - - The type of the MQTT message. - - - - Gets or sets a value indicating whether this MQTT Message is duplicate of a previous message. - - - true if duplicate; otherwise, false. - - - - - Gets or sets the Quality of Service indicator for the message. - - The qos. - - - - Gets or sets a value indicating whether this MQTT message should be retained by the message broker for transmission to new subscribers. - - - true if message should be retained by the message broker; otherwise, false. - - - - - Gets or sets the size of the variable header + payload section of the message. - - The size of the variable header + payload. - The size of the variable header + payload exceeds the maximum allowed size. - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class based on data contained within the supplied stream. - - The stream containing the header message. - - - - Writes the header to a supplied stream. - - The size of the message to write. - The stream to write the header bytes to. - - - - Creates a new MqttHeader based on a list of bytes. - - The stream that contains the message, positioned at the beginning of the header. - - - - - - Gets the value of the Mqtt header as a byte array - - - - - Calculates the remaining length of an mqttmessage from the bytes that make up the length - - The length bytes. - - - - - - Reads the length bytes of an MqttHeader from the supplied stream. - - The header stream. - - - - - - Calculates and return the bytes that represent the remaining length of the message. - - - - - - - Returns a that represents the current . - - - A that represents the current . - - - - - Factory for generating instances of MQTT Messages - - - - - Gets an instance of an MqttMessage based on the message type requested. - - The message header. - The content of the message, including variable header where applicable. - An instance of the desired message type. - - - - An enumeration of all available MQTT Message Types - - - - - Reserved by the MQTT spec, should not be used. - - - - - Reserved by the MQTT spec, should not be used. - - - - - Represents the payload (Body) of an MQTT Message. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The payload stream. - - - - Writes the payload to the supplied stream. - - The stream to write the variable header to. - - A basic message has no Variable Header. - - - - - Creates a payload from the specified header stream. - - The stream to read the payload from. - - - - Gets the length of the payload in bytes when written to a stream. - - The length of the payload in bytes. - - - - A client class for interacting with MQTT Data Packets - - - - - The Handler that is managing the connection to the remote server. - - - - - The subscriptions manager responsible for tracking subscriptions. - - - - - Handles the connection management while idle. - - - - - Handles everything to do with publication management. - - - - - Handles the logging of received messages for diagnostic purpose. - - - - - The remote server that this client will connect to. - - - - - The port on the remote server that this client will connect to. - - - - - Gets the Client Identifier of this instance of the MqttClient - - - - - Gets the current conneciton state of the Mqtt Client. - - - - - Initializes a new instance of the class using the default Mqtt Port. - - The server hostname to connect to. - The client identifier to use to connect with. - - - - Initializes a new instance of the class. - - The server. - The port. - The ID that the broker can use to identify the client. - - - - Performs a synchronous connect to the message broker with an optional username and password - for the purposes of authentication. - - Optionally the username to authenticate as. - Optionally the password to authenticate with. - - - - Gets a configured connect message. - - An MqttConnectMessage that can be used to connect to a message broker. - - - - Subscribles the specified topic with a callback function that accepts the raw message data. - - The topic. - The qos level. - - - If a topic that does not meet the MQTT topic spec rules is provided. - - - - Initiates a topic subscription request to the connected broker with a strongly typed data processor callback. - - The topic to subscribe to. - The qos level the message was published at. - - The identifier assigned to the subscription. - - If a topic that does not meet the MQTT topic spec rules is provided. - - - - Publishes a message to the message broker. - - The topic to publish the message to. - The message to publish. - The message identiier assigned to the message. - - - - Publishes a message to the message broker. - - The topic to publish the message to. - The QOS level to publish the message at. - The message to publish. - The message identiier assigned to the message. - - - - Publishes a message to the message broker. - - The type of the data convert. - The Type of the data being published - The topic to publish the message to. - The message to publish. - - The message identiier assigned to the message. - - - - - Publishes a message to the message broker. - - The type of the data converter to use. - The Type of the data being published - The topic to publish the message to. - The quality of service to attach to the message. - The message to publish. - - The message identiier assigned to the message. - - Thrown if the topic supplied violates the MQTT topic format rules. - - - - Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - - - - - Represents an MQTT message that contains a fixed header, variable header and message body. - - - Messages roughly look as follows. - - ---------------------------- - | Header, 2-5 Bytes Length | - ---------------------------- - | Variable Header | - | n Bytes Length | - ---------------------------- - | Message Payload | - | 256MB minus VH Size | - ---------------------------- - - - - - The header of the MQTT Message. Contains metadata about the message - - - - - Initializes a new instance of the class. - - - Only called via the MqttMessage.Create operation during processing of an Mqtt message stream. - - - - - Initializes a new instance of the class. - - The header of the message. - - - - Creates a new instance of an MQTT Message based on a raw message bytes. - - The message bytes. - - - - - - Creates a new instance of an MQTT Message based on a raw message stream. - - The message stream. - An MqttMessage containing details of the message. - - - - Writes the message to the supplied stream. - - The stream to write the message to. - - - - Reads a message from the supplied stream. - - The message stream. - - - - Returns a that represents the current . - - - A that represents the current . - - - - - Enumeration of available QoS types. - - - - - QOS Level 0 - Message is not guaranteed delivery. No retries are made to ensure delivery is successful. - - - - - QOS Level 1 - Message is guaranteed delivery. It will be delivered at least one time, but may be delivered - more than once if network errors occur. - - - - - QOS Level 2 - Message will be delivered once, and only once. Message will be retried until - it is successfully sent.. - - - - - Reserved by the MQTT Spec. Currently unused. - - - - - Represents the base class for the Variable Header portion of some MQTT Messages. - - - - - The length, in bytes, consumed by the variable header. - - - - - Defines the maximum allowable lag, in seconds, between expected messages. - - - The spec indicates that clients won't be disconnected until KeepAlive + 1/2 KeepAlive time period - elapses. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class, populating it with data from a stream. - - The stream containing the variable header. - - - - Gets the Read Flags used during message deserialization - - - - - Gets the write flags used during message serialization - - - - - Writes the variable header to the supplied stream. - - The stream to write the variable header to. - - This base implementation uses the WriteFlags property that can be - overridden in subclasses to determine what to read from the variable header. - A subclass can override this method to do completely custom read operations - if required. - - - - - Creates a variable header from the specified header stream. - - The stream to read the variable header from. - - This base implementation uses the ReadFlags property that can be - overridden in subclasses to determine what to read from the variable header. - A subclass can override this method to do completely custom read operations - if required. - - - - - Gets the length of the write data when WriteTo will be called. - - The length of data witten by the call to GetWriteLength - - - - Enumeration used by subclasses to tell the variable header what should be read from the underlying stream. - - - - - Implementation of a Publication topic that performs additional validations - messages that are published. - - - - - Validates that the topic has no wildcards which are not allowed in publication topics. - - The instance to check. - - - - Represents an event argumnts that contains an Mqtt Publish Message. - - - - - The message being published. - - - - - Gets the parsed topic belonging to the published message. - - - - - Creates a new instance of a PublishEventArgs class. - - The parsed topic. - The MQTT Publish Message that's been published. - - - - Handles the logic and workflow surrounding the message publishing and receipt process - - - - It's probably worth going into a bit of the detail around publishing and Quality of Service levels - as they are primarily the reason why message publishing has been split out into this class. - - - There are - 3 different QOS levels. AtMostOnce (0), means that the message, when sent from broker to client, or - client to broker, should be delivered at most one time, and it does not matter if the message is - "lost". QOS 2, AtLeastOnce, means that the message should be successfully received by the receiving - party at least one time, so requires some sort of acknowledgement so the sender can re-send if the - receiver does not acknowledge. - - - QOS 3 is a bit more complicated as it provides the facility for guaranteed delivery of the message - exactly one time, no more, no less. - - Each of these have different message flow between the sender and receiver. - - QOS 0 - AtMostOnce - - Sender --> Publish --> Receiver - - - - QOS 1 - AtLeastOnce - - Sender --> Publish --> Receiver --> PublishAck --> Sender - | - v - Message Processor - - - - QOS 2 - AtLeastOnce - - Sender --> Publish --> Receiver --> PublishReceived --> Sender --> PublishRelease --> Reciever --> PublishComplete --> Sender - | - v - Message Processor - - - - - - - Handles dispensing of message ids for messages published to a topic. - - - - - Stores messages that have been pubished but not yet acknowledged. - - - - - Stores messages that have been received from a broker with qos level 2 (Exactly Once). - - - - - Stores a cache of data converters used when publishing data to a broker. - - - - - The current connection handler. - - - - - Raised when a message has been recieved by the client and the relevant QOS handshake is complete. - - - - - Initializes a new instance of the class. - - The connection handler. - - - - Publish a message to the broker on the specified topic. - - The topic to send the message to. - The QOS to use when publishing the message. - The message to send. - The message identifier assigned to the message. - - - - Gets an instance of the specified publish data converter. - - The type of the data converter. - - - - - - Handles the receipt of publish acknowledgement messages. - - The publish acknowledgement - True; always. - - This callback simply removes it from the list of published messages. - - - - - Handles the receipt of publish messages from a message broker. - - The message that was published. - - - - - - Handles the publish complete, for messages that are undergoing Qos ExactlyOnce processing. - - The MSG. - Boolean value indicating whether the message was successfull processed. - - - - Raises the MessageReceived event. - - The topic the message belongs to. - The message received. - - - - Handles a publish complete message received from a broker. - - - - true if the message flow completed successfully, otherwise false. - - - - Handles publish received messages during processing of QOS level 2 (Exactly once) messages. - - The publish received message - true or false, depending on the success of message processing. - - - - Converts string data to and from the MQTT wire format - - - - - Processes received data and returns it as a string. - - The received data as an array of bytes. - - The data processed and turned into the specified type. - - - - - Converts sent data from a string to a byte array. - - The string to convert to the byte array. - A byte array representation of the string. - - - - Acts as a passthrough for the raw data without doing any conversion. - - s - - - Processes received data and returns it as a byte array. - - The received data as an array of bytes. - - The data processed and turned into a byte array. - - - - - Converts sent data from an object graph to a byte array. - - The data to convert to the byte array. - A byte array representation of the data. - - - - Entity that captures data related to an individual subscription - - - - - The message identifier assigned to the subscription - - - - - The time the subscription was created. - - - - - The Topic that is subscribed to. - - - - - The QOS level of the topics subscription - - - - - The observable that receives messages from the broker. - - - - - A class that can manage the topic subscription process. - - - - - used to synchronize access to subscriptions. - - - - - Dispenser used for keeping track of subscription ids - - - - - List of confirmed subscriptions, keyed on the topic name. - - - - - A list of subscriptions that are pending acknowledgement, keyed on the message identifier. - - - - - The connection handler that we use to subscribe to subscription acknowledgements. - - - - - Publishing manager used for passing on published messages to subscribers. - - - - - Creates a new instance of a SubscriptionsManager that uses the specified connection to manage subscriptions. - - The connection handler that will be used to subscribe to topics. - The punlishing manager that handles the receipt of messages from the broker. - - - - Registers a new subscription with the subscription manager. - - - - - - An IObservable that yields any messages received once subscribed. - If a topic that does not meet the MQTT topic spec rules is provided. - - - - Gets a view on the existing observable, if the subscription already exists. - - - - - - The subscription Topic to get. - Set to an observable on the subscription if one exists, otherwise null. - True if an existing observable is available, otherwise false. - - - - Creates a new subscription for the specified topic. - - The type of data the subscription is expected to return. - The type of the converter that can convert from bytes to the type T. - The topic to subscribe to. - The QOS level to subscribe at. - An observable that yields messages when they arrive. - If a topic that does not meet the MQTT topic spec rules is provided. - - - - Creates an observable for a subscription. - - The topic to the obserbable should read messages on. - The messgeid assigned to the subscription. - An observable that yields a byte array for each message that arrives on a topoc. - - - - Wraps a raw byte array observable with the payload converter and yields a serialized messages in place. - - The type of data the subscription is expected to return. - The type of the converter that can convert from bytes to the type T. - The observable on the raw byte array to be wrapped. - An observable that yields MqttReceivedMessages of type T when a message arrives on the subscription. - - - - Confirms a subscription has been made with the broker. Marks the sub as confirmed in the subs storage. - - The message that triggered subscription confirmation. - True, always. - - - - Cleans up after an unsubscribe message is received from the broker. - - The unsubscribe message from the broker. - True, always. - - - - Gets the current status of a subscription. - - The topoc to check the subscription for. - The current status of the subscription - - - - Gets the subscription data method registered for a subscription topoc. - - The topoc to retrieve the subscription data for. - The subscription data for a subscription, or null if there is no registered subscription. - - This will ignore pending subscriptions, so any messages that arrive for pending subscriptions will NOT be delivered. This - policy may change in the future if I find that some brokers might be a bit shifty. Sending messages to callbacks that - are not yet confirmed might not be handled gracefully by client consumers. - - - - - Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - - - - - Describes the status of a subscription - - - - - The subscription does not exist / is not known - - - - - The subscription is currently pending acknowledgement by a broker. - - - - - The subscription is currently active and messages will be received. - - - - - Describes the event arguments that represent an available MqttMessage. - - - - - Gets or sets the topic the message was published to. - - - - - Gets or sets the nessage that was published. - - - - - Creates a new instance of the MqttMessageEventArgs class. - - - A that represents the topic the message was published to. - - - A that represents the message that was published. - - - - - Provides the base implementation of an MQTT topic. - - - An MQTT - - - - - Returns True if there are any wildcards in the specified rawTopic, otherwise false. - - - - - Creates a new instance of a rawTopic from a rawTopic string. - - The topic to represent. - The validations to run on the rawTopic. - - - - Validates that the topic does not exceed the maximum length. - - The instance to check. - - - - Validates that the topic does not fall below the minimum length. - - The instance to check. - - - - Serves as a hash function for a topics. - - - A hash code for the current . - - 2 - - - - Checks if one topic equals another topic exactly. - - The topic to compare equality to. - - - - Returns a String representation of the topic. - - A string representation of the topic. - - - diff --git a/Externals/nmqtt/Nmqtt.dll b/Externals/nmqtt/Nmqtt.dll deleted file mode 100755 index dd2caceeb..000000000 Binary files a/Externals/nmqtt/Nmqtt.dll and /dev/null differ diff --git a/Externals/nmqtt/Nmqtt.dll.mdb b/Externals/nmqtt/Nmqtt.dll.mdb deleted file mode 100644 index 732ddbdbb..000000000 Binary files a/Externals/nmqtt/Nmqtt.dll.mdb and /dev/null differ diff --git a/Externals/nmqtt/System.Reactive.Core.dll b/Externals/nmqtt/System.Reactive.Core.dll deleted file mode 100644 index 2d3450bd4..000000000 Binary files a/Externals/nmqtt/System.Reactive.Core.dll and /dev/null differ diff --git a/Externals/nmqtt/System.Reactive.Interfaces.dll b/Externals/nmqtt/System.Reactive.Interfaces.dll deleted file mode 100644 index d9ed09df6..000000000 Binary files a/Externals/nmqtt/System.Reactive.Interfaces.dll and /dev/null differ diff --git a/Externals/nmqtt/System.Reactive.Linq.dll b/Externals/nmqtt/System.Reactive.Linq.dll deleted file mode 100644 index 002bb7dbc..000000000 Binary files a/Externals/nmqtt/System.Reactive.Linq.dll and /dev/null differ diff --git a/Externals/nmqtt/System.Reactive.PlatformServices.dll b/Externals/nmqtt/System.Reactive.PlatformServices.dll deleted file mode 100644 index a96bf0b14..000000000 Binary files a/Externals/nmqtt/System.Reactive.PlatformServices.dll and /dev/null differ diff --git a/Externals/nmqtt/readme.md b/Externals/nmqtt/readme.md deleted file mode 100644 index 21826bff1..000000000 --- a/Externals/nmqtt/readme.md +++ /dev/null @@ -1,49 +0,0 @@ -# nMQTT, an MQTT v3 Implementation - -Welcome to the nMQTT .Net MQTT Library. You can find a [quickstart here](./getting-started.md) - -## Build Server -There is a [TeamCity build server](http://teamcity.bareknucklecode.com:8111/) which provides CI -builds. The build currently runs on Ubuntu/Mono(v2) both because it's simpler and cheaper to maintain. -This also has the side benefit of finding any filename case bugs which can cause issues with -builds under mono on linux. - -## Getting Source -The source for nMQTT is on [github](https://github.com/markallanson/nmqtt). - -If you don't have Git on your machine, visit [git](http://git-scm.com) and grab a copy for your platform, -or simply install the github client for [Windows](http://windows.github.com) or -[Mac](http://mac.github.com). - -You can get a local copy by issuing the following command from your terminal. - -`git clone git://github.com/markallanson/nmqtt.git nmqtt` - -This command will clone a copy of the source to a new directory, "nmqtt" under your current working -directory. - -## Build Source -### On Windows - -Install the .Net SDK and run msbuild against your chosen sln file. -or -Run Visual Studio, load your chosen sln file. - -### On Mac OS X or Linux - -1. Install the latest [Xamarin Studio](http://xamarin.com/studio) -2. Load your chosen sln file into Xamarin Studio and build. - - -## Running Unit Tests - -The unit tests for nMqtt are written using the [xUnit framework](http://www.codeplex.com/xunit). - -The xUnit framework test runners run on both the .Net Framework and Mono platform (To run on mono -prefix the xunit runner executables with `mono`, then issue your command line as normal (ie. the -path to the nMQTTTests.dll assembly) - -## Pull Requests - -Please issue pull requests if you have additions or changes or bug fixes you would like to see -in the main branch. diff --git a/HISTORY.TXT b/HISTORY.TXT index 2650b18db..d9f13943c 100644 --- a/HISTORY.TXT +++ b/HISTORY.TXT @@ -1,5 +1,12 @@ RELEASE HISTORY +17/04/2016 v1.1-beta.516 + - Replaced nmqtt library with M2Mqyy.Net + - Fixed Data.Module.NeedsUdpdate serialization bug + - Reset oldest 24 hours of data instead of whole DB when statistics DB exceed size limit + - Fixed Web Server (MIG) headers bug preventing client from caching files + - Added event raising when a module property is changed from the UI; deprecated HG.Automation.Programs.PostBack; + 26/03/2016 v1.1-beta.515 - Fix "Add new Program" bug (issue #259) - Z-Wave Pepper1 database is now queried online diff --git a/HomeGenie/Automation/Engines/CSharpAppFactory.cs b/HomeGenie/Automation/Engines/CSharpAppFactory.cs index 79c322dc4..b83456914 100644 --- a/HomeGenie/Automation/Engines/CSharpAppFactory.cs +++ b/HomeGenie/Automation/Engines/CSharpAppFactory.cs @@ -219,11 +219,7 @@ private MethodRunResult EvaluateCondition() compilerParams.ReferencedAssemblies.Add("UnitsNet.dll"); } - compilerParams.ReferencedAssemblies.Add(Path.Combine("lib", "shared", "System.Reactive.Core.dll")); - compilerParams.ReferencedAssemblies.Add(Path.Combine("lib", "shared", "System.Reactive.Interfaces.dll")); - compilerParams.ReferencedAssemblies.Add(Path.Combine("lib", "shared", "System.Reactive.Linq.dll")); - compilerParams.ReferencedAssemblies.Add(Path.Combine("lib", "shared", "System.Reactive.PlatformServices.dll")); - compilerParams.ReferencedAssemblies.Add(Path.Combine("lib", "shared", "Nmqtt.dll")); + compilerParams.ReferencedAssemblies.Add(Path.Combine("lib", "shared", "M2Mqtt.Net.dll")); // compile and generate script assembly return provider.CompileAssemblyFromSource(compilerParams, source); diff --git a/HomeGenie/Automation/Scripting/ModuleHelper.cs b/HomeGenie/Automation/Scripting/ModuleHelper.cs index 971261264..527e997d0 100644 --- a/HomeGenie/Automation/Scripting/ModuleHelper.cs +++ b/HomeGenie/Automation/Scripting/ModuleHelper.cs @@ -148,7 +148,7 @@ public bool IsOfDeviceType(string typeList) public bool HasFeature(string feature) { var parameter = Service.Utility.ModuleParameterGet(module, feature); - return (parameter != null && parameter.Value != null && parameter.Value != ""); + return (parameter != null && !String.IsNullOrWhiteSpace(parameter.Value)); } /// diff --git a/HomeGenie/Automation/Scripting/MqttClientHelper.cs b/HomeGenie/Automation/Scripting/MqttClientHelper.cs index b2494aef6..47a5d12de 100644 --- a/HomeGenie/Automation/Scripting/MqttClientHelper.cs +++ b/HomeGenie/Automation/Scripting/MqttClientHelper.cs @@ -21,9 +21,9 @@ */ using System; - -using Nmqtt; using System.Net; +using System.Text; +using uPLibrary.Networking.M2Mqtt; namespace HomeGenie.Automation.Scripting { @@ -33,7 +33,7 @@ public class MqttEndPoint public int Port = 1883; public string ClientId = "hg-" + new Random().Next(10000).ToString(); } - + /// /// MQTT client helper. /// Class instance accessor: **MqttClient** @@ -41,11 +41,12 @@ public class MqttEndPoint [Serializable] public class MqttClientHelper { - private MqttClient mqttClient = null; private NetworkCredential networkCredential = null; private MqttEndPoint endPoint = new MqttEndPoint(); - private object mqttSyncLock = new object(); - + + private MqttClient mqttClient = null; + //private object mqttSyncLock = new object(); + /// /// Sets the MQTT server to use. /// @@ -55,7 +56,7 @@ public MqttClientHelper Service(string server) endPoint.Address = server; return this; } - + /// /// Connects to the MQTT server using the default port (1883) and the specified client identifier. /// @@ -79,7 +80,7 @@ public MqttClientHelper Connect(int port, string clientId) Connect(); return this; } - + /// /// Disconnects from the MQTT server. /// @@ -87,14 +88,8 @@ public MqttClientHelper Disconnect() { if (this.mqttClient != null) { - try - { - this.mqttClient.Dispose(); - } - catch - { - } - mqttClient = null; + this.mqttClient.Disconnect(); + this.mqttClient = null; } return this; } @@ -106,13 +101,14 @@ public MqttClientHelper Disconnect() /// Callback for receiving the subscribed topic messages. public MqttClientHelper Subscribe(string topic, Action callback) { - mqttClient.ListenTo(topic, (MqttQos)1) - //.ObserveOn(System.Threading.SynchronizationContext.Current) - .Subscribe(msg => - { - callback(msg.Topic, msg.Payload); - //Console.WriteLine("MQTT {0} : {1}", msg.Topic, msg.Payload); - }); + mqttClient.MqttMsgPublishReceived += (sender, e) => + { + var msg = Encoding.UTF8.GetString(e.Message); + callback(e.Topic, msg); + }; + + mqttClient.Subscribe(new string[] { topic }, new byte[] { uPLibrary.Networking.M2Mqtt.Messages.MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE }); + return this; } @@ -123,13 +119,15 @@ public MqttClientHelper Subscribe(string topic, Action callback) /// Message text. public MqttClientHelper Publish(string topic, string message) { - lock (mqttSyncLock) - { - mqttClient.PublishMessage(topic, (MqttQos)1, message); - } + var body = Encoding.UTF8.GetBytes(message); + mqttClient.Publish(topic, body, 1, true); + // lock (mqttSyncLock) + // { + // mqttClient.PublishMessage(topic, (MqttQos)1, message); + // } return this; } - + /// /// Publish a message to the specified topic. /// @@ -137,11 +135,8 @@ public MqttClientHelper Publish(string topic, string message) /// Message text as byte array. public MqttClientHelper Publish(string topic, byte[] message) { - lock (mqttSyncLock) - { - mqttClient.PublishMessage(topic, message); - } - return this; + mqttClient.Publish(topic, message); + return this; } /// @@ -168,14 +163,15 @@ public void Reset() private void Connect() { Disconnect(); - mqttClient = new MqttClient(endPoint.Address, endPoint.Port, endPoint.ClientId); + mqttClient = new MqttClient(endPoint.Address, endPoint.Port, false, null, null, MqttSslProtocols.None); + if (this.networkCredential != null) { - mqttClient.Connect(this.networkCredential.UserName, this.networkCredential.Password); + mqttClient.Connect(this.endPoint.ClientId, this.networkCredential.UserName, this.networkCredential.Password); } else { - mqttClient.Connect(); + mqttClient.Connect(endPoint.ClientId); } } @@ -183,4 +179,3 @@ private void Connect() } } - diff --git a/HomeGenie/Automation/Scripting/NetHelper.cs b/HomeGenie/Automation/Scripting/NetHelper.cs index e03ef3de5..06511b71e 100644 --- a/HomeGenie/Automation/Scripting/NetHelper.cs +++ b/HomeGenie/Automation/Scripting/NetHelper.cs @@ -43,7 +43,6 @@ using HomeGenie.Data; using HomeGenie.Service.Constants; -using Nmqtt; using NetClientLib; namespace HomeGenie.Automation.Scripting @@ -72,12 +71,9 @@ public class NetHelper private string mailSubject = ""; private Dictionary attachments = new Dictionary(); - private MqttClient mqttClient = null; - // multithread safe lock objects private object smtpSyncLock = new object(); //private object httpSyncLock = new object(); - private object mqttSyncLock = new object(); private HomeGenieService homegenie; private bool defaultCredentials; @@ -182,126 +178,117 @@ public bool SendMessage(string from, string recipients, string subject, string m this.mailSubject = subject; this.mailBody = messageText; // - lock(smtpSyncLock) - using (var message = new System.Net.Mail.MailMessage()) - { - string[] mailRecipients = recipients.Split(';'); - for (int e = 0; e < mailRecipients.Length; e++) - { - message.To.Add(mailRecipients[e]); - } - message.Subject = this.mailSubject; - message.From = new MailAddress(this.mailFrom); - message.Body = this.mailBody; - // - for (int a = 0; a < attachments.Count; a++) + lock (smtpSyncLock) + using (var message = new System.Net.Mail.MailMessage()) { - var attachment = new Attachment( - new MemoryStream(attachments.ElementAt(a).Value), - attachments.ElementAt(a).Key - ); - message.Attachments.Add(attachment); - } - // - if (this.mailService == "") - { - // this is a System Parameter - var spSmtpServer = homegenie.Parameters.Find(delegate(ModuleParameter mp) - { - return mp.Name == "Messaging.Email.SmtpServer"; - }); - if (spSmtpServer != null) + string[] mailRecipients = recipients.Split(';'); + for (int e = 0; e < mailRecipients.Length; e++) { - this.mailService = spSmtpServer.Value; + message.To.Add(mailRecipients[e]); } - } - if (this.mailPort == -1) - { - // this is a System Parameter - var spSmtpPort = homegenie.Parameters.Find(delegate(ModuleParameter mp) - { - return mp.Name == "Messaging.Email.SmtpPort"; - }); - if (spSmtpPort != null && spSmtpPort.DecimalValue > 0) + message.Subject = this.mailSubject; + message.From = new MailAddress(this.mailFrom); + message.Body = this.mailBody; + // + for (int a = 0; a < attachments.Count; a++) { - this.mailPort = (int)spSmtpPort.DecimalValue; + var attachment = new Attachment(new MemoryStream(attachments.ElementAt(a).Value), attachments.ElementAt(a).Key); + message.Attachments.Add(attachment); } - } - if (this.mailSsl == -1) - { - // this is a System Parameter - var spSmtpUseSsl = homegenie.Parameters.Find(delegate(ModuleParameter mp) - { - return mp.Name == "Messaging.Email.SmtpUseSsl"; - }); - if (spSmtpUseSsl != null && spSmtpUseSsl.Value.ToLower() == "true") + // + if (this.mailService == "") { - this.mailSsl = 1; + // this is a System Parameter + var spSmtpServer = homegenie.Parameters.Find(delegate(ModuleParameter mp) + { + return mp.Name == "Messaging.Email.SmtpServer"; + }); + if (spSmtpServer != null) + { + this.mailService = spSmtpServer.Value; + } } - } - var credentials = this.networkCredential; - if (credentials == null) - { - var username = ""; - // this is a System Parameter - var spSmtpUserName = homegenie.Parameters.Find(delegate(ModuleParameter mp) + if (this.mailPort == -1) { - return mp.Name == "Messaging.Email.SmtpUserName"; - }); - if (spSmtpUserName != null) - { - username = spSmtpUserName.Value; + // this is a System Parameter + var spSmtpPort = homegenie.Parameters.Find(delegate(ModuleParameter mp) + { + return mp.Name == "Messaging.Email.SmtpPort"; + }); + if (spSmtpPort != null && spSmtpPort.DecimalValue > 0) + { + this.mailPort = (int)spSmtpPort.DecimalValue; + } } - if (!String.IsNullOrWhiteSpace(username)) + if (this.mailSsl == -1) { - var password = ""; // this is a System Parameter - var spSmtpPassword = homegenie.Parameters.Find(delegate(ModuleParameter mp) + var spSmtpUseSsl = homegenie.Parameters.Find(delegate(ModuleParameter mp) { - return mp.Name == "Messaging.Email.SmtpPassword"; + return mp.Name == "Messaging.Email.SmtpUseSsl"; }); - if (spSmtpPassword != null) + if (spSmtpUseSsl != null && spSmtpUseSsl.Value.ToLower() == "true") { - password = spSmtpPassword.Value; + this.mailSsl = 1; } - credentials = new NetworkCredential(username, password); } - } - // - using (var smtpClient = new SmtpClient(this.mailService)) - { - try + var credentials = this.networkCredential; + if (credentials == null) { - smtpClient.Credentials = credentials; - smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network; - if (this.mailPort > 0) + var username = ""; + // this is a System Parameter + var spSmtpUserName = homegenie.Parameters.Find(delegate(ModuleParameter mp) + { + return mp.Name == "Messaging.Email.SmtpUserName"; + }); + if (spSmtpUserName != null) { - smtpClient.Port = this.mailPort; + username = spSmtpUserName.Value; } - if (this.mailSsl > 0) + if (!String.IsNullOrWhiteSpace(username)) { - smtpClient.EnableSsl = (this.mailSsl == 1); + var password = ""; + // this is a System Parameter + var spSmtpPassword = homegenie.Parameters.Find(delegate(ModuleParameter mp) + { + return mp.Name == "Messaging.Email.SmtpPassword"; + }); + if (spSmtpPassword != null) + { + password = spSmtpPassword.Value; + } + credentials = new NetworkCredential(username, password); } - smtpClient.Send(message); - attachments.Clear(); } - catch (Exception ex) - { - HomeGenieService.LogError( - Domains.HomeAutomation_HomeGenie_Automation, - this.GetType().Name, - ex.Message, - "Exception.StackTrace", - ex.StackTrace - ); - return false; - } - finally + // + using (var smtpClient = new SmtpClient(this.mailService)) { - smtpClient.Dispose(); + try + { + smtpClient.Credentials = credentials; + smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network; + if (this.mailPort > 0) + { + smtpClient.Port = this.mailPort; + } + if (this.mailSsl > 0) + { + smtpClient.EnableSsl = (this.mailSsl == 1); + } + smtpClient.Send(message); + attachments.Clear(); + } + catch (Exception ex) + { + HomeGenieService.LogError(Domains.HomeAutomation_HomeGenie_Automation, this.GetType().Name, ex.Message, "Exception.StackTrace", ex.StackTrace); + return false; + } + finally + { + smtpClient.Dispose(); + } } } - } return true; } @@ -430,15 +417,9 @@ public string Call() } catch (Exception ex) { - HomeGenieService.LogError( - Domains.HomeAutomation_HomeGenie_Automation, - this.GetType().Name, - ex.Message, - "Exception.StackTrace", - ex.StackTrace - ); + HomeGenieService.LogError(Domains.HomeAutomation_HomeGenie_Automation, this.GetType().Name, ex.Message, "Exception.StackTrace", ex.StackTrace); } - finally + finally { webClient.Dispose(); } @@ -511,15 +492,9 @@ public byte[] GetBytes() } catch (Exception ex) { - HomeGenieService.LogError( - Domains.HomeAutomation_HomeGenie_Automation, - this.GetType().Name, - ex.Message, - "Exception.StackTrace", - ex.StackTrace - ); + HomeGenieService.LogError(Domains.HomeAutomation_HomeGenie_Automation, this.GetType().Name, ex.Message, "Exception.StackTrace", ex.StackTrace); } - finally + finally { webClient.Dispose(); } @@ -562,77 +537,7 @@ public bool Ping(string remoteAddress) #endregion - //TODO: deprecate MQTT client in NetHelper (use MqttClientHelper instead) - #region MQTT client - - /// - /// Sets the MQTT server to use. - /// - /// The service. - /// MQTT server address. - /// MQTT server port. - /// MQTT topic. - [Obsolete("use 'MqttClientHelper' class instead")] - public NetHelper MqttService(string server, int port, string clientId) - { - mqttClient = new MqttClient(server, port, clientId); - if (this.networkCredential != null) - { - mqttClient.Connect(this.networkCredential.UserName, this.networkCredential.Password); - } - else - { - mqttClient.Connect(); - } - return this; - } - - //TODO: deprecate this (use this.networkCredential instead) - [Obsolete("use 'MqttClientHelper' class instead")] - public NetHelper MqttService(string server, int port, string username, string password, string clientId) - { - mqttClient = new MqttClient(server, port, clientId); - mqttClient.Connect(username, password); - return this; - } - - /// - /// Subscribe the specified topic. - /// - /// Topic name. - /// Callback for receiving the subscribed topic messages. - [Obsolete("use 'MqttClientHelper' class instead")] - public NetHelper Subscribe(string topic, Action callback) - { - mqttClient.ListenTo(topic, (MqttQos)1) - //.ObserveOn(System.Threading.SynchronizationContext.Current) - .Subscribe(msg => - { - callback(msg.Topic, msg.Payload); - //Console.WriteLine("MQTT {0} : {1}", msg.Topic, msg.Payload); - }); - return this; - } - - /// - /// Publish a message to the specified topic. - /// - /// Topic name. - /// Message text. - [Obsolete("use 'MqttClientHelper' class instead")] - public NetHelper Publish(string topic, string message) - { - lock (mqttSyncLock) - { - mqttClient.PublishMessage(topic, (MqttQos)1, message); - } - return this; - } - - #endregion - - - //TODO: add autodoc comment (HG Event forwarding) + // TODO: add autodoc comment (HG Event forwarding) public NetHelper SignalModuleEvent(string hgAddress, ModuleHelper module, ModuleParameter parameter) { string eventRouteUrl = "http://" + hgAddress + "/api/" + Domains.HomeAutomation_HomeGenie + "/Interconnection/Events.Push/" + homegenie.GetHttpServicePort(); @@ -671,10 +576,6 @@ public void Reset() this.networkCredential = null; this.mailBody = ""; this.mailSubject = ""; - if (this.mqttClient != null) - { - try { this.mqttClient.Dispose(); } catch { } - } } private class WebClient : System.Net.WebClient diff --git a/HomeGenie/Data/ModuleParameter.cs b/HomeGenie/Data/ModuleParameter.cs index 1770e0b35..6a2715222 100644 --- a/HomeGenie/Data/ModuleParameter.cs +++ b/HomeGenie/Data/ModuleParameter.cs @@ -107,7 +107,6 @@ public string Value /// Gets or sets the type of the field. /// /// The type of the field. - [JsonIgnore] public string FieldType { get; set; } /// @@ -116,7 +115,7 @@ public string Value /// The update time. public DateTime UpdateTime { get; set; } - [XmlIgnore,JsonIgnore] + [XmlIgnore] public bool NeedsUpdate { get; set; } /// diff --git a/HomeGenie/HomeGenie.csproj b/HomeGenie/HomeGenie.csproj index a18c1148e..547b29e21 100644 --- a/HomeGenie/HomeGenie.csproj +++ b/HomeGenie/HomeGenie.csproj @@ -123,32 +123,6 @@ ..\Externals\sqlite\System.Data.SQLite.dll False - - ..\Externals\nmqtt\Common.Logging.Core.dll - - - ..\Externals\nmqtt\Common.Logging.dll - - - ..\Externals\nmqtt\Nmqtt.dll - False - - - ..\Externals\nmqtt\System.Reactive.Core.dll - False - - - ..\Externals\nmqtt\System.Reactive.Interfaces.dll - False - - - ..\Externals\nmqtt\System.Reactive.Linq.dll - False - - - ..\Externals\nmqtt\System.Reactive.PlatformServices.dll - False - ..\Externals\raspberry-sharp\Raspberry.IO.SerialPeripheralInterface.dll @@ -194,6 +168,10 @@ ..\Externals\SharpZipLib\ICSharpCode.SharpZipLib.dll + + ..\Externals\M2Mqtt.Net\M2Mqtt.Net.dll + False + diff --git a/HomeGenie/Service/Handlers/Config.cs b/HomeGenie/Service/Handlers/Config.cs index e759e14d8..e541b76d4 100644 --- a/HomeGenie/Service/Handlers/Config.cs +++ b/HomeGenie/Service/Handlers/Config.cs @@ -111,9 +111,9 @@ public void ProcessRequest(MigClientRequest request) var portList = new List(); for (int p = serialPorts.Length - 1; p >= 0; p--) { - if (serialPorts[p].Contains("/ttyS") - || serialPorts[p].Contains("/ttyUSB") - || serialPorts[p].Contains("/ttyAMA") // RaZberry + if (serialPorts[p].Contains("/ttyS") + || serialPorts[p].Contains("/ttyUSB") + || serialPorts[p].Contains("/ttyAMA")// RaZberry || serialPorts[p].Contains("/ttyACM")) // ZME_UZB1 { portList.Add(serialPorts[p]); @@ -470,7 +470,7 @@ public void ProcessRequest(MigClientRequest request) try { var module = homegenie.Modules.Find(m => m.Domain == migCommand.GetOption(0) && m.Address == migCommand.GetOption(1)); - var parameter = Utility.ModuleParameterSet(module, migCommand.GetOption(2), migCommand.GetOption(3)); + homegenie.RaiseEvent(Domains.HomeGenie_System, module.Domain, module.Address, module.Description, migCommand.GetOption(2), migCommand.GetOption(3)); request.ResponseData = new ResponseText("OK"); } catch (Exception ex) @@ -608,22 +608,19 @@ public void ProcessRequest(MigClientRequest request) if (currentParameter == null) { currentModule.Properties.Add(newParameter); + homegenie.RaiseEvent(Domains.HomeGenie_System, currentModule.Domain, currentModule.Address, currentModule.Description, newParameter.Name, newParameter.Value); } else if (newParameter.NeedsUpdate) { // reset current reporting Watts if VMWatts field is set to 0 if (newParameter.Name == Properties.VirtualMeterWatts && newParameter.DecimalValue == 0 && currentParameter.DecimalValue != 0) { - homegenie.RaiseEvent( - Domains.HomeGenie_System, - currentModule.Domain, - currentModule.Address, - currentModule.Description, - Properties.MeterWatts, - "0.0" - ); + homegenie.RaiseEvent(Domains.HomeGenie_System, currentModule.Domain, currentModule.Address, currentModule.Description, Properties.MeterWatts, "0.0"); + } + else if (newParameter.Value != currentParameter.Value) + { + homegenie.RaiseEvent(Domains.HomeGenie_System, currentModule.Domain, currentModule.Address, currentModule.Description, newParameter.Name, newParameter.Value); } - currentParameter.Value = newParameter.Value; } } // look for deleted properties diff --git a/HomeGenie/Service/Handlers/Statistics.cs b/HomeGenie/Service/Handlers/Statistics.cs index 10760b4a9..0a25dcba2 100644 --- a/HomeGenie/Service/Handlers/Statistics.cs +++ b/HomeGenie/Service/Handlers/Statistics.cs @@ -20,19 +20,22 @@ * Project Homepage: http://homegenie.it */ -using HomeGenie.Service.Constants; -using HomeGenie.Service.Logging; -using MIG; using System; using System.Collections.Generic; using System.Linq; using System.Text; +using MIG; + +using HomeGenie.Service.Constants; +using HomeGenie.Service.Logging; + namespace HomeGenie.Service.Handlers { public class Statistics { private HomeGenieService homegenie; + public Statistics(HomeGenieService hg) { homegenie = hg; @@ -177,39 +180,39 @@ public void ProcessRequest(MigClientRequest request) double sum = 0; switch (x) { - case 0: - if (migCommand.GetOption(0).StartsWith(Properties.MeterAny)) - { - sum = (double)(hoursAverages[x].FindAll(se => se.TimeStart.ToLocalTime().Hour == h && se.Value > 0).Min(se => se.Value)); - } - else - { - sum = (double)(hoursAverages[x].FindAll(se => se.TimeStart.ToLocalTime().Hour == h).Min(se => se.Value)); - } - break; - case 1: - sum = (double)(hoursAverages[x].FindAll(se => se.TimeStart.ToLocalTime().Hour == h).Max(se => se.Value)); - break; - case 2: - if (migCommand.GetOption(0).StartsWith(Properties.MeterAny)) - { - sum = (double)(hoursAverages[x].FindAll(se => se.TimeStart.ToLocalTime().Hour == h && se.Value > 0).Average(se => se.Value)); - } - else - { - sum = (double)(hoursAverages[x].FindAll(se => se.TimeStart.ToLocalTime().Hour == h).Average(se => se.Value)); - } - break; - case 3: - if (migCommand.GetOption(0).StartsWith(Properties.MeterAny)) - { - sum = (double)(hoursAverages[x].FindAll(se => se.TimeStart.ToLocalTime().Hour == h && se.Value > 0).Average(se => se.Value)); - } - else - { - sum = (double)(hoursAverages[x].FindAll(se => se.TimeStart.ToLocalTime().Hour == h).Average(se => se.Value)); - } - break; + case 0: + if (migCommand.GetOption(0).StartsWith(Properties.MeterAny)) + { + sum = (double)(hoursAverages[x].FindAll(se => se.TimeStart.ToLocalTime().Hour == h && se.Value > 0).Min(se => se.Value)); + } + else + { + sum = (double)(hoursAverages[x].FindAll(se => se.TimeStart.ToLocalTime().Hour == h).Min(se => se.Value)); + } + break; + case 1: + sum = (double)(hoursAverages[x].FindAll(se => se.TimeStart.ToLocalTime().Hour == h).Max(se => se.Value)); + break; + case 2: + if (migCommand.GetOption(0).StartsWith(Properties.MeterAny)) + { + sum = (double)(hoursAverages[x].FindAll(se => se.TimeStart.ToLocalTime().Hour == h && se.Value > 0).Average(se => se.Value)); + } + else + { + sum = (double)(hoursAverages[x].FindAll(se => se.TimeStart.ToLocalTime().Hour == h).Average(se => se.Value)); + } + break; + case 3: + if (migCommand.GetOption(0).StartsWith(Properties.MeterAny)) + { + sum = (double)(hoursAverages[x].FindAll(se => se.TimeStart.ToLocalTime().Hour == h && se.Value > 0).Average(se => se.Value)); + } + else + { + sum = (double)(hoursAverages[x].FindAll(se => se.TimeStart.ToLocalTime().Hour == h).Average(se => se.Value)); + } + break; } // date is normalized to the current date, time info is preserved from original data entry var date = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd") + " " + h.ToString("00") + ":00:00"); @@ -276,14 +279,14 @@ public void ProcessRequest(MigClientRequest request) { if (entry.CustomData == "") entry.CustomData = entry.Domain + ":" + entry.Address; - if(moduleName != entry.CustomData) + if (moduleName != entry.CustomData) { - if(moduleName != "") + if (moduleName != "") { response = response.TrimEnd(','); response += " ],[ "; } - response += "[\""+entry.CustomData + "\"] ],[ "; + response += "[\"" + entry.CustomData + "\"] ],[ "; moduleName = entry.CustomData; } response += "[" + DateToJavascriptLocal(entry.TimeStart).ToString("0.000", System.Globalization.CultureInfo.InvariantCulture) + "," + entry.Value.ToString("0.000", System.Globalization.CultureInfo.InvariantCulture) + "],"; @@ -318,9 +321,9 @@ public void ProcessRequest(MigClientRequest request) break; case "Parameter.StatDelete": response = "["; - var dateText = migCommand.GetOption(0).Replace('.',','); + var dateText = migCommand.GetOption(0).Replace('.', ','); dateStart = JavascriptToDateUtc(double.Parse(dateText)); - var responseDelete = homegenie.Statistics.DeleteStat(dateStart,migCommand.GetOption(1)); + var responseDelete = homegenie.Statistics.DeleteStat(dateStart, migCommand.GetOption(1)); response += "[Response," + responseDelete + "]"; response += "]"; request.ResponseData = response; diff --git a/HomeGenie/Service/Logging/StatisticsLogger.cs b/HomeGenie/Service/Logging/StatisticsLogger.cs index 81e69be8b..ba62f7195 100644 --- a/HomeGenie/Service/Logging/StatisticsLogger.cs +++ b/HomeGenie/Service/Logging/StatisticsLogger.cs @@ -74,7 +74,6 @@ public static bool IsValidField(string field) private SQLiteConnection dbConnection; private long dbSizeLimit = 2097152; - //private object dbLock = new object(); //private static int STATISTICS_TIME_RESOLUTION_MINUTES = 5; private readonly int _statisticsTimeResolutionSeconds = 5 * 60; @@ -142,24 +141,21 @@ public void ResetDatabase() public List GetParametersList(string domain, string address) { var parameterList = new List(); - //lock (dbLock) + var dbCommand = dbConnection.CreateCommand(); + string query = "select distinct Parameter from ValuesHist"; + if (!string.IsNullOrEmpty(domain) && !string.IsNullOrEmpty(address)) { - var dbCommand = dbConnection.CreateCommand(); - string query = "select distinct Parameter from ValuesHist"; - if (!string.IsNullOrEmpty(domain) && !string.IsNullOrEmpty(address)) - { - query += " WHERE Domain=@domain AND Address=@address "; - dbCommand.Parameters.Add(new SQLiteParameter("@domain", domain)); - dbCommand.Parameters.Add(new SQLiteParameter("@address", address)); - } - dbCommand.CommandText = query; - var reader = dbCommand.ExecuteReader(); - while (reader.Read()) - { - parameterList.Add(reader.GetString(0)); - } - reader.Close(); + query += " WHERE Domain=@domain AND Address=@address "; + dbCommand.Parameters.Add(new SQLiteParameter("@domain", domain)); + dbCommand.Parameters.Add(new SQLiteParameter("@address", address)); } + dbCommand.CommandText = query; + var reader = dbCommand.ExecuteReader(); + while (reader.Read()) + { + parameterList.Add(reader.GetString(0)); + } + reader.Close(); return parameterList; } @@ -171,26 +167,22 @@ public StatisticsEntry GetDateRange() { var start = DateTime.UtcNow; var end = DateTime.UtcNow; - //lock (dbLock) + var dbCommand = dbConnection.CreateCommand(); + string query = "select min(TimeStart),max(TimeEnd) from ValuesHist"; + dbCommand.CommandText = query; + try { - var dbCommand = dbConnection.CreateCommand(); - string query = "select min(TimeStart),max(TimeEnd) from ValuesHist"; - dbCommand.CommandText = query; - try - { - var reader = dbCommand.ExecuteReader(); - if (reader.Read()) - { - start = DateTime.Parse(reader.GetString(0)); - end = DateTime.Parse(reader.GetString(1)); - } - reader.Close(); - } - catch (Exception) + var reader = dbCommand.ExecuteReader(); + if (reader.Read()) { - // TODO: add error logging + start = DateTime.Parse(reader.GetString(0)); + end = DateTime.Parse(reader.GetString(1)); } - + reader.Close(); + } + catch (Exception) + { + // TODO: add error logging } return new StatisticsEntry() { TimeStart = start, TimeEnd = end }; } @@ -249,47 +241,43 @@ public double GetTotalCounter(string parameterName, double timeScaleSeconds) ) { var values = new List(); - //lock (dbLock) + var dbCommand = dbConnection.CreateCommand(); + string filter = ""; + if (!string.IsNullOrEmpty(domain) && !string.IsNullOrEmpty(address)) { - var dbCommand = dbConnection.CreateCommand(); - string filter = ""; - if (!string.IsNullOrEmpty(domain) && !string.IsNullOrEmpty(address)) + filter= " Domain=@domain AND Address=@address and "; + dbCommand.Parameters.Add(new SQLiteParameter("@domain", domain)); + dbCommand.Parameters.Add(new SQLiteParameter("@address", address)); + } + string query = "select TimeStart,TimeEnd,Domain,Address,Sum(AverageValue*( ((julianday(TimeEnd) - 2440587.5) * 86400.0) -((julianday(TimeStart) - 2440587.5) * 86400.0) )/" + timescaleseconds.ToString(CultureInfo.InvariantCulture) + ") as CounterValue from ValuesHist where " + filter + " Parameter = @parameterName AND " + GetParameterizedDateRangeFilter(ref dbCommand, startDate, endDate) + " group by Domain, Address, strftime('%H', TimeStart) order by TimeStart desc;"; + dbCommand.Parameters.Add(new SQLiteParameter("@parameterName", parameterName)); + dbCommand.CommandText = query; + var reader = dbCommand.ExecuteReader(); + // + while (reader.Read()) + { + var entry = new StatisticsEntry(); + entry.TimeStart = DateTime.Parse(reader.GetString(0)); + entry.TimeEnd = DateTime.Parse(reader.GetString(1)); + entry.Domain = reader.GetString(2); + entry.Address = reader.GetString(3); + entry.Value = 0; + try { - filter= " Domain=@domain AND Address=@address and "; - dbCommand.Parameters.Add(new SQLiteParameter("@domain", domain)); - dbCommand.Parameters.Add(new SQLiteParameter("@address", address)); + entry.Value = (double)reader.GetFloat(4); } - string query = "select TimeStart,TimeEnd,Domain,Address,Sum(AverageValue*( ((julianday(TimeEnd) - 2440587.5) * 86400.0) -((julianday(TimeStart) - 2440587.5) * 86400.0) )/" + timescaleseconds.ToString(CultureInfo.InvariantCulture) + ") as CounterValue from ValuesHist where " + filter + " Parameter = @parameterName AND " + GetParameterizedDateRangeFilter(ref dbCommand, startDate, endDate) + " group by Domain, Address, strftime('%H', TimeStart) order by TimeStart desc;"; - dbCommand.Parameters.Add(new SQLiteParameter("@parameterName", parameterName)); - dbCommand.CommandText = query; - var reader = dbCommand.ExecuteReader(); - // - while (reader.Read()) + catch { - var entry = new StatisticsEntry(); - entry.TimeStart = DateTime.Parse(reader.GetString(0)); - entry.TimeEnd = DateTime.Parse(reader.GetString(1)); - entry.Domain = reader.GetString(2); - entry.Address = reader.GetString(3); - entry.Value = 0; - try - { - entry.Value = (double)reader.GetFloat(4); - } - catch - { - var value = reader.GetValue(4); - if (value != DBNull.Value && value != null) double.TryParse( - reader.GetString(4), - out entry.Value - ); - } - // - values.Add(entry); + var value = reader.GetValue(4); + if (value != DBNull.Value && value != null) double.TryParse( + reader.GetString(4), + out entry.Value + ); } // - reader.Close(); + values.Add(entry); } + reader.Close(); return values; } @@ -309,51 +297,45 @@ string aggregator ) { var values = new List(); - //lock (dbLock) + var dbCommand = dbConnection.CreateCommand(); + string filter = ""; + var start = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd") + " 00:00:00.000000"); + dbCommand.Parameters.Add(new SQLiteParameter("@start", start.ToUniversalTime().ToString("yyyy-MM-dd HH:mm:ss.ffffff") )); + //if (domain != "" && address != "") filter = "Domain ='" + domain + "' and Address = '" + address + "' and "; + if (!string.IsNullOrEmpty(domain) && !string.IsNullOrEmpty(address)) { - var dbCommand = dbConnection.CreateCommand(); - string filter = ""; - var start = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd") + " 00:00:00.000000"); - dbCommand.Parameters.Add(new SQLiteParameter("@start", start.ToUniversalTime().ToString("yyyy-MM-dd HH:mm:ss.ffffff") )); - //if (domain != "" && address != "") filter = "Domain ='" + domain + "' and Address = '" + address + "' and "; - if (!string.IsNullOrEmpty(domain) && !string.IsNullOrEmpty(address)) + filter = " Domain=@domain AND Address=@address and "; + dbCommand.Parameters.Add(new SQLiteParameter("@domain", domain)); + dbCommand.Parameters.Add(new SQLiteParameter("@address", address)); + } + dbCommand.Parameters.Add(new SQLiteParameter("@parameterName", parameterName)); + // aggregated averages by hour + string query = "select TimeStart,TimeEnd,Domain,Address," + aggregator + "(AverageValue) as Value from ValuesHist where " + filter + "Parameter = @parameterName and TimeStart >= @start group by Domain, Address, strftime('%H', TimeStart) order by TimeStart asc;"; + dbCommand.CommandText = query; + SQLiteDataReader reader = dbCommand.ExecuteReader(); + while (reader.Read()) + { + var entry = new StatisticsEntry(); + entry.TimeStart = DateTime.Parse(reader.GetString(0)); + entry.TimeEnd = DateTime.Parse(reader.GetString(1)); + entry.Domain = reader.GetString(2); + entry.Address = reader.GetString(3); + entry.Value = 0; + try { - filter = " Domain=@domain AND Address=@address and "; - dbCommand.Parameters.Add(new SQLiteParameter("@domain", domain)); - dbCommand.Parameters.Add(new SQLiteParameter("@address", address)); + entry.Value = (double)reader.GetFloat(4); } - dbCommand.Parameters.Add(new SQLiteParameter("@parameterName", parameterName)); - // aggregated averages by hour - string query = "select TimeStart,TimeEnd,Domain,Address," + aggregator + "(AverageValue) as Value from ValuesHist where " + filter + "Parameter = @parameterName and TimeStart >= @start group by Domain, Address, strftime('%H', TimeStart) order by TimeStart asc;"; - dbCommand.CommandText = query; - SQLiteDataReader reader = dbCommand.ExecuteReader(); - // - while (reader.Read()) + catch { - var entry = new StatisticsEntry(); - entry.TimeStart = DateTime.Parse(reader.GetString(0)); - entry.TimeEnd = DateTime.Parse(reader.GetString(1)); - entry.Domain = reader.GetString(2); - entry.Address = reader.GetString(3); - entry.Value = 0; - try - { - entry.Value = (double)reader.GetFloat(4); - } - catch - { - var value = reader.GetValue(4); - if (value != DBNull.Value && value != null) double.TryParse( - reader.GetString(4), - out entry.Value - ); - } - // - values.Add(entry); + var value = reader.GetValue(4); + if (value != DBNull.Value && value != null) double.TryParse( + reader.GetString(4), + out entry.Value + ); } - // - reader.Close(); + values.Add(entry); } + reader.Close(); return values; } @@ -373,70 +355,65 @@ out entry.Value ) { var values = new List(); - //lock (dbLock) + var dbCommand = dbConnection.CreateCommand(); + string filter = ""; + string groupBy = ""; + var start = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd") + " 00:00:00.000000"); + dbCommand.Parameters.Add(new SQLiteParameter("@start", start.ToUniversalTime().ToString("yyyy-MM-dd HH:mm:ss.ffffff"))); + + if (!string.IsNullOrEmpty(domain) && !string.IsNullOrEmpty(address)) { - var dbCommand = dbConnection.CreateCommand(); - string filter = ""; - string groupBy = ""; - var start = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd") + " 00:00:00.000000"); - dbCommand.Parameters.Add(new SQLiteParameter("@start", start.ToUniversalTime().ToString("yyyy-MM-dd HH:mm:ss.ffffff"))); - - if (!string.IsNullOrEmpty(domain) && !string.IsNullOrEmpty(address)) + // detailed module stats. We set our own aggregator. (Detailed red line in chart) + filter = " Domain=@domain AND Address=@address and "; + dbCommand.Parameters.Add(new SQLiteParameter("@domain", domain)); + dbCommand.Parameters.Add(new SQLiteParameter("@address", address)); + aggregator = "AverageValue"; + } + else + { + // aggregated averages by hour + if (!string.IsNullOrEmpty(aggregator)) { - // detailed module stats. We set our own aggregator. (Detailed red line in chart) - filter = " Domain=@domain AND Address=@address and "; - dbCommand.Parameters.Add(new SQLiteParameter("@domain", domain)); - dbCommand.Parameters.Add(new SQLiteParameter("@address", address)); - aggregator = "AverageValue"; + aggregator = aggregator + "(AverageValue)"; } - else + groupBy = "group by TimeStart"; + } + string query = "select TimeStart,TimeEnd,Domain,Address," + aggregator + " as Value from ValuesHist where " + filter + " Parameter = @parameterName AND TimeStart >= @start " + groupBy + " order by TimeStart asc;"; + dbCommand.Parameters.Add(new SQLiteParameter("@parameterName", parameterName)); + dbCommand.CommandText = query; + + var reader = dbCommand.ExecuteReader(); + while (reader.Read()) + { + // If nothing is found in filter during aggregate, we get a row of all DBNulls. Skip the entry. + // NOTE: We got an exception before this check if HG sends a request for a param that has no results + // for the Parameter/TimeStart filter. We got single row of all DBNulls. + if (reader.IsDBNull(0)) { - // aggregated averages by hour - if (!string.IsNullOrEmpty(aggregator)) - { - aggregator = aggregator + "(AverageValue)"; - } - groupBy = "group by TimeStart"; + continue; } - string query = "select TimeStart,TimeEnd,Domain,Address," + aggregator + " as Value from ValuesHist where " + filter + " Parameter = @parameterName AND TimeStart >= @start " + groupBy + " order by TimeStart asc;"; - dbCommand.Parameters.Add(new SQLiteParameter("@parameterName", parameterName)); - dbCommand.CommandText = query; - - var reader = dbCommand.ExecuteReader(); - // - while (reader.Read()) + var entry = new StatisticsEntry(); + entry.TimeStart = DateTime.Parse(reader.GetString(0)); + entry.TimeEnd = DateTime.Parse(reader.GetString(1)); + entry.Domain = reader.GetString(2); + entry.Address = reader.GetString(3); + entry.Value = 0; + try { - // If nothing is found in filter during aggregate, we get a row of all DBNulls. Skip the entry. - // NOTE: We got an exception before this check if HG sends a request for a param that has no results - // for the Parameter/TimeStart filter. We got single row of all DBNulls. - if (reader.IsDBNull(0)) - { - continue; - } - var entry = new StatisticsEntry(); - entry.TimeStart = DateTime.Parse(reader.GetString(0)); - entry.TimeEnd = DateTime.Parse(reader.GetString(1)); - entry.Domain = reader.GetString(2); - entry.Address = reader.GetString(3); - entry.Value = 0; - try - { - entry.Value = (double)reader.GetFloat(4); - } - catch - { - var value = reader.GetValue(4); - if (value != DBNull.Value && value != null) double.TryParse( - reader.GetString(4), - out entry.Value - ); - } - // - values.Add(entry); + entry.Value = (double)reader.GetFloat(4); } - // - reader.Close(); + catch + { + var value = reader.GetValue(4); + if (value != DBNull.Value && value != null) double.TryParse( + reader.GetString(4), + out entry.Value + ); + } + values.Add(entry); } + reader.Close(); + return values; } @@ -459,61 +436,58 @@ out entry.Value ) { var values = new List(); - //lock (dbLock) - { - var dbCommand = dbConnection.CreateCommand(); - string filter = ""; + var dbCommand = dbConnection.CreateCommand(); + string filter = ""; - if (!string.IsNullOrEmpty(domain) && !string.IsNullOrEmpty(address)) - { - filter = " Domain=@domain AND Address=@address and "; - dbCommand.Parameters.Add(new SQLiteParameter("@domain", domain)); - dbCommand.Parameters.Add(new SQLiteParameter("@address", address)); - } - string query = ""; - if (aggregator != "") + if (!string.IsNullOrEmpty(domain) && !string.IsNullOrEmpty(address)) + { + filter = " Domain=@domain AND Address=@address and "; + dbCommand.Parameters.Add(new SQLiteParameter("@domain", domain)); + dbCommand.Parameters.Add(new SQLiteParameter("@address", address)); + } + string query = ""; + if (aggregator != "") + { + if(aggregator == "All") + query = "select TimeStart,TimeEnd,Domain,Address,CustomData,AverageValue from ValuesHist where " + filter + " Parameter = @parameterName AND " + GetParameterizedDateRangeFilter(ref dbCommand, startDate, endDate) + " order by CustomData, Domain, Address, TimeStart asc;"; + else + query = "select TimeStart,TimeEnd,Domain,Address,CustomData," + aggregator + "(AverageValue) as Value from ValuesHist where " + filter + " Parameter = @parameterName AND " + GetParameterizedDateRangeFilter(ref dbCommand, startDate, endDate) + " group by Domain, Address, strftime('%H', TimeStart) order by TimeStart asc;"; + } + else + query = "select TimeStart,TimeEnd,Domain,Address,CustomData,AverageValue from ValuesHist where " + filter + " Parameter = @parameterName AND " + GetParameterizedDateRangeFilter(ref dbCommand, startDate, endDate) + " order by TimeStart asc;"; + dbCommand.Parameters.Add(new SQLiteParameter("@parameterName", parameterName)); + + //if (domain != "" && address != "") filter = "Domain ='" + domain + "' and Address = '" + address + "' and "; + //string query = "select TimeStart,TimeEnd,Domain,Address," + aggregator + "(AverageValue) as Value from ValuesHist where " + filter + "Parameter = '" + parameterName + "' AND " + GetDateRangeFilter(startDate, endDate) + " group by Domain, Address, strftime('%H', TimeStart) order by TimeStart asc;"; + dbCommand.CommandText = query; + var reader = dbCommand.ExecuteReader(); + // + while (reader.Read()) + { + var entry = new StatisticsEntry(); + entry.TimeStart = DateTime.Parse(reader.GetString(0)); + entry.TimeEnd = DateTime.Parse(reader.GetString(1)); + entry.Domain = reader.GetString(2); + entry.Address = reader.GetString(3); + entry.CustomData = reader.GetString(4); + entry.Value = 0; + try { - if(aggregator == "All") - query = "select TimeStart,TimeEnd,Domain,Address,CustomData,AverageValue from ValuesHist where " + filter + " Parameter = @parameterName AND " + GetParameterizedDateRangeFilter(ref dbCommand, startDate, endDate) + " order by CustomData, Domain, Address, TimeStart asc;"; - else - query = "select TimeStart,TimeEnd,Domain,Address,CustomData," + aggregator + "(AverageValue) as Value from ValuesHist where " + filter + " Parameter = @parameterName AND " + GetParameterizedDateRangeFilter(ref dbCommand, startDate, endDate) + " group by Domain, Address, strftime('%H', TimeStart) order by TimeStart asc;"; + entry.Value = (double)reader.GetFloat(5); } - else - query = "select TimeStart,TimeEnd,Domain,Address,CustomData,AverageValue from ValuesHist where " + filter + " Parameter = @parameterName AND " + GetParameterizedDateRangeFilter(ref dbCommand, startDate, endDate) + " order by TimeStart asc;"; - dbCommand.Parameters.Add(new SQLiteParameter("@parameterName", parameterName)); - - //if (domain != "" && address != "") filter = "Domain ='" + domain + "' and Address = '" + address + "' and "; - //string query = "select TimeStart,TimeEnd,Domain,Address," + aggregator + "(AverageValue) as Value from ValuesHist where " + filter + "Parameter = '" + parameterName + "' AND " + GetDateRangeFilter(startDate, endDate) + " group by Domain, Address, strftime('%H', TimeStart) order by TimeStart asc;"; - dbCommand.CommandText = query; - var reader = dbCommand.ExecuteReader(); - // - while (reader.Read()) + catch { - var entry = new StatisticsEntry(); - entry.TimeStart = DateTime.Parse(reader.GetString(0)); - entry.TimeEnd = DateTime.Parse(reader.GetString(1)); - entry.Domain = reader.GetString(2); - entry.Address = reader.GetString(3); - entry.CustomData = reader.GetString(4); - entry.Value = 0; - try - { - entry.Value = (double)reader.GetFloat(5); - } - catch - { - var value = reader.GetValue(5); - if (value != DBNull.Value && value != null) double.TryParse( - reader.GetString(5), - out entry.Value - ); - } - // - values.Add(entry); + var value = reader.GetValue(5); + if (value != DBNull.Value && value != null) double.TryParse( + reader.GetString(5), + out entry.Value + ); } // - reader.Close(); + values.Add(entry); } + // + reader.Close(); return values; } @@ -546,7 +520,6 @@ string value internal bool OpenStatisticsDatabase() { bool success = false; - //lock (dbLock) if (dbConnection == null) { try @@ -574,7 +547,6 @@ internal bool OpenStatisticsDatabase() /// private void ResetStatisticsDatabase() { - //lock (dbLock) if (dbConnection != null) { var dbCommand = dbConnection.CreateCommand(); @@ -611,22 +583,19 @@ private void CleanOldValuesFromStatisticsDatabase(int numberOfDays) { if (numberOfDays > 0) { - //lock (dbLock) - { - var dbCommand = dbConnection.CreateCommand(); - dbCommand.CommandText = "DELETE FROM ValuesHist WHERE TimeStart < DATEADD(dd,-" + numberOfDays + ",GETDATE());"; - dbCommand.ExecuteNonQuery(); - dbCommand.CommandText = "VACUUM"; - dbCommand.ExecuteNonQuery(); - - HomeGenieService.LogDebug( - Domains.HomeAutomation_HomeGenie, - "Service.StatisticsLogger", - "Cleaned old values from database.", - "DayThreshold", - numberOfDays.ToString() - ); - } + var dbCommand = dbConnection.CreateCommand(); + dbCommand.CommandText = "DELETE FROM ValuesHist WHERE TimeStart < DATEADD(dd,-" + numberOfDays + ",GETDATE());"; + dbCommand.ExecuteNonQuery(); + dbCommand.CommandText = "VACUUM"; + dbCommand.ExecuteNonQuery(); + + HomeGenieService.LogDebug( + Domains.HomeAutomation_HomeGenie, + "Service.StatisticsLogger", + "Cleaned old values from database.", + "DayThreshold", + numberOfDays.ToString() + ); } } @@ -635,7 +604,6 @@ private void CleanOldValuesFromStatisticsDatabase(int numberOfDays) /// internal void CloseStatisticsDatabase() { - //lock (dbLock) if (dbConnection != null) { dbConnection.Close(); @@ -713,11 +681,18 @@ private void logInterval_Elapsed(object sender, ElapsedEventArgs eventArgs) var fileInfo = new FileInfo(dbName); if (fileInfo.Length > dbSizeLimit) { - ResetStatisticsDatabase(); + //ResetStatisticsDatabase(); // TODO: Test method below, then use that instead of rsetting whole database. //CleanOldValuesFromStatisticsDatabase(); + // Currently it deletes oldest 24 hours of data + var dateRange = GetDateRange(); + var removeOldestData = dbConnection.CreateCommand(); + removeOldestData.Parameters.Add(new SQLiteParameter("@deleteBefore", DateTimeToSQLite(dateRange.TimeStart.AddHours(24)))); + removeOldestData.CommandText = "DELETE FROM ValuesHist WHERE TimeStart < @deleteBefore"; + removeOldestData.ExecuteNonQuery(); + removeOldestData.CommandText = "VACUUM"; + removeOldestData.ExecuteNonQuery(); } - // var dbCommand = dbConnection.CreateCommand(); // "TimeStart","TimeEnd","Domain","Address","Parameter","AverageValue", "CustomData" dbCommand.Parameters.Add(new SQLiteParameter("@timestart", DateTimeToSQLite(parameter.Statistics.LastProcessedTimestap))); diff --git a/HomeGenie/Service/Utility.cs b/HomeGenie/Service/Utility.cs index 0dc8e18c4..3aacf761b 100644 --- a/HomeGenie/Service/Utility.cs +++ b/HomeGenie/Service/Utility.cs @@ -44,7 +44,7 @@ namespace HomeGenie.Service { - public static class Extensions + public static class SerializationExtensions { /// /// Perform a deep Copy of the object. @@ -63,6 +63,19 @@ public static T DeepClone(this T source) } } + public static class DateTimeExtensions + { + public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek) + { + int diff = dt.DayOfWeek - startOfWeek; + if (diff < 0) + { + diff += 7; + } + return dt.AddDays(-1 * diff).Date; + } + } + [Serializable()] public class TsList : System.Collections.Generic.List { diff --git a/HomeGenie/release_info.xml b/HomeGenie/release_info.xml index 683869a82..a969b90c7 100644 --- a/HomeGenie/release_info.xml +++ b/HomeGenie/release_info.xml @@ -1,10 +1,12 @@  HomeGenie - 1.1 beta r515 + 1.1 beta r516 Latest public release. - - Fix "Add new Program" bug (issue #259) - - Z-Wave Pepper1 database is now queried online - - Fix zwavenode.xml (node data persistence file) serialization issue - 2016-03-26T12:05:11.0000Z + - Replaced nmqtt library with M2Mqyy.Net + - Fixed Data.Module.NeedsUdpdate serialization bug + - Reset oldest 24 hours of data instead of whole DB when statistics DB exceed size limit + - Fixed Web Server (MIG) headers bug preventing client from caching files + - Added event raising when a module property is changed from the UI; deprecated HG.Automation.Programs.PostBack + 2016-04-17T15:50:28.0000Z diff --git a/HomeGenie_Linux/Packager/DEBIAN/md5sums b/HomeGenie_Linux/Packager/DEBIAN/md5sums index 17625eb2c..c676a9a92 100644 --- a/HomeGenie_Linux/Packager/DEBIAN/md5sums +++ b/HomeGenie_Linux/Packager/DEBIAN/md5sums @@ -4,8 +4,8 @@ de34fbe308eccd5e099f49ea0f2501aa usr/local/bin/homegenie/Raspberry.System.dll 513c0ab6c041976fe0bfc13a0c3f1690 usr/local/bin/homegenie/websocket-sharp.dll b17e826e40751dac378180d42a6142e5 usr/local/bin/homegenie/UnitsNet.dll cc27215f3e44078c573b0018b7f6d4c5 usr/local/bin/homegenie/homegenie_stats.db -2dd76be59c2186f8ae40372aa22eefa9 usr/local/bin/homegenie/MIG.dll -fd387d7e07d27394fb2fa2d323ff8c5c usr/local/bin/homegenie/CREDITS.TXT +1b486c9548627c5edf0d3da7525db3e7 usr/local/bin/homegenie/MIG.dll +245cb2044a26e93cf450ad64a84a749e usr/local/bin/homegenie/CREDITS.TXT ed3022822cd3dc3348bb51dc054f1574 usr/local/bin/homegenie/IronPython.dll 31bdfe51ef5cb451d0662a003773c905 usr/local/bin/homegenie/automationgroups.xml 0f71c47653734ff5b1b183543f07b16c usr/local/bin/homegenie/IronRuby.dll @@ -15,11 +15,10 @@ d41cdd52800b4bdf9c06e385d16931e3 usr/local/bin/homegenie/Linux.dll.mdb 3370764d6697cf724c34c76a789dc3fc usr/local/bin/homegenie/UPnP.dll 2e66d6a634f635382e62a014c60d45f6 usr/local/bin/homegenie/lib/shared/CronExpressionDescriptor.dll.mdb 840ba9adf7531994ad4d26319c80451c usr/local/bin/homegenie/lib/shared/ExpressionEvaluation.dll -fce6579b9380153aba1e3b7633fe82c7 usr/local/bin/homegenie/lib/shared/Nmqtt.dll 21d173f40025e0eb588f8b4ef6e60b1d usr/local/bin/homegenie/lib/shared/KNXLib.dll 3370764d6697cf724c34c76a789dc3fc usr/local/bin/homegenie/lib/shared/UPnP.dll 8f95df35b96a4ff2be7f93b06cd9d484 usr/local/bin/homegenie/lib/shared/NCrontab.pdb -f9235fe512bd41e42f6283d7a42c00f6 usr/local/bin/homegenie/lib/shared/System.Reactive.Linq.dll +5dfc87df81abacf82441bad9467d10ed usr/local/bin/homegenie/lib/shared/M2Mqtt.Net.dll.mdb 0dd334a75a245d02ed9f8811d87130de usr/local/bin/homegenie/lib/shared/System.Data.SQLite.dll 368f8df85d4623a732ea11ae2b6abf05 usr/local/bin/homegenie/lib/shared/CronExpressionDescriptor.dll 2d0ebfa31c4cb699f79af53efacee616 usr/local/bin/homegenie/lib/shared/fr/CronExpressionDescriptor.resources.dll @@ -27,19 +26,16 @@ ae0fde41ac16130b4ec74a277e3ff754 usr/local/bin/homegenie/lib/shared/NCrontab.dl 38375e91228465d53636ae7047f6f98b usr/local/bin/homegenie/lib/shared/tr/CronExpressionDescriptor.resources.dll 39b47760286956f36b316f240978abda usr/local/bin/homegenie/lib/shared/it/CronExpressionDescriptor.resources.dll 72ec76d4fc36fca61d1a2184a2f3dd22 usr/local/bin/homegenie/lib/shared/nl/CronExpressionDescriptor.resources.dll -943d65dbb4f5060c32c2da7eaf1e7cbc usr/local/bin/homegenie/lib/shared/Nmqtt.dll.mdb 95fedc3b478d5e69834836e4c46d217c usr/local/bin/homegenie/lib/shared/ru/CronExpressionDescriptor.resources.dll -6719023f2783d3357e9640a06607a8d7 usr/local/bin/homegenie/lib/shared/System.Reactive.Core.dll c3a5224804c251c4a6c628fba0618bbf usr/local/bin/homegenie/lib/shared/zh-CHS/CronExpressionDescriptor.resources.dll e029eb6f766c06a13c0fe050758cb4c2 usr/local/bin/homegenie/lib/shared/KNXLib.dll.mdb -1eaaeb4b0ac7c0b87a66425ea072ce50 usr/local/bin/homegenie/lib/shared/System.Reactive.Interfaces.dll a10fc9aa97ec8123eb53d6cce5205aad usr/local/bin/homegenie/lib/shared/SoapBox.FluentDwelling.dll e6d7626e06a8028c8759d354ac0292ef usr/local/bin/homegenie/lib/shared/uk/CronExpressionDescriptor.resources.dll -9797dd3759e5838a90f919a0a82ea1b4 usr/local/bin/homegenie/lib/shared/System.Reactive.PlatformServices.dll 7dddb28083ea3c65c55d26e11fce73ba usr/local/bin/homegenie/lib/shared/es/CronExpressionDescriptor.resources.dll b3a0e50dfe3bfb988838c3eb8892095f usr/local/bin/homegenie/lib/shared/no/CronExpressionDescriptor.resources.dll b28c8e3d0dd93543461eb01f2e5a0ee2 usr/local/bin/homegenie/lib/shared/de/CronExpressionDescriptor.resources.dll 9152e305b5638cacf958dab918e0a5b7 usr/local/bin/homegenie/lib/shared/UPnP.dll.mdb +668d68198a74c818c797bdd5f54560e2 usr/local/bin/homegenie/lib/shared/M2Mqtt.Net.dll 419c63466303958863e3cb552f2acc91 usr/local/bin/homegenie/lib/mig/MIG.Controllers.dll 4b9a7d5996299f8066ede35cd17a68b2 usr/local/bin/homegenie/lib/mig/MIG.Media.dll cb83c6c764e4cce219adfae1b177b27a usr/local/bin/homegenie/lib/mig/XTenLib.dll @@ -47,68 +43,69 @@ cb83c6c764e4cce219adfae1b177b27a usr/local/bin/homegenie/lib/mig/XTenLib.dll 4b2e8cdefcdd848a1e4293864093ff7d usr/local/bin/homegenie/lib/mig/v4l/debian64_libCameraCaptureV4L.so 6d8594a2978b5070055a4c1ad0d460f5 usr/local/bin/homegenie/lib/mig/v4l/debian64_libCameraCaptureV4L.so.gd3 9fa7c1e2979434e4fd3eeb8fa259184c usr/local/bin/homegenie/lib/mig/v4l/raspbian_libCameraCaptureV4L.so -ba0551703d17ba6c631ef115b15bbf39 usr/local/bin/homegenie/lib/mig/MIG.HomeAutomation.dll +3a851aa98abb08c9d9904a4d3726be2a usr/local/bin/homegenie/lib/mig/MIG.HomeAutomation.dll +2033b5196b81337f7affb4a6d1aedd00 usr/local/bin/homegenie/lib/mig/p1db_custom.xml ca71de7a3c556db84be080f0275a4e6d usr/local/bin/homegenie/lib/mig/MIG.Protocols.dll e2f6b564cb161a24fbd82e93352d1c9b usr/local/bin/homegenie/lib/mig/LibUsbDotNet.dll 83057cacbc8479f52daa9286abfbe280 usr/local/bin/homegenie/lib/mig/ZWaveLib.dll 13874c9fb26ea8a5ea60d59a38ba450e usr/local/bin/homegenie/lib/mig/lircremotes.xml -451906d98a1f31a32990553938684324 usr/local/bin/homegenie/programs/93.dll -19525f58c31a614cafe19d8dd4dc051c usr/local/bin/homegenie/programs/81.dll -eef113db02d5e88fa408bd9caded4405 usr/local/bin/homegenie/programs/200.dll -193ba988ad116ae0d4be7c46eee86bb5 usr/local/bin/homegenie/programs/26.dll -b89b7a0ff3dd8496e8ac315c9b621331 usr/local/bin/homegenie/programs/90.dll -45647c37ceea6c0438e2b21a16caeaf7 usr/local/bin/homegenie/programs/76.dll -abc1f4ad41eacbd09e77d583d90b88a8 usr/local/bin/homegenie/programs/84.dll -1e5cd5bea7dce9aa93e180b7f846af64 usr/local/bin/homegenie/programs/142.dll -9f1f9404201716498ea950a8187daae1 usr/local/bin/homegenie/programs/8.dll -4eaa3c8bf8f941db5e0b073efed8349d usr/local/bin/homegenie/programs/78.dll -55acb7f26e857830644b7df3db058211 usr/local/bin/homegenie/programs/145.dll -1f761a4be678e1409e94bf2e71bfd0b8 usr/local/bin/homegenie/programs/88.dll -479b6c673337a9c1f69cdf15d51e4b8e usr/local/bin/homegenie/programs/73.dll -0fcc6d87fb2f2ee8da4a7eb9a1bf7440 usr/local/bin/homegenie/programs/121.dll -d6fbbfa1d3c8be0fdd5b6feb62730742 usr/local/bin/homegenie/programs/505.dll -5b3c03964a86d3d5a0587bbf6a9a0c6f usr/local/bin/homegenie/programs/75.dll -726fbc3a8f5eb25f09b085e94126628e usr/local/bin/homegenie/programs/40.dll -586f9e130606eef67319ba706c499e85 usr/local/bin/homegenie/programs/180.dll -7418798a2bbc782810195b197623bd18 usr/local/bin/homegenie/programs/34.dll -0e8fec4b1c08881b8741dd9e5d7de410 usr/local/bin/homegenie/programs/77.dll -38e11d0aad42eed7c303cf3a99bb4238 usr/local/bin/homegenie/programs/82.dll -9d4e250755f1a8924fcf1c22dcfab104 usr/local/bin/homegenie/programs/91.dll -2493912eb96ce06300bd63ef3ba9f202 usr/local/bin/homegenie/programs/92.dll -123f9a0ac91466923f225e2fa505f002 usr/local/bin/homegenie/programs/29.dll -43cb7ef0cf6b399415c298eef6ee9dce usr/local/bin/homegenie/programs/39.dll -f85bd266c0d92a420ea12d5835156db8 usr/local/bin/homegenie/programs/7.dll -3bc33fbad015b2ffcbeb04bd03d7a509 usr/local/bin/homegenie/programs/112.dll -f7311f3ccc47f6a5b886fcae58dcd54c usr/local/bin/homegenie/programs/36.dll -8d30c644e6b8659ea656b23f66ce74c4 usr/local/bin/homegenie/programs/74.dll -3fe281853346eb3a9ea008d37def1cd2 usr/local/bin/homegenie/programs/35.dll -2ac6b7a230154313232d1a8be051ce33 usr/local/bin/homegenie/programs/6.dll -8efb9babdfbfb500e59f0cc1c10d372c usr/local/bin/homegenie/programs/16.dll +c33b9898c5e54da48fb775d8f36c2f0a usr/local/bin/homegenie/programs/93.dll +35423851b7e58f0542a9f0f64ac49261 usr/local/bin/homegenie/programs/81.dll +448d13ea6392f39391d1b074970f8c0c usr/local/bin/homegenie/programs/200.dll +af0b89ce7c292f2253311d5035874a87 usr/local/bin/homegenie/programs/26.dll +a3ac268f58ff1b30306bf3777354199d usr/local/bin/homegenie/programs/90.dll +c9c08964811b9ae19c44ce73f63dbb65 usr/local/bin/homegenie/programs/76.dll +754c3427617a3bb3fc0325e47bf0bb22 usr/local/bin/homegenie/programs/84.dll +baeccbfd5ee798550a2559313bccc191 usr/local/bin/homegenie/programs/142.dll +7c4027efab6d5ace21b9bebc47b17923 usr/local/bin/homegenie/programs/8.dll +1c6e1242190e7386148ff5006ea27a7b usr/local/bin/homegenie/programs/78.dll +c930d4f522af02c90be485424c24ae7d usr/local/bin/homegenie/programs/145.dll +cf74bfb96e19cdc7f73ff0a3f44c448a usr/local/bin/homegenie/programs/88.dll +8cc9b062678cecd80fa2d0a203de7e0d usr/local/bin/homegenie/programs/73.dll +1074b784c929192474ebea3a7b04788d usr/local/bin/homegenie/programs/121.dll +b5ec33e5a0ed4e23c3fa927df6d7d7ef usr/local/bin/homegenie/programs/505.dll +72e08bba01511cc10c378029932a3b1e usr/local/bin/homegenie/programs/75.dll +c5de0e74d52cd797626b5e9962075d4b usr/local/bin/homegenie/programs/40.dll +88ebdcc336ce4b6ce6d6b27d87d3554a usr/local/bin/homegenie/programs/180.dll +7589c8c5f9134eb9bf6e1fdd8e59acb7 usr/local/bin/homegenie/programs/34.dll +83d18bc1de2186b0ae49308e95edc55c usr/local/bin/homegenie/programs/77.dll +797821fdd0ac1c94f280d0f26d34f2c3 usr/local/bin/homegenie/programs/82.dll +1946f3a115194070658f0245cb09c0af usr/local/bin/homegenie/programs/91.dll +43002da1bccb4b925e7cef91388f2578 usr/local/bin/homegenie/programs/92.dll +a1cc45fc491983d9cfab7a9269c46304 usr/local/bin/homegenie/programs/29.dll +d3cf2b005e38fdcd30ec64150f91c9f8 usr/local/bin/homegenie/programs/39.dll +addf725141d637a73c49db30436c7ce5 usr/local/bin/homegenie/programs/7.dll +fc28f7ec309b99edcaa472bd870c7fdd usr/local/bin/homegenie/programs/112.dll +0c05d4260a3444498db693fdb7a9919f usr/local/bin/homegenie/programs/36.dll +192332f208282e40559c068faa485e67 usr/local/bin/homegenie/programs/74.dll +ec099554c398fcea43ad04f7cdde405c usr/local/bin/homegenie/programs/35.dll +05a1ce1e38861d8ffe07caa659a60429 usr/local/bin/homegenie/programs/6.dll +46e85a0b3dc1f6fd6f71c1af250e303c usr/local/bin/homegenie/programs/16.dll 6e911e0a393f7d7d6f2de035fa4f883b usr/local/bin/homegenie/Microsoft.Scripting.Metadata.dll -fad2953b7006270e2825ede85d494694 usr/local/bin/homegenie/HomeGenie.exe.mdb +5f74c914c6b799e46137a72a5b101194 usr/local/bin/homegenie/HomeGenie.exe.mdb edb4222ca9b4aa24ff7ad7dc5d63ab89 usr/local/bin/homegenie/NetClientLib.dll.mdb -198a54b1a3bba2d5300270ea6f1b9cb5 usr/local/bin/homegenie/Common.Logging.dll +b6df33c0bb71432909c278561f6fdb9c usr/local/bin/homegenie/Common.Logging.dll 037a39c0e60471e2ad6a155519aabaf8 usr/local/bin/homegenie/Common.dll.mdb 77b3a5f5184365b6d29cecfab3150d96 usr/local/bin/homegenie/Jint.dll cb2955458b620dbf5ed454b5ad1bba50 usr/local/bin/homegenie/Raspberry.IO.Components.dll 95e24268172c8908f5b2c906b90a92a7 usr/local/bin/homegenie/Newtonsoft.Json.dll 26aa2c76b7c6a102291cb3df7b06e2db usr/local/bin/homegenie/IronPython.Modules.dll 1d9ad3e990e9a228c53c63eb28f70518 usr/local/bin/homegenie/Common.dll -9b3d79ec6bcdcb6b058da166dbd359c3 usr/local/bin/homegenie/Common.Logging.Core.dll +cf846d6c77f76532f9cdab3181b71b6c usr/local/bin/homegenie/Common.Logging.Core.dll 8742ca673f11373aa5b26f966c03ef49 usr/local/bin/homegenie/LICENCE.TXT 46b7171b15421fb7e2840a8b55bbd728 usr/local/bin/homegenie/NLog.config 027d050500b7bb55a5ff9ae25aff0168 usr/local/bin/homegenie/Linux.dll d127cd699e15cf5feb4df3cdd34b77df usr/local/bin/homegenie/Raspberry.IO.InterIntegratedCircuit.dll 2074c256e8b7a372e28490a436a8e04d usr/local/bin/homegenie/NLog.dll 1dcf890d5a0ac7fdcd3db320b629a3ca usr/local/bin/homegenie/Raspberry.IO.Components.dll.config -578303123b879731b38b9e6dfc414643 usr/local/bin/homegenie/HISTORY.TXT +9f249a9560ee3a6d44dfe8ffb15fbcbc usr/local/bin/homegenie/HISTORY.TXT 3435a8ca2eb89ec7fc13a463590121c0 usr/local/bin/homegenie/README.TXT -a197878b0b27c672c8e685f61d5992c0 usr/local/bin/homegenie/programs.xml -5aadf70b56f0c48ffd8779379241ad61 usr/local/bin/homegenie/modules.xml +9846d4ca3240e91061d60364f0d06363 usr/local/bin/homegenie/programs.xml +436e6e45538eac4235415d3aa7d34acd usr/local/bin/homegenie/modules.xml a19a8070a77444aafa96d3fbe033c42e usr/local/bin/homegenie/IronRuby.Libraries.dll 456c7d0d3afb06de913ee487f333aadc usr/local/bin/homegenie/Raspberry.IO.Interop.dll -656629e29ad0a76021ba50ad0c14cf09 usr/local/bin/homegenie/html/ext/zwave/setupnode.html -161ad8e14ba01d26905fd61967354f1c usr/local/bin/homegenie/html/ext/zwave/_nodesetup.js +52a5168106ecd41e2cd42aaec938edfd usr/local/bin/homegenie/html/ext/zwave/setupnode.html +0a9e46107460e9b10e47c144493a8f88 usr/local/bin/homegenie/html/ext/zwave/_nodesetup.js fda0c2b84f26a9b7d852e5cdc7aadec1 usr/local/bin/homegenie/html/pages/control/main.html 1ee4d6908fe2722d4436c9965f827809 usr/local/bin/homegenie/html/pages/control/widgets/weather/wunderground/conditions.html e5d3df4775ab5e6bd239f74bf8c25068 usr/local/bin/homegenie/html/pages/control/widgets/weather/wunderground/images/wu_freezingrain.png @@ -394,7 +391,7 @@ a5e51ab675defdb4444683ab64714d63 usr/local/bin/homegenie/html/pages/control/wid 1b6624af9df68fa4954a9d50373ca954 usr/local/bin/homegenie/html/pages/control/widgets/template.js 363b407fb384bc0d8796b710493c92a7 usr/local/bin/homegenie/html/pages/control/_control.js d427dfc02f1f6277e41bd22f0462b618 usr/local/bin/homegenie/html/pages/events/main.html -ebbefa9357c4ca1f6892a6065da24823 usr/local/bin/homegenie/html/pages/events/_events.js +67879a89d5595c508cb517454f8574e1 usr/local/bin/homegenie/html/pages/events/_events.js a76e3bca4fbe34d3dbc2a130c5e3f17f usr/local/bin/homegenie/html/pages/apps/netplay/_slideshow.js 110a74cdaba4da7a8dbd471e4e90cc8b usr/local/bin/homegenie/html/pages/apps/netplay/slideshow.html 59c62b496ded33ba38f2b2354f792ac3 usr/local/bin/homegenie/html/pages/header.html @@ -406,7 +403,7 @@ d2ec0dc9bfb03fb7b9fe74ffa6045474 usr/local/bin/homegenie/html/pages/configure/i 79df37eba09157366cf0e5f27f795ddc usr/local/bin/homegenie/html/pages/configure/maintenance/main.html 31d907d170a44be3ed4a70e40509c2bb usr/local/bin/homegenie/html/pages/configure/maintenance/_maintenance.js d61a208f5ca3a39213dacd4e67f9b0ed usr/local/bin/homegenie/html/pages/configure/groups/_groupslist.js -e45e89787a17e10bb1b72268c2b3afd6 usr/local/bin/homegenie/html/pages/configure/groups/_groupmodules.js +0e855ab8a898ea1b8c51e8a2a3fd20a1 usr/local/bin/homegenie/html/pages/configure/groups/_groupmodules.js 61823179bb78b2328073070c2313e4c6 usr/local/bin/homegenie/html/pages/configure/groups/listgroups.html 22e243abdb9bec9b142803f856d22d97 usr/local/bin/homegenie/html/pages/configure/groups/listmodules.html bc0e46120343cd9283b92036c7d4aa48 usr/local/bin/homegenie/html/pages/configure/programengine/_groupslist.js @@ -424,29 +421,29 @@ e40e9f3d7c6470e2b2667b794ca3505e usr/local/bin/homegenie/html/pages/configure/w 38fefa63b1900f55071fa79a1005d209 usr/local/bin/homegenie/html/pages/configure/widgeteditor/editwidget.html a887fa79784e6721029b8158b4a92c4a usr/local/bin/homegenie/html/pages/configure/widgeteditor/listwidgets.html 3d85e954a150c8a1c3e001af005494b5 usr/local/bin/homegenie/html/pages/analyze/main.html -8b8235c7b0ab85ec41c45c0b7c69eda6 usr/local/bin/homegenie/html/pages/analyze/_statistics.js +5a01cababa2bcc0e91acf9f9a5319bdd usr/local/bin/homegenie/html/pages/analyze/_statistics.js 50048e2a8f01a633a34ef20f30798326 usr/local/bin/homegenie/html/locales/sv.lingo.json f0ab1246c4369e046013d92764a961b1 usr/local/bin/homegenie/html/locales/pl.lingo.json eef54d1c7ce38c6812ea95e194e2484a usr/local/bin/homegenie/html/locales/en.lingo.json -c1aafb077ef013adace381502f55ad27 usr/local/bin/homegenie/html/locales/nl.json -7bba696d2a81a0ce1b579271da91fe55 usr/local/bin/homegenie/html/locales/ru.json +7337d4495a90792a6f60be6c81aeaf96 usr/local/bin/homegenie/html/locales/nl.json +a638dbccf845389bfab903d3e038bedd usr/local/bin/homegenie/html/locales/ru.json c1e5548823bcce89f98f81b8f5eff7ef usr/local/bin/homegenie/html/locales/en.programs.json c05766eb6d2a9f2f4ad58dd871daf237 usr/local/bin/homegenie/html/locales/nl.lingo.json f200b98dbe6ed17b4385010fb0aeebe6 usr/local/bin/homegenie/html/locales/es.lingo.json a3661ccef2ce053188574e57816c959f usr/local/bin/homegenie/html/locales/it.programs.json -273a76640877fd480027d026ff0ece3c usr/local/bin/homegenie/html/locales/it.json +c92643e19cde0dbf26e1d711a8ba724c usr/local/bin/homegenie/html/locales/it.json 39202efeb92f6dac83a6b7a4ec482f7d usr/local/bin/homegenie/html/locales/ru.programs.json 42ae657831fc25ad32a3cd1d49084e92 usr/local/bin/homegenie/html/locales/fr.programs.json -2ab497d0c5558563afcb378f6fa95297 usr/local/bin/homegenie/html/locales/fr.json +1e0a8e38278f5e346552c5fcd728835b usr/local/bin/homegenie/html/locales/fr.json 82999c6df0484bdad6c1d58c3ae7dc52 usr/local/bin/homegenie/html/locales/de.lingo.json 24351c73b38c1df5950b5a75ea8fef46 usr/local/bin/homegenie/html/locales/ru.lingo.json -74c6972567867ab8e1f1eb3a27cdf02c usr/local/bin/homegenie/html/locales/sv.json +6a4983c44aa7b5f6f33d451232f0d275 usr/local/bin/homegenie/html/locales/sv.json edf7140a95f873d27e69958fb854a750 usr/local/bin/homegenie/html/locales/de.programs.json 200dc71ceec659b49b5dd8432c398cc1 usr/local/bin/homegenie/html/locales/it.lingo.json 85cc6dded2ab2be199aa13ad4a05c581 usr/local/bin/homegenie/html/locales/fr.lingo.json -b93bc988315bb58021bb25a572d0ac8b usr/local/bin/homegenie/html/locales/es.json -8349cc203051801683e9c38309c0c7b3 usr/local/bin/homegenie/html/locales/en.json -a9dc6561a46dda70ac13fb578667afe5 usr/local/bin/homegenie/html/locales/de.json +35426cebab5fb5438af2ebf2ca6a95d7 usr/local/bin/homegenie/html/locales/es.json +fe5dee8410ef04eda8f5680b7414b4f0 usr/local/bin/homegenie/html/locales/en.json +6863257f11c42e05062d8570bad0eb25 usr/local/bin/homegenie/html/locales/de.json aa124fa757aa5d7913cf38b027cc7463 usr/local/bin/homegenie/html/locales/es.programs.json a4e8c938edacd5e8c55c5441054dcf9a usr/local/bin/homegenie/html/icons.html b059dd0f6967f4e8ba50c9ca728c91b5 usr/local/bin/homegenie/html/css/jquery-ui.min.css @@ -849,7 +846,7 @@ bd006fcddf646d19684a914bff85fec7 usr/local/bin/homegenie/html/js/flot/README.tx 1920efeaabf5c1a60d7c55a0dd760779 usr/local/bin/homegenie/html/js/flot/jquery.flot.spline.js e2727c8d1313177d4fca63dff5f72a4c usr/local/bin/homegenie/html/js/error-stack-parser.min.js 523871857897f8a572f05df9e2aabf8e usr/local/bin/homegenie/html/js/jquery.knob.js -c7ecf23a0ae9852e3ea565539784b1d9 usr/local/bin/homegenie/html/js/api/homegenie.automation.js +6a12411d4eebc593e7e96dc66dc56ce1 usr/local/bin/homegenie/html/js/api/homegenie.automation.js b7ef2bf82f289e532e44a55508979e29 usr/local/bin/homegenie/html/js/api/homegenie.system.js 6daffd0c5b2f3ffe460c7802a241b5ba usr/local/bin/homegenie/html/js/api/homegenie.inc.js 335de8e57ee8ebb51d4a92ea0f633de4 usr/local/bin/homegenie/html/js/api/homegenie.statistics.js @@ -1080,7 +1077,7 @@ e68b5ba5011a20f19c2cf0910bb092fb usr/local/bin/homegenie/html/js/jquery.mobile- 1544ca9f803edff31be0577b9f985853 usr/local/bin/homegenie/html/js/jquery.mobile-1.4.5/jquery.mobile.structure-1.4.5.min.css 23968af605a5881dbb08d87ae1276b52 usr/local/bin/homegenie/html/js/jquery.mobile-1.4.5/jquery.mobile-1.4.5.min.map 0d6a0a1de599d6ae30eaa18451353542 usr/local/bin/homegenie/html/js/jquery.mobile-1.4.5/jquery.mobile.external-png-1.4.5.min.css -a4cc86814fed46a9901533a975a4b2be usr/local/bin/homegenie/html/index.html +8bf3f1c999a7644fbc1a415d7adaec37 usr/local/bin/homegenie/html/index.html 50d2d2eb4d8bca9b1fe4aad698474ebf usr/local/bin/homegenie/html/images/halt.png 11e6aed03a9856f09de50c12d6f5379c usr/local/bin/homegenie/html/images/configure.png 8fad32e6bba9a8aad97821e3f97bcd36 usr/local/bin/homegenie/html/images/interfaces/x10.png @@ -1180,14 +1177,14 @@ ce07e14186da81596585fb8970aa7d80 usr/local/bin/homegenie/html/ui/widgets/captur b8459e32556b6e692fae8f9ff81817c9 usr/local/bin/homegenie/html/ui/core/popup.cronwizard.html 40acf64097f759ba725a1afb6f7075b8 usr/local/bin/homegenie/html/ui/core/popup.cronwizard.js 9e90aad43d8acc5b45729f2296cb5907 usr/local/bin/homegenie/Raspberry.IO.SerialPeripheralInterface.dll -5b6f9354127c5939ab295256b63bee2c usr/local/bin/homegenie/HomeGenie.exe -26d84aef3befd4c05c8b4ad79facebbf usr/local/bin/homegenie/release_info.xml +f0e003c7d0a382bd0566052fae7debd6 usr/local/bin/homegenie/HomeGenie.exe +f9216f58947d48474938c108465a23b4 usr/local/bin/homegenie/release_info.xml 536920e88b28850b8df27484746134f4 usr/local/bin/homegenie/NetClientLib.dll 5405413fff79b8d9c747aa900f60f082 usr/local/bin/homegenie/sqlite3.dll 8b44d53cb2d7afc7ff215bd43df7fc40 usr/local/bin/homegenie/scheduler.xml ca7296e5c1dc0a5f0c9762733f0fb9b7 usr/local/bin/homegenie/groups.xml 61b0c6d8eb2c756355d52df2ef6170c6 usr/local/bin/homegenie/Microsoft.Scripting.dll -a852c934335fb901c0a0fec2a57510ac usr/local/bin/homegenie/homegenie_factory_config.zip +1f494840dd718b6ce23c4cc42570211d usr/local/bin/homegenie/homegenie_factory_config.zip acbb8de3a6a8f53d69957e2607097992 usr/local/bin/homegenie/DEVELOPERS.TXT ae7bbf0f4b96d2a0effd97d69befb47e usr/local/bin/homegenie/CommonMark.dll 93675a8ef36065d0c64fe1bf4fb79902 usr/local/bin/homegenie/IronRuby.Libraries.Yaml.dll