From ecd519c631b1c7bb9edea444d9beaa5916090306 Mon Sep 17 00:00:00 2001 From: Brian Clark Date: Sun, 2 Jun 2019 21:45:50 -0700 Subject: [PATCH 1/6] New Versoin. --- devicetypes/tonesto7/nest-camera.src/nest-camera.groovy | 2 +- devicetypes/tonesto7/nest-presence.src/nest-presence.groovy | 2 +- devicetypes/tonesto7/nest-protect.src/nest-protect.groovy | 2 +- devicetypes/tonesto7/nest-thermostat.src/nest-thermostat.groovy | 2 +- devicetypes/tonesto7/nest-weather.src/nest-weather.groovy | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/devicetypes/tonesto7/nest-camera.src/nest-camera.groovy b/devicetypes/tonesto7/nest-camera.src/nest-camera.groovy index 2c9ae0c89..03d2794fd 100644 --- a/devicetypes/tonesto7/nest-camera.src/nest-camera.groovy +++ b/devicetypes/tonesto7/nest-camera.src/nest-camera.groovy @@ -1500,4 +1500,4 @@ def hideCamHtml() { private def textDevName() { return "Nest Camera${appDevName()}" } private def appDevType() { return false } -private def appDevName() { return appDevType() ? " (Dev)" : "" } +private def appDevName() { return appDevType() ? " (Dev)" : "" } \ No newline at end of file diff --git a/devicetypes/tonesto7/nest-presence.src/nest-presence.groovy b/devicetypes/tonesto7/nest-presence.src/nest-presence.groovy index 0f5faaf96..844dce35f 100644 --- a/devicetypes/tonesto7/nest-presence.src/nest-presence.groovy +++ b/devicetypes/tonesto7/nest-presence.src/nest-presence.groovy @@ -587,4 +587,4 @@ def getHtml() { private def textDevName() { return "Nest Presence${appDevName()}" } private def appDevType() { return false } -private def appDevName() { return appDevType() ? " (Dev)" : "" } +private def appDevName() { return appDevType() ? " (Dev)" : "" } \ No newline at end of file diff --git a/devicetypes/tonesto7/nest-protect.src/nest-protect.groovy b/devicetypes/tonesto7/nest-protect.src/nest-protect.groovy index fabb92b73..8d7ac635e 100644 --- a/devicetypes/tonesto7/nest-protect.src/nest-protect.groovy +++ b/devicetypes/tonesto7/nest-protect.src/nest-protect.groovy @@ -1078,4 +1078,4 @@ def getInfoHtml() { private def textDevName() { return "Nest Protect${appDevName()}" } private def appDevType() { return false } -private def appDevName() { return appDevType() ? " (Dev)" : "" } +private def appDevName() { return appDevType() ? " (Dev)" : "" } \ No newline at end of file diff --git a/devicetypes/tonesto7/nest-thermostat.src/nest-thermostat.groovy b/devicetypes/tonesto7/nest-thermostat.src/nest-thermostat.groovy index c98183edb..e5508d2a8 100644 --- a/devicetypes/tonesto7/nest-thermostat.src/nest-thermostat.groovy +++ b/devicetypes/tonesto7/nest-thermostat.src/nest-thermostat.groovy @@ -4186,4 +4186,4 @@ def getCoolUsageDesc(perc, tmStr, timeType) { private def textDevName() { return "Nest Thermostat${appDevName()}" } private def appDevType() { return false } private def appDevName() { return appDevType() ? " (Dev)" : "" } -private def virtType() { return state?.virtual == true ? true : false } +private def virtType() { return state?.virtual == true ? true : false } \ No newline at end of file diff --git a/devicetypes/tonesto7/nest-weather.src/nest-weather.groovy b/devicetypes/tonesto7/nest-weather.src/nest-weather.groovy index ff4fcd50c..82ca56de7 100644 --- a/devicetypes/tonesto7/nest-weather.src/nest-weather.groovy +++ b/devicetypes/tonesto7/nest-weather.src/nest-weather.groovy @@ -1873,4 +1873,4 @@ def hideWeatherHtml() { private def textDevName() { return "Nest Weather${appDevName()}" } private def appDevType() { return false } -private def appDevName() { return appDevType() ? " (Dev)" : "" } +private def appDevName() { return appDevType() ? " (Dev)" : "" } \ No newline at end of file From 7fa8c8eda4679b27b1804de31f4ddf039ad1f695 Mon Sep 17 00:00:00 2001 From: Brian Clark Date: Sun, 26 Jan 2020 13:04:55 -0800 Subject: [PATCH 2/6] No change --- smartapps/tonesto7/nest-manager.src/nest-manager.groovy | 2 +- smartapps/tonesto7/nst-automations.src/nst-automations.groovy | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/smartapps/tonesto7/nest-manager.src/nest-manager.groovy b/smartapps/tonesto7/nest-manager.src/nest-manager.groovy index e7ef9ca43..d4bae431c 100644 --- a/smartapps/tonesto7/nest-manager.src/nest-manager.groovy +++ b/smartapps/tonesto7/nest-manager.src/nest-manager.groovy @@ -9975,4 +9975,4 @@ def textLicense() { return getWebData([uri: "https://raw.githubusercontent.com/$ def textDonateLink() { return "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=2CJEVN439EAWS" } def stIdeLink() { return "https://graph.api.smartthings.com" } def textCopyright() { return "Copyright© 2017 - Anthony S." } -def textDesc() { return "This SmartApp is used to integrate your Nest devices with SmartThings and to enable built-in automations" } +def textDesc() { return "This SmartApp is used to integrate your Nest devices with SmartThings and to enable built-in automations" } \ No newline at end of file diff --git a/smartapps/tonesto7/nst-automations.src/nst-automations.groovy b/smartapps/tonesto7/nst-automations.src/nst-automations.groovy index c1d4314eb..5dbbf3ea4 100644 --- a/smartapps/tonesto7/nst-automations.src/nst-automations.groovy +++ b/smartapps/tonesto7/nst-automations.src/nst-automations.groovy @@ -8082,4 +8082,4 @@ def appInfoDesc() { def textVersion() { return "Version: ${appVersion()}" } def textModified() { return "Updated: ${appVerDate()}" } def stIdeLink() { return "https://graph.api.smartthings.com" } -def appDesc() { return "This SmartApp is used to integrate your Nest devices with SmartThings and to enable built-in automations" } +def appDesc() { return "This SmartApp is used to integrate your Nest devices with SmartThings and to enable built-in automations" } \ No newline at end of file From d730b4895bcdb3739d507beb4f50f08e512e2ee1 Mon Sep 17 00:00:00 2001 From: Brian Clark Date: Sun, 26 Jan 2020 13:04:59 -0800 Subject: [PATCH 3/6] No change From 64d0e9216978d0a1a1dafb0198d27c3a2258ccca Mon Sep 17 00:00:00 2001 From: Brian Clark Date: Sun, 26 Jan 2020 13:05:02 -0800 Subject: [PATCH 4/6] No change From a9e938d48f260615849897a50d4c704c57032209 Mon Sep 17 00:00:00 2001 From: Brian Clark Date: Sat, 21 Aug 2021 21:26:44 -0700 Subject: [PATCH 5/6] Incorporated changes from origional repo. Pull request was giving some issues --- Data/appData.json | 33 +- Data/changelog.txt | 53 +- Data/changelog_cam.txt | 23 +- Data/changelog_prot.txt | 21 +- Data/changelog_tstat.txt | 21 +- Data/changelog_weath.txt | 22 +- Documents/css/ST-HTML.css | 644 +- Documents/css/ST-HTML.min.css | 2 +- Documents/css/diaghome.css | 11 +- Documents/css/diaghome.min.css | 2 +- Documents/css/diagpages.css | 1063 +--- Documents/css/diagpages.min.css | 2 +- Documents/css/diagpages_new.css | 463 +- Documents/css/diagpages_new.min.css | 2 +- .../Nest Developer - Nest Product.docx | Bin 133757 -> 364219 bytes .../Nest Developer - Nest Product.pdf | Bin 583519 -> 388319 bytes Documents/js/diaghome.js | 182 +- Documents/js/diaghome.min.js | 2 +- .../nest-camera.src/nest-camera.groovy | 941 ++- .../nest-presence.src/nest-presence.groovy | 165 +- .../nest-protect.src/nest-protect.groovy | 344 +- .../nest-thermostat.groovy | 979 +-- .../nest-weather.src/nest-weather.groovy | 847 +-- .../nest-manager.src/nest-manager.groovy | 5315 +++++++++-------- .../nst-automations.groovy | 2007 ++++--- 25 files changed, 6996 insertions(+), 6148 deletions(-) diff --git a/Data/appData.json b/Data/appData.json index 6aeacc347..25fab44a1 100644 --- a/Data/appData.json +++ b/Data/appData.json @@ -24,38 +24,35 @@ "setupVersion": 2, "versions": { "app": { - "ver": "5.2.3" + "ver": "5.6.4" }, "autoapp": { - "ver": "5.2.0" + "ver": "5.5.0" + }, + "storapp": { + "ver": "5.4.0" }, "thermostat": { - "ver": "5.2.0" + "ver": "5.4.6" }, "protect": { - "ver": "5.2.0" + "ver": "5.4.3" }, "camera": { - "ver": "5.2.0" + "ver": "5.4.5" }, "presence": { - "ver": "5.2.0" + "ver": "5.4.4" }, "weather": { - "ver": "5.2.0" + "ver": "5.5.2" } }, "allowInApp": false }, - "html": { - "cssVer": 1, - "cssUrl": "https://raw.githubusercontent.com/tonesto7/nest-manager/master/Documents/css/ST-HTML.min.css", - "chartJsVer": 1, - "chartJsUrl": "https://www.gstatic.com/charts/loader.js" - }, "database": { "allowRemoteDiag": true, - "disableExceptions": false, + "disableExceptions": true, "exceptionPath": "exceptionData", "newexceptionPath": "newexceptionData", "remoteDiagPath": "remoteDiagLogs" @@ -89,11 +86,11 @@ }, "healthcheck": { "camTimeout": 120, - "protWireTimeout": 35, + "protWireTimeout": 45, "protBattTimeout": 1500, - "tstatTimeout": 35, + "tstatTimeout": 45, "longTimeout": 120, - "timeout": 35, + "timeout": 45, "enabled": true, "repairEnabled": false }, @@ -101,4 +98,4 @@ "enabled": false, "path": "" } -} +} \ No newline at end of file diff --git a/Data/changelog.txt b/Data/changelog.txt index 2b2ccdb6a..6d103af8a 100644 --- a/Data/changelog.txt +++ b/Data/changelog.txt @@ -1,29 +1,50 @@ -V5.2.3 (November 8th, 2017): +V5.6.4 (May 16th, 2019): ▔▔▔▔▔▔▔▔▔▔▔ Manager App: - • FIXED: Empty Locations on New Installs - • FIXED: Tweaked the way app updates messages are determined - • ADDED: Workaround step added to stop the issues preventing users from uninstalling the App - • UPDATED: Minor Device Health Tweaks + • Token Updates -Automation App 5.1.8: -• FIXED: Tweaks to the Uninstall Process -• FIXED: More Cleanups +V5.6.2 (April 9th, 2019): +▔▔▔▔▔▔▔▔▔▔▔ +Manager App: + • Adjust for more conservative nest throttling + +V5.6.1 (March 29th, 2019): +▔▔▔▔▔▔▔▔▔▔▔ +Manager App: + • REMOVED: Local rest stream support (Until ST restores the feature) + • UPDATED: Simplified exception report logic. -V5.2.2 (November 7th, 2017): +V5.5.6 (November 14th, 2018): ▔▔▔▔▔▔▔▔▔▔▔ Manager App: - • FIXED: Minor Bug Fixes and Code Cleanups. + • Enabled Echo Speaks device support for Voice Notifications + • FIXED: Bug Fixes + +Automation App 5.4.7: + • FIXED: Bug Fixes -V5.2.1 (October 14th, 2017): +V5.5.2 (September 9th, 2018): ▔▔▔▔▔▔▔▔▔▔▔ Manager App: - • UPDATED: I have changed the app to no longer use our tokens and it will tell you when you are missing the required id and secret. + • Enabled new camera options + • FIXED: Bug Fixes + +Automation App 5.4.5: + • FIXED: Bug Fixes + +V5.5.1 (September 8th, 2018): +▔▔▔▔▔▔▔▔▔▔▔ +Manager App: + • FIXED: Bug Fixes + +Automation App 5.4.4: + • FIXED: Bug Fixes -V5.2.0 (July 22nd, 2017): +V5.5.0 (August 28th, 2018): ▔▔▔▔▔▔▔▔▔▔▔ Manager App: - • FIXED: NP issues + • UPDATED: NST Streaming is now communicates via local network (when enabled) + • FIXED: Bug Fixes -Automation App 5.1.7: -• FIXED: NP issues +Automation App 5.4.3: + • FIXED: Bug Fixes diff --git a/Data/changelog_cam.txt b/Data/changelog_cam.txt index 94a9bd92b..326e35303 100644 --- a/Data/changelog_cam.txt +++ b/Data/changelog_cam.txt @@ -1,15 +1,22 @@ -

V5.2.0 (November 8th, 2017):

+

V5.4.1 (September 8th, 2018):


    -
  • ADDED: Preference now available to only modify motion events when person detected (Requires Nest Aware Subscription!).
  • -
  • ADDED: Android Disclaimer for HTML.
  • -
  • ADDED: Added New Attribute called 'motionPerson' for WebCoRE to Monitor for changes.
  • -
  • UPDATED: Some Minor Device Health Tweaks.
  • -
  • FIXED: Refresh Button now works again on HTML (iOS only).
  • +
  • FIXED: Bug Fixes / Tweaks

-

V5.1.4 (July 21st, 2017):

+ +

V5.3.8 (July 30th, 2018):


    -
  • FIXED: The bug discovered with Storing the Images to ST is not entirely fixed but is now handled correctly and reporting the error.
  • +
  • ADDED: Now Supports filtering of Motion Zones when using Nest Aware and NST Streaming Service
  • +
  • FIXED: Bug Fixes / Tweaks
  • +
+
+ +

V5.3.7 (July 4th, 2018):

+


+
    +
  • FIXED: Performance optimizations
  • +
  • FIXED: HTML Optimizations
  • +
  • FIXED: Bug Fixes / Tweaks.
diff --git a/Data/changelog_prot.txt b/Data/changelog_prot.txt index 4771bec79..87a7b5636 100644 --- a/Data/changelog_prot.txt +++ b/Data/changelog_prot.txt @@ -1,13 +1,22 @@ -

V5.2.0 (November 8th, 2017):

+

V5.4.1 (September 8th, 2018):


    -
  • ADDED: Added Android Disclaimer for HTML.
  • -
  • UPDATED: Some Minor Device Health Tweaks.
  • -
  • FIXED: Refresh Button now works again on HTML (iOS only).
  • +
  • FIXED: Bug Fixes / Tweaks.

-

V5.1.1 (June 17th, 2017):

+ +

V5.3.6 (July 4th, 2018):


    -
  • UPDATED: Fixed command calls
  • +
  • FIXED: Updated web calls
  • +
  • FIXED: HTML Optimizations
  • +
  • FIXED: Bug Fixes / Tweaks.
  • +
+
+ +

V5.3.5 (May 31st, 2018):

+


+
    +
  • FIXED: State use reductions and cleanups
  • +
  • FIXED: Bug Fixes / Tweaks.
diff --git a/Data/changelog_tstat.txt b/Data/changelog_tstat.txt index 4f8580365..23b025dae 100644 --- a/Data/changelog_tstat.txt +++ b/Data/changelog_tstat.txt @@ -1,13 +1,22 @@ -

V5.2.0 (November 8th, 2017):

+

V5.4.1 (September 8th, 2018):


    -
  • ADDED: Added Android Disclaimer for HTML.
  • -
  • UPDATED: Some Minor Device Health Tweaks.
  • -
  • FIXED: Refresh Button now works again on HTML (iOS only).
  • +
  • FIXED: Bug Fixes / Tweaks

-

V5.1.6 (November 7th, 2017):

+ +

V5.3.6 (July 30th, 2018):


    -
  • FIXED: Cleanups and minor bugfixes.
  • +
  • FIXED: Bug Fixes / Tweaks
  • +
+
+ +

V5.3.6 (July 4th, 2018):

+


+
    +
  • ADDED: Eco is now a supported ST capability mode for thermostatMode.
  • +
  • FIXED: Updated Web calls
  • +
  • FIXED: HTML Optimizations
  • +
  • FIXED: Bug Fixes / Tweaks.
diff --git a/Data/changelog_weath.txt b/Data/changelog_weath.txt index baf0a48ee..79168fbae 100644 --- a/Data/changelog_weath.txt +++ b/Data/changelog_weath.txt @@ -1,13 +1,23 @@ -

V5.2.0 (November 8th, 2017):

+

V5.4.1 (Septemper 8th, 2018):


    -
  • ADDED: Added Android Disclaimer for HTML.
  • -
  • UPDATED: Some Minor Device Health Tweaks.
  • -
  • FIXED: Refresh Button now works again on HTML (iOS only).
  • +
  • FIXED: Exception Bug Fixes / Tweaks.

-

V5.1.2 (June 26th, 2017):

+ +

V5.3.6 (July 4th, 2018):


    -
  • UPDATED: Fixed NP when weatherunderground sends bad data
  • +
  • FIXED: Improved online status reporting based on last update from WU
  • +
  • FIXED: Fixed web calls
  • +
  • FIXED: HTML Optimizations
  • +
  • FIXED: Exception Bug Fixes / Tweaks.
  • +
+
+ +

V5.3.5 (May 31st, 2018):

+


+
    +
  • FIXED: State use reductions and cleanups
  • +
  • FIXED: Exception Bug Fixes / Tweaks.
diff --git a/Documents/css/ST-HTML.css b/Documents/css/ST-HTML.css index 6cb3b346d..106bba2c1 100644 --- a/Documents/css/ST-HTML.css +++ b/Documents/css/ST-HTML.css @@ -1,25 +1,26 @@ body { - font-family: 'San Francisco', 'Roboto', 'Arial'; - margin:0; - font-size: 3.9vw; + font-family: 'San Francisco', 'Roboto', 'Arial'; + margin: 0; + font-size: 3.9vw; } div { - margin:1px; + margin: 1px; } input[type="radio"], input[type="checkbox"] { - /* hide the inputs */ - opacity: 0; + /* hide the inputs */ + opacity: 0; } -:checked + span { - /* style for the checked/selected state */ - border: 3px solid #444; - text-shadow: 1px 1px 0 rgba(0,0,0,0.4); +:checked+span { + /* style for the checked/selected state */ + border: 3px solid #444; + text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.4); } + /**.button { background-color: #00a1db; border: none; @@ -49,19 +50,18 @@ input[type="checkbox"] { } .container { - position: relative; - width: 100%; + position: relative; + width: 100%; } -.hideable{ - transition: all ease 2s; +.hideable { + transition: all ease 2s; } - fieldset { - border: 1px solid #c0c0c0; - margin: 0 2px; - padding: 0.35em 0.625em 0.75em; + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; } button, @@ -69,18 +69,26 @@ input, optgroup, select, textarea { - color: inherit; /* 1 */ - font: inherit; /* 2 */ - margin: 0; /* 3 */ + color: inherit; + /* 1 */ + font: inherit; + /* 2 */ + margin: 0; + /* 3 */ } -h1, h2, h3, h4, h5, h6 { - padding:0px; - margin:0px; +h1, +h2, +h3, +h4, +h5, +h6 { + padding: 0px; + margin: 0px; } .topBorder { - border-top: 2px solid #00a1db; + border-top: 2px solid #00a1db; } .bottomBorder { @@ -88,149 +96,163 @@ h1, h2, h3, h4, h5, h6 { } h1 { - font-size: 6vw; - width: 100%; - text-align: center; - font-weight: normal; + font-size: 6vw; + width: 100%; + text-align: center; + font-weight: normal; } h2 { - font-size: 9vw; - text-align: center; - margin-left: auto; - margin-right: auto; - font-weight: normal; + font-size: 9vw; + text-align: center; + margin-left: auto; + margin-right: auto; + font-weight: normal; } - -h3, h3 a { - font-size: 6vw; - font-weight: bold; - text-align: center; - background: #B74C4C; - color: #f5f5f5; +h3, +h3 a { + font-size: 6vw; + font-weight: bold; + text-align: center; + background: #B74C4C; + color: #f5f5f5; } h4 { - font-size: 4vw; - font-weight: bold; - text-align: center; - background: #00a1db; - color: #f5f5f5; + font-size: 4vw; + font-weight: bold; + text-align: center; + background: #00a1db; + color: #f5f5f5; } .centerText { - text-align: center; + text-align: center; } hr { - background: #00a1db; - width: 100%; - height: 1px; -} - -.topModal, .bottomModal { - position: fixed; - font-size: 3vw; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: rgba(0,0,0,0.5); - z-index: 99999; - opacity:0; - -webkit-transition: opacity 400ms ease-in; - -moz-transition: opacity 400ms ease-in; - transition: opacity 400ms ease-in; - pointer-events: none; -} - -.topModal:target, .bottomModal:target { - opacity:1; - pointer-events: auto; -} - -.topModal > div { - width: 65%; - position: relative; - margin: 10% auto; - padding: 5px 20px 13px 20px; - border-radius: 10px; - background: #fff; -} - -.bottomModal > div { - width: 65%; - position: relative; - margin: 75% auto; - padding: 5px 20px 13px 20px; - border-radius: 10px; - background: #fff; + background: #00a1db; + width: 100%; + height: 1px; +} + +.topModal, +.bottomModal { + position: fixed; + font-size: 3vw; + top: 0; + right: 0; + bottom: 0; + left: 0; + background: rgba(0, 0, 0, 0.5); + z-index: 99999; + opacity: 0; + -webkit-transition: opacity 400ms ease-in; + -moz-transition: opacity 400ms ease-in; + transition: opacity 400ms ease-in; + pointer-events: none; +} + +.topModal:target, +.bottomModal:target { + opacity: 1; + pointer-events: auto; +} + +.topModal>div { + width: 65%; + position: relative; + margin: 10% auto; + padding: 5px 20px 13px 20px; + border-radius: 10px; + background: #fff; +} + +.bottomModal>div { + width: 65%; + position: relative; + margin: 75% auto; + padding: 5px 20px 13px 20px; + border-radius: 10px; + background: #fff; } .modal { - display: none; /* Hidden by default */ - position: fixed; /* Stay in place */ - z-index: 1; /* Sit on top */ - padding-top: 100px; /* Location of the box */ - left: 0; - top: 0; - width: 100%; /* Full width */ - height: 100%; /* Full height */ - overflow: auto; /* Enable scroll if needed */ - background-color: rgb(0,0,0); /* Fallback color */ - background-color: rgba(0,0,0,0.4); /* Black w/ opacity */ + display: none; + /* Hidden by default */ + position: fixed; + /* Stay in place */ + z-index: 1; + /* Sit on top */ + padding-top: 100px; + /* Location of the box */ + left: 0; + top: 0; + width: 100%; + /* Full width */ + height: 100%; + /* Full height */ + overflow: auto; + /* Enable scroll if needed */ + background-color: rgb(0, 0, 0); + /* Fallback color */ + background-color: rgba(0, 0, 0, 0.4); + /* Black w/ opacity */ } .modal-content { - background-color: #fefefe; - margin: auto; - padding: 20px; - border: 1px solid #888; - width: 80%; + background-color: #fefefe; + margin: auto; + padding: 20px; + border: 1px solid #888; + width: 80%; } .close { - background: #606061; - color: #FFFFFF; - line-height: 25px; - position: absolute; - right: -12px; - text-align: center; - top: -10px; - width: 24px; - text-decoration: none; - font-weight: bold; - -webkit-border-radius: 12px; - -moz-border-radius: 12px; - border-radius: 12px; - -moz-box-shadow: 1px 1px 3px #000; - -webkit-box-shadow: 1px 1px 3px #000; - box-shadow: 1px 1px 3px #000; + background: #606061; + color: #FFFFFF; + line-height: 25px; + position: absolute; + right: -12px; + text-align: center; + top: -10px; + width: 24px; + text-decoration: none; + font-weight: bold; + -webkit-border-radius: 12px; + -moz-border-radius: 12px; + border-radius: 12px; + -moz-box-shadow: 1px 1px 3px #000; + -webkit-box-shadow: 1px 1px 3px #000; + box-shadow: 1px 1px 3px #000; } -.close:hover { background: #00d9ff; } +.close:hover { + background: #00d9ff; +} - table { - border: none; - border-radius: 3px; - width:100%; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; +table { + border: none; + border-radius: 3px; + width: 100%; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; } -th, td { - box-shadow: inset 0 0px rgba(0, 0, 0, 0.25), inset 0 0px rgba(0, 0, 0, 0.25); - padding: 4px; +th, +td { + box-shadow: inset 0 0px rgba(0, 0, 0, 0.25), inset 0 0px rgba(0, 0, 0, 0.25); + padding: 4px; } th { - -webkit-font-smoothing: antialiased; - color: #f5f5f5; - text-shadow: 0 0 1px rgba(0, 0, 0, 0.1); - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - background: #00a1db; + -webkit-font-smoothing: antialiased; + color: #f5f5f5; + text-shadow: 0 0 1px rgba(0, 0, 0, 0.1); + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + background: #00a1db; } .devInfo th { @@ -238,19 +260,19 @@ th { } td { - color: grey; - text-shadow: 0 0 1px rgba(255, 255, 255, 0.1); - text-align: center; + color: grey; + text-shadow: 0 0 1px rgba(255, 255, 255, 0.1); + text-align: center; } tr { - -webkit-transition: background 0.3s, box-shadow 0.3s; - -moz-transition: background 0.3s, box-shadow 0.3s; - transition: background 0.3s, box-shadow 0.3s; + -webkit-transition: background 0.3s, box-shadow 0.3s; + -moz-transition: background 0.3s, box-shadow 0.3s; + transition: background 0.3s, box-shadow 0.3s; } .dateTimeText { - font-size: 3.4vw; + font-size: 3.4vw; } .dateTimeTextSmall { @@ -258,74 +280,146 @@ tr { } .battImg { - width:30px; height:15px; + width: 30px; + height: 15px; } .leafImg { - width: 25px; - height: 25px; + width: 25px; + height: 25px; } .column, .columns { - width: 100%; - float: left; - box-sizing: border-box; + width: 100%; + float: left; + box-sizing: border-box; } .one.column, -.one.columns { width: 4.66666666667%; } -.two.columns { width: 13.3333333333%; } -.three.columns { width: 22%; } -.four.columns { width: 32.6666666667%; } -.five.columns { width: 39.3333333333%; } -.six.columns { width: 48%; } -.seven.columns { width: 56.6666666667%; } -.eight.columns { width: 65.3333333333%; } -.nine.columns { width: 74.0%; } -.ten.columns { width: 82.6666666667%; } -.eleven.columns { width: 91.3333333333%; } -.twelve.columns { width: 100%; margin-left: 0; } +.one.columns { + width: 4.66666666667%; +} + +.two.columns { + width: 13.3333333333%; +} + +.three.columns { + width: 22%; +} + +.four.columns { + width: 32.6666666667%; +} + +.five.columns { + width: 39.3333333333%; +} + +.six.columns { + width: 48%; +} + +.seven.columns { + width: 56.6666666667%; +} + +.eight.columns { + width: 65.3333333333%; +} + +.nine.columns { + width: 74.0%; +} + +.ten.columns { + width: 82.6666666667%; +} + +.eleven.columns { + width: 91.3333333333%; +} + +.twelve.columns { + width: 100%; + margin-left: 0; +} /* Offsets */ + .offset-by-one.column, -.offset-by-one.columns { margin-left: 8.66666666667%; } +.offset-by-one.columns { + margin-left: 8.66666666667%; +} + .offset-by-two.column, -.offset-by-two.columns { margin-left: 17.3333333333%; } +.offset-by-two.columns { + margin-left: 17.3333333333%; +} + .offset-by-three.column, -.offset-by-three.columns { margin-left: 26%; } +.offset-by-three.columns { + margin-left: 26%; +} + .offset-by-four.column, -.offset-by-four.columns { margin-left: 34.6666666667%; } +.offset-by-four.columns { + margin-left: 34.6666666667%; +} + .offset-by-five.column, -.offset-by-five.columns { margin-left: 43.3333333333%; } +.offset-by-five.columns { + margin-left: 43.3333333333%; +} + .offset-by-six.column, -.offset-by-six.columns { margin-left: 52%; } +.offset-by-six.columns { + margin-left: 52%; +} + .offset-by-seven.column, -.offset-by-seven.columns { margin-left: 60.6666666667%; } +.offset-by-seven.columns { + margin-left: 60.6666666667%; +} + .offset-by-eight.column, -.offset-by-eight.columns { margin-left: 69.3333333333%; } +.offset-by-eight.columns { + margin-left: 69.3333333333%; +} + .offset-by-nine.column, -.offset-by-nine.columns { margin-left: 78.0%; } +.offset-by-nine.columns { + margin-left: 78.0%; +} + .offset-by-ten.column, -.offset-by-ten.columns { margin-left: 86.6666666667%; } -.offset-by-eleven.column, -.offset-by-eleven.columns { margin-left: 95.3333333333%; } +.offset-by-ten.columns { + margin-left: 86.6666666667%; +} +.offset-by-eleven.column, +.offset-by-eleven.columns { + margin-left: 95.3333333333%; +} .container:after, .row:after, .u-cf { - content: ""; - display: table; - clear: both; } + content: ""; + display: table; + clear: both; +} .row { - width:100%; - margin:2px; + width: 100%; + margin: 2px; } + /*<--Bootstrap button -->*/ + .btn { display: inline-block; padding: 6px 12px; @@ -337,138 +431,172 @@ tr { white-space: nowrap; vertical-align: middle; -ms-touch-action: manipulation; - touch-action: manipulation; + touch-action: manipulation; cursor: pointer; -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; background-image: none; border: 1px solid transparent; border-radius: 4px; } + .btn-info { - color: #fff; - background-color: #00a1db; - border-color: #00a1db; + color: #fff; + background-color: #00a1db; + border-color: #00a1db; } -.red{ - background-color:#db3a00; +.red { + background-color: #db3a00; } -.yellow{ - background-color:#dba800; +.yellow { + background-color: #dba800; } .redAlertBanner { - font-size: 6vw; - font-weight: bold; - text-align: center; - background: #B74C4C; - color: #f5f5f5; - padding: 8px 0px; + font-size: 6vw; + font-weight: bold; + text-align: center; + background: #B74C4C; + color: #f5f5f5; + padding: 8px 0px; } .brightRedAlertBanner { - font-size: 6vw; - font-weight: bold; - text-align: center; - background: #ff3b19; - color: #f5f5f5; - padding: 8px 0px; + font-size: 6vw; + font-weight: bold; + text-align: center; + background: #ff3b19; + color: #f5f5f5; + padding: 8px 0px; } .greenAlertBanner { - font-size: 6vw; - font-weight: bold; - text-align: center; - background: #00ff00; - -webkit-text-stroke: 1.0px #000000; - -webkit-text-fill-color: #FFFFFF; - padding: 8px 0px; + font-size: 6vw; + font-weight: bold; + text-align: center; + background: #00ff00; + -webkit-text-stroke: 1.0px #000000; + -webkit-text-fill-color: #FFFFFF; + padding: 8px 0px; } .androidAlertBanner { - font-size: 6vw; - font-weight: bold; - text-align: center; - background: #6f786f; - -webkit-text-stroke: 1.0px #000000; - -webkit-text-fill-color: #FFFFFF; - padding: 8px 0px; + font-size: 6vw; + font-weight: bold; + text-align: center; + background: #6f786f; + -webkit-text-stroke: 1.0px #000000; + -webkit-text-fill-color: #FFFFFF; + padding: 8px 0px; } .orangeAlertBanner { - font-size: 6vw; - font-weight: bold; - text-align: center; - background: #ffae19; - color: #f5f5f5; - padding: 8px 0px; + font-size: 6vw; + font-weight: bold; + text-align: center; + background: #ffae19; + color: #f5f5f5; + padding: 8px 0px; } .blueTitle { - font-size: 4vw; - font-weight: bold; - text-align: center; - background: #00a1db; - color: #f5f5f5; + font-size: 4vw; + font-weight: bold; + text-align: center; + background: #00a1db; + color: #f5f5f5; } .alertModalTitle { - font-size: 22px; - font-weight: bold; - text-align: center; - background: transparent; - color: black; + font-size: 22px; + font-weight: bold; + text-align: center; + background: transparent; + color: black; } .sched h3 { - font-size: 4.6vw; - background: #00a1db; + font-size: 4.6vw; + background: #00a1db; } .sched h4 { - font-size: 3.8vw; - background: #00a1db; + font-size: 3.8vw; + background: #00a1db; } .sched col { - font-size: 4.0vw; + font-size: 4.0vw; } .slideFooterMsg { font-size: 3.0vw; padding: 20px; - margin:1em auto; + margin: 1em auto; } .pageFooterBtn { padding: 10px; - horizontal-align: center; + /* horizontal-align: center; */ text-align: center; } .schedFill { - background: gray; - color: white; - text-align: center; - padding: 4px; + background: gray; + color: white; + text-align: center; + padding: 4px; } .tempSrc th { - font-size: 4.1vw; - font-weight: bold; - background: transparent; - text-decoration: underline; - color: gray; + font-size: 4.1vw; + font-weight: bold; + background: transparent; + text-decoration: underline; + color: gray; +} + +.slideFooterBtn { + font-size: 1rem; + text-align: center; + padding: 0; +} + +.slideFooterText { + font-size: 3.0vw; + margin: 1em auto; + padding: 0; + text-decoration: underline; +} + +.pageFooterCls { + text-align: center; } .swiper-container { width: 95%; min-height: 300px; - padding: 10px; + padding: 0 10px !important; +} + +.swiper-pagination-bullet { + width: 20px; + height: 20px; + text-align: center; + line-height: 20px; + font-size: 10px; + color: #000; + opacity: 1; + background: rgba(0, 0, 0, 0.2); +} + +.swiper-pagination-bullet-active { + color: #fff; + background: #007aff; } .default-container { @@ -477,12 +605,14 @@ tr { } .vex.vex-theme-default .vex-content { - width: 95%; padding: 3px; + width: 95%; + padding: 3px; } .alarmImg { - vertical-align: top; - width:60px; height:60px; + vertical-align: top; + width: 60px; + height: 60px; } .alarmWarnCap { @@ -501,7 +631,7 @@ tr { } .sectionBg { - box-shadow: 0 1px 1px rgba(0,0,0,0.16), 0 1px 1px rgba(0,0,0,0.23); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.16), 0 1px 1px rgba(0, 0, 0, 0.23); background: white; } @@ -513,7 +643,7 @@ tr { } .sectionBg table { - box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23); + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.16), 0 3px 6px rgba(0, 0, 0, 0.23); background: white; } @@ -543,11 +673,13 @@ tr { background: transparent; } -.chgLog ul, li { +.chgLog ul, +li { font-size: 12px; padding: 0 10px 0 10px; Margin: 0; } + .chgLog p { font-size: 12px; -} +} \ No newline at end of file diff --git a/Documents/css/ST-HTML.min.css b/Documents/css/ST-HTML.min.css index 7b6bb13ad..33096e6c7 100644 --- a/Documents/css/ST-HTML.min.css +++ b/Documents/css/ST-HTML.min.css @@ -1 +1 @@ -body{font-family:'San Francisco','Roboto','Arial';margin:0;font-size:3.9vw}div{margin:1px}input[type="radio"],input[type="checkbox"]{opacity:0}:checked+span{border:3px solid #444;text-shadow:1px 1px 0 rgba(0,0,0,0.4)}.button{background:white;background-image:linear-gradient(rgba(255,255,255,0),rgba(0,0,0,0.1));border:1px solid #ccc;border-radius:5px;color:#404040;display:block;width:30%;padding:.5em;outline:0}.container{position:relative;width:100%}.hideable{transition:all ease 2s}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:.35em .625em .75em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}h1,h2,h3,h4,h5,h6{padding:0;margin:0}.topBorder{border-top:2px solid #00a1db}.bottomBorder{border-bottom:2px solid #808080}h1{font-size:6vw;width:100%;text-align:center;font-weight:normal}h2{font-size:9vw;text-align:center;margin-left:auto;margin-right:auto;font-weight:normal}h3,h3 a{font-size:6vw;font-weight:bold;text-align:center;background:#b74c4c;color:#f5f5f5}h4{font-size:4vw;font-weight:bold;text-align:center;background:#00a1db;color:#f5f5f5}.centerText{text-align:center}hr{background:#00a1db;width:100%;height:1px}.topModal,.bottomModal{position:fixed;font-size:3vw;top:0;right:0;bottom:0;left:0;background:rgba(0,0,0,0.5);z-index:99999;opacity:0;-webkit-transition:opacity 400ms ease-in;-moz-transition:opacity 400ms ease-in;transition:opacity 400ms ease-in;pointer-events:none}.topModal:target,.bottomModal:target{opacity:1;pointer-events:auto}.topModal>div{width:65%;position:relative;margin:10% auto;padding:5px 20px 13px 20px;border-radius:10px;background:#fff}.bottomModal>div{width:65%;position:relative;margin:75% auto;padding:5px 20px 13px 20px;border-radius:10px;background:#fff}.modal{display:none;position:fixed;z-index:1;padding-top:100px;left:0;top:0;width:100%;height:100%;overflow:auto;background-color:#000;background-color:rgba(0,0,0,0.4)}.modal-content{background-color:#fefefe;margin:auto;padding:20px;border:1px solid #888;width:80%}.close{background:#606061;color:#fff;line-height:25px;position:absolute;right:-12px;text-align:center;top:-10px;width:24px;text-decoration:none;font-weight:bold;-webkit-border-radius:12px;-moz-border-radius:12px;border-radius:12px;-moz-box-shadow:1px 1px 3px #000;-webkit-box-shadow:1px 1px 3px #000;box-shadow:1px 1px 3px #000}.close:hover{background:#00d9ff}table{border:0;border-radius:3px;width:100%;-webkit-border-radius:3px;-moz-border-radius:3px}th,td{box-shadow:inset 0 0 rgba(0,0,0,0.25),inset 0 0 rgba(0,0,0,0.25);padding:4px}th{-webkit-font-smoothing:antialiased;color:#f5f5f5;text-shadow:0 0 1px rgba(0,0,0,0.1);-webkit-border-radius:2px;-moz-border-radius:2px;background:#00a1db}.devInfo th{font-size:3.8vw}td{color:grey;text-shadow:0 0 1px rgba(255,255,255,0.1);text-align:center}tr{-webkit-transition:background .3s,box-shadow .3s;-moz-transition:background .3s,box-shadow .3s;transition:background .3s,box-shadow .3s}.dateTimeText{font-size:3.4vw}.dateTimeTextSmall{font-size:2.8vw}.battImg{width:30px;height:15px}.leafImg{width:25px;height:25px}.column,.columns{width:100%;float:left;box-sizing:border-box}.one.column,.one.columns{width:4.66666666667%}.two.columns{width:13.3333333333%}.three.columns{width:22%}.four.columns{width:32.6666666667%}.five.columns{width:39.3333333333%}.six.columns{width:48%}.seven.columns{width:56.6666666667%}.eight.columns{width:65.3333333333%}.nine.columns{width:74.0%}.ten.columns{width:82.6666666667%}.eleven.columns{width:91.3333333333%}.twelve.columns{width:100%;margin-left:0}.offset-by-one.column,.offset-by-one.columns{margin-left:8.66666666667%}.offset-by-two.column,.offset-by-two.columns{margin-left:17.3333333333%}.offset-by-three.column,.offset-by-three.columns{margin-left:26%}.offset-by-four.column,.offset-by-four.columns{margin-left:34.6666666667%}.offset-by-five.column,.offset-by-five.columns{margin-left:43.3333333333%}.offset-by-six.column,.offset-by-six.columns{margin-left:52%}.offset-by-seven.column,.offset-by-seven.columns{margin-left:60.6666666667%}.offset-by-eight.column,.offset-by-eight.columns{margin-left:69.3333333333%}.offset-by-nine.column,.offset-by-nine.columns{margin-left:78.0%}.offset-by-ten.column,.offset-by-ten.columns{margin-left:86.6666666667%}.offset-by-eleven.column,.offset-by-eleven.columns{margin-left:95.3333333333%}.container:after,.row:after,.u-cf{content:"";display:table;clear:both}.row{width:100%;margin:2px}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:normal;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn-info{color:#fff;background-color:#00a1db;border-color:#00a1db}.red{background-color:#db3a00}.yellow{background-color:#dba800}.redAlertBanner{font-size:6vw;font-weight:bold;text-align:center;background:#b74c4c;color:#f5f5f5;padding:8px 0}.brightRedAlertBanner{font-size:6vw;font-weight:bold;text-align:center;background:#ff3b19;color:#f5f5f5;padding:8px 0}.greenAlertBanner{font-size:6vw;font-weight:bold;text-align:center;background:#0f0;-webkit-text-stroke:1.0px #000;-webkit-text-fill-color:#fff;padding:8px 0}.androidAlertBanner{font-size:6vw;font-weight:bold;text-align:center;background:#6f786f;-webkit-text-stroke:1.0px #000;-webkit-text-fill-color:#fff;padding:8px 0}.orangeAlertBanner{font-size:6vw;font-weight:bold;text-align:center;background:#ffae19;color:#f5f5f5;padding:8px 0}.blueTitle{font-size:4vw;font-weight:bold;text-align:center;background:#00a1db;color:#f5f5f5}.alertModalTitle{font-size:22px;font-weight:bold;text-align:center;background:transparent;color:black}.sched h3{font-size:4.6vw;background:#00a1db}.sched h4{font-size:3.8vw;background:#00a1db}.sched col{font-size:4.0vw}.slideFooterMsg{font-size:3.0vw;padding:20px;margin:1em auto}.pageFooterBtn{padding:10px;horizontal-align:center;text-align:center}.schedFill{background:gray;color:white;text-align:center;padding:4px}.tempSrc th{font-size:4.1vw;font-weight:bold;background:transparent;text-decoration:underline;color:gray}.swiper-container{width:95%;min-height:300px;padding:10px}.default-container{width:95%;padding:10px}.vex.vex-theme-default .vex-content{width:95%;padding:3px}.alarmImg{vertical-align:top;width:60px;height:60px}.alarmWarnCap{display:block;color:#e89a15}.alarmEmerCap{display:block;color:#df5316}.alarmClearCap{display:block;color:gray}.sectionBg{box-shadow:0 1px 1px rgba(0,0,0,0.16),0 1px 1px rgba(0,0,0,0.23);background:white}.sectionBg h3{background-color:#00a1db;font-size:4.5vw;padding:.6vw;text-shadow:1px 1px 1px black}.sectionBg table{box-shadow:0 3px 6px rgba(0,0,0,0.16),0 3px 6px rgba(0,0,0,0.23);background:white}.devInfo th{color:#00a1db;background:transparent;font-size:3.8vw;text-shadow:0 0 1px lightgray;text-decoration:underline}.redText{color:red}.orangeText{color:orange}.chgLog div{padding:0 5px 0 5px;text-align:left}.chgLog h3{background-color:transparent;background:transparent}.chgLog ul,li{font-size:12px;padding:0 10px 0 10px;Margin:0}.chgLog p{font-size:12px} \ No newline at end of file +.androidAlertBanner,.greenAlertBanner{-webkit-text-stroke:1px #000;-webkit-text-fill-color:#FFF}body{font-family:'San Francisco',Roboto,Arial;margin:0;font-size:3.9vw}div{margin:1px}input[type=radio],input[type=checkbox]{opacity:0}:checked+span{border:3px solid #444;text-shadow:1px 1px 0 rgba(0,0,0,.4)}.button{background:#fff;background-image:linear-gradient(rgba(255,255,255,0),rgba(0,0,0,.1));border:1px solid #ccc;border-radius:5px;color:#404040;display:block;width:30%;padding:.5em;outline:0}h4,hr{background:#00a1db}h3,h3 a,h4{color:#f5f5f5}.container,h1,hr{width:100%}.container{position:relative}.hideable{transition:all ease 2s}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}h1,h2{text-align:center;font-weight:400}h1,h2,h3,h4,h5,h6{padding:0;margin:0}.topBorder{border-top:2px solid #00a1db}.bottomBorder{border-bottom:2px solid grey}h1{font-size:6vw}h2{font-size:9vw;margin-left:auto;margin-right:auto}.close,h3,h3 a,h4{font-weight:700;text-align:center}h3,h3 a{font-size:6vw;background:#B74C4C}h4{font-size:4vw}.centerText{text-align:center}hr{height:1px}.bottomModal,.topModal{position:fixed;font-size:3vw;top:0;right:0;bottom:0;left:0;background:rgba(0,0,0,.5);z-index:99999;opacity:0;-webkit-transition:opacity .4s ease-in;-moz-transition:opacity .4s ease-in;transition:opacity .4s ease-in;pointer-events:none}.bottomModal>div,.topModal>div{width:65%;position:relative;padding:5px 20px 13px;border-radius:10px;background:#fff}.bottomModal:target,.topModal:target{opacity:1;pointer-events:auto}.topModal>div{margin:10% auto}.bottomModal>div{margin:75% auto}.modal{display:none;position:fixed;z-index:1;padding-top:100px;left:0;top:0;width:100%;height:100%;overflow:auto;background-color:#000;background-color:rgba(0,0,0,.4)}.modal-content{background-color:#fefefe;margin:auto;padding:20px;border:1px solid #888;width:80%}.close{background:#606061;color:#FFF;line-height:25px;position:absolute;right:-12px;top:-10px;width:24px;text-decoration:none;-webkit-border-radius:12px;-moz-border-radius:12px;border-radius:12px;-moz-box-shadow:1px 1px 3px #000;-webkit-box-shadow:1px 1px 3px #000;box-shadow:1px 1px 3px #000}.devInfo th,.slideFooterText,.tempSrc th{text-decoration:underline}.close:hover{background:#00d9ff}table{border:none;border-radius:3px;width:100%;-webkit-border-radius:3px;-moz-border-radius:3px}td,th{box-shadow:inset 0 0 rgba(0,0,0,.25),inset 0 0 rgba(0,0,0,.25);padding:4px}th{-webkit-font-smoothing:antialiased;color:#f5f5f5;text-shadow:0 0 1px rgba(0,0,0,.1);-webkit-border-radius:2px;-moz-border-radius:2px;background:#00a1db}td{color:grey;text-shadow:0 0 1px rgba(255,255,255,.1);text-align:center}tr{-webkit-transition:background .3s,box-shadow .3s;-moz-transition:background .3s,box-shadow .3s;transition:background .3s,box-shadow .3s}.dateTimeText{font-size:3.4vw}.dateTimeTextSmall{font-size:2.8vw}.battImg{width:30px;height:15px}.leafImg{width:25px;height:25px}.column,.columns{width:100%;float:left;box-sizing:border-box}.one.column,.one.columns{width:4.66666666667%}.two.columns{width:13.3333333333%}.three.columns{width:22%}.four.columns{width:32.6666666667%}.five.columns{width:39.3333333333%}.six.columns{width:48%}.seven.columns{width:56.6666666667%}.eight.columns{width:65.3333333333%}.nine.columns{width:74%}.ten.columns{width:82.6666666667%}.eleven.columns{width:91.3333333333%}.twelve.columns{width:100%;margin-left:0}.offset-by-one.column,.offset-by-one.columns{margin-left:8.66666666667%}.offset-by-two.column,.offset-by-two.columns{margin-left:17.3333333333%}.offset-by-three.column,.offset-by-three.columns{margin-left:26%}.offset-by-four.column,.offset-by-four.columns{margin-left:34.6666666667%}.offset-by-five.column,.offset-by-five.columns{margin-left:43.3333333333%}.offset-by-six.column,.offset-by-six.columns{margin-left:52%}.offset-by-seven.column,.offset-by-seven.columns{margin-left:60.6666666667%}.offset-by-eight.column,.offset-by-eight.columns{margin-left:69.3333333333%}.offset-by-nine.column,.offset-by-nine.columns{margin-left:78%}.offset-by-ten.column,.offset-by-ten.columns{margin-left:86.6666666667%}.offset-by-eleven.column,.offset-by-eleven.columns{margin-left:95.3333333333%}.container:after,.row:after,.u-cf{content:"";display:table;clear:both}.row{width:100%;margin:2px}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.androidAlertBanner,.brightRedAlertBanner,.greenAlertBanner,.orangeAlertBanner,.redAlertBanner{font-size:6vw;padding:8px 0}.btn-info{color:#fff;background-color:#00a1db;border-color:#00a1db}.blueTitle,.brightRedAlertBanner,.orangeAlertBanner,.redAlertBanner{color:#f5f5f5;font-weight:700;text-align:center}.red{background-color:#db3a00}.yellow{background-color:#dba800}.redAlertBanner{background:#B74C4C}.brightRedAlertBanner{background:#ff3b19}.greenAlertBanner{font-weight:700;text-align:center;background:#0f0}.androidAlertBanner{font-weight:700;text-align:center;background:#6f786f}.orangeAlertBanner{background:#ffae19}.blueTitle{font-size:4vw;background:#00a1db}.alertModalTitle{font-size:22px;font-weight:700;text-align:center;background:0 0;color:#000}.sched h3{font-size:4.6vw;background:#00a1db}.sched h4{font-size:3.8vw;background:#00a1db}.sched col{font-size:4vw}.slideFooterMsg{font-size:3vw;padding:20px;margin:1em auto}.pageFooterBtn{padding:10px;text-align:center}.schedFill{background:gray;color:#fff;text-align:center;padding:4px}.tempSrc th{font-size:4.1vw;font-weight:700;background:0 0;color:gray}.slideFooterBtn{font-size:1rem;text-align:center;padding:0}.slideFooterText{font-size:3vw;margin:1em auto;padding:0}.pageFooterCls{text-align:center}.swiper-container{width:95%;min-height:300px;padding:0 10px!important}.swiper-pagination-bullet{width:20px;height:20px;text-align:center;line-height:20px;font-size:10px;color:#000;opacity:1;background:rgba(0,0,0,.2)}.swiper-pagination-bullet-active{color:#fff;background:#007aff}.default-container{width:95%;padding:10px}.vex.vex-theme-default .vex-content{width:95%;padding:3px}.alarmImg{vertical-align:top;width:60px;height:60px}.alarmWarnCap{display:block;color:#e89a15}.alarmEmerCap{display:block;color:#df5316}.alarmClearCap{display:block;color:gray}.sectionBg{box-shadow:0 1px 1px rgba(0,0,0,.16),0 1px 1px rgba(0,0,0,.23);background:#fff}.sectionBg h3{background-color:#00a1db;font-size:4.5vw;padding:.6vw;text-shadow:1px 1px 1px #000}.sectionBg table{box-shadow:0 3px 6px rgba(0,0,0,.16),0 3px 6px rgba(0,0,0,.23);background:#fff}.chgLog h3,.devInfo th{background:0 0}.devInfo th{color:#00a1db;font-size:3.8vw;text-shadow:0 0 1px #d3d3d3}.chgLog p,.chgLog ul,li{font-size:12px}.redText{color:red}.orangeText{color:orange}.chgLog div{padding:0 5px;text-align:left}.chgLog ul,li{padding:0 10px;Margin:0} \ No newline at end of file diff --git a/Documents/css/diaghome.css b/Documents/css/diaghome.css index 61fe1d42d..d9d89312d 100644 --- a/Documents/css/diaghome.css +++ b/Documents/css/diaghome.css @@ -64,7 +64,7 @@ body { } .shortcutBtns { - width: 140px; + width: 150px; } .stateUseCircText { @@ -79,7 +79,8 @@ body { font-size: 14px; } -.percircle.blue2 .bar, .percircle.blue2 .fill { +.percircle.blue2 .bar, +.percircle.blue2 .fill { border-color: #049dff; } @@ -87,7 +88,8 @@ body { color: #049dff; } -.percircle.blue2.dark .bar, .percircle.blue2.dark .fill { +.percircle.blue2.dark .bar, +.percircle.blue2.dark .fill { border-color: #049dff; } @@ -160,6 +162,7 @@ body { border-width: 1px; } + /************************************** BACK TO TOP CSS BUTTON ***************************************/ @@ -181,4 +184,4 @@ body { #scrollTopBtn:hover { background-color: #3174AE; -} +} \ No newline at end of file diff --git a/Documents/css/diaghome.min.css b/Documents/css/diaghome.min.css index f489b7dd8..087a37a27 100644 --- a/Documents/css/diaghome.min.css +++ b/Documents/css/diaghome.min.css @@ -1 +1 @@ -html{position:relative;min-height:100%;min-width:375px}body{margin-bottom:20px}.container{width:auto;max-width:800px;padding:0 15px}#top-hdr{height:auto;min-width:375px}.in-middle{vertical-align:middle}.left-head-col{padding:1.2em 0 0 20px}.right-head-col{padding:1.8em 40px 0 0}.centerText{text-align:center}.links{padding:10px;font-size:18px}.footer{position:relative;bottom:0;width:100%;max-width:800px;height:20px;line-height:20px;padding-bottom:50px}.footerText{text-align:center;font-size:14px}.logoIcn{width:1.7em;height:auto;max-width:48px;max-height:48px}.shortcutBtns{width:140px}.stateUseCircText{text-align:center;color:gray;font-size:13px}.stateUseTitleText{text-align:center;color:black;font-size:14px}.percircle.blue2 .bar,.percircle.blue2 .fill{border-color:#049dff}.percircle.blue2:hover>span{color:#049dff}.percircle.blue2.dark .bar,.percircle.blue2.dark .fill{border-color:#049dff}.percircle.blue2.dark:hover>span{color:#049dff}.refresh-btn{color:black;width:auto;height:auto;max-width:90px;max-height:40px;font-size:1.0em;border-radius:.4em;background-color:white;border-color:gray;border-style:solid;border-width:1px}#rfrshBtn:after{content:' Refresh'}@media screen and (max-width:520px){#rfrshBtn:after{content:''}#rfrshBtn{font-size:1.1em}}.panel-title-text{font-size:24px}.subpanel-title-text{font-size:18px}.panel-border{padding:0 15px;border-radius:1em;border-style:solid;border-color:lightgray;border-style:solid;border-width:1px}.install-content{padding:7px 0 0 0}.title-text{font-size:2.0em}.home-btn{width:auto;height:auto;max-width:80px;max-height:40px;font-size:1.1em;border-radius:.4em;background-color:white;border-color:gray;border-style:solid;border-width:1px}#scrollTopBtn{display:none;position:fixed;bottom:20px;right:30px;z-index:99;border:0;outline:0;background-color:gray;color:white;cursor:pointer;padding:15px;border-radius:10px}#scrollTopBtn:hover{background-color:#3174ae} \ No newline at end of file +#top-hdr,html{min-width:375px}.footer,html{position:relative}.centerText,.footerText,.stateUseCircText{text-align:center}.percircle.blue2 .bar,.percircle.blue2 .fill,.percircle.blue2.dark .bar,.percircle.blue2.dark .fill{border-color:#049dff}html{min-height:100%}body{margin-bottom:20px}.container{width:auto;max-width:800px;padding:0 15px}#top-hdr{height:auto}.in-middle{vertical-align:middle}.left-head-col{padding:1.2em 0 0 20px}.right-head-col{padding:1.8em 40px 0 0}.links{padding:10px;font-size:18px}.footer{bottom:0;width:100%;max-width:800px;height:20px;line-height:20px;padding-bottom:50px}.footerText{font-size:14px}.logoIcn{width:1.7em;height:auto;max-width:48px;max-height:48px}.shortcutBtns{width:150px}.home-btn,.refresh-btn{width:auto;height:auto;max-height:40px;background-color:#fff;border-style:solid;border-width:1px}.stateUseCircText{color:gray;font-size:13px}.stateUseTitleText{text-align:center;color:#000;font-size:14px}.percircle.blue2.dark:hover>span,.percircle.blue2:hover>span{color:#049dff}.refresh-btn{color:#000;max-width:90px;font-size:1em;border-radius:.4em;border-color:gray}#rfrshBtn:after{content:' Refresh'}@media screen and (max-width:520px){#rfrshBtn:after{content:''}#rfrshBtn{font-size:1.1em}}.panel-title-text{font-size:24px}.subpanel-title-text{font-size:18px}.panel-border{padding:0 15px;border-radius:1em;border-color:#d3d3d3;border-style:solid;border-width:1px}.install-content{padding:7px 0 0}.title-text{font-size:2em}.home-btn{max-width:80px;font-size:1.1em;border-radius:.4em;border-color:gray}#scrollTopBtn{display:none;position:fixed;bottom:20px;right:30px;z-index:99;border:none;outline:0;background-color:gray;color:#fff;cursor:pointer;padding:15px;border-radius:10px}#scrollTopBtn:hover{background-color:#3174AE} \ No newline at end of file diff --git a/Documents/css/diagpages.css b/Documents/css/diagpages.css index 8208619e1..c65ceb49f 100644 --- a/Documents/css/diagpages.css +++ b/Documents/css/diagpages.css @@ -69,1067 +69,16 @@ html, body { #rfrshBtn { font-size: 1.1em; } - body { padding:0px; margin:0; } - } -.export-pdf-btn { - color: white; - width: auto; - height: auto; - max-width: 90px; - max-height: 40px; - font-size: 1.0em; - border-radius: 0.4em; - background-color: transparent; - border-color: white; - border-style: solid; - border-width: 1px; - display: none; -} - -.panel-title-text { - padding-top: 0.5em; - font-size: 24px; -} - -.subpanel-title-text { - font-size: 18px; -} - -.panelHeadTxt { - font-size: 25px; -} - -.pnl-head-title { - font-size: 2.0em; -} - -@media (min-width: 800px) { - .pnl-head-title { - padding: 3px 0; - } -} - -@media (min-width: 600px) { - .pnl-head-title { - padding: 5px 0; - } -} - -.title-text { - font-size: 2.0em; -} - - -/************************************** - PRE CODE CSS -***************************************/ - -pre { - overflow-x: auto; - overflow-y: auto; -} - - -/************************************** - NAV BAR CSS -***************************************/ - -.navMenu { - text-align: left; -} - -.nav-home-btn { - padding: 20px 10px 0 10px; - font-size: 22px; -} - -.nav-menu { - padding: 12px; -} - -.nav-menu li { - border-bottom: solid 1px rgba(102, 102, 102, 0.3); - margin-left: 5px; - margin-right: 5px; - font-size: 14px; - padding: 12px; -} - -.nav-menu li a { - color: white; - text-decoration: none; -} - -.nav-menu li a:hover { - color: tomato; - text-decoration: none; -} - -.nav-menu li .sub-nav { - border-bottom: 0px; - padding: 4px; -} - -.nav-menu a .caret { - width: 0; - height: 0; - display: inline-block; - vertical-align: top; - border-top: 4px solid #4f5963; - border-right: 4px solid transparent; - border-left: 4px solid transparent; - content: ""; - margin-top: 8px; -} - -.nav-menu a:hover .caret { - border-top-color: #4f5963; -} - -.nav-menu li.open>a>.caret { - border-top: none; - border-bottom: 4px solid #4f5963; - border-right: 4px solid transparent; - border-left: 4px solid transparent; -} - -.nav-menu li.open>a:hover>.caret { - border-bottom-color: #4f5963; -} - -.icon:before { - font-family: 'FontAwesome'; - font-style: normal; - font-variant: normal; - font-weight: normal; - line-height: 1; - text-transform: none; - content: '\f105'; -} - -.nav-menu li>a>span.icon { - float: right; - margin: 0.1em 1.7em -0.1em 0; - opacity: 0; - -webkit-transition: all 0.2s ease-in-out; - -moz-transition: all 0.2s ease-in-out; - -o-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; -} - -.nav-menu li>a:hover>span.icon { - float: right; - margin: 0.1em 0.8em -0.1em 0; - opacity: 1; -} - -.menu-btn:focus { - outline: none; -} - -.nav-cont-bord-div { - padding: 15px 15px 25px 15px; -} - -.nav-cont-div { - padding: 10px; - border-radius: 0.6em; - background-color: #333333; - border: solid lightgray 1px; - -moz-box-shadow: 0px 5px 1px #ccc; - -webkit-box-shadow: 0px 1px 1px #ccc; - box-shadow: 0px 1px 1px #ccc; -} - -.nav-key-item { - font-weight: bold; - text-decoration: underline; - list-style: none; - font-size: 1.0em; -} - -.nav-subkey-item { - font-weight: normal; - list-style: none; -} - -.nav-subkey-item:before { - color: white; - content: "▶"; - padding-right: 8px; -} - - -/* Menu Appearance */ - -.pushy { - position: fixed; - width: 250px; - height: 100%; - top: 0; - z-index: 9999; - background: #191918; - overflow: auto; - -webkit-overflow-scrolling: touch; - /* enables momentum scrolling in iOS overflow elements */ -} - - -/* -.pushy a { - display: block; - color: #b3b3b1; - padding: 15px 30px; - text-decoration: none; -} - -.pushy a:hover { - color: #FFF; -} - -.pushy ul:first-child { - margin-top: 10px; -} -*/ - -.pushy.pushy-left { - left: 0; -} - -.pushy.pushy-right { - right: 0; -} - - -/*.pushy-content { - visibility: hidden; -}*/ - - -/* Menu Movement */ - -.pushy-left { - -webkit-transform: translate3d(-250px, 0, 0); - -ms-transform: translate3d(-250px, 0, 0); - transform: translate3d(-250px, 0, 0); -} - -.pushy-open-left #container, .pushy-open-left .push { - -webkit-transform: translate3d(250px, 0, 0); - -ms-transform: translate3d(250px, 0, 0); - transform: translate3d(250px, 0, 0); -} - -.pushy-right { - -webkit-transform: translate3d(250px, 0, 0); - -ms-transform: translate3d(250px, 0, 0); - transform: translate3d(250px, 0, 0); -} - -.pushy-open-right #container, .pushy-open-right .push { - -webkit-transform: translate3d(-250px, 0, 0); - -ms-transform: translate3d(-250px, 0, 0); - transform: translate3d(-250px, 0, 0); -} - -.pushy-open-left .pushy, .pushy-open-right .pushy { - -webkit-transform: translate3d(0, 0, 0); - -ms-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); -} - -.pushy-open-left .pushy-content, .pushy-open-right .pushy-content { - visibility: visible; -} - - -/* Menu Transitions */ - -#container, .pushy, .push { - transition: transform 0.2s cubic-bezier(0.16, 0.68, 0.43, 0.99); -} - -.pushy-content { - transition: visibility 0.2s cubic-bezier(0.16, 0.68, 0.43, 0.99); -} - - -/* Site Overlay */ - -.site-overlay { - display: none; -} - -.pushy-open-left .site-overlay, .pushy-open-right .site-overlay { - display: block; - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 9998; - background-color: rgba(0, 0, 0, 0.5); - -webkit-animation: fade 500ms; - animation: fade 500ms; -} - -@keyframes fade { - 0% { - opacity: 0; - } - 100% { - opacity: 1; - } -} - -@-webkit-keyframes fade { - 0% { - opacity: 0; - } - 100% { - opacity: 1; - } -} - - -/* Submenu Appearance */ - - -/* .pushy-submenu { */ - - -/* Submenu Buttons */ - - -/* Submenu Icon */ - - -/* } */ - - -/* .pushy-submenu ul { - padding-left: 15px; - transition: max-height 0.2s ease-in-out, visibility 0.2s ease-in-out; -} - -.pushy-submenu ul .pushy-link { - transition: opacity 0.2s ease-in-out; -} - -.pushy-submenu button { - width: 100%; - color: #b3b3b1; - padding: 15px 30px; - text-align: left; - background: transparent; - border: 0; -} - -.pushy-submenu button:hover { - color: #FFF; -} - -.pushy-submenu>a, .pushy-submenu>button { - position: relative; -} - -.pushy-submenu>a::after, .pushy-submenu>button::after { - content: ''; - display: block; - height: 11px; - width: 8px; - position: absolute; - top: 50%; - right: 15px; - background: url("https://cdnjs.cloudflare.com/ajax/libs/pushy/1.1.0/img/arrow.svg") no-repeat; - -webkit-transform: translateY(-50%); - -ms-transform: translateY(-50%); - transform: translateY(-50%); - transition: transform 0.2s; -} */ - - -/* Submenu Movement */ - - -/* -.pushy-submenu-closed ul { - max-height: 0; - overflow: hidden; - visibility: hidden; -} - -.pushy-submenu-closed .pushy-link { - opacity: 0; -} - -.pushy-submenu-open { - /* Submenu Icon */ - - -/*}*/ - - -/* -.pushy-submenu-open ul { - max-height: 1000px; - visibility: visible; -} - -.pushy-submenu-open .pushy-link { - opacity: 1; -} - -.pushy-submenu-open a::after, .pushy-submenu-open button::after { - -webkit-transform: translateY(-50%) rotate(90deg); - -ms-transform: translateY(-50%) rotate(90deg); - transform: translateY(-50%) rotate(90deg); -}*/ - - -/************************************** - LOG PAGE SECTION CSS -***************************************/ - -.logs-div { - text-align: left; - vertical-align: middle; - padding: 0, 0; -} - -.log-line { - display: inline-block; - padding-bottom: 8px; - vertical-align: middle; -} - -.log-time { - font-weight: bold; - vertical-align: middle; -} - -.log-type { - display: inline-block; - padding: .2em .6em .3em; - font-weight: bold; - line-height: 1; - color: #fff; - text-align: center; - white-space: nowrap; - vertical-align: middle; - border-radius: .25em; - min-width: 44px; - font-size: 0.75em; -} - -.log-source { - border-radius: 0.3em; - border-color: gray; - border-style: solid; - border-width: 1px; - padding: 2px; - font-style: italic; - vertical-align: middle; -} - -.log-msg { - vertical-align: middle; -} - -.defsrc-bg { - color: gray; - background-color: white; - font-size: 0.9em; -} - -.mansrc-bg { - color: #6b6b6b; - background-color: transparent; - font-size: 0.9em; -} - -.autosrc-bg { - color: #6b6b6b; - background-color: lightgray; - font-size: 0.9em; -} - -.camsrc-bg { - color: #6b6b6b; - background-color: lightblue; - font-size: 0.9em; -} - -.protsrc-bg { - color: #6b6b6b; - background-color: lightorange; - font-size: 0.9em; -} - -.pressrc-bg { - color: #6b6b6b; - background-color: lightyellow; - font-size: 0.9em; -} - -.weatsrc-bg { - color: #6b6b6b; - background-color: lightpurple; - font-size: 0.9em; -} - -.tstatsrc-bg { - color: #6b6b6b; - background-color: lightgreen; - font-size: 0.9em; -} - -.centerText { - text-align: center; -} - -.mapDataFmt {} - - -/************************************** - BACK TO TOP CSS BUTTON -***************************************/ - -#scrollTopBtn { - display: none; - position: fixed; - bottom: 20px; - right: 30px; - z-index: 99; - border: none; - outline: none; - background-color: gray; - color: white; - cursor: pointer; - padding: 15px; - border-radius: 10px; -} - -#scrollTopBtn:hover { - background-color: #3174AE; -} - -.export-pdf-btn { - color: white; - width: auto; - height: auto; - max-width: 90px; - max-height: 40px; - font-size: 1.0em; - border-radius: 0.4em; - background-color: transparent; - border-color: white; - border-style: solid; - border-width: 1px; -} - -.panel-title-text { - padding-top: 0.5em; - font-size: 24px; -} - -.subpanel-title-text { - font-size: 18px; -} - -.panelHeadTxt { - font-size: 25px; -} - -.pnl-head-title { - font-size: 2.0em; -} - -@media (min-width: 800px) { - .pnl-head-title { - padding: 3px 0; - } -} - -@media (min-width: 600px) { - .pnl-head-title { - padding: 5px 0; - } -} - -.title-text { - font-size: 2.0em; -} - -/************************************** - PRE CODE CSS -***************************************/ -pre { - overflow-x: auto; - overflow-y: auto; -} - -/************************************** - NAV BAR CSS -***************************************/ - -.navMenu { - text-align: left; -} - -.nav-home-btn { - padding: 20px 10px 0 10px; - font-size: 22px; -} - -.nav-menu { - padding: 12px; -} - -.nav-menu li { - border-bottom: solid 1px rgba(102, 102, 102, 0.3); - margin-left: 5px; - margin-right: 5px; - font-size: 14px; - padding: 12px; -} - -.nav-menu li a { - color: white; - text-decoration: none; -} - -.nav-menu li a:hover { - color: tomato; - text-decoration: none; -} - -.nav-menu li .sub-nav { - border-bottom: 0px; - padding: 4px; -} - -.nav-menu a .caret { - width: 0; - height: 0; - display: inline-block; - vertical-align: top; - border-top: 4px solid #4f5963; - border-right: 4px solid transparent; - border-left: 4px solid transparent; - content: ""; - margin-top: 8px; -} - -.nav-menu a:hover .caret { - border-top-color: #4f5963; -} - -.nav-menu li.open>a>.caret { - border-top: none; - border-bottom: 4px solid #4f5963; - border-right: 4px solid transparent; - border-left: 4px solid transparent; -} - -.nav-menu li.open>a:hover>.caret { - border-bottom-color: #4f5963; -} - -.icon:before { - font-family: 'FontAwesome'; - font-style: normal; - font-variant: normal; - font-weight: normal; - line-height: 1; - text-transform: none; - content: '\f105'; -} - -.nav-menu li>a>span.icon { - float: right; - margin: 0.1em 1.7em -0.1em 0; - opacity: 0; - -webkit-transition: all 0.2s ease-in-out; - -moz-transition: all 0.2s ease-in-out; - -o-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; -} - -.nav-menu li>a:hover>span.icon { - float: right; - margin: 0.1em 0.8em -0.1em 0; - opacity: 1; -} - -.menu-btn:focus { - outline: none; -} - -.nav-cont-bord-div { - padding: 15px 15px 25px 15px; -} - -.nav-cont-div { - padding: 10px; - border-radius: 0.6em; - background-color: #333333; - border: solid lightgray 1px; - -moz-box-shadow: 0px 5px 1px #ccc; - -webkit-box-shadow: 0px 1px 1px #ccc; - box-shadow: 0px 1px 1px #ccc; -} - -.nav-key-item { - font-weight: bold; - text-decoration: underline; - list-style: none; - font-size: 1.0em; -} - -.nav-subkey-item { - font-weight: normal; - list-style: none; -} - -.nav-subkey-item:before { - color: white; - content: "▶"; - padding-right: 8px; -} - - -/* Menu Appearance */ - -.pushy { - position: fixed; - width: 250px; - height: 100%; - top: 0; - z-index: 9999; - background: #191918; - overflow: auto; - -webkit-overflow-scrolling: touch; - /* enables momentum scrolling in iOS overflow elements */ -} - - -/* -.pushy a { - display: block; - color: #b3b3b1; - padding: 15px 30px; - text-decoration: none; -} - -.pushy a:hover { - color: #FFF; -} - -.pushy ul:first-child { - margin-top: 10px; -} -*/ - -.pushy.pushy-left { - left: 0; -} - -.pushy.pushy-right { - right: 0; -} - - -/*.pushy-content { - visibility: hidden; -}*/ - - -/* Menu Movement */ - -.pushy-left { - -webkit-transform: translate3d(-250px, 0, 0); - -ms-transform: translate3d(-250px, 0, 0); - transform: translate3d(-250px, 0, 0); -} - -.pushy-open-left #container, .pushy-open-left .push { - -webkit-transform: translate3d(250px, 0, 0); - -ms-transform: translate3d(250px, 0, 0); - transform: translate3d(250px, 0, 0); -} - -.pushy-right { - -webkit-transform: translate3d(250px, 0, 0); - -ms-transform: translate3d(250px, 0, 0); - transform: translate3d(250px, 0, 0); -} - -.pushy-open-right #container, .pushy-open-right .push { - -webkit-transform: translate3d(-250px, 0, 0); - -ms-transform: translate3d(-250px, 0, 0); - transform: translate3d(-250px, 0, 0); -} - -.pushy-open-left .pushy, .pushy-open-right .pushy { - -webkit-transform: translate3d(0, 0, 0); - -ms-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); -} - -.pushy-open-left .pushy-content, .pushy-open-right .pushy-content { - visibility: visible; -} - - -/* Menu Transitions */ - -#container, .pushy, .push { - transition: transform 0.2s cubic-bezier(0.16, 0.68, 0.43, 0.99); -} - -.pushy-content { - transition: visibility 0.2s cubic-bezier(0.16, 0.68, 0.43, 0.99); -} - - -/* Site Overlay */ - -.site-overlay { - display: none; -} - -.pushy-open-left .site-overlay, .pushy-open-right .site-overlay { - display: block; - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 9998; - background-color: rgba(0, 0, 0, 0.5); - -webkit-animation: fade 500ms; - animation: fade 500ms; -} - -@keyframes fade { - 0% { - opacity: 0; - } - 100% { - opacity: 1; - } -} - -@-webkit-keyframes fade { - 0% { - opacity: 0; - } - 100% { - opacity: 1; - } -} - - -/* Submenu Appearance */ - - -/* .pushy-submenu { */ - - -/* Submenu Buttons */ - - -/* Submenu Icon */ - - -/* } */ - - -/* .pushy-submenu ul { - padding-left: 15px; - transition: max-height 0.2s ease-in-out, visibility 0.2s ease-in-out; -} - -.pushy-submenu ul .pushy-link { - transition: opacity 0.2s ease-in-out; -} - -.pushy-submenu button { - width: 100%; - color: #b3b3b1; - padding: 15px 30px; - text-align: left; - background: transparent; - border: 0; -} - -.pushy-submenu button:hover { - color: #FFF; -} - -.pushy-submenu>a, .pushy-submenu>button { - position: relative; -} - -.pushy-submenu>a::after, .pushy-submenu>button::after { - content: ''; - display: block; - height: 11px; - width: 8px; - position: absolute; - top: 50%; - right: 15px; - background: url("https://cdnjs.cloudflare.com/ajax/libs/pushy/1.1.0/img/arrow.svg") no-repeat; - -webkit-transform: translateY(-50%); - -ms-transform: translateY(-50%); - transform: translateY(-50%); - transition: transform 0.2s; -} */ - - -/* Submenu Movement */ - - -/* -.pushy-submenu-closed ul { - max-height: 0; - overflow: hidden; - visibility: hidden; -} - -.pushy-submenu-closed .pushy-link { - opacity: 0; -} - -.pushy-submenu-open { - /* Submenu Icon */ - - -/*}*/ - - -/* -.pushy-submenu-open ul { - max-height: 1000px; - visibility: visible; -} - -.pushy-submenu-open .pushy-link { - opacity: 1; -} - -.pushy-submenu-open a::after, .pushy-submenu-open button::after { - -webkit-transform: translateY(-50%) rotate(90deg); - -ms-transform: translateY(-50%) rotate(90deg); - transform: translateY(-50%) rotate(90deg); -}*/ - - -/************************************** - LOG PAGE SECTION CSS -***************************************/ - -.logs-div { - text-align: left; - padding: 0, 0; -} - -.label { - display: inline; - padding: .2em .6em .3em; - font-weight: bold; - line-height: 1; - color: #fff; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: .25em; -} - -.logSrcFmt { - border-radius: 0.3em; - border-color: gray; - border-style: solid; - border-width: 1px; - padding: 2px; - font-style: italic; -} - -.defsrc-bg { - color: gray; - background-color: lightgray; -} - -.mansrc-bg { - color: gray; - background-color: lightgray; -} - -.autosrc-bg { - color: gray; - background-color: lightgray; -} - -.camsrc-bg { - color: gray; - background-color: lightgray; -} - -.protsrc-bg { - color: gray; - background-color: lightgray; -} - -.pressrc-bg { - color: gray; - background-color: lightgray; -} - -.weatsrc-bg { - color: gray; - background-color: lightgray; -} - -.tstatsrc-bg { - color: gray; - background-color: lightgray; -} - -.centerText { - text-align: center; -} - -.logEvtDt { - font-weight: bold; -} - -.mapDataFmt {} - - -/************************************** - BACK TO TOP CSS BUTTON -***************************************/ - -#scrollTopBtn { - display: none; - position: fixed; - bottom: 20px; - right: 30px; - z-index: 99; - border: none; - outline: none; - background-color: gray; - color: white; - cursor: pointer; - padding: 15px; - border-radius: 10px; +.hamburger-box { + width: 27px; + height: 24px; } -#scrollTopBtn:hover { - background-color: #3174AE; +.hamburger-inner, .hamburger-inner:after, .hamburger-inner:before { + width: 27px; + height: 4px; } .export-pdf-btn { diff --git a/Documents/css/diagpages.min.css b/Documents/css/diagpages.min.css index c327138b2..54165d8fd 100644 --- a/Documents/css/diagpages.min.css +++ b/Documents/css/diagpages.min.css @@ -1 +1 @@ -html,body{position:relative;height:100%;min-height:100%;min-width:375px}.container{width:100%;margin:auto}#top-hdr{height:auto;min-width:375px}.in-middle{vertical-align:middle}.left-head-col{padding:1.2em 0 0 20px}.right-head-col{padding:2.1em 40px 0 0}.links{padding:10px;font-size:18px}.logoIcn{width:1.7em;height:auto;max-width:48px;max-height:48px}.refresh-btn{color:black;width:auto;height:auto;max-width:90px;max-height:40px;font-size:1.0em;border-radius:.4em;background-color:white;border-color:gray;border-style:solid;border-width:1px}#rfrshBtn:after{content:' Refresh'}@media screen and (max-width:520px){#rfrshBtn:after{content:''}#rfrshBtn{font-size:1.1em}}.export-pdf-btn{color:white;width:auto;height:auto;max-width:90px;max-height:40px;font-size:1.0em;border-radius:.4em;background-color:transparent;border-color:white;border-style:solid;border-width:1px;display:none}.panel-title-text{padding-top:.5em;font-size:24px}.subpanel-title-text{font-size:18px}.panelHeadTxt{font-size:25px}.pnl-head-title{font-size:2.0em}@media(min-width:800px){.pnl-head-title{padding:3px 0}}@media(min-width:600px){.pnl-head-title{padding:5px 0}}.title-text{font-size:2.0em}pre{overflow-x:auto;overflow-y:auto}.navMenu{text-align:left}.nav-home-btn{padding:20px 10px 0 10px;font-size:22px}.nav-menu{padding:12px}.nav-menu li{border-bottom:solid 1px rgba(102,102,102,0.3);margin-left:5px;margin-right:5px;font-size:14px;padding:12px}.nav-menu li a{color:white;text-decoration:none}.nav-menu li a:hover{color:tomato;text-decoration:none}.nav-menu li .sub-nav{border-bottom:0;padding:4px}.nav-menu a .caret{width:0;height:0;display:inline-block;vertical-align:top;border-top:4px solid #4f5963;border-right:4px solid transparent;border-left:4px solid transparent;content:"";margin-top:8px}.nav-menu a:hover .caret{border-top-color:#4f5963}.nav-menu li.open>a>.caret{border-top:0;border-bottom:4px solid #4f5963;border-right:4px solid transparent;border-left:4px solid transparent}.nav-menu li.open>a:hover>.caret{border-bottom-color:#4f5963}.icon:before{font-family:'FontAwesome';font-style:normal;font-variant:normal;font-weight:normal;line-height:1;text-transform:none;content:'\f105'}.nav-menu li>a>span.icon{float:right;margin:.1em 1.7em -0.1em 0;opacity:0;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.nav-menu li>a:hover>span.icon{float:right;margin:.1em .8em -0.1em 0;opacity:1}.menu-btn:focus{outline:0}.nav-cont-bord-div{padding:15px 15px 25px 15px}.nav-cont-div{padding:10px;border-radius:.6em;background-color:#333;border:solid lightgray 1px;-moz-box-shadow:0 5px 1px #ccc;-webkit-box-shadow:0 1px 1px #ccc;box-shadow:0 1px 1px #ccc}.nav-key-item{font-weight:bold;text-decoration:underline;list-style:none;font-size:1.0em}.nav-subkey-item{font-weight:normal;list-style:none}.nav-subkey-item:before{color:white;content:"▶";padding-right:8px}.pushy{position:fixed;width:250px;height:100%;top:0;z-index:9999;background:#191918;overflow:auto;-webkit-overflow-scrolling:touch}.pushy.pushy-left{left:0}.pushy.pushy-right{right:0}.pushy-left{-webkit-transform:translate3d(-250px,0,0);-ms-transform:translate3d(-250px,0,0);transform:translate3d(-250px,0,0)}.pushy-open-left #container,.pushy-open-left .push{-webkit-transform:translate3d(250px,0,0);-ms-transform:translate3d(250px,0,0);transform:translate3d(250px,0,0)}.pushy-right{-webkit-transform:translate3d(250px,0,0);-ms-transform:translate3d(250px,0,0);transform:translate3d(250px,0,0)}.pushy-open-right #container,.pushy-open-right .push{-webkit-transform:translate3d(-250px,0,0);-ms-transform:translate3d(-250px,0,0);transform:translate3d(-250px,0,0)}.pushy-open-left .pushy,.pushy-open-right .pushy{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.pushy-open-left .pushy-content,.pushy-open-right .pushy-content{visibility:visible}#container,.pushy,.push{transition:transform .2s cubic-bezier(0.16,0.68,0.43,0.99)}.pushy-content{transition:visibility .2s cubic-bezier(0.16,0.68,0.43,0.99)}.site-overlay{display:none}.pushy-open-left .site-overlay,.pushy-open-right .site-overlay{display:block;position:fixed;top:0;right:0;bottom:0;left:0;z-index:9998;background-color:rgba(0,0,0,0.5);-webkit-animation:fade 500ms;animation:fade 500ms}@keyframes fade{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes fade{0%{opacity:0}100%{opacity:1}}.logs-div{text-align:left;vertical-align:middle;padding:0,0}.log-line{display:inline-block;padding-bottom:8px;vertical-align:middle}.log-time{font-weight:bold;vertical-align:middle}.log-type{display:inline-block;padding:.2em .6em .3em;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;border-radius:.25em;min-width:44px;font-size:.75em}.log-source{border-radius:.3em;border-color:gray;border-style:solid;border-width:1px;padding:2px;font-style:italic;vertical-align:middle}.log-msg{vertical-align:middle}.defsrc-bg{color:gray;background-color:white;font-size:.9em}.mansrc-bg{color:#6b6b6b;background-color:transparent;font-size:.9em}.autosrc-bg{color:#6b6b6b;background-color:lightgray;font-size:.9em}.camsrc-bg{color:#6b6b6b;background-color:lightblue;font-size:.9em}.protsrc-bg{color:#6b6b6b;background-color:lightorange;font-size:.9em}.pressrc-bg{color:#6b6b6b;background-color:lightyellow;font-size:.9em}.weatsrc-bg{color:#6b6b6b;background-color:lightpurple;font-size:.9em}.tstatsrc-bg{color:#6b6b6b;background-color:lightgreen;font-size:.9em}.centerText{text-align:center}#scrollTopBtn{display:none;position:fixed;bottom:20px;right:30px;z-index:99;border:0;outline:0;background-color:gray;color:white;cursor:pointer;padding:15px;border-radius:10px}#scrollTopBtn:hover{background-color:#3174ae} \ No newline at end of file +html,body{position:relative;height:100%;min-height:100%;min-width:375px}.container{width:100%;margin:auto}#top-hdr{height:auto;min-width:375px}.in-middle{vertical-align:middle}.left-head-col{padding:1.2em 0 0 20px}.right-head-col{padding:2.1em 40px 0 0}.links{padding:10px;font-size:18px}.logoIcn{width:1.7em;height:auto;max-width:48px;max-height:48px}.refresh-btn{color:black;width:auto;height:auto;max-width:90px;max-height:40px;font-size:1.0em;border-radius:.4em;background-color:white;border-color:gray;border-style:solid;border-width:1px}#rfrshBtn:after{content:' Refresh'}@media screen and (max-width:520px){#rfrshBtn:after{content:''}#rfrshBtn{font-size:1.1em}}.hamburger-box{width:27px;height:24px}.hamburger-inner,.hamburger-inner:after,.hamburger-inner:before{width:27px;height:4px}.export-pdf-btn{color:white;width:auto;height:auto;max-width:90px;max-height:40px;font-size:1.0em;border-radius:.4em;background-color:transparent;border-color:white;border-style:solid;border-width:1px;display:none}.panel-title-text{padding-top:.5em;font-size:24px}.subpanel-title-text{font-size:18px}.panelHeadTxt{font-size:25px}.pnl-head-title{font-size:2.0em}@media(min-width:800px){.pnl-head-title{padding:3px 0}}@media(min-width:600px){.pnl-head-title{padding:5px 0}}.title-text{font-size:2.0em}pre{overflow-x:auto;overflow-y:auto}.navMenu{text-align:left}.nav-home-btn{padding:20px 10px 0 10px;font-size:22px}.nav-menu{padding:12px}.nav-menu li{border-bottom:solid 1px rgba(102,102,102,0.3);margin-left:5px;margin-right:5px;font-size:14px;padding:12px}.nav-menu li a{color:white;text-decoration:none}.nav-menu li a:hover{color:tomato;text-decoration:none}.nav-menu li .sub-nav{border-bottom:0;padding:4px}.nav-menu a .caret{width:0;height:0;display:inline-block;vertical-align:top;border-top:4px solid #4f5963;border-right:4px solid transparent;border-left:4px solid transparent;content:"";margin-top:8px}.nav-menu a:hover .caret{border-top-color:#4f5963}.nav-menu li.open>a>.caret{border-top:0;border-bottom:4px solid #4f5963;border-right:4px solid transparent;border-left:4px solid transparent}.nav-menu li.open>a:hover>.caret{border-bottom-color:#4f5963}.icon:before{font-family:'FontAwesome';font-style:normal;font-variant:normal;font-weight:normal;line-height:1;text-transform:none;content:'\f105'}.nav-menu li>a>span.icon{float:right;margin:.1em 1.7em -0.1em 0;opacity:0;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.nav-menu li>a:hover>span.icon{float:right;margin:.1em .8em -0.1em 0;opacity:1}.menu-btn:focus{outline:0}.nav-cont-bord-div{padding:15px 15px 25px 15px}.nav-cont-div{padding:10px;border-radius:.6em;background-color:#333;border:solid lightgray 1px;-moz-box-shadow:0 5px 1px #ccc;-webkit-box-shadow:0 1px 1px #ccc;box-shadow:0 1px 1px #ccc}.nav-key-item{font-weight:bold;text-decoration:underline;list-style:none;font-size:1.0em}.nav-subkey-item{font-weight:normal;list-style:none}.nav-subkey-item:before{color:white;content:"▶";padding-right:8px}.pushy{position:fixed;width:250px;height:100%;top:0;z-index:9999;background:#191918;overflow:auto;-webkit-overflow-scrolling:touch}.pushy.pushy-left{left:0}.pushy.pushy-right{right:0}.pushy-left{-webkit-transform:translate3d(-250px,0,0);-ms-transform:translate3d(-250px,0,0);transform:translate3d(-250px,0,0)}.pushy-open-left #container,.pushy-open-left .push{-webkit-transform:translate3d(250px,0,0);-ms-transform:translate3d(250px,0,0);transform:translate3d(250px,0,0)}.pushy-right{-webkit-transform:translate3d(250px,0,0);-ms-transform:translate3d(250px,0,0);transform:translate3d(250px,0,0)}.pushy-open-right #container,.pushy-open-right .push{-webkit-transform:translate3d(-250px,0,0);-ms-transform:translate3d(-250px,0,0);transform:translate3d(-250px,0,0)}.pushy-open-left .pushy,.pushy-open-right .pushy{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.pushy-open-left .pushy-content,.pushy-open-right .pushy-content{visibility:visible}#container,.pushy,.push{transition:transform .2s cubic-bezier(0.16,0.68,0.43,0.99)}.pushy-content{transition:visibility .2s cubic-bezier(0.16,0.68,0.43,0.99)}.site-overlay{display:none}.pushy-open-left .site-overlay,.pushy-open-right .site-overlay{display:block;position:fixed;top:0;right:0;bottom:0;left:0;z-index:9998;background-color:rgba(0,0,0,0.5);-webkit-animation:fade 500ms;animation:fade 500ms}@keyframes fade{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes fade{0%{opacity:0}100%{opacity:1}}.logs-div{text-align:left;vertical-align:middle;padding:0,0}.log-line{display:inline-block;padding-bottom:8px;vertical-align:middle}.log-time{font-weight:bold;vertical-align:middle}.log-type{display:inline-block;padding:.2em .6em .3em;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;border-radius:.25em;min-width:44px;font-size:.75em}.log-source{border-radius:.3em;border-color:gray;border-style:solid;border-width:1px;padding:2px;font-style:italic;vertical-align:middle}.log-msg{vertical-align:middle}.defsrc-bg{color:gray;background-color:white;font-size:.9em}.mansrc-bg{color:#6b6b6b;background-color:transparent;font-size:.9em}.autosrc-bg{color:#6b6b6b;background-color:lightgray;font-size:.9em}.camsrc-bg{color:#6b6b6b;background-color:lightblue;font-size:.9em}.protsrc-bg{color:#6b6b6b;background-color:lightorange;font-size:.9em}.pressrc-bg{color:#6b6b6b;background-color:lightyellow;font-size:.9em}.weatsrc-bg{color:#6b6b6b;background-color:lightpurple;font-size:.9em}.tstatsrc-bg{color:#6b6b6b;background-color:lightgreen;font-size:.9em}.centerText{text-align:center}#scrollTopBtn{display:none;position:fixed;bottom:20px;right:30px;z-index:99;border:0;outline:0;background-color:gray;color:white;cursor:pointer;padding:15px;border-radius:10px}#scrollTopBtn:hover{background-color:#3174ae} \ No newline at end of file diff --git a/Documents/css/diagpages_new.css b/Documents/css/diagpages_new.css index 84ed193b3..9c81bb201 100644 --- a/Documents/css/diagpages_new.css +++ b/Documents/css/diagpages_new.css @@ -1,4 +1,5 @@ -html, body { +html, +body { position: relative; height: 100%; min-height: 100%; @@ -81,6 +82,7 @@ html, body { /* padding-top: 0.5em; */ font-size: 1.2em; } + .subpanel-title-text { /* padding-top: 0.5em; */ font-size: 1em; @@ -315,7 +317,8 @@ pre { transform: translate3d(-250px, 0, 0); } -.pushy-open-left #container, .pushy-open-left .push { +.pushy-open-left #container, +.pushy-open-left .push { -webkit-transform: translate3d(250px, 0, 0); -ms-transform: translate3d(250px, 0, 0); transform: translate3d(250px, 0, 0); @@ -327,26 +330,31 @@ pre { transform: translate3d(250px, 0, 0); } -.pushy-open-right #container, .pushy-open-right .push { +.pushy-open-right #container, +.pushy-open-right .push { -webkit-transform: translate3d(-250px, 0, 0); -ms-transform: translate3d(-250px, 0, 0); transform: translate3d(-250px, 0, 0); } -.pushy-open-left .pushy, .pushy-open-right .pushy { +.pushy-open-left .pushy, +.pushy-open-right .pushy { -webkit-transform: translate3d(0, 0, 0); -ms-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); } -.pushy-open-left .pushy-content, .pushy-open-right .pushy-content { +.pushy-open-left .pushy-content, +.pushy-open-right .pushy-content { visibility: visible; } /* Menu Transitions */ -#container, .pushy, .push { +#container, +.pushy, +.push { transition: transform 0.2s cubic-bezier(0.16, 0.68, 0.43, 0.99); } @@ -361,7 +369,8 @@ pre { display: none; } -.pushy-open-left .site-overlay, .pushy-open-right .site-overlay { +.pushy-open-left .site-overlay, +.pushy-open-right .site-overlay { display: block; position: fixed; top: 0; @@ -611,30 +620,40 @@ pre { background-color: #3174AE; } + /************************************** DEVICE TILE CSS ***************************************/ -.vex.vex-theme-default .vex-content { width: 50%; padding: 3px; } +.vex.vex-theme-default .vex-content { + width: 50%; + padding: 3px; +} + .device table { border: none; border-radius: 3px; - width:100%; + width: 100%; -webkit-border-radius: 3px; -moz-border-radius: 3px; } -.device h1, h2, h3, h4, h5, h6 { - padding:20px; - margin:4px; +.device h1, +h2, +h3, +h4, +h5, +h6 { + padding: 20px; + margin: 4px; } .topBorder { - border-top: 2px solid #00a1db; + border-top: 2px solid #00a1db; } .bottomBorder { - border-bottom: 2px solid #808080; + border-bottom: 2px solid #808080; } .device { @@ -644,133 +663,207 @@ pre { } .device h1 { - font-size: 6vw; - width: 100%; - text-align: center; - font-weight: normal; + font-size: 6vw; + width: 100%; + text-align: center; + font-weight: normal; } .device h2 { - font-size: 9vw; - text-align: center; - margin-left: auto; - margin-right: auto; - font-weight: normal; + font-size: 9vw; + text-align: center; + margin-left: auto; + margin-right: auto; + font-weight: normal; } - -.device h3, h3 a { - font-size: 6vw; - font-weight: bold; - text-align: center; - background: #B74C4C; - color: #f5f5f5; +.device h3, +h3 a { + font-size: 6vw; + font-weight: bold; + text-align: center; + background: #B74C4C; + color: #f5f5f5; } .device h4 { - font-size: 4vw; - font-weight: bold; - text-align: center; - background: #00a1db; - color: #f5f5f5; + font-size: 4vw; + font-weight: bold; + text-align: center; + background: #00a1db; + color: #f5f5f5; } .centerText { - text-align: center; + text-align: center; } .device hr { - background: #00a1db; - width: 100%; - height: 1px; + background: #00a1db; + width: 100%; + height: 1px; } -.device th, td { - box-shadow: inset 0 0px rgba(0, 0, 0, 0.25), inset 0 0px rgba(0, 0, 0, 0.25); - padding: 4px; + +.device th, +td { + box-shadow: inset 0 0px rgba(0, 0, 0, 0.25), inset 0 0px rgba(0, 0, 0, 0.25); + padding: 4px; } .device th { - -webkit-font-smoothing: antialiased; - color: #f5f5f5; - text-shadow: 0 0 1px rgba(0, 0, 0, 0.1); - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - background: #00a1db; + -webkit-font-smoothing: antialiased; + color: #f5f5f5; + text-shadow: 0 0 1px rgba(0, 0, 0, 0.1); + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + background: #00a1db; } .devInfo th { - font-size: 3.8vw; + font-size: 3.8vw; } + .devInfoTile th { - font-size: 2.0vw; + font-size: 2.0vw; } + .devInfoTile h4 { - font-size: 1.5vw; + font-size: 1.5vw; } .device td { - color: grey; - text-shadow: 0 0 1px rgba(255, 255, 255, 0.1); - text-align: center; + color: grey; + text-shadow: 0 0 1px rgba(255, 255, 255, 0.1); + text-align: center; } .device tr { - -webkit-transition: background 0.3s, box-shadow 0.3s; - -moz-transition: background 0.3s, box-shadow 0.3s; - transition: background 0.3s, box-shadow 0.3s; + -webkit-transition: background 0.3s, box-shadow 0.3s; + -moz-transition: background 0.3s, box-shadow 0.3s; + transition: background 0.3s, box-shadow 0.3s; } + .column, .columns { - width: 100%; - float: left; - box-sizing: border-box; + width: 100%; + float: left; + box-sizing: border-box; } .one.column, -.one.columns { width: 4.66666666667%; } -.two.columns { width: 13.3333333333%; } -.three.columns { width: 22%; } -.four.columns { width: 32.6666666667%; } -.five.columns { width: 39.3333333333%; } -.six.columns { width: 48%; } -.seven.columns { width: 56.6666666667%; } -.eight.columns { width: 65.3333333333%; } -.nine.columns { width: 74.0%; } -.ten.columns { width: 82.6666666667%; } -.eleven.columns { width: 91.3333333333%; } -.twelve.columns { width: 100%; margin-left: 0; } +.one.columns { + width: 4.66666666667%; +} + +.two.columns { + width: 13.3333333333%; +} + +.three.columns { + width: 22%; +} + +.four.columns { + width: 32.6666666667%; +} + +.five.columns { + width: 39.3333333333%; +} + +.six.columns { + width: 48%; +} + +.seven.columns { + width: 56.6666666667%; +} + +.eight.columns { + width: 65.3333333333%; +} + +.nine.columns { + width: 74.0%; +} + +.ten.columns { + width: 82.6666666667%; +} + +.eleven.columns { + width: 91.3333333333%; +} + +.twelve.columns { + width: 100%; + margin-left: 0; +} /* Offsets */ + .offset-by-one.column, -.offset-by-one.columns { margin-left: 8.66666666667%; } +.offset-by-one.columns { + margin-left: 8.66666666667%; +} + .offset-by-two.column, -.offset-by-two.columns { margin-left: 17.3333333333%; } +.offset-by-two.columns { + margin-left: 17.3333333333%; +} + .offset-by-three.column, -.offset-by-three.columns { margin-left: 26%; } +.offset-by-three.columns { + margin-left: 26%; +} + .offset-by-four.column, -.offset-by-four.columns { margin-left: 34.6666666667%; } +.offset-by-four.columns { + margin-left: 34.6666666667%; +} + .offset-by-five.column, -.offset-by-five.columns { margin-left: 43.3333333333%; } +.offset-by-five.columns { + margin-left: 43.3333333333%; +} + .offset-by-six.column, -.offset-by-six.columns { margin-left: 52%; } +.offset-by-six.columns { + margin-left: 52%; +} + .offset-by-seven.column, -.offset-by-seven.columns { margin-left: 60.6666666667%; } +.offset-by-seven.columns { + margin-left: 60.6666666667%; +} + .offset-by-eight.column, -.offset-by-eight.columns { margin-left: 69.3333333333%; } +.offset-by-eight.columns { + margin-left: 69.3333333333%; +} + .offset-by-nine.column, -.offset-by-nine.columns { margin-left: 78.0%; } +.offset-by-nine.columns { + margin-left: 78.0%; +} + .offset-by-ten.column, -.offset-by-ten.columns { margin-left: 86.6666666667%; } +.offset-by-ten.columns { + margin-left: 86.6666666667%; +} + .offset-by-eleven.column, -.offset-by-eleven.columns { margin-left: 95.3333333333%; } +.offset-by-eleven.columns { + margin-left: 95.3333333333%; +} .dateTimeText { - font-size: 3.4vw; + font-size: 3.4vw; } .dateTimeTextTile { - font-size: 1.5vw; + font-size: 1.5vw; } .dateTimeTextSmall { @@ -778,92 +871,94 @@ pre { } .battImg { - width:30px; height:15px; + width: 30px; + height: 15px; } .leafImg { - width: 25px; - height: 25px; + width: 25px; + height: 25px; } -.red{ - background-color:#db3a00; + +.red { + background-color: #db3a00; } -.yellow{ - background-color:#dba800; +.yellow { + background-color: #dba800; } .redAlertBanner { - font-size: 6vw; - font-weight: bold; - text-align: center; - background: #B74C4C; - color: #f5f5f5; - padding: 8px 0px; + font-size: 6vw; + font-weight: bold; + text-align: center; + background: #B74C4C; + color: #f5f5f5; + padding: 8px 0px; } .brightRedAlertBanner { - font-size: 6vw; - font-weight: bold; - text-align: center; - background: #ff3b19; - color: #f5f5f5; - padding: 8px 0px; + font-size: 6vw; + font-weight: bold; + text-align: center; + background: #ff3b19; + color: #f5f5f5; + padding: 8px 0px; } .greenAlertBanner { - font-size: 6vw; - font-weight: bold; - text-align: center; - background: #00ff00; - -webkit-text-stroke: 1.0px #000000; - -webkit-text-fill-color: #FFFFFF; - padding: 8px 0px; + font-size: 6vw; + font-weight: bold; + text-align: center; + background: #00ff00; + -webkit-text-stroke: 1.0px #000000; + -webkit-text-fill-color: #FFFFFF; + padding: 8px 0px; } .androidAlertBanner { - font-size: 6vw; - font-weight: bold; - text-align: center; - background: #6f786f; - -webkit-text-stroke: 1.0px #000000; - -webkit-text-fill-color: #FFFFFF; - padding: 8px 0px; + font-size: 6vw; + font-weight: bold; + text-align: center; + background: #6f786f; + -webkit-text-stroke: 1.0px #000000; + -webkit-text-fill-color: #FFFFFF; + padding: 8px 0px; } .orangeAlertBanner { - font-size: 6vw; - font-weight: bold; - text-align: center; - background: #ffae19; - color: #f5f5f5; - padding: 8px 0px; + font-size: 6vw; + font-weight: bold; + text-align: center; + background: #ffae19; + color: #f5f5f5; + padding: 8px 0px; } .blueTitle { - font-size: 4vw; - font-weight: bold; - text-align: center; - background: #00a1db; - color: #f5f5f5; + font-size: 4vw; + font-weight: bold; + text-align: center; + background: #00a1db; + color: #f5f5f5; } .alertModalTitle { - font-size: 22px; - font-weight: bold; - text-align: center; - background: transparent; - color: black; + font-size: 22px; + font-weight: bold; + text-align: center; + background: transparent; + color: black; } .sched h3 { - font-size: 4.6vw; - background: #00a1db; + font-size: 4.6vw; + background: #00a1db; } .sched h4 { - font-size: 3.8vw; - background: #00a1db; + font-size: 3.8vw; + background: #00a1db; } .sched col { @@ -873,19 +968,24 @@ pre { .slideFooterMsg { font-size: 3.0vw; padding: 20px; - margin:1em auto; + margin: 1em auto; } -.slideFooterMsgTile { +.slideFooterMsg { font-size: 1.8vw; padding: 20px; - margin:1em auto; + margin: 1em auto; + text-decoration: underline; +} + +.slideFooterTextTile { + font-size: 1.8vw; + margin: 1em auto; text-decoration: underline; } .pageFooterBtn { padding: 10px; - horizontal-align: center; text-align: center; } @@ -904,10 +1004,43 @@ pre { color: gray; } +.slideFooterBtn { + font-size: 1rem; + text-align: center; + padding: 0; +} + +.slideFooterText { + font-size: 3.0vw; + margin: 1em auto; + padding: 0; + text-decoration: underline; +} + +.pageFooterCls { + text-align: center; +} + .swiper-container { width: 95%; min-height: 300px; - padding: 10px; + padding: 0 10px !important; +} + +.swiper-pagination-bullet { + width: 20px; + height: 20px; + text-align: center; + line-height: 20px; + font-size: 10px; + color: #000; + opacity: 1; + background: rgba(0, 0, 0, 0.2); +} + +.swiper-pagination-bullet-active { + color: #fff; + background: #007aff; } .default-container { @@ -916,12 +1049,14 @@ pre { } .vex.vex-theme-default .vex-content { - width: 95%; padding: 3px; + width: 95%; + padding: 3px; } .alarmImg { - vertical-align: top; - width:60px; height:60px; + vertical-align: top; + width: 60px; + height: 60px; } .alarmWarnCap { @@ -940,7 +1075,7 @@ pre { } .sectionBg { - box-shadow: 0 1px 1px rgba(0,0,0,0.16), 0 1px 1px rgba(0,0,0,0.23); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.16), 0 1px 1px rgba(0, 0, 0, 0.23); background: white; } @@ -952,7 +1087,7 @@ pre { } .sectionBgTile { - box-shadow: 0 1px 1px rgba(0,0,0,0.16), 0 1px 1px rgba(0,0,0,0.23); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.16), 0 1px 1px rgba(0, 0, 0, 0.23); background: white; } @@ -964,12 +1099,12 @@ pre { } .sectionBg table { - box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23); + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.16), 0 3px 6px rgba(0, 0, 0, 0.23); background: white; } .sectionBgTile table { - box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23); + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.16), 0 3px 6px rgba(0, 0, 0, 0.23); background: white; } @@ -981,6 +1116,7 @@ pre { text-decoration: underline; text-align: center; } + .devInfoTile th { color: #00a1db; background: transparent; @@ -989,6 +1125,7 @@ pre { text-decoration: underline; text-align: center; } + .redText { color: red; } @@ -1007,21 +1144,37 @@ pre { background: transparent; } -.chgLog ul, li { +.chgLog ul, +li { font-size: 12px; padding: 0 10px 0 10px; Margin: 0; } + .chgLog p { font-size: 12px; } +.hamburger-box { + width: 27px; + height: 24px; +} + +.hamburger-inner, +.hamburger-inner:after, +.hamburger-inner:before { + width: 27px; + height: 4px; +} + @media only screen and (max-width: 600px) { h1 { padding: 20px 0 !important; } - .hamburger-inner, .hamburger-inner:after, .hamburger-inner:before { - width: 25px; + .hamburger-inner, + .hamburger-inner:after, + .hamburger-inner:before { + width: 27px; height: 4px; } #rfrshBtn:after { @@ -1078,6 +1231,4 @@ pre { margin-left: 0; } -@media only screen and (min-width: 601px) { - -} +@media only screen and (min-width: 601px) {} \ No newline at end of file diff --git a/Documents/css/diagpages_new.min.css b/Documents/css/diagpages_new.min.css index 681237c87..c9b39ff0b 100644 --- a/Documents/css/diagpages_new.min.css +++ b/Documents/css/diagpages_new.min.css @@ -1 +1 @@ -html,body{position:relative;height:100%;min-height:100%;min-width:375px}.container{width:100%;margin:auto}#top-hdr{height:auto;min-width:375px}.in-middle{vertical-align:middle}.left-head-col{padding:1.2em 0 0 20px}.right-head-col{padding:2.2em 40px 0 0}.links{padding:10px;font-size:18px}.logoIcn{width:1.7em;height:auto;max-width:48px;max-height:48px}.refresh-btn{color:black;width:auto;height:auto;max-width:90px;max-height:40px;font-size:1.0em;border-radius:.4em;background-color:white;border-color:gray;border-style:solid;border-width:1px}#rfrshBtn:after{content:' Refresh'}.export-pdf-btn{color:white;width:auto;height:auto;max-width:90px;max-height:40px;font-size:1.0em;border-radius:.4em;background-color:transparent;border-color:white;border-style:solid;border-width:1px;display:none}.panel-title-text{font-size:1.2em}.subpanel-title-text{font-size:1em}.panel-heading{padding:0 10px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panelHeadTxt{font-size:25px}.pnl-head-title{font-size:2.0em}@media(min-width:800px){.pnl-head-title{padding:3px 0}}@media(min-width:600px){.pnl-head-title{padding:5px 0}}.title-text{font-size:2.0em}pre{overflow-x:auto;overflow-y:auto}.navMenu{text-align:left}.nav-home-btn{padding:20px 10px 0 10px;font-size:22px;-webkit-text-stroke:white;-webkit-text-stroke-width:thin}.nav-menu{padding:12px}.nav-menu li{border-bottom:solid 1px rgba(102,102,102,0.3);margin-left:5px;margin-right:5px;font-size:14px;padding:12px}.nav-menu li a{color:white;text-decoration:none}.nav-menu li a:hover{color:tomato;text-decoration:none}.nav-menu li .sub-nav{border-bottom:0;padding:4px}.nav-menu a .caret{width:0;height:0;display:inline-block;vertical-align:top;border-top:4px solid #4f5963;border-right:4px solid transparent;border-left:4px solid transparent;content:"";margin-top:8px}.nav-menu a:hover .caret{border-top-color:#4f5963}.nav-menu li.open>a>.caret{border-top:0;border-bottom:4px solid #4f5963;border-right:4px solid transparent;border-left:4px solid transparent}.nav-menu li.open>a:hover>.caret{border-bottom-color:#4f5963}.icon:before{font-family:'FontAwesome';font-style:normal;font-variant:normal;font-weight:normal;line-height:1;text-transform:none;content:'\f105'}.nav-menu li>a>span.icon{float:right;margin:.1em 1.7em -0.1em 0;opacity:0;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.nav-menu li>a:hover>span.icon{float:right;margin:.1em .8em -0.1em 0;opacity:1}.menu-btn:focus{outline:0}.nav-cont-bord-div{padding:15px 15px 25px 15px}.nav-cont-div{padding:10px;border-radius:.6em;background-color:#333;border:solid lightgray 1px;-moz-box-shadow:0 5px 1px #ccc;-webkit-box-shadow:0 1px 1px #ccc;box-shadow:0 1px 1px #ccc}.nav-key-item{font-weight:bold;text-decoration:underline;list-style:none;font-size:1.0em}.nav-subkey-item{font-weight:normal;list-style:none}.nav-subkey-item:before{color:white;content:"▶";padding-right:8px}.pushy{position:fixed;width:250px;height:100%;top:0;z-index:9999;background:#191918;opacity:.6;overflow:auto;-webkit-overflow-scrolling:touch}.pushy.pushy-left{left:0}.pushy.pushy-right{right:0}.pushy-left{-webkit-transform:translate3d(-250px,0,0);-ms-transform:translate3d(-250px,0,0);transform:translate3d(-250px,0,0)}.pushy-open-left #container,.pushy-open-left .push{-webkit-transform:translate3d(250px,0,0);-ms-transform:translate3d(250px,0,0);transform:translate3d(250px,0,0)}.pushy-right{-webkit-transform:translate3d(250px,0,0);-ms-transform:translate3d(250px,0,0);transform:translate3d(250px,0,0)}.pushy-open-right #container,.pushy-open-right .push{-webkit-transform:translate3d(-250px,0,0);-ms-transform:translate3d(-250px,0,0);transform:translate3d(-250px,0,0)}.pushy-open-left .pushy,.pushy-open-right .pushy{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.pushy-open-left .pushy-content,.pushy-open-right .pushy-content{visibility:visible}#container,.pushy,.push{transition:transform .2s cubic-bezier(0.16,0.68,0.43,0.99)}.pushy-content{transition:visibility .2s cubic-bezier(0.16,0.68,0.43,0.99)}.site-overlay{display:none}.pushy-open-left .site-overlay,.pushy-open-right .site-overlay{display:block;position:fixed;top:0;right:0;bottom:0;left:0;z-index:9998;background-color:rgba(0,0,0,0.5);-webkit-animation:fade 500ms;animation:fade 500ms}@keyframes fade{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes fade{0%{opacity:0}100%{opacity:1}}.logs-div{text-align:left;vertical-align:middle;padding:0,0}.log-line{display:inline-block;padding-bottom:8px;vertical-align:middle}.log-time{font-weight:bold;vertical-align:middle}.log-type{display:inline-block;padding:.2em .6em .3em;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;border-radius:.25em;min-width:44px;font-size:.75em}.log-source{border-radius:.3em;border-color:gray;border-style:solid;border-width:1px;padding:2px;font-style:italic;vertical-align:middle}.log-msg{vertical-align:middle}.defsrc-bg{color:gray;background-color:white;font-size:.9em}.mansrc-bg{color:#6b6b6b;background-color:transparent;font-size:.9em}.autosrc-bg{color:#6b6b6b;background-color:lightgray;font-size:.9em}.camsrc-bg{color:#6b6b6b;background-color:lightblue;font-size:.9em}.protsrc-bg{color:#6b6b6b;background-color:lightorange;font-size:.9em}.pressrc-bg{color:#6b6b6b;background-color:lightyellow;font-size:.9em}.weatsrc-bg{color:#6b6b6b;background-color:lightpurple;font-size:.9em}.tstatsrc-bg{color:#6b6b6b;background-color:lightgreen;font-size:.9em}#scrollTopBtn{display:none;position:fixed;bottom:20px;right:30px;z-index:99;border:0;outline:0;background-color:gray;color:white;cursor:pointer;padding:15px;border-radius:10px}#scrollTopBtn:hover{background-color:#3174ae}.vex.vex-theme-default .vex-content{width:50%;padding:3px}.device table{border:0;border-radius:3px;width:100%;-webkit-border-radius:3px;-moz-border-radius:3px}.device h1,h2,h3,h4,h5,h6{padding:20px;margin:4px}.topBorder{border-top:2px solid #00a1db}.bottomBorder{border-bottom:2px solid #808080}.device{max-width:1200px;width:100%;padding-top:10px}.device h1{font-size:6vw;width:100%;text-align:center;font-weight:normal}.device h2{font-size:9vw;text-align:center;margin-left:auto;margin-right:auto;font-weight:normal}.device h3,h3 a{font-size:6vw;font-weight:bold;text-align:center;background:#b74c4c;color:#f5f5f5}.device h4{font-size:4vw;font-weight:bold;text-align:center;background:#00a1db;color:#f5f5f5}.centerText{text-align:center}.device hr{background:#00a1db;width:100%;height:1px}.device th,td{box-shadow:inset 0 0 rgba(0,0,0,0.25),inset 0 0 rgba(0,0,0,0.25);padding:4px}.device th{-webkit-font-smoothing:antialiased;color:#f5f5f5;text-shadow:0 0 1px rgba(0,0,0,0.1);-webkit-border-radius:2px;-moz-border-radius:2px;background:#00a1db}.devInfo th{font-size:3.8vw}.devInfoTile th{font-size:2.0vw}.devInfoTile h4{font-size:1.5vw}.device td{color:grey;text-shadow:0 0 1px rgba(255,255,255,0.1);text-align:center}.device tr{-webkit-transition:background .3s,box-shadow .3s;-moz-transition:background .3s,box-shadow .3s;transition:background .3s,box-shadow .3s}.column,.columns{width:100%;float:left;box-sizing:border-box}.one.column,.one.columns{width:4.66666666667%}.two.columns{width:13.3333333333%}.three.columns{width:22%}.four.columns{width:32.6666666667%}.five.columns{width:39.3333333333%}.six.columns{width:48%}.seven.columns{width:56.6666666667%}.eight.columns{width:65.3333333333%}.nine.columns{width:74.0%}.ten.columns{width:82.6666666667%}.eleven.columns{width:91.3333333333%}.twelve.columns{width:100%;margin-left:0}.offset-by-one.column,.offset-by-one.columns{margin-left:8.66666666667%}.offset-by-two.column,.offset-by-two.columns{margin-left:17.3333333333%}.offset-by-three.column,.offset-by-three.columns{margin-left:26%}.offset-by-four.column,.offset-by-four.columns{margin-left:34.6666666667%}.offset-by-five.column,.offset-by-five.columns{margin-left:43.3333333333%}.offset-by-six.column,.offset-by-six.columns{margin-left:52%}.offset-by-seven.column,.offset-by-seven.columns{margin-left:60.6666666667%}.offset-by-eight.column,.offset-by-eight.columns{margin-left:69.3333333333%}.offset-by-nine.column,.offset-by-nine.columns{margin-left:78.0%}.offset-by-ten.column,.offset-by-ten.columns{margin-left:86.6666666667%}.offset-by-eleven.column,.offset-by-eleven.columns{margin-left:95.3333333333%}.dateTimeText{font-size:3.4vw}.dateTimeTextTile{font-size:1.5vw}.dateTimeTextSmall{font-size:2.8vw}.battImg{width:30px;height:15px}.leafImg{width:25px;height:25px}.red{background-color:#db3a00}.yellow{background-color:#dba800}.redAlertBanner{font-size:6vw;font-weight:bold;text-align:center;background:#b74c4c;color:#f5f5f5;padding:8px 0}.brightRedAlertBanner{font-size:6vw;font-weight:bold;text-align:center;background:#ff3b19;color:#f5f5f5;padding:8px 0}.greenAlertBanner{font-size:6vw;font-weight:bold;text-align:center;background:#0f0;-webkit-text-stroke:1.0px #000;-webkit-text-fill-color:#fff;padding:8px 0}.androidAlertBanner{font-size:6vw;font-weight:bold;text-align:center;background:#6f786f;-webkit-text-stroke:1.0px #000;-webkit-text-fill-color:#fff;padding:8px 0}.orangeAlertBanner{font-size:6vw;font-weight:bold;text-align:center;background:#ffae19;color:#f5f5f5;padding:8px 0}.blueTitle{font-size:4vw;font-weight:bold;text-align:center;background:#00a1db;color:#f5f5f5}.alertModalTitle{font-size:22px;font-weight:bold;text-align:center;background:transparent;color:black}.sched h3{font-size:4.6vw;background:#00a1db}.sched h4{font-size:3.8vw;background:#00a1db}.sched col{font-size:4.0vw}.slideFooterMsg{font-size:3.0vw;padding:20px;margin:1em auto}.slideFooterMsgTile{font-size:1.8vw;padding:20px;margin:1em auto;text-decoration:underline}.pageFooterBtn{padding:10px;horizontal-align:center;text-align:center}.schedFill{background:gray;color:white;text-align:center;padding:4px}.tempSrc th{font-size:4.1vw;font-weight:bold;background:transparent;text-decoration:underline;color:gray}.swiper-container{width:95%;min-height:300px;padding:10px}.default-container{width:95%;padding:10px}.vex.vex-theme-default .vex-content{width:95%;padding:3px}.alarmImg{vertical-align:top;width:60px;height:60px}.alarmWarnCap{display:block;color:#e89a15}.alarmEmerCap{display:block;color:#df5316}.alarmClearCap{display:block;color:gray}.sectionBg{box-shadow:0 1px 1px rgba(0,0,0,0.16),0 1px 1px rgba(0,0,0,0.23);background:white}.sectionBg h3{background-color:#00a1db;font-size:4.5vw;padding:.6vw;text-shadow:1px 1px 1px black}.sectionBgTile{box-shadow:0 1px 1px rgba(0,0,0,0.16),0 1px 1px rgba(0,0,0,0.23);background:white}.sectionBgTile h3{background-color:#00a1db;font-size:2.5vw;padding:.6vw;text-shadow:1px 1px 1px black}.sectionBg table{box-shadow:0 3px 6px rgba(0,0,0,0.16),0 3px 6px rgba(0,0,0,0.23);background:white}.sectionBgTile table{box-shadow:0 3px 6px rgba(0,0,0,0.16),0 3px 6px rgba(0,0,0,0.23);background:white}.devInfo th{color:#00a1db;background:transparent;font-size:3.8vw;text-shadow:0 0 1px lightgray;text-decoration:underline;text-align:center}.devInfoTile th{color:#00a1db;background:transparent;font-size:2.0vw;text-shadow:0 0 1px lightgray;text-decoration:underline;text-align:center}.redText{color:red}.orangeText{color:orange}.chgLog div{padding:0 5px 0 5px;text-align:left}.chgLog h3{background-color:transparent;background:transparent}.chgLog ul,li{font-size:12px;padding:0 10px 0 10px;Margin:0}.chgLog p{font-size:12px}@media only screen and (max-width:600px){h1{padding:20px 0!important}.hamburger-inner,.hamburger-inner:after,.hamburger-inner:before{width:25px;height:4px}#rfrshBtn:after{content:''}#rfrshBtn{font-size:1.1em}.logoIcn{max-width:32px!important;max-height:32px!important}.title-text{font-size:6vw!important;padding:3.5vw 0!important}.container{padding-right:0!important;padding-left:0!important}.panel-body{padding:0 15px!important}.sectionBgTile h3{font-size:3.5vw!important}.device td{font-size:3.0vw!important}.devInfoTile th{font-size:3.0vw!important}.left-head-col{padding:3.2vw 0 0 0!important}.right-head-col{padding:1.7em 20px 0 0!important}.slideFooterMsg{font-size:2.8vw!important;text-decoration:underline}.slideFooterMsgTile{font-size:2.8vw!important;text-decoration:underline}b.wStation{font-size:2.5vw}}.row{margin-right:0;margin-left:0} \ No newline at end of file +.logs-div,.navMenu{text-align:left}body,html{position:relative;height:100%;min-height:100%;min-width:375px}.container{width:100%;margin:auto}#top-hdr{height:auto;min-width:375px}.in-middle{vertical-align:middle}.left-head-col{padding:1.2em 0 0 20px}.right-head-col{padding:2.2em 40px 0 0}.links{padding:10px;font-size:18px}.logoIcn{width:1.7em;height:auto;max-width:48px;max-height:48px}.export-pdf-btn,.refresh-btn{width:auto;height:auto;max-width:90px;max-height:40px;font-size:1em;border-radius:.4em;border-style:solid;border-width:1px}.refresh-btn{color:#000;background-color:#fff;border-color:gray}#rfrshBtn:after{content:' Refresh'}.export-pdf-btn{color:#fff;background-color:transparent;border-color:#fff;display:none}.nav-menu a .caret,.nav-menu li.open>a>.caret{border-right:4px solid transparent;border-left:4px solid transparent}.panel-title-text{font-size:1.2em}.subpanel-title-text{font-size:1em}.panel-heading{padding:0 10px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panelHeadTxt{font-size:25px}.pnl-head-title,.title-text{font-size:2em}@media (min-width:800px){.pnl-head-title{padding:3px 0}}@media (min-width:600px){.pnl-head-title{padding:5px 0}}pre{overflow-x:auto;overflow-y:auto}.nav-home-btn{padding:20px 10px 0;font-size:22px;-webkit-text-stroke:#fff;-webkit-text-stroke-width:thin}.nav-menu,.nav-menu li{padding:12px}.androidAlertBanner,.greenAlertBanner{-webkit-text-stroke:1px #000;-webkit-text-fill-color:#FFF}.nav-menu li{border-bottom:solid 1px rgba(102,102,102,.3);margin-left:5px;margin-right:5px;font-size:14px}.nav-menu li a{color:#fff;text-decoration:none}.nav-menu li a:hover{color:tomato;text-decoration:none}.nav-menu li .sub-nav{border-bottom:0;padding:4px}.nav-menu a .caret{width:0;height:0;display:inline-block;vertical-align:top;border-top:4px solid #4f5963;content:"";margin-top:8px}.nav-menu a:hover .caret{border-top-color:#4f5963}.nav-menu li.open>a>.caret{border-top:none;border-bottom:4px solid #4f5963}.nav-menu li.open>a:hover>.caret{border-bottom-color:#4f5963}.icon:before{font-family:FontAwesome;font-style:normal;font-variant:normal;font-weight:400;line-height:1;text-transform:none;content:'\f105'}.nav-menu li>a>span.icon{float:right;margin:.1em 1.7em -.1em 0;opacity:0;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.nav-menu li>a:hover>span.icon{float:right;margin:.1em .8em -.1em 0;opacity:1}.menu-btn:focus{outline:0}.nav-cont-bord-div{padding:15px 15px 25px}.nav-cont-div{padding:10px;border-radius:.6em;background-color:#333;border:1px solid #d3d3d3;-moz-box-shadow:0 5px 1px #ccc;-webkit-box-shadow:0 1px 1px #ccc;box-shadow:0 1px 1px #ccc}.nav-key-item{font-weight:700;text-decoration:underline;list-style:none;font-size:1em}.nav-subkey-item{font-weight:400;list-style:none}.nav-subkey-item:before{color:#fff;content:"â–¶";padding-right:8px}.pushy{position:fixed;width:250px;height:100%;top:0;z-index:9999;background:#191918;opacity:.6;overflow:auto;-webkit-overflow-scrolling:touch}.pushy.pushy-left{left:0}.pushy.pushy-right{right:0}.pushy-left{-webkit-transform:translate3d(-250px,0,0);-ms-transform:translate3d(-250px,0,0);transform:translate3d(-250px,0,0)}.pushy-open-left #container,.pushy-open-left .push,.pushy-right{-webkit-transform:translate3d(250px,0,0);-ms-transform:translate3d(250px,0,0);transform:translate3d(250px,0,0)}.pushy-open-right #container,.pushy-open-right .push{-webkit-transform:translate3d(-250px,0,0);-ms-transform:translate3d(-250px,0,0);transform:translate3d(-250px,0,0)}.pushy-open-left .pushy,.pushy-open-right .pushy{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.pushy-open-left .pushy-content,.pushy-open-right .pushy-content{visibility:visible}#container,.push,.pushy{transition:transform .2s cubic-bezier(.16,.68,.43,.99)}.pushy-content{transition:visibility .2s cubic-bezier(.16,.68,.43,.99)}.site-overlay{display:none}.pushy-open-left .site-overlay,.pushy-open-right .site-overlay{display:block;position:fixed;top:0;right:0;bottom:0;left:0;z-index:9998;background-color:rgba(0,0,0,.5);-webkit-animation:fade .5s;animation:fade .5s}.log-line,.log-type{display:inline-block;vertical-align:middle}@keyframes fade{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes fade{0%{opacity:0}100%{opacity:1}}.logs-div{vertical-align:middle;padding:0,}.log-line{padding-bottom:8px}.log-time{font-weight:700;vertical-align:middle}.log-type{padding:.2em .6em .3em;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;border-radius:.25em;min-width:44px;font-size:.75em}.device h1,.device h2{text-align:center;font-weight:400}.log-source{border-radius:.3em;border-color:gray;border-style:solid;border-width:1px;padding:2px;font-style:italic;vertical-align:middle}.log-msg{vertical-align:middle}.defsrc-bg{color:gray;background-color:#fff;font-size:.9em}.autosrc-bg,.camsrc-bg,.mansrc-bg,.pressrc-bg,.protsrc-bg,.tstatsrc-bg,.weatsrc-bg{color:#6b6b6b;font-size:.9em}.mansrc-bg{background-color:transparent}.autosrc-bg{background-color:#d3d3d3}.camsrc-bg{background-color:#add8e6}.protsrc-bg{background-color:lightorange}.pressrc-bg{background-color:#ffffe0}.weatsrc-bg{background-color:lightpurple}.tstatsrc-bg{background-color:#90ee90}#scrollTopBtn{display:none;position:fixed;bottom:20px;right:30px;z-index:99;border:none;outline:0;background-color:gray;color:#fff;cursor:pointer;padding:15px;border-radius:10px}#scrollTopBtn:hover{background-color:#3174AE}.device table{border:none;border-radius:3px;width:100%;-webkit-border-radius:3px;-moz-border-radius:3px}.device h1,h2,h3,h4,h5,h6{padding:20px;margin:4px}.topBorder{border-top:2px solid #00a1db}.bottomBorder{border-bottom:2px solid grey}.device{max-width:1200px;width:100%;padding-top:10px}.device h1{font-size:6vw;width:100%}.device h2{font-size:9vw;margin-left:auto;margin-right:auto}.device h3,.device h4,h3 a{font-weight:700;color:#f5f5f5;text-align:center}.device h3,h3 a{font-size:6vw;background:#B74C4C}.device h4,.device hr,.device th{background:#00a1db}.device h4{font-size:4vw}.centerText{text-align:center}.device hr{width:100%;height:1px}.device th,td{box-shadow:inset 0 0 rgba(0,0,0,.25),inset 0 0 rgba(0,0,0,.25);padding:4px}.sectionBg,.sectionBgTile{box-shadow:0 1px 1px rgba(0,0,0,.16),0 1px 1px rgba(0,0,0,.23)}.device th{-webkit-font-smoothing:antialiased;color:#f5f5f5;text-shadow:0 0 1px rgba(0,0,0,.1);-webkit-border-radius:2px;-moz-border-radius:2px}.devInfoTile h4{font-size:1.5vw}.device td{color:grey;text-shadow:0 0 1px rgba(255,255,255,.1);text-align:center}.device tr{-webkit-transition:background .3s,box-shadow .3s;-moz-transition:background .3s,box-shadow .3s;transition:background .3s,box-shadow .3s}.column,.columns{width:100%;float:left;box-sizing:border-box}.one.column,.one.columns{width:4.66666666667%}.two.columns{width:13.3333333333%}.three.columns{width:22%}.four.columns{width:32.6666666667%}.five.columns{width:39.3333333333%}.six.columns{width:48%}.seven.columns{width:56.6666666667%}.eight.columns{width:65.3333333333%}.nine.columns{width:74%}.ten.columns{width:82.6666666667%}.eleven.columns{width:91.3333333333%}.twelve.columns{width:100%;margin-left:0}.offset-by-one.column,.offset-by-one.columns{margin-left:8.66666666667%}.offset-by-two.column,.offset-by-two.columns{margin-left:17.3333333333%}.offset-by-three.column,.offset-by-three.columns{margin-left:26%}.offset-by-four.column,.offset-by-four.columns{margin-left:34.6666666667%}.offset-by-five.column,.offset-by-five.columns{margin-left:43.3333333333%}.offset-by-six.column,.offset-by-six.columns{margin-left:52%}.offset-by-seven.column,.offset-by-seven.columns{margin-left:60.6666666667%}.offset-by-eight.column,.offset-by-eight.columns{margin-left:69.3333333333%}.offset-by-nine.column,.offset-by-nine.columns{margin-left:78%}.offset-by-ten.column,.offset-by-ten.columns{margin-left:86.6666666667%}.offset-by-eleven.column,.offset-by-eleven.columns{margin-left:95.3333333333%}.dateTimeText{font-size:3.4vw}.dateTimeTextTile{font-size:1.5vw}.dateTimeTextSmall{font-size:2.8vw}.androidAlertBanner,.brightRedAlertBanner,.greenAlertBanner,.orangeAlertBanner,.redAlertBanner{font-size:6vw;padding:8px 0;font-weight:700;text-align:center}.battImg{width:30px;height:15px}.leafImg{width:25px;height:25px}.red{background-color:#db3a00}.yellow{background-color:#dba800}.redAlertBanner{background:#B74C4C;color:#f5f5f5}.brightRedAlertBanner{background:#ff3b19;color:#f5f5f5}.greenAlertBanner{background:#0f0}.androidAlertBanner{background:#6f786f}.orangeAlertBanner{background:#ffae19;color:#f5f5f5}.blueTitle{font-size:4vw;font-weight:700;text-align:center;background:#00a1db;color:#f5f5f5}.alertModalTitle{font-size:22px;font-weight:700;text-align:center;background:0 0;color:#000}.sched h3{font-size:4.6vw;background:#00a1db}.sched h4{font-size:3.8vw;background:#00a1db}.sched col{font-size:4vw}.slideFooterMsg,.slideFooterTextTile{font-size:1.8vw;margin:1em auto;text-decoration:underline}.slideFooterMsg{padding:20px}.pageFooterBtn{padding:10px;text-align:center}.schedFill{background:gray;color:#fff;text-align:center;padding:4px}.tempSrc th{font-size:4.1vw;font-weight:700;background:0 0;text-decoration:underline;color:gray}.slideFooterBtn{font-size:1rem;text-align:center;padding:0}.slideFooterText{font-size:3vw;margin:1em auto;padding:0;text-decoration:underline}.pageFooterCls{text-align:center}.swiper-container{width:95%;min-height:300px;padding:0 10px!important}.swiper-pagination-bullet{width:20px;height:20px;text-align:center;line-height:20px;font-size:10px;color:#000;opacity:1;background:rgba(0,0,0,.2)}.swiper-pagination-bullet-active{color:#fff;background:#007aff}.default-container{width:95%;padding:10px}.vex.vex-theme-default .vex-content{width:95%;padding:3px}.sectionBg h3,.sectionBgTile h3{padding:.6vw;text-shadow:1px 1px 1px #000}.alarmImg{vertical-align:top;width:60px;height:60px}.alarmWarnCap{display:block;color:#e89a15}.alarmEmerCap{display:block;color:#df5316}.alarmClearCap{display:block;color:gray}.sectionBg{background:#fff}.sectionBg h3{background-color:#00a1db;font-size:4.5vw}.sectionBgTile{background:#fff}.sectionBgTile h3{background-color:#00a1db;font-size:2.5vw}.devInfo th,.devInfoTile th{color:#00a1db;text-shadow:0 0 1px #d3d3d3;text-decoration:underline;text-align:center}.sectionBg table,.sectionBgTile table{box-shadow:0 3px 6px rgba(0,0,0,.16),0 3px 6px rgba(0,0,0,.23);background:#fff}.chgLog h3,.devInfo th{background:0 0}.devInfo th{font-size:3.8vw}.devInfoTile th{background:0 0;font-size:2vw}.chgLog p,.chgLog ul,li{font-size:12px}.redText{color:red}.orangeText{color:orange}.chgLog div{padding:0 5px;text-align:left}.chgLog ul,li{padding:0 10px;Margin:0}.hamburger-box{width:27px;height:24px}.hamburger-inner,.hamburger-inner:after,.hamburger-inner:before{width:27px;height:4px}@media only screen and (max-width:600px){h1{padding:20px 0!important}.hamburger-inner,.hamburger-inner:after,.hamburger-inner:before{width:27px;height:4px}#rfrshBtn:after{content:''}#rfrshBtn{font-size:1.1em}.logoIcn{max-width:32px!important;max-height:32px!important}.title-text{font-size:6vw!important;padding:3.5vw 0!important}.container{padding-right:0!important;padding-left:0!important}.panel-body{padding:0 15px!important}.sectionBgTile h3{font-size:3.5vw!important}.devInfoTile th,.device td{font-size:3vw!important}.left-head-col{padding:3.2vw 0 0!important}.right-head-col{padding:1.7em 20px 0 0!important}.slideFooterMsg,.slideFooterMsgTile{font-size:2.8vw!important;text-decoration:underline}b.wStation{font-size:2.5vw}}.row{margin-right:0;margin-left:0} \ No newline at end of file diff --git a/Documents/instructions/Nest Developer - Nest Product.docx b/Documents/instructions/Nest Developer - Nest Product.docx index 74dddcbc5c8c1d5ceb2e2e9f85977f149780b1a1..f738f466ef00db769d0fda40aa740bdc87e18895 100644 GIT binary patch delta 248749 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

GR<`LTzBwntVMkyb9pGTiAntX7a9 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 z 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�}i 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 &e%8!O|WD_YK;rb%iCb~<>7yO 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
`-ANjxRaGta@AGwKxh_E+c!M&X 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≷`!ZOufBBTE%m8vmVvda?fA&{^bypehF?S1Kh@ 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
o53SCy|KYc}xLo*|&V{oJNTk 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 literal 583519 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

w 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⪚0IA`)S}k{TgT|LoyC>ZP)UZ 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⩔9A8NDghxz}1-jQ*N_?WWzkvH1Y4yh^)!!584? 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%0Db)Pn&3BS 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̗`F^NpZ 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 diff --git a/Documents/js/diaghome.js b/Documents/js/diaghome.js index d51233bed..9d95d9edd 100644 --- a/Documents/js/diaghome.js +++ b/Documents/js/diaghome.js @@ -1,30 +1,37 @@ -var hdrHeight = $("#top-hdr").height(); -var hdrHeightPx = hdrHeight + 5 + "px"; - -$("body").animate({ - paddingTop: hdrHeightPx, - duration: 'fast' -}); - -$("#rfrshBtn").click(function() { - window.location.reload(true); -}); - -$("#rfrshBtn").hover(function(e) { - $("#rfrshBtnIcn").toggleClass("fa-spin"); -}); - -$(window).scroll(function() { - if ($("body").scrollTop() > 20 || document.documentElement.scrollTop > 20) { - $("#scrollTopBtn").css({ - display: "block" - }); - } else { - $("#scrollTopBtn").css({ - display: "none" - }); - } -}); +'use esversion: 6'; + +var copyBtn = document.getElementById('copyUrlBtn'); +var clipboard = new Clipboard('.copyBtn'); + +function makeRequest(url, method, message, contentType, responseType) { + return new Promise(function(resolve, reject) { + var xhr = new XMLHttpRequest(); + // url += appId || ''; + xhr.onreadystatechange = function() { + if (xhr.readyState === XMLHttpRequest.DONE) { + if (xhr.status === 200) { + resolve(xhr.response); + } else { + reject(Error(xhr.statusText)); + } + } + }; + xhr.onprogress = function() { + // console.log('LOADING', xhr.readyState); // readyState will be 3 + }; + xhr.onerror = function() { + reject(Error('XMLHttpRequest failed; error code:' + xhr.statusText)); + }; + xhr.open(method, url, true); + if (contentType !== null && responseType !== null) { + xhr.setRequestHeader('Accept', contentType); + xhr.responseType = responseType; + xhr.send(); + } else { + xhr.send(message); + } + }); +} function topFunction() { //console.log("requested height:", hdrHeightPx, "| actual height:", $('body').scrollTop()); @@ -32,28 +39,12 @@ function topFunction() { document.documentElement.scrollTop = hdrHeightPx; } -$(function() { - $("#stateUseCirc").percircle(); -}); - - - -var btn = document.getElementById('copyUrlBtn'); -var clipboard = new Clipboard('.btn'); - -clipboard.on('success', function(e) { - console.info('Text:', e.text); - //console.info('Trigger:', e.trigger); - e.clearSelection(); -}); - -clipboard.on('error', function(e) { - //console.error('Action:', e.action); - //console.error('Trigger:', e.trigger); -}); +var hdrHeight = $("#top-hdr").height(); +var hdrHeightPx = hdrHeight + 5 + "px"; $("body").animate({ - paddingTop: hdrHeightPx + paddingTop: hdrHeightPx, + duration: 'fast' }); $("#rfrshBtn").click(function() { @@ -64,55 +55,52 @@ $("#rfrshBtn").hover(function(e) { $("#rfrshBtnIcn").toggleClass("fa-spin"); }); -$(window).scroll(function() { - if ($("body").scrollTop() > 20 || document.documentElement.scrollTop > 20) { - $("#scrollTopBtn").css({ - display: "block" +$('#stateCleanupBtn').click(function(e) { + var data = JSON.stringify({ + cmd: "stateCleanup", + value: null + }); + makeRequest(cmdUrl, 'POST', data, null, null) + .catch(function(err) { + console.log(err, 'Diag Command Results!'); + }) + .then(function(resp) { + if (JSON.parse(resp).data) { + console.log("diagCmd: Sent Successfully!"); + } }); - } else { - $("#scrollTopBtn").css({ - display: "none" - }); - } -}); - -function topFunction() { - //console.log("requested height:", hdrHeightPx, "| actual height:", $('body').scrollTop()); - document.body.scrollTop = hdrHeightPx; - document.documentElement.scrollTop = hdrHeightPx; -} - -$(function() { - $("#stateUseCirc").percircle(); -}); - - - -var btn = document.getElementById('copyUrlBtn'); -var clipboard = new Clipboard('.btn'); - -clipboard.on('success', function(e) { - console.info('Text:', e.text); - //console.info('Trigger:', e.trigger); - e.clearSelection(); }); -clipboard.on('error', function(e) { - //console.error('Action:', e.action); - //console.error('Trigger:', e.trigger); -}); - -$("body").animate({ - paddingTop: hdrHeightPx, - duration: 'fast' -}); - -$("#rfrshBtn").click(function() { - window.location.reload(true); +$('#updateMethodBtn').click(function(e) { + var data = JSON.stringify({ + cmd: "runUpdated", + value: null + }); + makeRequest(cmdUrl, 'POST', data, null, null) + .catch(function(err) { + console.log(err, 'Diag Command Results!'); + }) + .then(function(resp) { + if (JSON.parse(resp).gotData) { + console.log("diagCmd: Sent Successfully!"); + } + }); }); -$("#rfrshBtn").hover(function(e) { - $("#rfrshBtnIcn").toggleClass("fa-spin"); +$('#sendInstallDataBtn').click(function(e) { + var data = JSON.stringify({ + cmd: "sendFirebaseData", + value: null + }); + makeRequest(cmdUrl, 'POST', data, null, null) + .catch(function(err) { + console.log(err, 'Diag Command Results!'); + }) + .then(function(resp) { + if (JSON.parse(resp).gotData) { + console.log("diagCmd: Sent Successfully!"); + } + }); }); $(window).scroll(function() { @@ -127,21 +115,11 @@ $(window).scroll(function() { } }); -function topFunction() { - //console.log("requested height:", hdrHeightPx, "| actual height:", $('body').scrollTop()); - document.body.scrollTop = hdrHeightPx; - document.documentElement.scrollTop = hdrHeightPx; -} $(function() { $("#stateUseCirc").percircle(); }); - - -var btn = document.getElementById('copyUrlBtn'); -var clipboard = new Clipboard('.btn'); - clipboard.on('success', function(e) { console.info('Text:', e.text); //console.info('Trigger:', e.trigger); @@ -151,4 +129,4 @@ clipboard.on('success', function(e) { clipboard.on('error', function(e) { //console.error('Action:', e.action); //console.error('Trigger:', e.trigger); -}); +}); \ No newline at end of file diff --git a/Documents/js/diaghome.min.js b/Documents/js/diaghome.min.js index ecb037d34..1006065eb 100644 --- a/Documents/js/diaghome.min.js +++ b/Documents/js/diaghome.min.js @@ -1 +1 @@ -var hdrHeight=$("#top-hdr").height();var hdrHeightPx=hdrHeight+5+"px";$("body").animate({paddingTop:hdrHeightPx,duration:"fast"});$("#rfrshBtn").click(function(){window.location.reload(true)});$("#rfrshBtn").hover(function(a){$("#rfrshBtnIcn").toggleClass("fa-spin")});$(window).scroll(function(){if($("body").scrollTop()>20||document.documentElement.scrollTop>20){$("#scrollTopBtn").css({display:"block"})}else{$("#scrollTopBtn").css({display:"none"})}});function topFunction(){document.body.scrollTop=hdrHeightPx;document.documentElement.scrollTop=hdrHeightPx}$(function(){$("#stateUseCirc").percircle()});var btn=document.getElementById("copyUrlBtn");var clipboard=new Clipboard(".btn");clipboard.on("success",function(a){console.info("Text:",a.text);a.clearSelection()});clipboard.on("error",function(a){}); \ No newline at end of file +"use esversion: 6";function makeRequest(n,e,t,o,l){return new Promise(function(c,s){var r=new XMLHttpRequest;r.onreadystatechange=function(){r.readyState===XMLHttpRequest.DONE&&(200===r.status?c(r.response):s(Error(r.statusText)))},r.onprogress=function(){},r.onerror=function(){s(Error("XMLHttpRequest failed; error code:"+r.statusText))},r.open(e,n,!0),null!==o&&null!==l?(r.setRequestHeader("Accept",o),r.responseType=l,r.send()):r.send(t)})}function topFunction(){document.body.scrollTop=hdrHeightPx,document.documentElement.scrollTop=hdrHeightPx}var copyBtn=document.getElementById("copyUrlBtn"),clipboard=new Clipboard(".copyBtn"),hdrHeight=$("#top-hdr").height(),hdrHeightPx=hdrHeight+5+"px";$("body").animate({paddingTop:hdrHeightPx,duration:"fast"}),$("#rfrshBtn").click(function(){window.location.reload(!0)}),$("#rfrshBtn").hover(function(n){$("#rfrshBtnIcn").toggleClass("fa-spin")}),$("#stateCleanupBtn").click(function(n){var e=JSON.stringify({cmd:"stateCleanup",value:null});makeRequest(cmdUrl,"POST",e,null,null).catch(function(n){console.log(n,"Diag Command Results!")}).then(function(n){JSON.parse(n).data&&console.log("diagCmd: Sent Successfully!")})}),$("#updateMethodBtn").click(function(n){var e=JSON.stringify({cmd:"runUpdated",value:null});makeRequest(cmdUrl,"POST",e,null,null).catch(function(n){console.log(n,"Diag Command Results!")}).then(function(n){JSON.parse(n).gotData&&console.log("diagCmd: Sent Successfully!")})}),$("#sendInstallDataBtn").click(function(n){var e=JSON.stringify({cmd:"sendFirebaseData",value:null});makeRequest(cmdUrl,"POST",e,null,null).catch(function(n){console.log(n,"Diag Command Results!")}).then(function(n){JSON.parse(n).gotData&&console.log("diagCmd: Sent Successfully!")})}),$(window).scroll(function(){$("body").scrollTop()>20||document.documentElement.scrollTop>20?$("#scrollTopBtn").css({display:"block"}):$("#scrollTopBtn").css({display:"none"})}),$(function(){$("#stateUseCirc").percircle()}),clipboard.on("success",function(n){console.info("Text:",n.text),n.clearSelection()}),clipboard.on("error",function(n){}); \ No newline at end of file diff --git a/devicetypes/tonesto7/nest-camera.src/nest-camera.groovy b/devicetypes/tonesto7/nest-camera.src/nest-camera.groovy index 03d2794fd..213f4bfc6 100644 --- a/devicetypes/tonesto7/nest-camera.src/nest-camera.groovy +++ b/devicetypes/tonesto7/nest-camera.src/nest-camera.groovy @@ -4,7 +4,7 @@ * Contributors: Ben W. (@desertblade), Eric S. (@E_Sch) * A Huge thanks goes out to Greg (@ghesp) for all of your help getting this working. * - * Copyright (C) 2017 Anthony S. + * Copyright (C) 2017, 2018, 2019 Anthony S. * Licensing Info: Located at https://raw.githubusercontent.com/tonesto7/nest-manager/master/LICENSE.md */ @@ -13,7 +13,7 @@ import groovy.time.TimeCategory preferences { } -def devVer() { return "5.2.0" } +def devVer() { return "5.4.5" } metadata { definition (name: "${textDevName()}", author: "Anthony S.", namespace: "tonesto7") { @@ -44,10 +44,9 @@ metadata { attribute "activityZoneName", "string" attribute "isStreaming", "string" attribute "audioInputEnabled", "string" - attribute "videoHistoryEnabled", "string" + attribute "nestAware", "string" attribute "motionPerson", "string" - attribute "minVideoHistoryHours", "string" - attribute "maxVideoHistoryHours", "string" + attribute "videoQualityLevel", "string" attribute "publicShareEnabled", "string" attribute "lastEventStart", "string" attribute "lastEventEnd", "string" @@ -57,6 +56,7 @@ metadata { attribute "debugOn", "string" attribute "devTypeVer", "string" attribute "onlineStatus", "string" + attribute "securityState", "string" } simulator { } @@ -110,20 +110,39 @@ metadata { state "inactive", label:'no motion', icon:"st.motion.motion.inactive", backgroundColor:"#ffffff" } standardTile("sound", "device.sound", width: 2, height: 2, decoration: "flat", wordWrap: true) { - state "detected", label:'Noise', icon:"st.sound.sound.detected", backgroundColor:"#00a0dc" - state "not detected", label:'Quiet', icon:"st.sound.sound.notdetected", backgroundColor:"#ffffff" + state "detected", label:'Noise', icon:"st.Entertainment.entertainment15", backgroundColor:"#00a0dc" + state "not detected", label:'Quiet', icon:"st.Entertainment.entertainment15", backgroundColor:"#ffffff" + } + valueTile("softwareVer", "device.softwareVer", inactiveLabel: false, width: 3, height: 1, decoration: "flat", wordWrap: true) { + state("default", label: 'Firmware:\nv${currentValue}') + } + valueTile("lastConnection", "device.lastConnection", inactiveLabel: false, width: 3, height: 1, decoration: "flat", wordWrap: true) { + state("default", label: 'Camera Last Checked-In:\n${currentValue}') + } + valueTile("onlineStatus", "device.onlineStatus", width: 2, height: 1, wordWrap: true, decoration: "flat") { + state("default", label: 'Network Status:\n${currentValue}') + } + valueTile("lastUpdatedDt", "device.lastUpdatedDt", width: 3, height: 1, decoration: "flat", wordWrap: true) { + state("default", label: 'Data Last Received:\n${currentValue}') + } + valueTile("devTypeVer", "device.devTypeVer", width: 3, height: 1, decoration: "flat") { + state("default", label: 'Device Type:\nv${currentValue}', defaultState: true) + } + valueTile("apiStatus", "device.apiStatus", width: 2, height: 1, decoration: "flat", wordWrap: true) { + state "Good", label: "API Status:\nOK" + state "Sporadic", label: "API Status:\nISSUE ", backgroundColor: "#FFFF33" + state "Outage", label: "API Status:\nISSUE ", backgroundColor: "#FFFF33" } standardTile("refresh", "device.refresh", width:2, height:2, decoration: "flat") { state "default", action:"refresh.refresh", icon:"https://raw.githubusercontent.com/tonesto7/nest-manager/master/Images/Devices/refresh_icon.png" } - htmlTile(name:"devCamHtml", action: "getCamHtml", width: 6, height: 10, whitelist: ["raw.githubusercontent.com", "cdn.rawgit.com"]) - - standardTile("test", "device.testBtn", width:2, height:2, decoration: "flat") { - state "default", label: 'Test', action:"testBtn" + htmlTile(name:"devCamHtml", action: "getCamHtml", width: 6, height: 10, whitelist: ["raw.githubusercontent.com", "cdn.rawgit.com", "cdnjs.cloudflare.com"]) + valueTile("remind", "device.blah", inactiveLabel: false, width: 6, height: 2, decoration: "flat", wordWrap: true) { + state("default", label: 'Reminder:\nHTML Content is Available in SmartApp', defaultState: true) } main "isStreamingStatus" - //details(["devCamHtml", "isStreaming", "take", "refresh", "motion", "cameraDetails", "sound"]) - details(["videoPlayer", "isStreaming", "take", "refresh", "devCamHtml", "cameraDetails", "motion", "sound" ]) + details(["videoPlayer", "isStreaming", "take", "refresh", "cameraDetails", "motion", "sound","onlineStatus","debugOn", "apiStatus", "lastConnection", "lastUpdatedDt", "lastTested","devTypeVer", "softwareVer", "devCamHtml", "remind" ]) + } preferences { input "enableEvtSnapShot", "bool", title: "Take Snapshot on Motion Events?", description: "", defaultValue: true, displayDuringSetup: false @@ -133,12 +152,10 @@ metadata { mappings { path("/getInHomeURL") {action: [GET: "getInHomeURL"]} - path("/getOutHomeURL") {action: [GET: "getOutHomeURL"]} path("/getCamHtml") {action: [GET: "getCamHtml"]} } -def getInHomeURL() { return [InHomeURL: getCamPlaylistURL().toString()] } -def getOutHomeURL() { return [OutHomeURL: getCamPlaylistURL().toString()] } +def getInHomeURL() { return [InHomeURL: (getCamPlaylistURL() ?: "")] } def initialize() { Logger("initialized...") @@ -146,6 +163,7 @@ def initialize() { if (!state.updatedLastRanAt || now() >= state.updatedLastRanAt + 2000) { state.updatedLastRanAt = now() verifyHC() + state?.isInstalled = true } else { log.trace "initialize(): Ran within last 2 seconds - SKIPPING" } @@ -153,15 +171,14 @@ def initialize() { void installed() { Logger("installed...") - initialize() - state?.isInstalled = true + runIn(5, "initialize", [overwrite: true] ) state?.shownChgLog = true - runIn(15, "refresh") + runIn(15, "refresh", [overwrite: true]) } void updated() { Logger("updated...") - initialize() + runIn(5, "initialize", [overwrite: true] ) } def useTrackedHealth() { return state?.useTrackedHealth ?: false } @@ -195,9 +212,7 @@ def modifyDeviceStatus(status) { def ping() { Logger("ping...") -// if(useTrackedHealth()) { - keepAwakeEvent() -// } + keepAwakeEvent() } def keepAwakeEvent() { @@ -235,17 +250,19 @@ void poll() { } void refresh() { + state?.camApiServerData = null poll() } void cltLiveStreamStart() { //log.trace "video stream start()" - def url = getCamPlaylistURL().toString() - def imgUrl = "http://cdn.device-icons.smartthings.com/camera/dlink-indoor@2x.png" - //def imgUrl = state?.snapshot_url - def dataLiveVideo = [OutHomeURL: url, InHomeURL: url, ThumbnailURL: imgUrl, cookie: [key: "key", value: "value"]] - def evtData = groovy.json.JsonOutput.toJson(dataLiveVideo) - sendEvent(name: "stream", value: evtData.toString(), data: evtData, descriptionText: "Starting the livestream", eventType: "VIDEO", displayed: false, isStateChange: true) + String url = getCamPlaylistURL() + String imgUrl = "http://cdn.device-icons.smartthings.com/camera/dlink-indoor@2x.png" + if(url && imgUrl) { + Map dataLiveVideo = [OutHomeURL: url, InHomeURL: url, ThumbnailURL: imgUrl, cookie: [key: "key", value: "value"]] + def evtData = groovy.json.JsonOutput.toJson(dataLiveVideo) + sendEvent(name: "stream", value: evtData.toString(), data: evtData, descriptionText: "Starting the Live Video Stream", eventType: "VIDEO", displayed: false, isStateChange: true) + } } // parent calls this method to queue data. @@ -254,25 +271,26 @@ void cltLiveStreamStart() { def generateEvent(Map eventData) { //log.trace("generateEvent Parsing data ${eventData}") state.eventData = eventData - runIn(3, "processEvent", [overwrite: true] ) + //runIn(1, "processEvent", [overwrite: true] ) + processEvent() } def processEvent() { if(state?.swVersion != devVer()) { initialize() state.swVersion = devVer() - state?.shownChgLog = false + state.shownChgLog = false state.androidDisclaimerShown = false } def eventData = state?.eventData state.eventData = null def dtNow = getDtNow() //log.trace("processEvent Parsing data ${eventData}") - try { +// try { LogAction("------------START OF API RESULTS DATA------------", "warn") if(eventData) { def results = eventData?.data - //log.debug "results: $results" + // log.debug "results: $results" state.isBeta = eventData?.isBeta == true ? true : false state.hcRepairEnabled = eventData?.hcRepairEnabled == true ? true : false state.takeSnapOnEvt = eventData?.camTakeSnapOnEvt == true ? true : false @@ -280,44 +298,47 @@ def processEvent() { state.showLogNamePrefix = eventData?.logPrefix == true ? true : false state.enRemDiagLogging = eventData?.enRemDiagLogging == true ? true : false state.streamMsg = eventData?.streamNotify == true ? true : false - state.healthMsg = eventData?.healthNotify == true ? true : false - state.motionSndChgWaitVal = eventData?.motionSndChgWaitVal ? eventData?.motionSndChgWaitVal.toInteger() : 60 -// if(useTrackedHealth()) { - if(eventData.hcTimeout && (state?.hcTimeout != eventData?.hcTimeout || !state?.hcTimeout)) { - state.hcTimeout = eventData?.hcTimeout - verifyHC() - } -// } - state?.useMilitaryTime = eventData?.mt ? true : false + state.healthMsg = eventData?.healthNotify?.healthMsg == true ? true : false + state.healthMsgWait = eventData?.healthNotify?.healthMsgWait + state.motionSndChgWaitVal = eventData?.motionSndChgWaitVal ? eventData?.motionSndChgWaitVal?.toInteger() : 60 + if(eventData?.hcTimeout && (state?.hcTimeout != eventData?.hcTimeout || !state?.hcTimeout)) { + state.hcTimeout = eventData?.hcTimeout + verifyHC() + } + state.useMilitaryTime = eventData?.mt ? true : false state.clientBl = eventData?.clientBl == true ? true : false state.mobileClientType = eventData?.mobileClientType state.nestTimeZone = eventData?.tz ?: null state?.devBannerData = eventData?.devBannerData ?: null - publicShareUrlEvent(results?.public_share_url) onlineStatusEvent(results?.is_online?.toString()) isStreamingEvent(results?.is_streaming) + publicShareUrlEvent(results?.public_share_url) + securityStateEvent(eventData?.secState) publicShareEnabledEvent(results?.is_public_share_enabled?.toString()) videoHistEnabledEvent(results?.is_video_history_enabled?.toString()) if(results?.last_is_online_change) { lastOnlineEvent(results?.last_is_online_change?.toString()) } - if(eventData?.htmlInfo) { state?.htmlInfo = eventData?.htmlInfo } - if(eventData?.allowDbException) { state?.allowDbException = eventData?.allowDbException = false ? false : true } + if(eventData?.allowDbException) { state?.allowDbException = eventData?.allowDbException == false ? false : true } apiStatusEvent(eventData?.apiIssues) debugOnEvent(eventData?.debug ? true : false) + state?.camMotionZones = eventData?.camMotionZones ?: [] audioInputEnabledEvent(results?.is_audio_input_enabled?.toString()) softwareVerEvent(results?.software_version?.toString()) if(results?.activity_zones) { state?.activityZones = results?.activity_zones } - if(results?.snapshot_url) { state?.snapshot_url = results?.snapshot_url?.toString() } + + //if(results?.snapshot_url) { state?.snapshot_url = results?.snapshot_url?.toString() } + imageEvent(results?.snapshot_url?.toString()) if(results?.app_url) { state?.app_url = results?.app_url?.toString() } if(results?.web_url) { state?.web_url = results?.web_url?.toString() } if(results?.last_event) { - state?.animation_url = null + // state?.animation_url = null if(results?.last_event?.animated_image_url) { state?.animation_url = results?.last_event?.animated_image_url } if(results?.last_event.start_time && results?.last_event.end_time) { lastEventDataEvent(results?.last_event) } } - deviceVerEvent(eventData?.latestVer.toString()) - vidHistoryTimeEvent() - lastUpdatedEvent() + deviceVerEvent(eventData?.latestVer?.toString()) + // videoQualityEvent() + // findCameraModel() + lastUpdatedEvent(true) checkHealth() if(state?.ok2Checkin == true) { lastCheckinEvent(dtNow) @@ -326,15 +347,19 @@ def processEvent() { // Logger("Device Health Status: ${device.getStatus()}") } return null - } +/* } catch (ex) { - log.error "generateEvent Exception:", ex - exceptionDataHandler(ex.message, "generateEvent") + def s = "" + if(ex && ex?.message) { s = ex?.message?.toString() } + log.error "processEvent Exception: ${s}", ex + exceptionDataHandler(s, "processEvent") } +*/ } def getStateSize() { return state?.toString().length() } -def getStateSizePerc() { return (int) ((stateSize/100000)*100).toDouble().round(0) } // +def getStateSizePerc() { return (int) ((stateSize/100000)*100).toDouble().round(0) } +def getDevTypeId() { return device?.getTypeId() } def getDataByName(String name) { state[name] ?: device.getDataValue(name) @@ -345,7 +370,7 @@ def getDeviceStateData() { } def evtSnapShotOk() { - if(state?.takeSnapOnEvt != true) { return false } + if(!state?.isOnline || !state?.isStreaming || !state?.takeSnapOnEvt) { return false } return settings?.enableEvtSnapShot == false ? false : true } @@ -391,13 +416,13 @@ def isCodeUpdateAvailable(newVer, curVer) { } def deviceVerEvent(ver) { - def curData = device.currentState("devTypeVer")?.value.toString() + def curData = device.currentState("devTypeVer")?.value?.toString() def pubVer = ver ?: null def dVer = devVer() ?: null def newData = isCodeUpdateAvailable(pubVer, dVer) ? "${dVer}(New: v${pubVer})" : "${dVer}" as String state?.devTypeVer = newData state?.updateAvailable = isCodeUpdateAvailable(pubVer, dVer) - if(isStateChange(device, "devVer", dVer.toString())) { + if(isStateChange(device, "devVer", dVer?.toString())) { sendEvent(name: 'devVer', value: dVer, displayed: false) } if(isStateChange(device, "devTypeVer", newData?.toString())) { @@ -411,7 +436,7 @@ def lastCheckinEvent(checkin) { def formatVal = state?.useMilitaryTime ? "MMM d, yyyy - HH:mm:ss" : "MMM d, yyyy - h:mm:ss a" def tf = new SimpleDateFormat(formatVal) tf.setTimeZone(getTimeZone()) - def lastConn = checkin ? tf?.format(Date.parse("E MMM dd HH:mm:ss z yyyy", checkin.toString())) : "Not Available" + def lastConn = checkin ? tf?.format(Date.parse("E MMM dd HH:mm:ss z yyyy", checkin?.toString())) : "Not Available" def lastChk = device.currentState("lastConnection")?.value state?.lastConnection = lastConn?.toString() if(isStateChange(device, "lastConnection", lastConn?.toString())) { @@ -436,29 +461,57 @@ def lastOnlineEvent(dt) { } def onlineStatusEvent(isOnline) { - //Logger("onlineStatusEvent($isOnline)") - def prevOnlineStat = device.currentState("onlineStatus")?.value - def onlineStat = isOnline.toString() == "true" ? "online" : "offline" - state?.onlineStatus = onlineStat.toString().capitalize() + LogAction("onlineStatusEvent($isOnline)") + // if(state?.camApiServerData) { + // state?.camApiServerData?.items[0]?.capabilities?.each { + // if(it?.startsWith("streaming.cameraprofile") || it?.startsWith("streaming.data-usage-tier")) { + // log.debug "${it}" + // } + // } + // } + if(state?.camApiServerData && (state?.camApiServerData?.items[0]?.is_online != isOnline?.toBoolean() ) ) { + Logger("onlineStatusEvent: ${isOnline?.toBoolean()} | CamData: ${state?.camApiServerData?.items[0]?.is_online}") + //isOnline = state?.camApiServerData?.items[0]?.is_online + state.camApiServerData = null + } + def onlineStat = isOnline?.toString() == "true" ? "online" : "offline" state?.isOnline = (onlineStat == "online") modifyDeviceStatus(onlineStat) - if(isStateChange(device, "onlineStatus", onlineStat.toString())) { + def prevOnlineStat = device.currentState("onlineStatus")?.value + state?.onlineStatus = onlineStat?.toString().capitalize() + if(isStateChange(device, "onlineStatus", onlineStat?.toString())) { Logger("UPDATED | Online Status is: (${onlineStat}) | Original State: (${prevOnlineStat})") - sendEvent(name: "onlineStatus", value: onlineStat.toString(), descriptionText: "Online Status is: ${onlineStat}", displayed: true, isStateChange: true, state: onlineStat) + sendEvent(name: "onlineStatus", value: onlineStat?.toString(), descriptionText: "Online Status is: ${onlineStat}", displayed: true, isStateChange: true, state: onlineStat) addCheckinReason("onlineStatusChange") } else { LogAction("Online Status is: (${onlineStat}) | Original State: (${prevOnlineStat})") } } +def securityStateEvent(sec) { + def val = "" + def oldState = device.currentState("securityState")?.value + if(sec) { val = sec } + if(isStateChange(device, "securityState", val?.toString())) { + Logger("UPDATED | Security State is (${val}) | Original State: (${oldState})") + sendEvent(name: "securityState", value: val, descriptionText: "Location Security State is: ${val}", displayed: true, isStateChange: true, state: val) + } else { LogAction("Location Security State is: (${val}) | Original State: (${oldState})") } +} + def isStreamingEvent(isStreaming, override=false) { - //log.trace "isStreamingEvent($isStreaming)..." + LogAction("isStreamingEvent($isStreaming, $override)...") def isOn = device.currentState("isStreaming")?.value def isOnline = device.currentState("onlineStatus")?.value - //log.debug "isStreamingEvent: ${isStreaming} | CamData: ${state?.camApiServerData?.items?.is_streaming[0]}" if(override) { state?.camApiServerData = null } - else { if(state?.camApiServerData && state?.camApiServerData?.items?.is_streaming[0]) { isStreaming = state?.camApiServerData?.items?.is_streaming[0] } } - def val = (isStreaming.toString() == "true") ? "on" : (isOnline.toString() != "online" ? "offline" : "off") + else { + if(state?.camApiServerData && (state?.camApiServerData?.items[0]?.is_streaming != isStreaming) ) { + Logger("isStreamingEvent: ${isStreaming} | CamData: ${state?.camApiServerData?.items[0]?.is_streaming}") + //isStreaming = state?.camApiServerData?.items[0]?.is_streaming + state.camApiServerData = null + } + } + def val = (isOnline?.toString() != "online" ? "offline" : (isStreaming?.toString() == "true") ? "on" : "off") + //def val = (isStreaming.toString() == "true") ? "on" : (isOnline.toString() != "online" ? "offline" : "off") state?.isStreaming = (val == "on") ? true : false - if(isStateChange(device, "isStreaming", val.toString())) { + if(isStateChange(device, "isStreaming", val?.toString())) { Logger("UPDATED | Camera Live Video Streaming is: (${val}) | Original State: (${isOn})") sendEvent(name: "isStreaming", value: val, descriptionText: "Camera Live Video Streaming is: ${val}", displayed: true, isStateChange: true, state: val) sendEvent(name: "switch", value: (val == "on" ? val : "off"), displayed: false) @@ -469,9 +522,9 @@ def isStreamingEvent(isStreaming, override=false) { def audioInputEnabledEvent(on) { def isOn = device.currentState("audioInputEnabled")?.value - def val = (on.toString() == "true") ? "Enabled" : "Disabled" + def val = (on?.toString() == "true") ? "Enabled" : "Disabled" state?.audioInputEnabled = val - if(isStateChange(device, "audioInputEnabled", val.toString())) { + if(isStateChange(device, "audioInputEnabled", val?.toString())) { Logger("UPDATED | Audio Input Status is: (${val}) | Original State: (${isOn})") sendEvent(name: "audioInputEnabled", value: val, descriptionText: "Audio Input Status is: ${val}", displayed: true, isStateChange: true, state: val) addCheckinReason("audioInputEnabled") @@ -479,21 +532,22 @@ def audioInputEnabledEvent(on) { } def videoHistEnabledEvent(on) { - def isOn = device.currentState("videoHistoryEnabled")?.value - def val = (on.toString() == "true") ? "Enabled" : "Disabled" + def isOn = device.currentState("nestAware")?.value + def val = (on?.toString() == "true") ? "Active" : "Inactive" + state?.nestAwareActive = (on?.toString() == "true") state?.videoHistoryEnabled = val - if(isStateChange(device, "videoHistoryEnabled", val.toString())) { - Logger("UPDATED | Video History Status is: (${val}) | Original State: (${isOn})") - sendEvent(name: "videoHistoryEnabled", value: val, descriptionText: "Video History Status is: ${val}", displayed: true, isStateChange: true, state: val) - addCheckinReason("videoHistoryEnabled") - } else { LogAction("Video History Status is: (${val}) | Original State: (${isOn})") } + if(isStateChange(device, "nestAware", val?.toString())) { + Logger("UPDATED | Nest Aware Status is: (${val}) | Original State: (${isOn})") + sendEvent(name: "nestAware", value: val, descriptionText: "Nest Aware Status is: ${val}", displayed: true, isStateChange: true, state: val) + addCheckinReason("nestAware") + } else { LogAction("Nest Aware Status is: (${val}) | Original State: (${isOn})") } } def publicShareEnabledEvent(on) { def isOn = device.currentState("publicShareEnabled")?.value - def val = on ? "Enabled" : "Disabled" + def val = (on?.toString() == "true") ? "Enabled" : "Disabled" state?.publicShareEnabled = val - if(isStateChange(device, "publicShareEnabled", val.toString())) { + if(isStateChange(device, "publicShareEnabled", val?.toString())) { Logger("UPDATED | Public Sharing Status is: (${val}) | Original State: (${isOn})") sendEvent(name: "publicShareEnabled", value: val, descriptionText: "Public Sharing Status is: ${val}", displayed: true, isStateChange: true, state: val) addCheckinReason("publicShareEnabled") @@ -503,7 +557,7 @@ def publicShareEnabledEvent(on) { def softwareVerEvent(ver) { def verVal = device.currentState("softwareVer")?.value state?.softwareVer = ver - if(isStateChange(device, "softwareVer", ver.toString())) { + if(isStateChange(device, "softwareVer", ver?.toString())) { Logger("UPDATED | Firmware Version: (${ver}) | Original State: (${verVal})") sendEvent(name: 'softwareVer', value: ver, descriptionText: "Firmware Version is now v${ver}", displayed: false) addCheckinReason("softwareVer") @@ -514,23 +568,25 @@ def lastEventDataEvent(data) { // log.trace "lastEventDataEvent($data)" def tf = new SimpleDateFormat("E MMM dd HH:mm:ss z yyyy") tf.setTimeZone(getTimeZone()) - def curStartDt = device?.currentState("lastEventStart")?.value ? tf?.format(Date.parse("E MMM dd HH:mm:ss z yyyy", device?.currentState("lastEventStart")?.value.toString())) : null - def curEndDt = device?.currentState("lastEventEnd")?.value ? tf?.format(Date.parse("E MMM dd HH:mm:ss z yyyy", device?.currentState("lastEventEnd")?.value.toString())) : null - def newStartDt = data?.start_time ? tf.format(Date.parse("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", data?.start_time.toString())) : "Not Available" - def newEndDt = data?.end_time ? tf.format(Date.parse("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", data?.end_time.toString())) : "Not Available" - - def hasPerson = data?.has_person ? data?.has_person?.toBoolean() : false - state?.motionPerson = hasPerson - def hasMotion = data?.has_motion ? data?.has_motion?.toBoolean() : false - def hasSound = data?.has_sound ? data?.has_sound?.toBoolean() : false + def curStartDt = device?.currentState("lastEventStart")?.value ? tf?.format(Date.parse("E MMM dd HH:mm:ss z yyyy", device?.currentState("lastEventStart")?.value?.toString())) : null + def curEndDt = device?.currentState("lastEventEnd")?.value ? tf?.format(Date.parse("E MMM dd HH:mm:ss z yyyy", device?.currentState("lastEventEnd")?.value?.toString())) : null + def newStartDt = data?.start_time ? tf.format(Date.parse("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", data?.start_time?.toString())) : "Not Available" + def newEndDt = data?.end_time ? tf.format(Date.parse("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", data?.end_time?.toString())) : "Not Available" + + def camMotionZones = state?.camMotionZones && state?.camMotionZones != [] ? state?.camMotionZones : [] + + def hasPerson = data?.has_person != null ? data?.has_person.toBoolean() : false + state.motionPerson = hasPerson + def hasMotion = data?.has_motion != null ? data?.has_motion.toBoolean() : false + def hasSound = data?.has_sound != null ? data?.has_sound.toBoolean() : false def actZones = state?.activityZones def evtZoneIds = data?.activity_zone_ids def evtZoneNames = null - def evtType = !hasMotion ? "Sound Event" : "Motion Event${hasPerson ? " (Person)${hasSound ? " (Sound)" : ""}" : ""}" - state?.lastEventTypeHtml = !hasMotion && hasSound ? "Sound Event" : "Motion Event${hasPerson ? "
(Person)${hasSound ? "
(Sound)" : ""}" : ""}" + String evtType = (!hasMotion ? "Sound Event" : "Motion Event") + "${hasPerson ? " (Person)" : ""}" + "${hasSound ? " (Sound)" : ""}" + state?.lastEventTypeHtml = (!hasMotion && hasSound ? "Sound Event" : "Motion Event") + "${hasPerson ? "
(Person)" : ""}" + "${hasSound ? "
(Sound)" : ""}" if(actZones && evtZoneIds) { - evtZoneNames = actZones.findAll { it.id.toString() in evtZoneIds }.collect { it?.name } + evtZoneNames = actZones.findAll { it?.id?.toString() in evtZoneIds }.collect { it?.name } def zstr = "" def i = 1 evtZoneNames?.sort().each { @@ -540,38 +596,43 @@ def lastEventDataEvent(data) { state?.lastEventZonesHtml = zstr } + def motionZoneOk = isMotionZoneOk(evtZoneIds) //log.debug "curStartDt: $curStartDt | curEndDt: $curEndDt || newStartDt: $newStartDt | newEndDt: $newEndDt" - state.lastEventDate = formatDt2(Date.parse("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", data?.start_time.toString()), "MMMMM d, yyyy").toString() - state.lastEventTime = "${formatDt2(Date.parse("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", data?.start_time.toString()), "h:mm:ssa")} to ${formatDt2(Date.parse("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", data?.end_time.toString()), "h:mm:ssa")}" + state.lastEventDate = formatDt2(Date.parse("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", data?.start_time?.toString()), "MMMMM d, yyyy")?.toString() + state.lastEventTime = "${formatDt2(Date.parse("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", data?.start_time?.toString()), "h:mm:ssa")} to ${formatDt2(Date.parse("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", data?.end_time?.toString()), "h:mm:ssa")}" if(state?.lastEventData) { state.lastEventData == null } def tryPic = false - if(!state?.lastCamEvtData || (curStartDt != newStartDt || curEndDt != newEndDt) && (hasPerson || hasMotion || hasSound) || isStateChange(device, "lastEventType", evtType.toString()) || isStateChange(device, "lastEventZones", evtZoneNames.toString())) { + //if(!state?.lastCamEvtData || (curStartDt != newStartDt || curEndDt != newEndDt) || (hasPerson || hasMotion || hasSound) || isStateChange(device, "lastEventType", evtType?.toString()) || isStateChange(device, "lastEventZones", evtZoneNames?.toString())) { + if(!state?.lastCamEvtData || (curStartDt != newStartDt || curEndDt != newEndDt) || isStateChange(device, "lastEventType", evtType?.toString()) || isStateChange(device, "lastEventZones", evtZoneNames?.toString())) { + if(hasPerson || hasMotion || hasSound) { sendEvent(name: 'lastEventStart', value: newStartDt, descriptionText: "Last Event Start is ${newStartDt}", displayed: false) sendEvent(name: 'lastEventEnd', value: newEndDt, descriptionText: "Last Event End is ${newEndDt}", displayed: false) sendEvent(name: 'lastEventType', value: evtType, descriptionText: "Last Event Type was ${evtType}", displayed: false) - sendEvent(name: 'lastEventZones', value: evtZoneNames.toString(), descriptionText: "Last Event Zones: ${evtZoneNames}", displayed: false) - state.lastCamEvtData = ["startDt":newStartDt, "endDt":newEndDt, "hasMotion":hasMotion, "hasSound":hasSound, "hasPerson":hasPerson, "motionOnPersonOnly":(settings?.motionOnPersonOnly == true), "actZones":(data?.activity_zone_ids ?: null)] + sendEvent(name: 'lastEventZones', value: evtZoneNames?.toString(), descriptionText: "Last Event Zones: ${evtZoneNames}", displayed: false) + state.lastCamEvtData = ["startDt":newStartDt, "endDt":newEndDt, "hasMotion":hasMotion, "hasSound":hasSound, "hasPerson":hasPerson, "motionOnPersonOnly":(settings?.motionOnPersonOnly == true), "actZones":(data?.activity_zone_ids ?: null), "sentMUpd":false, "sentSUpd":false ] tryPic = evtSnapShotOk() Logger(state?.enRemDiagLogging ? "└──────────────" : "└────────────────────────────") //Logger("│ URL: ${state?.animation_url ?: "None"}") Logger("│ Took Snapshot: (${tryPic})") + if(evtType?.startsWith("Motion Event")) { Logger("│ Zone Motion Filtered: (${(motionZoneOk == false)})") } Logger("│ Zones: ${evtZoneNames ?: "None"}") Logger("│ End Time: (${newEndDt})") Logger("│ Start Time: (${newStartDt})") Logger("│ Type: ${evtType}") Logger(state?.enRemDiagLogging ? "┌───New Camera Event────" : "┌────────New Camera Event────────") addCheckinReason("lastEventData") + } } else { LogAction("Last Event Start Time: (${newStartDt}) - Zones: ${evtZoneNames} | Original State: (${curStartDt})") LogAction("Last Event End Time: (${newEndDt}) - Zones: ${evtZoneNames} | Original State: (${curEndDt})") LogAction("Last Event Type: (${evtType}) - Zones: ${evtZoneNames}") } - motionSoundEvtHandler() - if(tryPic) { - if(state?.videoHistoryEnabled == "Enabled") { + motionSoundEvtHandler(motionZoneOk) + if(tryPic && motionZoneOk) { + if(state?.videoHistoryEnabled == "Active" && state?.animation_url) { takePicture(state?.animation_url) } else { takePicture(state?.snapshot_url) @@ -579,78 +640,117 @@ def lastEventDataEvent(data) { } } -def motionSoundEvtHandler() { +def isMotionZoneOk(evtZoneIds) { + if(state?.camMotionZones && evtZoneIds) { + if(evtZoneIds?.size()) { + def res = evtZoneIds?.find { it?.toString() in state?.camMotionZones } + // log.debug "result: ${res}" + if(res) { return false} + } + } + return true +} + +def motionSoundEvtHandler(zoneOk=true) { def data = state?.lastCamEvtData if(data) { - motionEvtHandler(data) + motionEvtHandler(data, zoneOk) + data = state?.lastCamEvtData soundEvtHandler(data) } } -void motionEvtHandler(data) { - def tf = new SimpleDateFormat("E MMM dd HH:mm:ss z yyyy") - tf.setTimeZone(getTimeZone()) - def dtNow = new Date() +void motionEvtHandler(data, zoneOk) { + def curMotion = device.currentState("motion")?.stringValue def motionStat = "inactive" def motionPerStat = "inactive" - if(state?.restStreaming == true && data) { - if(data?.endDt && data?.hasMotion) { - def newEndDt = null - use( TimeCategory ) { - newEndDt = Date.parse("E MMM dd HH:mm:ss z yyyy", data?.endDt.toString())+1.minutes - } - if(newEndDt) { + if(state?.restStreaming == true && data && zoneOk != false) { + if(data?.endDt && data?.hasMotion && !data?.sentMUpd) { + int t0 = getTimeDiffSeconds(data?.startDt, data?.endDt) + int t1 = state?.motionSndChgWaitVal ?: 4 + int newDur = Math.min( Math.max(3, t0) , t1) + + t0 = getTimeDiffSeconds(data?.endDt) + def howRecent = Math.max(1, t0) + //Logger("MOTION NewDur: ${newDur} howRecent: ${howRecent}") + + def tt0 = state?.lastCamEvtData + tt0.sentMUpd = true + state.lastCamEvtData = tt0 + if(howRecent <= 60) { def motGo = (data?.motionOnPersonOnly == true && data?.hasPerson != true) ? false : true - if(newEndDt > dtNow && motGo) { + if(motGo) { motionStat = "active" if(data?.hasPerson) { motionPerStat = "active" } - runIn(state?.motionSndChgWaitVal.toInteger()+6, "motionSoundEvtHandler", [overwrite: true]) + runIn(newDur?.toInteger(), "motionSoundEvtHandler", [overwrite: true]) } } } } - if(isStateChange(device, "motion", motionStat.toString()) || isStateChange(device, "motionPerson", motionPerStat?.toString())) { + // log.trace "motionEvtHandler(zoneOk: $zoneOk) | motionStat: $motionStat | curMotion: $curMotion" + if(isStateChange(device, "motion", motionStat?.toString()) || isStateChange(device, "motionPerson", motionPerStat?.toString())) { Logger("UPDATED | Motion Sensor is: (${motionStat}) | Person: (${motionPerStat}) | Original State: (${curMotion})") - sendEvent(name: "motion", value: motionStat, descriptionText: "Motion Sensor is: ${motionStat}", displayed: true, isStateChange: true, state: motionStat) - sendEvent(name: "motionPerson", value: motionPerStat, descriptionText: "Motion Person is: ${motionPerStat}", displayed: true, isStateChange: true, state: motionPerStat) + sendEvent(name: "motion", value: motionStat, descriptionText: "Motion Sensor is: ${motionStat}", displayed: true, /*isStateChange: true,*/ state: motionStat) + sendEvent(name: "motionPerson", value: motionPerStat, descriptionText: "Motion Person is: ${motionPerStat}", displayed: true, /*isStateChange: true,*/ state: motionPerStat) addCheckinReason("motion") } else { LogAction("Motion Sensor is: (${motionStat}) | Original State: (${curMotion})") } } void soundEvtHandler(data) { - def tf = new SimpleDateFormat("E MMM dd HH:mm:ss z yyyy") - tf.setTimeZone(getTimeZone()) - def dtNow = new Date() def curSound = device.currentState("sound")?.stringValue def sndStat = "not detected" if(state?.restStreaming == true && data) { - if(data?.endDt && data?.hasSound) { - def newEndDt = null - use( TimeCategory ) { - newEndDt = Date.parse("E MMM dd HH:mm:ss z yyyy", data?.endDt.toString())+1.minutes - } - if(newEndDt) { - if(newEndDt > dtNow) { - sndStat = "detected" - runIn(state?.motionSndChgWaitVal.toInteger()+6, "motionSoundEvtHandler", [overwrite: true]) - } + if(data?.endDt && data?.hasSound && !data?.sentSUpd) { + int t0 = getTimeDiffSeconds(data?.startDt, data?.endDt) + int t1 = state?.motionSndChgWaitVal ?: 4 + int newDur = Math.min( Math.max(3, t0) , state?.motionSndChgWaitVal) + + t0 = getTimeDiffSeconds(data?.endDt) + def howRecent = Math.max(1, t0) + //Logger("SOUND NewDur: ${newDur} howRecent: ${howRecent}") + + def tt0 = state?.lastCamEvtData + tt0.sentSUpd = true + state.lastCamEvtData = tt0 + if(howRecent <= 60) { + sndStat = "detected" + runIn(newDur?.toInteger(), "motionSoundEvtHandler", [overwrite: true]) } } } - if(isStateChange(device, "sound", sndStat.toString())) { + if(isStateChange(device, "sound", sndStat?.toString())) { Logger("UPDATED | Sound Sensor State: (${sndStat}) | Original State: (${curSound})") sendEvent(name: "sound", value: sndStat, descriptionText: "Sound Sensor is: ${sndStat}", displayed: true, isStateChange: true, state: sndStat) addCheckinReason("sound") } else { LogAction("Sound Sensor State: (${sndStat}) | Original State: (${curSound})") } } +def imageEvent(url) { + def clearUrl = true + if(state?.isOnline && state?.isStreaming && url != null && url != "") { + if(url?.startsWith("https://")) { + def curImage = device.currentState("image")?.stringValue + state.snapshot_url = url + clearUrl = false + if(isStateChange(device, "image", url?.toString())) { + LogAction("UPDATED | Image Url: (${url}) | Original State: (${curImage})") + sendEvent(name: "image", value: url, descriptionText: "Image URL ${url}", displayed: false, isStateChange: true, state: url) + } + } + } + if(clearUrl) { + state.snapshot_url = null + sendEvent(name: "image", value: "", descriptionText: "Image URL Cleared", displayed: false) + } +} + def debugOnEvent(debug) { def val = device.currentState("debugOn")?.value def dVal = debug ? "On" : "Off" state?.debugStatus = dVal - state?.debug = debug.toBoolean() ? true : false - if(isStateChange(device, "debugOn", dVal.toString())) { + state?.debug = debug?.toBoolean() ? true : false + if(isStateChange(device, "debugOn", dVal?.toString())) { Logger("UPDATED | Device Debug Logging is: (${dVal}) | Original State: (${val})") sendEvent(name: 'debugOn', value: dVal, displayed: false) addCheckinReason("debugOn") @@ -659,9 +759,9 @@ def debugOnEvent(debug) { def apiStatusEvent(issue) { def curStat = device.currentState("apiStatus")?.value - def newStat = issue ? "Has Issue" : "Good" - state?.apiStatus = newStat - if(isStateChange(device, "apiStatus", newStat.toString())) { + def newStat = issue + state.apiStatus = newStat + if(isStateChange(device, "apiStatus", newStat?.toString())) { Logger("UPDATED | API Status is: (${newStat}) | Original State: (${curStat})") sendEvent(name: "apiStatus", value: newStat, descriptionText: "API Status is: ${newStat}", displayed: true, isStateChange: true, state: newStat) addCheckinReason("apiStatus") @@ -683,44 +783,79 @@ def lastUpdatedEvent(sendEvt=false) { } } -def vidHistoryTimeEvent() { +def videoQualityEvent() { if(!state?.camApiServerData) { return } - def camData = state?.camApiServerData - def newMin = (camData?.items?.hours_of_free_tier_history[0] > 3 ? camData?.items?.hours_of_free_tier_history[0] : 3) - def newMax = (camData?.items?.hours_of_recording_max[0] > 3 ? camData?.items?.hours_of_recording_max[0] : 3) - def curMin = device.currentState("minVideoHistoryHours")?.value - def curMax = device.currentState("maxVideoHistoryHours")?.value - state?.minVideoHistoryHours = newMin - state?.maxVideoHistoryHours = newMax - if(isStateChange(device, "minVideoHistoryHours", newMin.toString()) || isStateChange(device, "maxVideoHistoryHours", newMax.toString())) { - Logger("UPDATED | Video Recording History Hours is Now: (Minimum: ${newMin} hours | Maximum: ${newMax} hours) | Original State: (Minimum: ${curMin} | Maximum: ${curMax})") - sendEvent(name: "minVideoHistoryHours", value: newMin, descriptionText: "Minimum Video Recording History Hours is Now: (${newMin} hours)", displayed: false, isStateChange: true, state: newMin) - sendEvent(name: "maxVideoHistoryHours", value: newMax, descriptionText: "Maximum Video Recording History Hours is Now: (${newMax} hours)", displayed: false, isStateChange: true, state: newMax) - addCheckinReason("videoHistoryTime") - } else { LogAction("Video Recording History Hours is Now: (Minimum: ${newMin} hours | Maximum: ${newMax} hours) | Original State: (Minimum: ${curMin} | Maximum: ${curMax})") } + def camData = state?.camApiServerData?.items[0]?.capabilities?.findAll { it?.startsWith("streaming.data-usage-tier") }.collect { it as String } + log.debug "camData: $camData" + /* + Nest Cam IQ (Indoor/Outdoor) + * Low: 100GB + * Medium Low: 200GB + * Medium High: 300GB + * High: 400GB + + Nest Cam Indoor/Outdoor + * Low: 30GB + * Medium: 120GB + * High: 300GB + + Dropcam, Dropcam HD + * Low: 30GB + * Medium: 120GB + + Nest Hello Doorbell + * Low: 50GB + * Medium: 150GB + * High: 300GB + + */ + def vals = [] + camData?.each { item-> + log.debug "${item?.split(".")}" + + // if(t[2]?.isNumber()) { + // vals.push(t[2] as Integer) + // } + } + log.debug "vals: ${vals} | max: " +} + +def findCameraModel() { + // if(!state?.camApiServerData) { return } + // def camData = state?.camApiServerData?.items[0]?.capabilities?.findAll { it?.startsWith("streaming.cameraprofile") } + } def publicShareUrlEvent(url) { //log.trace "publicShareUrlEvent($url)" if(url) { - if(!state?.public_share_url || state?.public_share_url != url) { state?.public_share_url = url } + if(!state?.public_share_url || state?.public_share_url != url) { + state?.public_share_url = url + Logger("publicShareUrlEvent url changed ${url}") + state.camApiServerData = null + } def pubVidId = getPublicVidID() def lastVidId = state?.lastPubVidId //log.debug "Url: $url | Url(state): ${state?.public_share_url} | pubVidId: $pubVidId | lastVidId: $lastVidId | camUUID: ${state?.camUUID}" - if(lastVidId == null || lastVidId.toString() != pubVidId.toString()) { - state?.public_share_url = url + if(lastVidId == null || lastVidId?.toString() != pubVidId?.toString()) { + //state?.public_share_url = url state?.lastPubVidId = pubVidId } if(!state?.camUUID) { getCamUUID(pubVidId) } else { - def camData = getCamApiServerData(state?.camUUID) - if(camData && state?.lastCamApiServerData != camData) { state?.lastCamApiServerData = camData } + def camData + def ldtSec = getTimeDiffSeconds(state?.lastGetCamApiServerData) + if(state?.camUUID && (state?.camApiServerData == null || ldtSec > (180*60)) ) { + camData = getCamApiServerData(state?.camUUID) + } + if(camData && state?.lastCamApiServerData != camData) { + state?.lastCamApiServerData = camData + log.trace "publicShareUrlEvent($url) camData Changed" + } } } else { //Logger("Url: $url | Url(state): ${state?.public_share_url} | pubVidId: ${state.pubVidId} | lastVidId: ${state.lastPubVidId} | camUUID: ${state?.camUUID} | camApiServerData ${state?.camApiServerData} | animation_url ${state?.animation_url} | snapshot_url ${state?.snapshot_url}", "warn") - //if(state?.public_share_url || state?.pubVidId || state?.lastPubVidId || state?.camUUID || state?.camApiServerData || state?.animation_url || state?.snapshot_url) { - if(state?.public_share_url || state?.pubVidId || state?.lastPubVidId || state?.camUUID || state?.camApiServerData) { state?.public_share_url = null state?.pubVidId = null @@ -749,7 +884,7 @@ def getRecTimeDesc(val) { def result = null if(val && val instanceof Integer) { if(val.toInteger() > 24) { - def nVal = (val/24).toDouble().round(0) // + def nVal = (val/24).toDouble().round(0) result = "${nVal.toInteger()} days" } else { result = "${val} hours" @@ -769,15 +904,16 @@ def cameraStreamNotify(streaming) { def getHealthStatus(lower=false) { def res = device?.getStatus() - if(lower) { return res.toString().toLowerCase() } - return res.toString() + if(lower) { return res?.toString()?.toLowerCase() } + return res?.toString() } def healthNotifyOk() { def lastDt = state?.lastHealthNotifyDt if(lastDt) { def ldtSec = getTimeDiffSeconds(lastDt) - if(ldtSec < 600) { + def t0 = state?.healthMsgWait ?: 3600 + if(ldtSec < t0) { return false } } @@ -798,7 +934,7 @@ def checkHealth() { | DEVICE COMMANDS | *************************************************************************************************/ void chgStreaming() { - def cur = device?.currentState("isStreaming")?.value.toString() + def cur = device?.currentState("isStreaming")?.value?.toString() if(cur == "on" || cur == "unavailable" || !cur) { streamingOff(true) } else { @@ -816,8 +952,8 @@ void streamingOn(manChg=false) { } } catch (ex) { - log.error "streamingOn Exception:", ex - exceptionDataHandler(ex.message, "streamingOn") + log.error "streamingOn Exception: ${ex?.message}", ex + exceptionDataHandler(ex?.message, "streamingOn") } } @@ -830,8 +966,8 @@ void streamingOff(manChg=false) { else { incProgStreamChgCnt() } } } catch (ex) { - log.error "streamingOff Exception:", ex - exceptionDataHandler(ex.message, "streamingOff") + log.error "streamingOff Exception: ${ex?.message}", ex + exceptionDataHandler(ex?.message, "streamingOff") } } @@ -866,7 +1002,7 @@ private getImageWidth() { private takePicture(String url) { try { - if(state?.isOnline) { + if(state?.isOnline && state?.isStreaming) { if(url?.startsWith("https://")) { ByteArrayInputStream imageBytes def params = [ @@ -881,13 +1017,15 @@ private takePicture(String url) { } } } else { - exceptionDataHandler("takePicture Error: non-standard url received ($url)") - return + def sUrl = url ? "${url}" : "null" + Logger("takePicture: non-standard url received (${sUrl}), public share enabled: (${state?.publicShareEnabled})", "error") } + } else { + Logger("takePicture: Camera is not online (${!state?.isOnline}) or not streaming (${!state?.isStreaming})", "error") } } catch (ex) { - log.error "takePicture Exception: $ex" - exceptionDataHandler(ex.message, "takePicture") + log.error "takePicture Exception: ${ex?.message}", ex + exceptionDataHandler(ex?.message, "takePicture") } return false } @@ -900,30 +1038,31 @@ def lastN(String input, n) { } void Logger(msg, logType = "debug") { - def smsg = state?.showLogNamePrefix ? "${device.displayName}: ${msg}" : "${msg}" - switch (logType) { - case "trace": - log.trace "${smsg}" - break - case "debug": - log.debug "${smsg}" - break - case "info": - log.info "${smsg}" - break - case "warn": - log.warn "${smsg}" - break - case "error": - log.error "${smsg}" - break - default: - log.debug "${smsg}" - break - } + def smsg = state?.showLogNamePrefix ? "${device.displayName} (v${devVer()}) | ${msg}" : "${msg}" def theId = lastN(device.getId().toString(),5) if(state?.enRemDiagLogging) { parent.saveLogtoRemDiagStore(smsg, logType, "Camera-${theId}") + } else { + switch (logType) { + case "trace": + log.trace "${smsg}" + break + case "debug": + log.debug "${smsg}" + break + case "info": + log.info "${smsg}" + break + case "warn": + log.warn "${smsg}" + break + case "error": + log.error "${smsg}" + break + default: + log.debug "${smsg}" + break + } } } @@ -941,7 +1080,7 @@ def log(message, level = "trace") { return null // always child interface call with a return value } -def exceptionDataHandler(msg, methodName) { +def exceptionDataHandler(String msg, String methodName) { if(state?.allowDbException == false) { return } else { @@ -954,20 +1093,14 @@ def exceptionDataHandler(msg, methodName) { def getTimeDiffSeconds(strtDate, stpDate=null, methName=null) { //LogTrace("[GetTimeDiffSeconds] StartDate: $strtDate | StopDate: ${stpDate ?: "Not Sent"} | MethodName: ${methName ?: "Not Sent"})") - try { - if((strtDate && !stpDate) || (strtDate && stpDate)) { - def now = new Date() - def stopVal = stpDate ? stpDate.toString() : formatDt(now) - def startDt = Date.parse("E MMM dd HH:mm:ss z yyyy", strtDate) - def stopDt = Date.parse("E MMM dd HH:mm:ss z yyyy", stopVal) - def start = Date.parse("E MMM dd HH:mm:ss z yyyy", formatDt(startDt)).getTime() - def stop = Date.parse("E MMM dd HH:mm:ss z yyyy", stopVal).getTime() - def diff = (int) (long) (stop - start) / 1000 // - return diff - } else { return null } - } catch (ex) { - log.warn "getTimeDiffSeconds error: Unable to parse datetime..." - } + if((strtDate && !stpDate) || (strtDate && stpDate)) { + def now = new Date() + def stopVal = stpDate ? stpDate.toString() : formatDt(now) + def start = Date.parse("E MMM dd HH:mm:ss z yyyy", strtDate).getTime() + def stop = Date.parse("E MMM dd HH:mm:ss z yyyy", stopVal).getTime() + def diff = (int) (long) (stop - start) / 1000 + return diff + } else { return null } } def incHtmlLoadCnt() { state?.htmlLoadCnt = (state?.htmlLoadCnt ? state?.htmlLoadCnt.toInteger()+1 : 1) } @@ -1035,26 +1168,38 @@ def isTimeBetween(start, end, now, tz) { } def getFileBase64(url, preType, fileType) { - def params = [ - uri: url, - contentType: '$preType/$fileType' - ] - httpGet(params) { resp -> - if(resp.data) { - def respData = resp?.data - ByteArrayOutputStream bos = new ByteArrayOutputStream() - int len - int size = 4096 - byte[] buf = new byte[size] - while ((len = respData.read(buf, 0, size)) != -1) - bos.write(buf, 0, len) - buf = bos.toByteArray() - //log.debug "buf: $buf" - String s = buf?.encodeBase64() - //log.debug "resp: ${s}" - return s ? "data:${preType}/${fileType};base64,${s.toString()}" : null + try { + def params = [uri: url, contentType: "$preType/$fileType"] + httpGet(params) { resp -> + if(resp?.status == 200) { + if(resp.data) { + def respData = resp?.data + byte[] byteData = resp?.data?.getBytes() + String enc = byteData?.encodeBase64() + // log.debug "enc: ${enc}" + return enc ? "data:${preType}/${fileType};base64,${enc?.toString()}" : null + } + } else { + LogAction("getFileBase64 Resp: ${resp?.status} ${url}", "error") + exceptionDataHandler("resp ${ex?.response?.status} ${url}", "getFileBase64") + return null + } } - } + } catch (ex) { + if(ex instanceof groovyx.net.http.ResponseParseException) { + if(ex?.statusCode != 200) { + LogAction("getFileBase64 Resp: ${ex?.statusCode} ${url}", "error") + log.error "getFileBase64 Exception:", ex + } + } else if(ex instanceof groovyx.net.http.HttpResponseException && ex?.response) { + LogAction("getFileBase64 Resp: ${ex?.response?.status} ${url}", "error") + exceptionDataHandler("${ex?.response?.status} ${url}", "getFileBase64") + } else { + log.error "getFileBase64 Exception:", ex + exceptionDataHandler(ex, "getFileBase64") + } + return null + } } def getImg(imgName) { @@ -1087,20 +1232,6 @@ def gitBranch() { return state?.isBeta ? "beta" : "master" } def gitPath() { return "${gitRepo()}/${gitBranch()}"} def devVerInfo() { return getWebData([uri: "https://raw.githubusercontent.com/${gitPath()}/Data/changelog_cam.txt", contentType: "text/plain; charset=UTF-8"], "changelog") } -def getCssData() { - def cssData = null - def htmlInfo = state?.htmlInfo - if(htmlInfo?.cssUrl && htmlInfo?.cssVer) { - cssData = getFileBase64(htmlInfo.cssUrl, "text", "css") - state?.cssVer = htmlInfo?.cssVer - } else { - cssData = getFileBase64(cssUrl(), "text", "css") - } - return cssData -} - -def cssUrl() { return "https://raw.githubusercontent.com/tonesto7/nest-manager/master/Documents/css/ST-HTML.min.css" } - //this scrapes the public nest cam page for its unique id for using in render html tile include 'asynchttp_v1' //<<<< - //log.debug "resp: (status: ${resp?.status}) | data: ${resp?.data}" - state?.camApiServerData = resp?.data - return resp?.data ?: null + if(resp?.status == 200) { + LogAction("getCamApiServerData resp: (status: ${resp?.status}) | data: ${resp?.data}") + if(resp?.data) { + state?.camApiServerData = resp?.data + state.lastGetCamApiServerData = getDtNow() + return resp?.data + } + } else { Logger("getCamApiServerData Resp: ${resp?.status}....", "warn") } } } else { Logger("getCamApiServerData camUUID is missing....", "warn") } } catch (ex) { - log.error "getCamApiServerData Exception:", ex - exceptionDataHandler(ex.message, "getCamApiServerData") + def s = ex?.message?.toString() + log.error "getCamApiServerData Exception: ${s}", ex + exceptionDataHandler(s, "getCamApiServerData") } + return null } def getStreamHostUrl() { if(!state?.camApiServerData) { return null } - def res = state?.camApiServerData?.items?.live_stream_host - def data = res.toString().replaceAll("\\[|\\]", "") + def res = state?.camApiServerData?.items[0]?.live_stream_host + def data = res?.toString().replaceAll("\\[|\\]", "") //log.debug "getStreamHostUrl: $data" return data ?: null } -def getCamPlaylistURL() { - def hUrl = getStreamHostUrl() +String getCamPlaylistURL() { + String hUrl = getStreamHostUrl() if(hUrl && state?.camUUID) { return "https://${hUrl}/nexus_aac/${state?.camUUID}/playlist.m3u8" } return null } def getCamApiServer() { if(!state?.camApiServerData) { return null } - def res = state?.camApiServerData?.items?.nexus_api_http_server - def data = res.toString().replaceAll("\\[|\\]", "") + def res = state?.camApiServerData?.items[0]?.nexus_api_http_server + def data = res?.toString().replaceAll("\\[|\\]", "") //log.debug "getCamApiServer: $data" return data ?: null } @@ -1194,7 +1333,7 @@ def getChgLogHtml() { if(!state?.shownChgLog == true) { chgStr = """ - + + + + + @@ -1259,7 +1428,7 @@ def getCamHtml() { ${devBrdCastHtml} ${clientBl} ${updateAvail} -
-

${heading}

+

${heading}

@@ -9072,34 +9669,43 @@ def renderHtmlMapDesc(title, heading, datamap) {
-
+
-
+

${heading}:

-
-
+
+
${datamap.toString().replaceAll("\n", "
")}
-
+
- + + """ - /* "" */ + /* """ */ render contentType: "text/html", data: html } catch (ex) { log.error "getAppDataFile Exception:", ex } } def sendInstallData() { - sendFirebaseData(createInstallDataJson(), "installData/clients/${atomicState?.installationId}.json", null, "heartbeat") + if(atomicState?.cltMetBlacklisted) { + LogAction("Metrics Upload has been BLACKLISTED for this client.", "warn", true) + } else { sendFirebaseData(getFbMetricsUrl(), createInstallDataJson(), "clients/${atomicState?.installationId}.json", null, "heartbeat") } } def removeInstallData() { - return removeFirebaseData("installData/clients/${atomicState?.installationId}.json") + return removeFirebaseData("clients/${atomicState?.installationId}.json") } def sendInstallSlackNotif(inst=true) { @@ -9116,10 +9722,10 @@ def sendInstallSlackNotif(inst=true) { str += "\n • App Version: v${appVersion()}" str += "\n • Mobile Client: ${cltType}" str += atomicState?.authToken && atomicState?.authTokenNum ? "\n • TokenNum: ${atomicState?.authTokenNum}" : "" - str += atomicState?.authToken && atomicState?.authTokenCreatedDt ? "\n • TokenCreated: ${atomicState?.authTokenCreatedDt}" : "" + str += atomicState?.authToken && getTimestampVal("authTokenCreatedDt") ? "\n • TokenCreated: ${getTimestampVal("authTokenCreatedDt")}" : "" def tf = new SimpleDateFormat("M/d/yyyy - h:mm a") if(getTimeZone()) { tf.setTimeZone(getTimeZone()) } - str += atomicState?.authToken && atomicState?.authTokenExpires ? "\n • TokenExpires: ${tf?.format(atomicState?.authTokenExpires)}" : "" + str += atomicState?.authToken && atomicState?.authTokenExpires ? "\n • TokenExpires: ${tf.format(atomicState?.authTokenExpires)}" : "" def res = [:] res << ["username":"New User Notification"] res << ["icon_emoji":":spock-hand:"] @@ -9133,7 +9739,23 @@ def sendInstallSlackNotif(inst=true) { sendDataToSlack(json, "", "post", "${typeStr} Slack Notif") } -def getDbExceptPath() { return atomicState?.appData?.database?.newexceptionPath ?: "newexceptionData" } +def getDbExceptPath() { return atomicState?.appData?.settings?.database?.exceptionKey ?: "exceptions" } + +def ok2SendException(ex) { + def retVal = true + if(allowDbException() != true) { + retVal = false + // Nothing to see here! + } else if(atomicState?.cltExcBlacklisted) { + LogAction("Exception Data Upload has been BLACKLISTED for this client.", "warn", true) + retVal = false + } else if(!(settings?.optInSendExceptions || settings?.optInSendExceptions == null)) { + retVal = false + } else if (ex instanceof java.util.concurrent.TimeoutException) { + retVal = false + } + return retVal +} def sendExceptionData(ex, methodName, isChild = false, autoType = null) { try { @@ -9141,41 +9763,43 @@ def sendExceptionData(ex, methodName, isChild = false, autoType = null) { def labelstr = (settings?.debugAppendAppName || settings?.debugAppendAppName == null) ? "${app.label} | " : "" //LogAction("${labelstr}sendExceptionData(method: $methodName, isChild: $isChild, autoType: $autoType)", "info", false) LogAction("${labelstr}sendExceptionData(method: $methodName, isChild: $isChild, autoType: $autoType, ex: ${ex})", "error", showErrLog) - if(atomicState?.appData?.database?.disableExceptions == true) { - return - } else { - def exCnt = atomicState?.appExceptionCnt ?: 1 - atomicState?.appExceptionCnt = exCnt?.toInteger() + 1 + def exCnt = atomicState?.appExceptionCnt ?: 1 + atomicState?.appExceptionCnt = exCnt?.toInteger() + 1 + if(ok2SendException(ex)) { def exString = "${ex}" - if(settings?.optInSendExceptions || settings?.optInSendExceptions == null) { - generateInstallId() - def appType = isChild && autoType ? "automationApp/${autoType}" : "managerApp" - def exData =[:] - if(isChild) { - exData = ["methodName":methodName, "automationType":autoType, "appVersion":(appVersion() ?: "Not Available"),"errorMsg":exString, "errorDt":getDtNow().toString()] - } else { - exData = ["methodName":methodName, "appVersion":(appVersion() ?: "Not Available"),"errorMsg":exString, "errorDt":getDtNow().toString()] - } - def results = new groovy.json.JsonOutput().toJson(exData) - sendFirebaseData(results, "${getDbExceptPath()}/${appType}/${methodName}/${atomicState?.installationId}.json", "post", "Exception") + generateInstallId() + def appType = isChild && autoType ? "automationApp/${autoType}" : "managerApp" + def exData =[:] + if(isChild) { + exData = ["methodName":methodName, "automationType":autoType, "appVersion":(appVersion() ?: "Not Available"),"errorMsg":exString, "errorDt":getDtNow().toString()] + } else { + exData = ["methodName":methodName, "appVersion":(appVersion() ?: "Not Available"),"errorMsg":exString, "errorDt":getDtNow().toString()] } + def results = new groovy.json.JsonOutput().toJson(exData) + sendFirebaseData(getFbExceptionsUrl(), results, "${getDbExceptPath()}/${appType}/${methodName}/${atomicState?.installationId}.json", "post", "Exception") + } + if(ex instanceof physicalgraph.exception.StateCharacterLimitExceededException) { + state.remove("remDiagLogDataStore") + settingUpdate("resetAllData", "true", "bool") + atomicState?.resetAllData = false + runIn(20, "updated", [overwrite: true]) } } catch (e) { - log.debug "other exception caught" + log.debug "sendExceptionData: other exception caught" } } def sendChildExceptionData(devType, devVer, ex, methodName) { def showErrLog = (atomicState?.enRemDiagLogging && settings?.enRemDiagLogging) ? true : false - def exString = "${ex}" LogAction("sendChildExceptionData(device: $deviceType, devVer: $devVer, method: $methodName, ex: ${ex}", "error", showErrLog) def exCnt = atomicState?.childExceptionCnt ?: 1 atomicState?.childExceptionCnt = exCnt.toInteger() + 1 - if(settings?.optInSendExceptions || settings?.optInSendExceptions == null) { + if(ok2SendException(ex)) { generateInstallId() + def exString = "${ex}" def exData = ["deviceType":devType, "devVersion":(devVer ?: "Not Available"), "methodName":methodName, "errorMsg":exString, "errorDt":getDtNow().toString()] def results = new groovy.json.JsonOutput().toJson(exData) - sendFirebaseData(results, "${getDbExceptPath()}/${devType}/${methodName}/${atomicState?.installationId}.json", "post", "Exception") + sendFirebaseData(getFbExceptionsUrl(), results, "${getDbExceptPath()}/${devType}/${methodName}/${atomicState?.installationId}.json", "post", "Exception") } } @@ -9183,33 +9807,23 @@ def sendFeedbackData(msg) { def cltId = atomicState?.installationId def exData = ["guid":atomicState?.installationId, "version":appVersion(), "feedbackMsg":(msg ? msg : (settings?.feedbackMsg ?: "No Text")), "msgDt":getDtNow().toString()] def results = new groovy.json.JsonOutput().toJson(exData) - if(sendFirebaseData(results, "feedback/data.json", "post", "Feedback")) { + if(sendFirebaseData(getFbLegacyAppUrl(), results, "feedback/data.json", "post", "Feedback")) { atomicState?.feedbackPending = false if(!msg) { atomicState?.lastFeedbackData = ["lastMsg":settings?.feedbackMsg, "lastMsgDt":getDtNow().toString(), "lastAppVer":appVersion()] } } } -def sendFirebaseData(data, pathVal, cmdType=null, type=null, noAsync=false) { +def sendFirebaseData(url, data, pathVal, cmdType=null, type=null) { + LogAction("sendFirebaseData(${data}, ${pathVal}, $cmdType, $type", "info", true) LogTrace("sendFirebaseData(${data}, ${pathVal}, $cmdType, $type") - - def allowAsync = false - def metstr = "sync" - if(atomicState?.appData && atomicState?.appData?.pollMethod?.allowAsync) { - allowAsync = true - metstr = "async" - } - if(allowAsync && !noAsync) { - return queueFirebaseData(data, pathVal, cmdType, type) - } else { - return syncSendFirebaseData(data, pathVal, cmdType, type) - } + return queueFirebaseData(url, data, pathVal, cmdType, type) } -def queueFirebaseData(data, pathVal, cmdType=null, type=null) { +def queueFirebaseData(url, data, pathVal, cmdType=null, type=null) { LogTrace("queueFirebaseData(${data}, ${pathVal}, $cmdType, $type") def result = false def json = new groovy.json.JsonOutput().prettyPrint(data) - def params = [ uri: "${getFirebaseAppUrl()}/${pathVal}", body: json.toString() ] + def params = [ uri: "${url}/${pathVal}", body: json.toString() ] def typeDesc = type ? "${type}" : "Data" try { if(!cmdType || cmdType == "put") { @@ -9222,7 +9836,7 @@ def queueFirebaseData(data, pathVal, cmdType=null, type=null) { } catch(ex) { log.error "queueFirebaseData (type: $typeDesc) Exception:", ex - sendExceptionData(ex, "queueFirebaseData") + //sendExceptionData(ex, "queueFirebaseData") } return result } @@ -9237,7 +9851,7 @@ def processFirebaseSlackResponse(resp, data) { if(typeDesc?.toString() == "Remote Diag Logs") { } else { - if(typeDesc?.toString() == "heartbeat") { atomicState?.lastAnalyticUpdDt = getDtNow() } + if(typeDesc?.toString() == "heartbeat") { updTimestampMap("lastAnalyticUpdDt", getDtNow()) } } result = true } @@ -9248,7 +9862,7 @@ def processFirebaseSlackResponse(resp, data) { LogAction("processFirebaseSlackResponse: 'Unexpected' Response: ${resp?.status}", "warn", true) } if(resp?.hasError()) { - LogAction("processFirebaseSlackResponse: errorData: $resp.errorData errorMessage: $resp.errorMessage", "error", true) + LogAction("processFirebaseSlackResponse: errorData: $resp.errorData errorMessage: $resp.errorMessage", "error", true) } } catch(ex) { log.error "processFirebaseSlackResponse (type: $typeDesc) Exception:", ex @@ -9256,52 +9870,6 @@ def processFirebaseSlackResponse(resp, data) { } } -def syncSendFirebaseData(data, pathVal, cmdType=null, type=null) { - LogTrace("syncSendFirebaseData(${data}, ${pathVal}, $cmdType, $type") - def result = false - def json = new groovy.json.JsonOutput().prettyPrint(data) - def params = [ uri: "${getFirebaseAppUrl()}/${pathVal}", body: json.toString() ] - def typeDesc = type ? "${type}" : "Data" - def respData - try { - if(!cmdType || cmdType == "put") { - httpPutJson(params) { resp -> - respData = resp - } - } else if (cmdType == "post") { - httpPostJson(params) { resp -> - respData = resp - } - } - if(respData) { - //log.debug "respData: ${respData}" - if(respData?.status == 200) { - LogAction("sendFirebaseData: ${typeDesc} Data Sent SUCCESSFULLY", "info", false) - if(typeDesc.toString() == "Remote Diag Logs") { - - } else { - if(typeDesc?.toString() == "heartbeat") { atomicState?.lastAnalyticUpdDt = getDtNow() } - } - result = true - } - else if(respData?.status == 400) { - LogAction("sendFirebaseData: 'Bad Request': ${respData?.status}", "error", true) - } - else { - LogAction("sendFirebaseData: 'Unexpected' Response: ${respData?.status}", "warn", true) - } - } - } - catch (ex) { - if(ex instanceof groovyx.net.http.HttpResponseException) { - LogAction("sendFirebaseData: 'HttpResponseException': ${ex?.message}", "error", true) - } - else { log.error "sendFirebaseData: ([$data, $pathVal, $cmdType, $type]) Exception:", ex } - sendExceptionData(ex, "sendFirebaseData") - } - return result -} - def sendDataToSlack(data, pathVal, cmdType=null, type=null) { LogAction("sendDataToSlack(${data}, ${pathVal}, $cmdType, $type", "trace", false) def result = false @@ -9313,27 +9881,7 @@ def sendDataToSlack(data, pathVal, cmdType=null, type=null) { if(!cmdType || cmdType == "post") { asynchttp_v1.post(processFirebaseSlackResponse, params, [ type: "${typeDesc}"]) result = true -/* - httpPostJson(params) { resp -> - respData = resp - } -*/ - } -/* - if(respData) { - //log.debug "respData: ${respData}" - if(respData?.status == 200) { - LogAction("sendDataToSlack: ${typeDesc} Data Sent SUCCESSFULLY", "info", false) - result = true - } - else if(respData?.status == 400) { - LogAction("sendDataToSlack: 'Bad Request': ${respData?.status}", "error", true) - } - else { - LogAction("sendDataToSlack: 'Unexpected' Response: ${respData?.status}", "warn", true) - } } -*/ } catch (ex) { if(ex instanceof groovyx.net.http.HttpResponseException) { @@ -9349,8 +9897,11 @@ def removeFirebaseData(pathVal) { LogAction("removeFirebaseData(${pathVal})", "trace", false) def result = true try { - httpDelete(uri: "${getFirebaseAppUrl()}/${pathVal}") { resp -> - LogAction("resp: ${resp?.status}", "info", true) + httpDelete(uri: "${getFbMetricsUrl()}/${pathVal}") { resp -> + LogAction("cur FB resp: ${resp?.status}", "info", true) + } + httpDelete(uri: "${getFbLegacyAppUrl()}/installData/${pathVal}") { resp -> + LogAction("old FB resp: ${resp?.status}", "info", true) } } catch (ex) { @@ -9374,22 +9925,14 @@ def removeFirebaseData(pathVal) { // Calls by Automation children // parent only method -def automationNestModeEnabled(val=null) { - LogTrace("automationNestModeEnabled: val: $val") - if(val == null) { - return atomicState?.automationNestModeEnabled ?: false - } else { - atomicState.automationNestModeEnabled = val.toBoolean() - } - return atomicState?.automationNestModeEnabled ?: false -} def remSenLock(val, myId) { def res = false + def k = "remSenLock${val}" if(val && myId && !parent) { - def lval = atomicState?."remSenLock${val}" + def lval = atomicState?."${k}" if(!lval) { - atomicState?."remSenLock${val}" = myId + atomicState?."${k}" = myId res = true } else if(lval == myId) { res = true } } @@ -9399,11 +9942,12 @@ def remSenLock(val, myId) { def remSenUnlock(val, myId) { def res = false if(val && myId && !parent) { - def lval = atomicState?."remSenLock${val}" + def k = "remSenLock${val}" + def lval = atomicState?."${k}" if(lval) { if(lval == myId) { - atomicState?."remSenLock${val}" = null - state.remove("remSenLock${val}" as String) + atomicState?."${k}" = null + state.remove("${k}" as String) res = true } } else { res = true } @@ -9411,8 +9955,26 @@ def remSenUnlock(val, myId) { return res } +def automationNestModeEnabled(val=null) { + LogTrace("automationNestModeEnabled: $val") + return getSetVal("automationNestModeEnabled", val) +/* + if(val == null) { + return atomicState?.automationNestModeEnabled ?: false + } else { + atomicState.automationNestModeEnabled = val.toBoolean() + } + return atomicState?.automationNestModeEnabled ?: false +*/ +} + def setNModeActive(val=null) { - LogTrace("setNModeActive: val: $val") + LogTrace("setNModeActive: $val") + def myKey = "automationNestModeEcoActive" + def retVal + if(!automationNestModeEnabled(null)) { + retVal = getSetVal(myKey, false) +/* if(automationNestModeEnabled(null)) { if(val == null) { return atomicState?.automationNestModeEcoActive ?: false @@ -9421,6 +9983,18 @@ def setNModeActive(val=null) { } } else { atomicState.automationNestModeEcoActive = false } return atomicState?.automationNestModeEcoActive ?: false +*/ + } else { retVal = getSetVal(myKey, val) } + return retVal +} + +def getSetVal(k, val=null) { + if(val == null) { + return atomicState?."${k}" ?: false + } else { + atomicState."${k}" = val.toBoolean() + } + return atomicState?."${k}" ?: false } // Most of this is obsolete after upgrade to V5 is complete @@ -9460,7 +10034,6 @@ def initAutoApp() { def uninstAutomationApp() { LogTrace("uninstAutomationApp") def autoType = getAutoType() - //def migrate = parent?.migrationInProgress() if(autoType == "schMot") { def myID = getMyLockId() //if(schMotTstat && myID && parent && !migrate) { @@ -9533,29 +10106,6 @@ def getAutoType() { return !parent ? "" : atomicState?.automationType } def getAutoIcon(type) { if(type) { switch(type) { -/* - case "remSen": - return getAppImg("remote_sensor_icon.png") - break - case "fanCtrl": - return getAppImg("fan_control_icon.png") - break - case "conWat": - return getAppImg("open_window.png") - break - case "leakWat": - return getAppImg("leak_icon.png") - break - case "extTmp": - return getAppImg("external_temp_icon.png") - break - case "tMode": - return getAppImg("mode_setpoints_icon.png") - break - case "humCtrl": - return getAppImg("humidity_automation_icon.png") - break -*/ case "nMode": return getAppImg("mode_automation_icon.png") break @@ -9565,6 +10115,9 @@ def getAutoIcon(type) { case "watchDog": return getAppImg("watchdog_icon.png") break + case "storage": + return getAppImg("storage_icon.png") + break case "remDiag": return getAppImg("diag_icon.png") break @@ -9586,18 +10139,9 @@ def isSchMotConfigured() { return settings?.schMotTstat ? true : false } -//These are here to catch any events that occur before the migration occurs -def heartbeatAutomation() { return } -def runAutomationEval() { return } -def automationGenericEvt(evt) { return } -def automationSafetyTempEvt(evt) { return } -def nModeGenericEvt(evt) { return } -def leakWatSensorEvt(evt) { return } -def conWatContactEvt(evt) { return } -def extTmpGenericEvt(evt) { return } - def getAutomationType() { - return atomicState?.automationType ?: null + //return atomicState?.automationType ?: null + return null } def getIsAutomationDisabled() { @@ -9613,11 +10157,11 @@ def fixTempSetting(Double temp) { if(temp != null) { if(getTemperatureScale() == "C") { if(temp > 35) { // setting was done in F - newtemp = roundTemp( (newtemp - 32.0) * (5 / 9) as Double) // + newtemp = roundTemp( (newtemp - 32.0) * (5 / 9) as Double) } } else if(getTemperatureScale() == "F") { if(temp < 40) { // setting was done in C - newtemp = roundTemp( ((newtemp * (9 / 5) as Double) + 32.0) ).toInteger() // + newtemp = roundTemp( ((newtemp * (9 / 5) as Double) + 32.0) ).toInteger() } } } @@ -9636,136 +10180,11 @@ private timeDayOfWeekOptions() { return ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"] } -/* -private getDayOfWeekName(date = null) { - if (!date) { - date = adjustTime(now()) - } - switch (date.day) { - case 0: return "Sunday" - case 1: return "Monday" - case 2: return "Tuesday" - case 3: return "Wednesday" - case 4: return "Thursday" - case 5: return "Friday" - case 6: return "Saturday" - } - return null -} - -private getDayOfWeekNumber(date = null) { - if (!date) { - date = adjustTime(now()) - } - if (date instanceof Date) { - return date.day - } - switch (date) { - case "Sunday": return 0 - case "Monday": return 1 - case "Tuesday": return 2 - case "Wednesday": return 3 - case "Thursday": return 4 - case "Friday": return 5 - case "Saturday": return 6 - } - return null -} - -//adjusts the time to local timezone -private adjustTime(time = null) { - if (time instanceof String) { - //get UTC time - time = timeToday(time, location.timeZone).getTime() - } - if (time instanceof Date) { - //get unix time - time = time.getTime() - } - if (!time) { - time = now() - } - if (time) { - return new Date(time + location.timeZone.getOffset(time)) - } - return null -} - -private formatLocalTime(time, format = "EEE, MMM d yyyy @ h:mm a z") { - if (time instanceof Long) { - time = new Date(time) - } - if (time instanceof String) { - //get UTC time - time = timeToday(time, location.timeZone) - } - if (!(time instanceof Date)) { - return null - } - def formatter = new java.text.SimpleDateFormat(format) - formatter.setTimeZone(location.timeZone) - return formatter.format(time) -} - -private convertDateToUnixTime(date) { - if (!date) { - return null - } - if (!(date instanceof Date)) { - date = new Date(date) - } - return date.time - location.timeZone.getOffset(date.time) -} - -private convertTimeToUnixTime(time) { - if (!time) { - return null - } - return time - location.timeZone.getOffset(time) -} - -private formatTime(time, zone = null) { - //we accept both a Date or a settings' Time - return formatLocalTime(time, "h:mm a${zone ? " z" : ""}") -} - -private formatHour(h) { - return (h == 0 ? "midnight" : (h < 12 ? "${h} AM" : (h == 12 ? "noon" : "${h-12} PM"))).toString() -} - -def getActiveScheduleState() { - return atomicState?.activeSchedData ?: null -} - -def okSym() { - return "✓"// ☑" -} -def notOkSym() { - return "✘" -} - -def getRemSenTempSrc() { - return atomicState?.remoteTempSourceStr ?: null -} - -def getAbrevDay(vals) { - def list = [] - if(vals) { - //log.debug "days: $vals | (${vals?.size()})" - def len = (vals?.toString().length() < 7) ? 3 : 2 - vals?.each { d -> - list.push(d?.toString().substring(0, len)) - } - } - return list -} -*/ - def roundTemp(Double temp) { if(temp == null) { return null } def newtemp if( getTemperatureScale() == "C") { - newtemp = Math.round(temp.round(1) * 2) / 2.0f // + newtemp = Math.round(temp.round(1) * 2) / 2.0f } else { if(temp instanceof Integer) { //log.debug "roundTemp: ($temp) is Integer" @@ -9785,30 +10204,6 @@ def roundTemp(Double temp) { return newtemp } -/* -def deviceInputToList(items) { - def list = [] - if(items) { - items?.sort().each { d -> - list.push(d?.displayName.toString()) - } - return list - } - return null -} - -def inputItemsToList(items) { - def list = [] - if(items) { - items?.each { d -> - list.push(d) - } - return list - } - return null -} -*/ - def getInputToStringDesc(inpt, addSpace = null) { def cnt = 0 def str = "" @@ -9831,41 +10226,6 @@ def isPluralString(obj) { | GLOBAL Code | Logging AND Diagnostic | *************************************************************************************************/ -def sendEventPushNotifications(message, type, pName) { - //LogTrace("sendEventPushNotifications($message, $type, $pName)") - if(settings["${pName}_Alert_1_Send_Push"] || settings["${pName}_Alert_2_Send_Push"]) { -//TODO this portion is never reached - if(settings["${pName}_Alert_1_CustomPushMessage"]) { - sendNofificationMsg(settings["${pName}_Alert_1_CustomPushMessage"].toString(), type, settings?."${pName}NotifRecips", settings?."${pName}NotifPhones", settings?."${pName}UsePush") - } else { - sendNofificationMsg(message, type, settings?."${pName}NotifRecips", settings?."${pName}NotifPhones", settings?."${pName}UsePush") - } - } else { - sendNofificationMsg(message, type, settings?."${pName}NotifRecips", settings?."${pName}NotifPhones", settings?."${pName}UsePush") - } -} - -def sendEventVoiceNotifications(vMsg, pName, msgId, rmAAMsg=false, rmMsgId) { - def allowNotif = settings?."${pName}NotificationsOn" ? true : false - def allowSpeech = allowNotif && settings?."${pName}AllowSpeechNotif" ? true : false - def ok2Notify = getOk2Notify() - - LogAction("sendEventVoiceNotifications($vMsg, $pName) ok2Notify: $ok2Notify", "trace", false) - if(allowNotif && allowSpeech) { - if(ok2Notify && (settings["${pName}SpeechDevices"] || settings["${pName}SpeechMediaPlayer"])) { - sendTTS(vMsg, pName) - } - if(settings["${pName}SendToAskAlexaQueue"]) { // we queue to Alexa regardless of quiet times - if(rmMsgId != null && rmAAMsg == true) { - removeAskAlexaQueueMsg(rmMsgId) - } - if (vMsg && msgId != null) { - addEventToAskAlexaQueue(vMsg, msgId) - } - } - } -} - def addEventToAskAlexaQueue(vMsg, msgId, queue=null) { if(getAskAlexaMQEn()) { if(getAskAlexaMultiQueueEn()) { @@ -9908,17 +10268,6 @@ def getSafetyTemps(tstat, usedefault=true) { return null } -/* -def getComfortHumidity(tstat) { - def maxHum = tstat?.currentValue("comfortHumidityMax") ?: 0 - if(maxHum) { - //return ["min":minHumidity, "max":maxHumidity] - return maxHum - } - return null -} -*/ - def getComfortDewpoint(tstat, usedefault=true) { def maxDew = tstat?.currentState("comfortDewpointMax")?.doubleValue maxDew = maxDew ?: 0.0 @@ -9936,16 +10285,13 @@ def askAlexaImgUrl() { return "https://raw.githubusercontent.com/MichaelStruck/S /////////////////////////////////////////////////////////////////////////////// /****************************************************************************** -| Application Help and License Info Variables | +| Application Help and License Info Variables | *******************************************************************************/ /////////////////////////////////////////////////////////////////////////////// def appName() { return "${parent ? "${autoAppName()}" : "${appLabel()}"}${appDevName()}" } -def appLabel() { return inReview() ? "NST Manager" : "Nest Manager" } +def appLabel() { return "Nest Manager" } def appAuthor() { return "Anthony S." } def appNamespace() { return "tonesto7" } -def useNewAutoFile() { return true } -def blockOldAuto() { return true } -def newAutoName() { return "NST Automations" } def autoAppName() { return "NST Automations" } def gitRepo() { return "tonesto7/nest-manager"} def gitBranch() { return betaMarker() ? "beta" : "master" } @@ -9953,9 +10299,6 @@ def gitPath() { return "${gitRepo()}/${gitBranch()}"} def developerVer() { return false } def betaMarker() { return false } def appDevType() { return false } -def inReview() { return false } -def keepBackups() { return false } -def allowMigration() { return true } def appDevName() { return appDevType() ? " (Dev)" : "" } def appInfoDesc() { def cur = atomicState?.appData?.updater?.versions?.app?.ver.toString() @@ -9968,11 +10311,11 @@ def appInfoDesc() { } def textVersion() { return "Version: ${appVersion()}" } def textModified() { return "Updated: ${appVerDate()}" } - def textVerInfo() { return "${appVerInfo()}" } def appVerInfo() { return getWebData([uri: "https://raw.githubusercontent.com/${gitPath()}/Data/changelog.txt", contentType: "text/plain; charset=UTF-8"], "changelog") } def textLicense() { return getWebData([uri: "https://raw.githubusercontent.com/${gitPath()}/app_license.txt", contentType: "text/plain; charset=UTF-8"], "license") } -def textDonateLink() { return "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=2CJEVN439EAWS" } +def textDonateLink(){ return "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=2CJEVN439EAWS" } +def streamLink() { return "https://community.smartthings.com/t/nst-manager-real-time-events/89198" } def stIdeLink() { return "https://graph.api.smartthings.com" } -def textCopyright() { return "Copyright© 2017 - Anthony S." } -def textDesc() { return "This SmartApp is used to integrate your Nest devices with SmartThings and to enable built-in automations" } \ No newline at end of file +def textCopyright() { return "Copyright© 2017, 2018 - Anthony S." } +def textDesc() { return "This SmartApp is used to integrate your Nest devices with SmartThings and to enable built-in automations" } diff --git a/smartapps/tonesto7/nst-automations.src/nst-automations.groovy b/smartapps/tonesto7/nst-automations.src/nst-automations.groovy index 5dbbf3ea4..01ebd145d 100644 --- a/smartapps/tonesto7/nst-automations.src/nst-automations.groovy +++ b/smartapps/tonesto7/nst-automations.src/nst-automations.groovy @@ -1,6 +1,6 @@ /******************************************************************************************** | Application Name: NST Automations | -| Copyright (C) 2017 Anthony S. | +| Copyright (C) 2017, 2018, 2019 Anthony S. | | Authors: Anthony S. (@tonesto7), Eric S. (@E_sch) | | Contributors: Ben W. (@desertblade) | | A few code methods are modeled from those in CoRE by Adrian Caramaliu | @@ -18,17 +18,16 @@ definition( parent: "${appNamespace()}:${appParentName()}", description: "${appDesc()}", category: "Convenience", - iconUrl: "https://raw.githubusercontent.com/${gitPath()}/Images/App/automation_icon.png", - iconX2Url: "https://raw.githubusercontent.com/${gitPath()}/Images/App/automation_icon.png", - iconX3Url: "https://raw.githubusercontent.com/${gitPath()}/Images/App/automation_icon.png" -) + iconUrl: "https://raw.githubusercontent.com/${gitPath()}/Images/App/nst_automations_5.png", + iconX2Url: "https://raw.githubusercontent.com/${gitPath()}/Images/App/nst_automations_5.png", + iconX3Url: "https://raw.githubusercontent.com/${gitPath()}/Images/App/nst_automations_5.png") { appSetting "devOpt" } -def appVersion() { "5.2.1" } -def appVerDate() { "12-16-2017" } +def appVersion() { "5.5.0" } +def appVerDate() { "01-25-2019" } preferences { //startPage @@ -48,6 +47,7 @@ preferences { page(name: "schMotModePage") page(name: "setDayModeTimePage") page(name: "watchDogPage") + page(name: "storagePage") page(name: "diagnosticsPage") page(name: "schMotSchedulePage") page(name: "scheduleConfigPage") @@ -59,7 +59,7 @@ preferences { } /****************************************************************************** -| Application Pages | +| Application Pages | *******************************************************************************/ //This Page is used to load either parent or child app interface code def startPage() { @@ -70,6 +70,8 @@ def startPage() { atomicState?.isParent = false selectAutoPage() } + } else { + notAllowedPage() } } @@ -79,6 +81,7 @@ def notAllowedPage () { paragraph "HOUSTON WE HAVE A PROBLEM!\n\nNST Automations can't be directly installed from the Marketplace.\n\nPlease use the NST Manager SmartApp to configure them.", required: true, state: null, image: getAppImg("disable_icon2.png") } + remove("Remove this bad Automation", "WARNING!!!", "BAD Automation SHOULD be removed") } } @@ -100,7 +103,7 @@ def uninstallPage() { paragraph "This will uninstall the ${app?.label} Automation!" } } - remove("Remove ${appName()} and Devices!", "WARNING!!!", "Last Chance to Stop!\nThis action is not reversible\n\nThis App, All Devices, and Automations will be removed") + remove("Remove ${appName()}", "WARNING!!!", "Last Chance to Stop!\nThis action is not reversible\n\nThis Automation will be removed") } } @@ -109,16 +112,20 @@ def uninstallPage() { *######################### NATIVE ST APP METHODS ############################* ******************************************************************************/ def installed() { - log.debug "${app.label} Installed with settings: ${settings}" // MUST BE log.debug + log.debug "${app.getLabel()} Installed with settings: ${settings}" // MUST BE log.debug atomicState?.installData = ["initVer":appVersion(), "dt":getDtNow().toString()] + atomicState?.isInstalled = true initialize() + if(settings["storageFlag"]) { + atomicState?.automationType = "storage" + parent?.storageAppInst(true) + } sendNotificationEvent("${appName()} installed") } def updated() { - LogAction("${app.label} Updated...with settings: ${settings}", "debug", true) + LogAction("${app.getLabel()} Updated...with settings: ${settings}", "debug", true) initialize() - sendNotificationEvent("${appName()} has updated settings") atomicState?.lastUpdatedDt = getDtNow() } @@ -131,6 +138,7 @@ def initialize() { //log.debug "${app.label} Initialize..." // Must be log.debug if(!atomicState?.newAutomationFile) { atomicState?.newAutomationFile = true } if(!atomicState?.installData) { atomicState?.installData = ["initVer":appVersion(), "dt":getDtNow().toString()] } + if(!atomicState?.isInstalled) { atomicState?.isInstalled = true } def settingsReset = parent?.settings?.resetAllData if(atomicState?.resetAllData || settingsReset) { if(fixState()) { return } // runIn of fixState will call initAutoApp() @@ -144,12 +152,13 @@ def subscriber() { private adj_temp(tempF) { if(getTemperatureScale() == "C") { - return ((tempF - 32) * (5 / 9)) as Double // + return ((tempF - 32) * ( 5/9 )) as Double } else { return tempF } } +/* def getStZipCode() { return location?.zipCode?.toString() } def getNestZipCode() { if(atomicState?.structures && atomicState?.structData) { @@ -168,20 +177,21 @@ def helpHandler() { atomicState.showHelp = (help?.showHelp == false) ? false : true } } +*/ -def incMetricCntVal(item) { - def data = atomicState?.usageMetricsStore ?: [:] +private incMetricCntVal(String item) { + Map data = atomicState?.usageMetricsStore ?: [:] data[item] = (data[item] == null) ? 1 : data[item].toInteger()+1 atomicState?.usageMetricsStore = data } def incAutoGlobPrefLoadCnt() { incMetricCntVal("autoGlobPrefLoadCnt") } -def isCodeUpdateAvailable(newVer, curVer, type) { - def result = false +Boolean isCodeUpdateAvailable(String newVer, String curVer, String type) { + Boolean result = false def latestVer if(newVer && curVer) { - def versions = [newVer, curVer] + List versions = [newVer, curVer] if(newVer != curVer) { latestVer = versions?.max { a, b -> def verA = a?.tokenize('.') @@ -195,7 +205,7 @@ def isCodeUpdateAvailable(newVer, curVer, type) { } verA?.size() <=> verB?.size() } - result = (latestVer == newVer) ? true : false + result = (latestVer == newVer) } } //log.debug "type: $type | newVer: $newVer | curVer: $curVer | newestVersion: ${latestVer} | result: $result" @@ -220,39 +230,30 @@ def getMyLockId() { def fixState() { def result = false - LogAction("fixState", "info", false) + LogTrace("fixState") def before = getStateSizePerc() - if(!parent) { -/* - if(!atomicState?.resetAllData && resetAllData) { - def data = getState()?.findAll { !(it?.key in ["accessToken", "authToken", "enRemDiagLogging", "installationId", "remDiagLogActivatedDt", "remDiagLogDataStore", "remDiagDataSentDt", "remDiagLogSentCnt", "resetAllData", "pollingOn", "apiCommandCnt"]) } - data.each { item -> - state.remove(item?.key.toString()) - } - unschedule() - unsubscribe() - atomicState.pollingOn = false - result = true - } else if(atomicState?.resetAllData && !resetAllData) { - LogAction("fixState: resetting ALL toggle", "info", true) - atomicState.resetAllData = false - } -*/ - } else { - if(!atomicState?.resetAllData && parent?.settings?.resetAllData) { // automation cleanup called from update() -> initAutoApp() - def data = getState()?.findAll { !(it?.key in [ "automationType", "disableAutomation", "lastScheduleList", "oldremSenTstat", "leakWatRestoreMode", "conWatRestoreMode", "extTmpRestoreMode", "extTmpTstatOffRequested", "conWatTstatOffRequested", "leakWatTstatOffRequested", "resetAllData", "extTmpLastDesiredTemp", "restoreId", "restoredFromBackup", "restoreCompleted", "automationTypeFlag", "newAutomationFile", "installData", "remDiagLogDataStore" ]) } + if(!atomicState?.resetAllData && parent?.settings?.resetAllData) { // automation cleanup called from update() -> initAutoApp() + def data = getState()?.findAll { !(it?.key in [ "automationType", "disableAutomation", "lastScheduleList", "resetAllData", "disableAutomationDt", + "leakWatRestoreMode", "leakWatTstatOffRequested", + "conWatRestoreMode", "conWatlastMode", "conWatTstatOffRequested", + "oldremSenTstat", /* "remSenTstat", */ + "haveRunFan", "lastfanCtrlRunDt", "lastfanCtrlFanOffDt", + "extTmpRestoreMode", "extTmpTstatOffRequested", "extTmpLastDesiredTemp", "extTmplastMode", "extTmpLastDesiredCTemp", "extTmpLastDesiredHTemp", "extTmpChgWhileOnDt", "extTmpChgWhileOffDt", + "remDiagLogDataStore", + "restoreId", "restoredFromBackup", "restoreCompleted", "automationTypeFlag", "newAutomationFile", "installData", "usageMetricsStore" ]) } // "watchDogAlarmActive", "extTmpAlarmActive", "conWatAlarmActive", "leakWatAlarmActive", - data.each { item -> - state.remove(item?.key.toString()) - } - unschedule() - unsubscribe() - result = true - } else if(atomicState?.resetAllData && !parent?.settings?.resetAllData) { - LogAction("fixState: resetting ALL toggle", "info", true) - atomicState.resetAllData = false + data.each { item -> + state.remove(item?.key.toString()) } + setAutomationStatus() + unschedule() + unsubscribe() + result = true + } else if(atomicState?.resetAllData && !parent?.settings?.resetAllData) { + LogAction("fixState: resetting ALL toggle", "info", true) + atomicState.resetAllData = false } + if(result) { atomicState.resetAllData = true LogAction("fixState: State Data: before: $before after: ${getStateSizePerc()}", "info", true) @@ -262,79 +263,28 @@ def fixState() { } void finishFixState(migrate=false) { - LogAction("finishFixState", "info", false) - if(!parent) { -/* - if(atomicState?.resetAllData) { - atomicState.misPollNotifyWaitVal = !misPollNotifyWaitVal ? 900 : misPollNotifyWaitVal.toInteger() - atomicState.misPollNotifyMsgWaitVal = !misPollNotifyMsgWaitVal ? 3600 : misPollNotifyMsgWaitVal.toInteger() - atomicState.updNotifyWaitVal = !updNotifyWaitVal ? 43200 : updNotifyWaitVal.toInteger() - atomicState.useAltNames = settings?.useAltNames ? true : false - atomicState.custLabelUsed = settings?.useCustDevNames ? true : false - if(!atomicState?.installData) { atomicState?.installData = ["initVer":appVersion(), "dt":getDtNow().toString(), "freshInstall":false, "shownDonation":false, "shownFeedback":false] } - - getWebFileData() // get the appData and calls setStateVar - - atomicState.needStrPoll = true - atomicState?.needDevPoll = true - atomicState?.needMetaPoll = true - - atomicState.structures = settings?.structures ?: null - if(settings?.structures && atomicState?.structures && !atomicState.structName) { - def structs = getNestStructures() - if(structs) { - atomicState.structName = "${structs[atomicState?.structures]}" - } - } - //def str = getApiData("str") - //def dev = getApiData("dev") - //def meta = getApiData("meta") - - if(settings?.thermostats && !atomicState?.thermostats) { atomicState.thermostats = settings?.thermostats ? statState(settings?.thermostats) : null } - if(settings?.protects && !atomicState?.protects) { atomicState.protects = settings?.protects ? coState(settings?.protects) : null } - if(settings?.cameras && !atomicState?.cameras) { atomicState.cameras = settings?.cameras ? camState(settings?.cameras) : null } - atomicState.presDevice = settings?.presDevice ?: null - atomicState.weatherDevice = settings?.weatherDevice ?: null - if(settings?.thermostats || settings?.protects || settings?.cameras || settings?.presDevice || settings?.weatherDevice) { - atomicState.isInstalled = true - atomicState.newSetupComplete = true - atomicState?.setupVersion = atomicState?.appData?.updater?.setupVersion?.toInteger() ?: 0 - } else { atomicState.isInstalled = false } - - //updated() - initManagerApp() - - def cApps = getChildApps() - if(cApps) { - cApps?.sort()?.each { chld -> - chld?.update() - } + LogTrace("finishFixState") + if(atomicState?.resetAllData || migrate) { + def tstat = settings?.schMotTstat + if(tstat) { + LogAction("finishFixState found tstat", "info", true) + getTstatCapabilities(tstat, schMotPrefix()) + if(!getMyLockId()) { + setMyLockId(app.id) } - } -*/ - } else { - if(atomicState?.resetAllData || migrate) { - def tstat = settings?.schMotTstat - if(tstat) { - LogAction("finishFixState found tstat", "info", true) - getTstatCapabilities(tstat, schMotPrefix()) - if(!getMyLockId()) { - setMyLockId(app.id) + if(settings?.schMotRemoteSensor) { + LogAction("finishFixState found remote sensor", "info", true) + if( parent?.remSenLock(tstat?.deviceNetworkId, getMyLockId()) ) { // lock new ID + atomicState?.remSenTstat = tstat?.deviceNetworkId } - if(settings?.schMotRemoteSensor) { - LogAction("finishFixState found remote sensor", "info", true) - if( parent?.remSenLock(tstat?.deviceNetworkId, getMyLockId()) ) { // lock new ID - atomicState?.remSenTstat = tstat?.deviceNetworkId - } - if(isRemSenConfigured() && settings?.remSensorDay) { - LogAction("finishFixState found remote sensor configured", "info", true) - if(settings?.vthermostat != null) { parent?.addRemoveVthermostat(tstat.deviceNetworkId, vthermostat, getMyLockId()) } - } + if(isRemSenConfigured() && settings?.remSensorDay) { + LogAction("finishFixState found remote sensor configured", "info", true) + if(settings?.vthermostat != null) { parent?.addRemoveVthermostat(tstat.deviceNetworkId, vthermostat, getMyLockId()) } } } - if(!migrate) { initAutoApp() } - //updated() } + if(!migrate) { initAutoApp() } + //updated() } } @@ -358,18 +308,20 @@ def selectAutoPage() { def mainAutoPage(params) { //LogTrace("mainAutoPage()") - if(!atomicState?.tempUnit) { atomicState?.tempUnit = getTemperatureScale()?.toString() } + def t0 = getTemperatureScale()?.toString() + atomicState?.tempUnit = (t0 != null) ? t0 : atomicState?.tempUnit if(!atomicState?.disableAutomation) { atomicState.disableAutomation = false } - def t0 = parent?.getShowHelp() + t0 = parent?.getShowHelp() atomicState?.showHelp = (t0 != null) ? t0 : true def autoType = null //If params.autoType is not null then save to atomicState. if(!params?.autoType) { autoType = atomicState?.automationType } - else { atomicState.automationType = params?.autoType; autoType = params?.autoType } + else { atomicState.automationType = params?.autoType; autoType = params?.autoType; } // If the selected automation has not been configured take directly to the config page. Else show main page if(autoType == "nMode" && !isNestModesConfigured()) { return nestModePresPage() } else if(autoType == "watchDog" && !isWatchdogConfigured()) { return watchDogPage() } + else if(autoType == "storage") { return storagePage() } else if(autoType == "remDiag" && !isDiagnosticsConfigured()) { return diagnosticsPage() } else if(autoType == "schMot" && !isSchMotConfigured()) { return schMotModePage() } @@ -378,7 +330,7 @@ def mainAutoPage(params) { //return dynamicPage(name: "mainAutoPage", title: "Automation Configuration", uninstall: false, install: false, nextPage: "nameAutoPage" ) { return dynamicPage(name: "mainAutoPage", title: "Automation Configuration", uninstall: false, install: true, nextPage:null ) { section() { - if(disableAutomationreq) { + if(settings?.disableAutomationreq) { paragraph "This Automation is currently disabled!\nTurn it back on to to make changes or resume operation", required: true, state: null, image: getAppImg("instruct_icon.png") } else { if(atomicState?.disableAutomation) { paragraph "This Automation is still disabled!\nPress Next and Done to Activate this Automation Again", state: "complete", image: getAppImg("instruct_icon.png") } @@ -394,7 +346,7 @@ def mainAutoPage(params) { } nDesc += (nModePresSensor && !nModeSwitch) ? "\n\n${nModePresenceDesc()}" : "" nDesc += (nModeSwitch && !nModePresSensor) ? "\n • Using Switch: (State: ${isSwitchOn(nModeSwitch) ? "ON" : "OFF"})" : "" - nDesc += (nModeDelay && nModeDelayVal) ? "\n • Change Delay: (${getEnumValue(longTimeSecEnum(), nModeDelayVal)})" : "" + nDesc += (settings?.nModeDelay && settings?.nModeDelayVal) ? "\n • Change Delay: (${getEnumValue(longTimeSecEnum(), settings?.nModeDelayVal)})" : "" nDesc += (isNestModesConfigured() ) ? "\n • Restrictions Active: (${autoScheduleOk(getAutoType()) ? "NO" : "YES"})" : "" if(isNestModesConfigured()) { nDesc += "\n • Set Thermostats to ECO: (${nModeSetEco ? "On" : "Off"})" @@ -406,7 +358,9 @@ def mainAutoPage(params) { } } } - nDesc += (nModePresSensor || nModeSwitch) || (!nModePresSensor && !nModeSwitch && (nModeAwayModes && nModeHomeModes)) ? "\n\nTap to modify" : "" + def t1 = getNotifConfigDesc("nMode") + nDesc += t1 ? "\n\n${t1}" : "" + nDesc += t1 || (nModePresSensor || nModeSwitch) || (!nModePresSensor && !nModeSwitch && (nModeAwayModes && nModeHomeModes)) ? "\n\nTap to modify" : "" def nModeDesc = isNestModesConfigured() ? "${nDesc}" : null href "nestModePresPage", title: "Nest Mode Automation Config", description: nModeDesc ?: "Tap to configure", state: (nModeDesc ? "complete" : null), image: getAppImg("mode_automation_icon.png") } @@ -419,25 +373,30 @@ def mainAutoPage(params) { if(autoType == "watchDog") { //paragraph title:"Watch your Nest Location for Events:", "" def watDesc = "" - def t1 = getVoiceNotifConfigDesc("watchDog") - watDesc += (settings["${getAutoType()}AllowSpeechNotif"] && (settings["${getAutoType()}SpeechDevices"] || settings["${getAutoType()}SpeechMediaPlayer"]) && t1) ? - "\n\nVoice Notifications:${t1}" : "" + //def t1 = getVoiceNotifConfigDesc("watchDog") + //watDesc += (settings["${getAutoType()}AllowSpeechNotif"] && (settings["${getAutoType()}SpeechDevices"] || settings["${getAutoType()}SpeechMediaPlayer"]) && t1) ? "\n\nVoice Notifications:${t1}" : "" + def t1 = getNotifConfigDesc("watchDog") + watDesc += t1 ? "${t1}\n\nTap to modify" : "" def watDogDesc = isWatchdogConfigured() ? "${watDesc}" : null href "watchDogPage", title: "Nest Location Watchdog", description: watDogDesc ?: "Tap to configure", state: (watDogDesc ? "complete" : null), image: getAppImg("watchdog_icon.png") } if(autoType == "remDiag") { - //paragraph title:"Watch your Nest Location for Events:", "" def diagDesc = "" def remDiagDesc = isDiagnosticsConfigured() ? "${diagDesc}" : null href "diagnosticsPage", title: "NST Diagnostics", description: remDiagDesc ?: "Tap to configure", state: (remDiagDesc ? "complete" : null), image: getAppImg("diag_icon.png") } + if(autoType == "storage") { + def storDesc = "" + def storageDesc = isStorageConfigured() ? "${storDesc}" : null + href "storagePage", title: "NST Storage", description: storageDesc ?: "Tap to configure", state: (storageDesc ? "complete" : null), image: getAppImg("storage_icon.png") + } } } section("Automation Options:") { - if(atomicState?.isInstalled && (isNestModesConfigured() || isWatchdogConfigured() || isSchMotConfigured())) { + if(/* atomicState?.isInstalled && */ (isNestModesConfigured() || isWatchdogConfigured() || isSchMotConfigured())) { //paragraph title:"Enable/Disable this Automation", "" - input "disableAutomationreq", "bool", title: "Disable this Automation?", required: false, defaultValue: atomicState?.disableAutomation, submitOnChange: true, image: getAppImg("disable_icon2.png") - setAutomationStatus(settings?.disableAutomationreq) + input "disableAutomationreq", "bool", title: "Disable this Automation?", required: false, defaultValue: false /* atomicState?.disableAutomation */, submitOnChange: true, image: getAppImg("disable_icon2.png") + setAutomationStatus() } input ("showDebug", "bool", title: "Debug Option", description: "Show Automation Logs in the IDE?", required: false, defaultValue: false, submitOnChange: true, image: getAppImg("debug_icon.png")) if(showDebug) { @@ -447,15 +406,11 @@ def mainAutoPage(params) { } } section("Automation Name:") { -// if(autoType == "watchDog") { -// paragraph "${app?.label}" -// } else { - def newName = getAutoTypeLabel() - label title: "Label this Automation:", description: "Suggested Name: ${newName}", defaultValue: newName, required: true, wordWrap: true, image: getAppImg("name_tag_icon.png") - if(!atomicState?.isInstalled) { - paragraph "Make sure to name it something that you can easily recgonize." - } -// } + def newName = getAutoTypeLabel() + label title: "Label this Automation:", description: "Suggested Name: ${newName}", defaultValue: newName, required: true, wordWrap: true, image: getAppImg("name_tag_icon.png") + if(!atomicState?.isInstalled) { + paragraph "Make sure to name it something that you can easily recgonize." + } } remove("Remove this Automation!", "WARNING!!!", "Last Chance to Stop!!!\nThis action is not reversible\n\nThis Automation will be removed completely") } @@ -480,20 +435,31 @@ def getSchMotConfigDesc(retAsList=false) { list?.each { ls -> sDesc += "\n • ${ls}" } + def t1 = getNotifConfigDesc("schMot") + sDesc += t1 ? "\n\n${t1}" : "" sDesc += settings?.schMotTstat ? "\n\nTap to modify" : "" return isSchMotConfigured() ? "${sDesc}" : null } } -def setAutomationStatus(disabled, upd=false) { - if(!atomicState?.disableAutomation && disabled) { +def setAutomationStatus(upd=false) { + Boolean myDis = (settings?.disableAutomationreq == true) + Boolean settingsReset = (parent?.settings?.disableAllAutomations == true) + Boolean storAutoType = getAutoType() == "storage" ? true : false + if(settingsReset && !storAutoType) { + if(!myDis && settingsReset) { LogAction("setAutomationStatus: NST Manager forcing disable", "info", true) } + myDis = true + } else if(storAutoType) { + myDis = false + } + if(!atomicState?.disableAutomation && myDis) { LogAction("Automation Disabled at (${getDtNow()})", "info", true) atomicState?.disableAutomationDt = getDtNow() - } else if(atomicState?.disableAutomation && !disabled) { + } else if(atomicState?.disableAutomation && !myDis) { LogAction("Automation Enabled at (${getDtNow()})", "info", true) atomicState?.disableAutomationDt = null } - atomicState?.disableAutomation = disabled + atomicState?.disableAutomation = myDis if(upd) { app.update() } } @@ -533,8 +499,7 @@ def createAutoBackupJson() { else { if(itemType == "mode" || itemVal instanceof Integer || itemVal instanceof Double || itemVal instanceof Boolean || itemVal instanceof Float || itemVal instanceof Long || itemVal instanceof BigDecimal) { setObj = itemVal - } - else { setObj = itemVal.toString() } + } else { setObj = itemVal.toString() } } //log.debug "setting item ${item?.key}: ${getObjType(itemVal)} | result: $setObj" setData[item?.key]?.value = setObj @@ -560,40 +525,41 @@ def backupConfigToFirebase() { void settingUpdate(name, value, type=null) { LogTrace("settingUpdate($name, $value, $type)...") - try { - //if(name && value && type) { - if(name && type) { - app?.updateSetting("$name", [type: "$type", value: value]) + if(name) { + if(value == "" || value == null || value == []) { + settingRemove(name) + return } - //else if (name && value && type == null) { app?.updateSetting(name.toString(), value) } - else if (name && type == null) { app?.updateSetting(name.toString(), value) } - } catch(e) { - log.error "settingUpdate Exception:", ex } + if(name && type) { app?.updateSetting("$name", [type: "$type", value: value]) } + else if (name && type == null) { app?.updateSetting(name.toString(), value) } +} + +void settingRemove(name) { + LogAction("settingRemove($name)...", "trace", false) + if(name) { app?.deleteSetting("$name") } } def stateUpdate(key, value) { - if(key) { atomicState?."${key}" = value } - else { LogAction("stateUpdate: null key $key $value", "error", true) } + if(key) { atomicState?."${key}" = value; return true } + else { LogAction("stateUpdate: null key $key $value", "error", true); return false } +} + +def stateRemove(key) { + if(state?.containsKey(key)) { state.remove(key?.toString()) } + return true } def initAutoApp() { //log.debug "${app.label} initAutoApp..." // Must be log.debug - def restoreId = settings["restoreId"] - def restoreComplete = settings["restoreCompleted"] == true ? true : false if(settings["watchDogFlag"]) { atomicState?.automationType = "watchDog" + } else if(settings["storageFlag"]) { + atomicState?.automationType = "storage" + parent?.storageAppInst(true) } else if(settings["remDiagFlag"]) { atomicState?.automationType = "remDiag" - } - else if (restoreId != null && restoreComplete == false) { - LogAction("Restored AutomationType: (${settings?.automationTypeFlag})", "info", true) - if(parent?.callRestoreState(app, restoreId)) { - finishFixState(true) - parent?.postChildRestore(restoreId) - if(parent?.keepBackups() != true) { parent?.removeAutomationBackupData(restoreId) } - settingUpdate("restoreCompleted", true, "bool") - } + parent?.remDiagAppAvail(true) } def autoType = getAutoType() @@ -603,92 +569,95 @@ def initAutoApp() { unschedule() unsubscribe() def autoDisabled = getIsAutomationDisabled() + setAutomationStatus() - if(!autoDisabled && (restoreId && restoreComplete == false ? false : true)) { - automationsInst() + //if(!autoDisabled && (restoreId && restoreComplete == false ? false : true)) { - if(autoType == "schMot" && isSchMotConfigured()) { - updateScheduleStateMap() - def schedList = getScheduleList() - def timersActive = false - def sLbl - def cnt = 1 - def numact = 0 - schedList?.each { scd -> - sLbl = "schMot_${scd}_" - atomicState."schedule${cnt}SwEnabled" = null - atomicState."schedule${cnt}PresEnabled" = null - atomicState."schedule${cnt}MotionEnabled" = null - atomicState."schedule${cnt}SensorEnabled" = null - - def newscd = [] - def act = settings["${sLbl}SchedActive"] - if(act) { - newscd = cleanUpMap([ - m: settings["${sLbl}restrictionMode"], - tf: settings["${sLbl}restrictionTimeFrom"], - tfc: settings["${sLbl}restrictionTimeFromCustom"], - tfo: settings["${sLbl}restrictionTimeFromOffset"], - tt: settings["${sLbl}restrictionTimeTo"], - ttc: settings["${sLbl}restrictionTimeToCustom"], - tto: settings["${sLbl}restrictionTimeToOffset"], - w: settings["${sLbl}restrictionDOW"], - p1: buildDeviceNameList(settings["${sLbl}restrictionPresHome"], "and"), - p0: buildDeviceNameList(settings["${sLbl}restrictionPresAway"], "and"), - s1: buildDeviceNameList(settings["${sLbl}restrictionSwitchOn"], "and"), - s0: buildDeviceNameList(settings["${sLbl}restrictionSwitchOff"], "and"), - ctemp: roundTemp(settings["${sLbl}CoolTemp"]), - htemp: roundTemp(settings["${sLbl}HeatTemp"]), - hvacm: settings["${sLbl}HvacMode"], - sen0: settings["schMotRemoteSensor"] ? buildDeviceNameList(settings["${sLbl}remSensor"], "and") : null, - thres: settings["schMotRemoteSensor"] ? settings["${sLbl}remSenThreshold"] : null, - m0: buildDeviceNameList(settings["${sLbl}Motion"], "and"), - mctemp: settings["${sLbl}Motion"] ? roundTemp(settings["${sLbl}MCoolTemp"]) : null, - mhtemp: settings["${sLbl}Motion"] ? roundTemp(settings["${sLbl}MHeatTemp"]) : null, - mhvacm: settings["${sLbl}Motion"] ? settings["${sLbl}MHvacMode"] : null, -// mpresHome: settings["${sLbl}Motion"] ? settings["${sLbl}MPresHome"] : null, -// mpresAway: settings["${sLbl}Motion"] ? settings["${sLbl}MPresAway"] : null, - mdelayOn: settings["${sLbl}Motion"] ? settings["${sLbl}MDelayValOn"] : null, - mdelayOff: settings["${sLbl}Motion"] ? settings["${sLbl}MDelayValOff"] : null - ]) - numact += 1 - } - LogTrace("initAutoApp: [Schedule: $scd | sLbl: $sLbl | act: $act | newscd: $newscd]") - atomicState."sched${cnt}restrictions" = newscd - atomicState."schedule${cnt}SwEnabled" = (newscd?.s1 || newscd?.s0) ? true : false - atomicState."schedule${cnt}PresEnabled" = (newscd?.p1 || newscd?.p0) ? true : false - atomicState."schedule${cnt}MotionEnabled" = (newscd?.m0) ? true : false - atomicState."schedule${cnt}SensorEnabled" = (newscd?.sen0) ? true : false - //atomicState."schedule${cnt}FanCtrlEnabled" = (newscd?.fan0) ? true : false - atomicState."schedule${cnt}TimeActive" = (newscd?.tf || newscd?.tfc || newscd?.tfo || newscd?.tt || newscd?.ttc || newscd?.tto || newscd?.w) ? true : false - - atomicState."${sLbl}MotionActiveDt" = null - atomicState."${sLbl}MotionInActiveDt" = null - - def newact = isMotionActive(settings["${sLbl}Motion"]) - if(newact) { atomicState."${sLbl}MotionActiveDt" = getDtNow() } - else { atomicState."${sLbl}MotionInActiveDt" = getDtNow() } - - atomicState."${sLbl}oldMotionActive" = newact - atomicState?."motion${cnt}UseMotionSettings" = null // clear automation state of schedule in use motion state - atomicState?."motion${cnt}LastisBtwn" = false - - timersActive = (timersActive || atomicState."schedule${cnt}TimeActive") ? true : false + automationsInst() - cnt += 1 + if(autoType == "schMot" && isSchMotConfigured()) { + updateScheduleStateMap() + def schedList = getScheduleList() + def timersActive = false + def sLbl + def cnt = 1 + def numact = 0 + schedList?.each { scd -> + sLbl = "schMot_${scd}_" + atomicState."schedule${cnt}SwEnabled" = null + atomicState."schedule${cnt}PresEnabled" = null + atomicState."schedule${cnt}MotionEnabled" = null + atomicState."schedule${cnt}SensorEnabled" = null + + def newscd = [:] + def act = settings["${sLbl}SchedActive"] + if(act) { + newscd = cleanUpMap([ + m: settings["${sLbl}restrictionMode"], + tf: settings["${sLbl}restrictionTimeFrom"], + tfc: settings["${sLbl}restrictionTimeFromCustom"], + tfo: settings["${sLbl}restrictionTimeFromOffset"], + tt: settings["${sLbl}restrictionTimeTo"], + ttc: settings["${sLbl}restrictionTimeToCustom"], + tto: settings["${sLbl}restrictionTimeToOffset"], + w: settings["${sLbl}restrictionDOW"], + p1: buildDeviceNameList(settings["${sLbl}restrictionPresHome"], "and"), + p0: buildDeviceNameList(settings["${sLbl}restrictionPresAway"], "and"), + s1: buildDeviceNameList(settings["${sLbl}restrictionSwitchOn"], "and"), + s0: buildDeviceNameList(settings["${sLbl}restrictionSwitchOff"], "and"), + ctemp: roundTemp(settings["${sLbl}CoolTemp"]), + htemp: roundTemp(settings["${sLbl}HeatTemp"]), + hvacm: settings["${sLbl}HvacMode"], + sen0: settings["schMotRemoteSensor"] ? buildDeviceNameList(settings["${sLbl}remSensor"], "and") : null, + thres: settings["schMotRemoteSensor"] ? settings["${sLbl}remSenThreshold"] : null, + m0: buildDeviceNameList(settings["${sLbl}Motion"], "and"), + mctemp: settings["${sLbl}Motion"] ? roundTemp(settings["${sLbl}MCoolTemp"]) : null, + mhtemp: settings["${sLbl}Motion"] ? roundTemp(settings["${sLbl}MHeatTemp"]) : null, + mhvacm: settings["${sLbl}Motion"] ? settings["${sLbl}MHvacMode"] : null, +// mpresHome: settings["${sLbl}Motion"] ? settings["${sLbl}MPresHome"] : null, +// mpresAway: settings["${sLbl}Motion"] ? settings["${sLbl}MPresAway"] : null, + mdelayOn: settings["${sLbl}Motion"] ? settings["${sLbl}MDelayValOn"] : null, + mdelayOff: settings["${sLbl}Motion"] ? settings["${sLbl}MDelayValOff"] : null + ]) + numact += 1 } - atomicState.scheduleTimersActive = timersActive - atomicState.lastSched = null // clear automation state of schedule in use - atomicState.scheduleSchedActiveCount = numact - } + LogTrace("initAutoApp: [Schedule: $scd | sLbl: $sLbl | act: $act | newscd: $newscd]") + atomicState."sched${cnt}restrictions" = newscd + atomicState."schedule${cnt}SwEnabled" = (newscd?.s1 || newscd?.s0) ? true : false + atomicState."schedule${cnt}PresEnabled" = (newscd?.p1 || newscd?.p0) ? true : false + atomicState."schedule${cnt}MotionEnabled" = (newscd?.m0) ? true : false + atomicState."schedule${cnt}SensorEnabled" = (newscd?.sen0) ? true : false + //atomicState."schedule${cnt}FanCtrlEnabled" = (newscd?.fan0) ? true : false + atomicState."schedule${cnt}TimeActive" = (newscd?.tf || newscd?.tfc || newscd?.tfo || newscd?.tt || newscd?.ttc || newscd?.tto || newscd?.w) ? true : false + + atomicState."${sLbl}MotionActiveDt" = null + atomicState."${sLbl}MotionInActiveDt" = null - subscribeToEvents() - scheduler() + def newact = isMotionActive(settings["${sLbl}Motion"]) + if(newact) { atomicState."${sLbl}MotionActiveDt" = getDtNow() } + else { atomicState."${sLbl}MotionInActiveDt" = getDtNow() } + + atomicState."${sLbl}oldMotionActive" = newact + atomicState?."motion${cnt}UseMotionSettings" = null // clear automation state of schedule in use motion state + atomicState?."motion${cnt}LastisBtwn" = false + + timersActive = (timersActive || atomicState."schedule${cnt}TimeActive") ? true : false + + cnt += 1 + } + atomicState.scheduleTimersActive = timersActive + atomicState.lastSched = null // clear automation state of schedule in use + atomicState.scheduleSchedActiveCount = numact } + + subscribeToEvents() + scheduler() + app.updateLabel(getAutoTypeLabel()) LogAction("Automation Label: ${getAutoTypeLabel()}", "info", true) - - //if(settings["backedUpData"] && atomicState?.restoreCompleted) { } + if(settings?."${autoType}PushoverEnabled" == true) { + pushover_init() + } else { pushover_cleanup() } state.remove("motionnullLastisBtwn") state.remove("motion1InBtwn") @@ -718,21 +687,14 @@ def uninstAutomationApp() { //LogTrace("uninstAutomationApp") def autoType = getAutoType() if(autoType == "schMot") { - def myID = getMyLockId() - if(schMotTstat && myID && parent) { - if(parent?.addRemoveVthermostat(schMotTstat.deviceNetworkId, false, myID)) { - LogAction("uninstAutomationApp: cleanup virtual thermostat", "debug", true) - } - } - if(schMotTstat && myID && parent) { - if( parent?.remSenUnlock(atomicState?.remSenTstat, myID) ) { // attempt unlock old ID - LogAction("uninstAutomationApp: Released remote sensor lock", "debug", true) - } - } + removeVstat("uninstAutomationApp") } if(autoType == "nMode") { parent?.automationNestModeEnabled(false) } + if(settings["remDiagFlag"]) { + parent?.remDiagAppAvail(false) + } } def getCurAppLbl() { return app?.label?.toString() } @@ -748,6 +710,7 @@ def getAutoTypeLabel() { if(type == "nMode") { typeLabel = "${newName} (NestMode)" } else if(type == "watchDog") { typeLabel = "Nest Location ${location.name} Watchdog"} + else if(type == "storage") { typeLabel = "NST Storage"} else if(type == "remDiag") { typeLabel = "NST Diagnostics"} else if(type == "schMot") { typeLabel = "${newName} (${schMotTstat?.label})" } @@ -783,26 +746,27 @@ def getStateVal(var) { return state[var] ?: null } -def automationsInst() { - atomicState.isNestModesConfigured = isNestModesConfigured() ? true : false - atomicState.isWatchdogConfigured = isWatchdogConfigured() ? true : false - atomicState.isDiagnosticsConfigured = isDiagnosticsConfigured() ? true : false - atomicState.isSchMotConfigured = isSchMotConfigured() ? true : false - - atomicState.isLeakWatConfigured = isLeakWatConfigured() ? true : false - atomicState.isConWatConfigured = isConWatConfigured() ? true : false - atomicState.isHumCtrlConfigured = isHumCtrlConfigured() ? true : false - atomicState.isExtTmpConfigured = isExtTmpConfigured() ? true : false - atomicState.isRemSenConfigured = isRemSenConfigured() ? true : false - atomicState.isTstatSchedConfigured = isTstatSchedConfigured() ? true : false - atomicState.isFanCtrlConfigured = isFanCtrlSwConfigured() ? true : false - atomicState.isFanCircConfigured = isFanCircConfigured() ? true : false +public automationsInst() { + atomicState.isNestModesConfigured = (isNestModesConfigured() == true) + atomicState.isWatchdogConfigured = (isWatchdogConfigured() == true) + atomicState.isDiagnosticsConfigured = (isDiagnosticsConfigured() == true) + atomicState.isStorageConfigured = (isStorageConfigured() == true) + atomicState.isSchMotConfigured = (isSchMotConfigured() == true) + + atomicState.isLeakWatConfigured = (isLeakWatConfigured() == true) + atomicState.isConWatConfigured = (isConWatConfigured() == true) + atomicState.isHumCtrlConfigured = (isHumCtrlConfigured() == true) + atomicState.isExtTmpConfigured = (isExtTmpConfigured() == true) + atomicState.isRemSenConfigured = (isRemSenConfigured() == true) + atomicState.isTstatSchedConfigured = (isTstatSchedConfigured() == true) + atomicState.isFanCtrlConfigured = (isFanCtrlSwConfigured() == true) + atomicState.isFanCircConfigured = (isFanCircConfigured() == true) atomicState?.isInstalled = true } -def getAutomationsInstalled() { - def list = [] - def aType = atomicState?.automationType +List getAutomationsInstalled() { + List list = [] + String aType = atomicState?.automationType switch(aType) { case "nMode": list.push(aType) @@ -810,14 +774,14 @@ def getAutomationsInstalled() { case "schMot": def tmp = [:] tmp[aType] = [] - if(isLeakWatConfigured()) { tmp[aType].push("leakWat") } - if(isConWatConfigured()) { tmp[aType].push("conWat") } - if(isHumCtrlConfigured()) { tmp[aType].push("humCtrl") } - if(isExtTmpConfigured()) { tmp[aType].push("extTmp") } + if(isLeakWatConfigured()) { tmp[aType].push("leakWat") } + if(isConWatConfigured()) { tmp[aType].push("conWat") } + if(isHumCtrlConfigured()) { tmp[aType].push("humCtrl") } + if(isExtTmpConfigured()) { tmp[aType].push("extTmp") } if(isRemSenConfigured()) { tmp[aType].push("remSen") } - if(isTstatSchedConfigured()) { tmp[aType].push("tSched") } - if(isFanCtrlSwConfigured()) { tmp[aType].push("fanCtrl") } - if(isFanCircConfigured()) { tmp[aType].push("fanCirc") } + if(isTstatSchedConfigured()) { tmp[aType].push("tSched") } + if(isFanCtrlSwConfigured()) { tmp[aType].push("fanCtrl") } + if(isFanCircConfigured()) { tmp[aType].push("fanCirc") } if(tmp?.size()) { list.push(tmp) } break case "watchDog": @@ -826,16 +790,19 @@ def getAutomationsInstalled() { case "remDiag": list.push(aType) break + case "storage": + list.push(aType) + break } LogTrace("getAutomationsInstalled List: $list") return list } -def getAutomationType() { +String getAutomationType() { return atomicState?.automationType ?: null } -def getAutoType() { return !parent ? "" : atomicState?.automationType } +String getAutoType() { return !parent ? "" : atomicState?.automationType } def getIsAutomationDisabled() { def dis = atomicState?.disableAutomation @@ -844,8 +811,8 @@ def getIsAutomationDisabled() { def subscribeToEvents() { //Remote Sensor Subscriptions - def autoType = getAutoType() - def swlist = [] + String autoType = getAutoType() + List swlist = [] //Nest Mode Subscriptions if(autoType == "nMode") { @@ -862,13 +829,13 @@ def subscribeToEvents() { if(d1) { LogAction("Found: ${d1?.displayName} with (Id: ${dni?.key})", "debug", false) - subscribe(d1, "nestThermostatMode", automationGenericEvt) - subscribe(d1, "presence", automationGenericEvt) + //subscribe(d1, "nestThermostatMode", automationGenericEvt) // this is not needed for nMode + //subscribe(d1, "presence", automationGenericEvt) // this is not needed, tracking only } return d1 } } - def t0 = [] + List t0 = [] if(settings["nModerestrictionSwitchOn"]) { t0 = t0 + settings["nModerestrictionSwitchOn"] } if(settings["nModerestrictionSwitchOff"]) { t0 = t0 + settings["nModerestrictionSwitchOff"] } for(sw in t0) { @@ -890,12 +857,18 @@ def subscribeToEvents() { if(isSchMotConfigured()) { if(settings?.schMotWaterOff) { - if(isLeakWatConfigured()) { subscribe(leakWatSensors, "water", leakWatSensorEvt) } + if(isLeakWatConfigured()) { + setInitialVoiceMsgs(leakWatPrefix()) + setCustomVoice(leakWatPrefix()) + subscribe(leakWatSensors, "water", leakWatSensorEvt) + } } if(settings?.schMotContactOff) { if(isConWatConfigured()) { + setInitialVoiceMsgs(conWatPrefix()) + setCustomVoice(conWatPrefix()) subscribe(conWatContacts, "contact", conWatContactEvt) - def t0 = [] + List t0 = [] if(settings["conWatrestrictionSwitchOn"]) { t0 = t0 + settings["conWatrestrictionSwitchOn"] } if(settings["conWatrestrictionSwitchOff"]) { t0 = t0 + settings["conWatrestrictionSwitchOff"] } for(sw in t0) { @@ -938,6 +911,8 @@ def subscribeToEvents() { if(settings?.schMotExternalTempOff) { if(isExtTmpConfigured()) { + setInitialVoiceMsgs(extTmpPrefix()) + setCustomVoice(extTmpPrefix()) if(settings?.extTmpUseWeather) { atomicState.needWeathUpd = true if(parent?.getWeatherDeviceInst()) { @@ -975,13 +950,18 @@ def subscribeToEvents() { senlist.push(sen) subscribe(sen, "temperature", automationGenericEvt) subscribe(sen, "humidity", automationGenericEvt) + if(settings?.schMotExternalTempOff) { + if(isExtTmpConfigured()) { + subscribe(sen, "temperature", extTmpGenericEvt) + subscribe(sen, "humidity", extTmpGenericEvt) + } + } } } } } } - if(isTstatSchedConfigured()) { - } + if(isTstatSchedConfigured()) { } if(settings?.schMotOperateFan) { if(isFanCtrlSwConfigured() && fanCtrlFanSwitches) { subscribe(fanCtrlFanSwitches, "switch", automationGenericEvt) @@ -999,15 +979,16 @@ def subscribeToEvents() { } } } - if(settings?.schMotOperateFan || settings?.schMotRemoteSensor || settings?.schMotHumidityControl) { + Boolean hasFan = (atomicState?.schMotTstatHasFan == true) + if(hasFan && (settings?.schMotOperateFan || settings?.schMotRemoteSensor || settings?.schMotHumidityControl)) { subscribe(schMotTstat, "thermostatFanMode", automationGenericEvt) } - def schedList = getScheduleList() - def sLbl - def cnt = 1 - def prlist = [] - def mtlist = [] + List schedList = getScheduleList() + String sLbl + Integer cnt = 1 + List prlist = [] + List mtlist = [] schedList?.each { scd -> sLbl = "schMot_${scd}_" def restrict = atomicState?."sched${cnt}restrictions" @@ -1089,8 +1070,14 @@ def subscribeToEvents() { subscribe(schMotTstat, "thermostatOperatingState", automationGenericEvt) subscribe(schMotTstat, "temperature", automationGenericEvt) subscribe(schMotTstat, "presence", automationGenericEvt) - subscribe(schMotTstat, "coolingSetpoint", automationGenericEvt) - subscribe(schMotTstat, "heatingSetpoint", automationGenericEvt) + def canCool = atomicState?.schMotTstatCanCool + if(canCool) { + subscribe(schMotTstat, "coolingSetpoint", automationGenericEvt) + } + def canHeat = atomicState?.schMotTstatCanHeat + if(canHeat) { + subscribe(schMotTstat, "heatingSetpoint", automationGenericEvt) + } subscribe(schMotTstat, "safetyTempExceeded", automationSafetyTempEvt) subscribe(location, "sunset", automationGenericEvt) subscribe(location, "sunrise", automationGenericEvt) @@ -1099,7 +1086,7 @@ def subscribeToEvents() { } //watchDog Subscriptions if(autoType == "watchDog") { - // if(isWatchdogConfigured()) { + // if(isWatchdogConfigured()) def tstats = parent?.getTstats() def foundTstats @@ -1119,11 +1106,12 @@ def subscribeToEvents() { return d1 } } - //Alarm status monitoring - if(settings["${autoType}AlarmDevices"] && settings?."${pName}AllowAlarmNotif") { - if(settings["${autoType}_Alert_1_Use_Alarm"] || settings["${autoType}_Alert_2_Use_Alarm"]) { - subscribe(settings["${autoType}AlarmDevices"], "alarm", alarmAlertEvt) - } + } + + //Alarm status monitoring if any automation has alarm notification enabled + if(settings["${autoType}AlarmDevices"] && settings?."${pName}AllowAlarmNotif") { + if(settings["${autoType}_Alert_1_Use_Alarm"] || settings["${autoType}_Alert_2_Use_Alarm"]) { + subscribe(settings["${autoType}AlarmDevices"], "alarm", alarmAlertEvt) } } @@ -1131,6 +1119,11 @@ def subscribeToEvents() { if(autoType == "remDiag") { } + + //storage Subscriptions + if(autoType == "storage") { + + } } def scheduler() { @@ -1142,7 +1135,7 @@ def scheduler() { if(autoType == "schMot" && atomicState?.scheduleSchedActiveCount && atomicState?.scheduleTimersActive) { LogAction("${autoType} scheduled (${random_int} ${random_dint}/5 * * * ?)", "info", true) schedule("${random_int} ${random_dint}/5 * * * ?", heartbeatAutomation) - } else if(autoType != "remDiag") { + } else if(autoType != "remDiag" || autoType != "storage") { LogAction("${autoType} scheduled (${random_int} ${random_dint}/30 * * * ?)", "info", true) schedule("${random_int} ${random_dint}/30 * * * ?", heartbeatAutomation) } @@ -1156,7 +1149,7 @@ def heartbeatAutomation() { val = 220 } if(getLastAutomationSchedSec() > val) { - LogAction("${autoType} Heartbeat run", "trace", false) + LogTrace("${autoType} Heartbeat run") runAutomationEval() } } @@ -1243,7 +1236,12 @@ def runAutomationEval() { break case "remDiag": if(isDiagnosticsConfigured()) { - //remDiagCheck() + // remDiagCheck() + } + break + case "storage": + if(isStorageConfigured()) { + // storageCheck() } break default: @@ -1342,7 +1340,7 @@ def doTheEvent(evt) { } /****************************************************************************** -| WATCHDOG AUTOMATION LOGIC CODE | +| WATCHDOG AUTOMATION LOGIC CODE | *******************************************************************************/ def watchDogPrefix() { return "watchDog" } @@ -1350,9 +1348,10 @@ def watchDogPage() { def pName = watchDogPrefix() dynamicPage(name: "watchDogPage", title: "Nest Location Watchdog", uninstall: false, install: true) { section("Notifications:") { - def pageDesc = getNotifConfigDesc(pName) + def t0 = getNotifConfigDesc(pName) + def pageDesc = t0 ? "${t0}\n\nTap to modify" : "" href "setNotificationPage", title: "Configured Alerts", description: pageDesc, params: ["pName":"${pName}", "allowSpeech":true, "allowAlarm":true, "showSchedule":true], - state: (pageDesc ? "complete" : null), image: getAppImg("notification_icon.png") + state: (pageDesc ? "complete" : null), image: getAppImg("notification_icon.png") input "watDogNotifMissedEco", "bool", title: "Notify When Away and Not in Eco Mode?", required: false, defaultValue: true, submitOnChange: true, image: getAppImg("switch_on_icon.png") } //remove("Remove ${app?.label}!", "Last Chance!!!", "Warning!!! This action is not reversible\n\nThis Automation will be removed completely") @@ -1411,7 +1410,6 @@ def watchDogCheck() { def watchDogAlarmActions(dev, dni, actType) { def pName = watchDogPrefix() - //def allowNotif = (settings["${pName}NotificationsOn"] && (settings["${pName}NotifRecips"] || settings["${pName}NotifPhones"] || settings["${pName}UsePush"])) ? true : false def allowNotif = settings["${pName}NotificationsOn"] ? true : false def allowSpeech = allowNotif && settings?."${pName}AllowSpeechNotif" ? true : false def allowAlarm = allowNotif && settings?."${pName}AllowAlarmNotif" ? true : false @@ -1429,25 +1427,25 @@ def watchDogAlarmActions(dev, dni, actType) { } else {return} break } - if(getLastWatDogSafetyAlertDtSec(dni) > getWatDogRepeatMsgDelayVal()) { + if(getLastWatDogSafetyAlertDtSec("${dni?.key}") > getWatDogRepeatMsgDelayVal()) { LogAction("watchDogAlarmActions() | ${evtNotifMsg}", "warn", true) if(allowNotif) { - sendEventPushNotifications(evtNotifMsg, "Warning", pName) + sendEventPushNotifications(evtNotifMsg, "Warning", pName) // this uses parent and honors quiet times others do NOT if(allowSpeech) { sendEventVoiceNotifications(voiceNotifString(evtVoiceMsg, pName), pName, "nmWatDogEvt_${app?.id}", true, "nmWatDogEvt_${app?.id}") } if(allowAlarm) { scheduleAlarmOn(pName) } + atomicState?."lastWatDogSafetyAlertDt${dni?.key}" = getDtNow() } else { - sendNofificationMsg("Warning", evtNotifMsg) + //sendNofificationMsg(evtNotifMsg, "Warning", watchDogPrefix()) } - atomicState?."lastWatDogSafetyAlertDt${dni}" = getDtNow() } } -def getLastWatDogSafetyAlertDtSec(dni) { return !atomicState?."lastWatDogSafetyAlertDt{$dni}" ? 10000 : GetTimeDiffSeconds(atomicState?."lastWatDogSafetyAlertDt${dni}", null, "getLastWatDogSafetyAlertDtSec").toInteger() } +def getLastWatDogSafetyAlertDtSec(dni) { return !atomicState?."lastWatDogSafetyAlertDt${dni}" ? 10000 : GetTimeDiffSeconds(atomicState?."lastWatDogSafetyAlertDt${dni}", null, "getLastWatDogSafetyAlertDtSec").toInteger() } def getWatDogRepeatMsgDelayVal() { return !watDogRepeatMsgDelay ? 3600 : watDogRepeatMsgDelay.toInteger() } def isWatchdogConfigured() { @@ -1455,7 +1453,7 @@ def isWatchdogConfigured() { } /****************************************************************************** -| REMOTE DIAG AUTOMATION LOGIC CODE | +| REMOTE DIAG AUTOMATION LOGIC CODE | *******************************************************************************/ def remDiagPrefix() { return "remDiag" } @@ -1468,6 +1466,27 @@ def diagnosticsPage() { } } +def storagePrefix() { return "storage" } +def storagePage() { + def pName = storagePrefix() + dynamicPage(name: "storagePage", title: "NST Storage", uninstall: false, install: true) { + storageInfoSect() + } +} + +def storageInfoSect() { + section("Storage App Info:") { + def str = "" + str += "Version: V${appVersion()}" + str += "\nUsage: ${getStateSizePerc()}%" + paragraph str, state: "complete" + } +} + +def isStorageConfigured() { + return (atomicState?.automationType == "storage") ? true : false +} + def isDiagnosticsConfigured() { return (atomicState?.automationType == "remDiag") ? true : false } @@ -1476,11 +1495,41 @@ def isDiagnosticsConfigured() { /////////////////////THERMOSTAT AUTOMATION CODE LOGIC /////////////////////// /**************************************************************************** -| REMOTE SENSOR AUTOMATION CODE | +| REMOTE SENSOR AUTOMATION CODE | *****************************************************************************/ def remSenPrefix() { return "remSen" } +//ERS +def removeVstat(callerStr) { + def autoType = getAutoType() + if(autoType == "schMot") { + def mycallerStr = "${callerStr} removeVstat: Could" + def t0 = mycallerStr + def myID = getMyLockId() + if(!myID) { + setMyLockId(app.id) + myID = getMyLockId() + } + def toRemove = atomicState?.remSenTstat + if(schMotTstat && myID && parent && toRemove) { + + if(!parent?.addRemoveVthermostat(toRemove, false, myID)) { + t0 = "${mycallerStr} NOT" + } + LogAction("${t0} cleanup virtual thermostat", "debug", true) + atomicState.oldremSenTstat = atomicState?.remSenTstat + atomicState?.remSenTstat = null + + t0 = mycallerStr + if( !parent?.remSenUnlock(toRemove, myID) ) { // attempt unlock old ID + t0 = "${mycallerStr} NOT" + } + LogAction("${t0} Release remote sensor lock", "debug", true) + } + } +} + /* def remSenLock(val, myId) { def res = false @@ -1518,7 +1567,7 @@ def remSenDayCoolTempOk() { return (!remSenCoolTempsReq() || (remSenCoolTempsReq def isRemSenConfigured() { def devOk = (settings?.remSensorDay) ? true : false - return (devOk && settings?.remSenRuleType && remSenDayHeatTempOk() && remSenDayCoolTempOk() ) ? true : false + return (settings?.schMotRemoteSensor && devOk && settings?.remSenRuleType && remSenDayHeatTempOk() && remSenDayCoolTempOk() ) ? true : false } def getLastMotionActiveSec(mySched) { @@ -1609,7 +1658,7 @@ def getDeviceTempAvg(items) { if(!items) { return tempVal } else if(items?.size() > 1) { tmpAvg = items*.currentTemperature - if(tmpAvg && tmpAvg?.size() > 1) { tempVal = (tmpAvg?.sum().toDouble() / tmpAvg?.size().toDouble()).round(1) } // + if(tmpAvg && tmpAvg?.size() > 1) { tempVal = (tmpAvg?.sum().toDouble() / tmpAvg?.size().toDouble()).round(1) } } else { tempVal = getDeviceTemp(items) } return tempVal.toDouble() @@ -1618,14 +1667,15 @@ def getDeviceTempAvg(items) { def remSenShowTempsPage() { dynamicPage(name: "remSenShowTempsPage", uninstall: false) { if(settings?.remSensorDay) { + def t0 = "${tUnitStr()}" section("Default Sensor Temps: (Schedules can override)") { def cnt = 0 def rCnt = settings?.remSensorDay?.size() def str = "" - str += "Sensor Temp (average): (${getDeviceTempAvg(settings?.remSensorDay)}°${getTemperatureScale()})\n│" + str += "Sensor Temp (average): (${getDeviceTempAvg(settings?.remSensorDay)}${t0})\n│" settings?.remSensorDay?.each { t -> cnt = cnt+1 - str += "${(cnt >= 1) ? "${(cnt == rCnt) ? "\n└" : "\n├"}" : "\n└"} ${t?.label}: ${(t?.label?.toString()?.length() > 10) ? "\n${(rCnt == 1 || cnt == rCnt) ? " " : "│"}└ " : ""}(${getDeviceTemp(t)}°${getTemperatureScale()})" + str += "${(cnt >= 1) ? "${(cnt == rCnt) ? "\n└" : "\n├"}" : "\n└"} ${t?.label}: ${(t?.label?.toString()?.length() > 10) ? "\n${(rCnt == 1 || cnt == rCnt) ? " " : "│"}└ " : ""}(${getDeviceTemp(t)}${t0})" } paragraph "${str}", state: "complete", image: getAppImg("temperature_icon.png") } @@ -1638,7 +1688,7 @@ def remSendoSetCool(chgval, onTemp, offTemp) { def remSenTstatMir = settings?.schMotTstatMir try { - def hvacMode = remSenTstat ? remSenTstat?.currentThermostatMode.toString() : null + def hvacMode = remSenTstat ? remSenTstat?.currentThermostatMode?.toString() : null def curCoolSetpoint = getTstatSetpoint(remSenTstat, "cool") def curHeatSetpoint = getTstatSetpoint(remSenTstat, "heat") def tempChangeVal = !remSenTstatTempChgVal ? 5.0 : Math.min(Math.max(remSenTstatTempChgVal.toDouble(), 2.0), 5.0) @@ -1646,24 +1696,27 @@ def remSendoSetCool(chgval, onTemp, offTemp) { chgval = (chgval > (onTemp + maxTempChangeVal)) ? onTemp + maxTempChangeVal : chgval chgval = (chgval < (offTemp - maxTempChangeVal)) ? offTemp - maxTempChangeVal : chgval + + def t0 = "${tUnitStr()}" + if(chgval != curCoolSetpoint) { - scheduleAutomationEval(60) + scheduleAutomationEval(70) def cHeat = null if(hvacMode in ["auto"]) { if(curHeatSetpoint >= (offTemp-tempChangeVal)) { cHeat = offTemp - tempChangeVal - LogAction("Remote Sensor: HEAT - Adjusting HeatSetpoint to (${cHeat}°${getTemperatureScale()}) to allow COOL setting", "info", true) + LogAction("Remote Sensor: HEAT - Adjusting HeatSetpoint to (${cHeat}${t0}) to allow COOL setting", "info", true) if(remSenTstatMir) { remSenTstatMir*.setHeatingSetpoint(cHeat) } } } if(setTstatAutoTemps(remSenTstat, chgval, cHeat, "remSen")) { - //LogAction("Remote Sensor: COOL - Adjusting CoolSetpoint to (${chgval}°${getTemperatureScale()}) ", "info", true) - //storeLastAction("Adjusted Cool Setpoint to (${chgval}°${getTemperatureScale()}) Heat Setpoint to (${cHeat}°${getTemperatureScale()})", getDtNow(), "remSen") + //LogAction("Remote Sensor: COOL - Adjusting CoolSetpoint to (${chgval}${t0}) ", "info", true) + //storeLastAction("Adjusted Cool Setpoint to (${chgval}${t0}) Heat Setpoint to (${cHeat}${t0})", getDtNow(), "remSen") if(remSenTstatMir) { remSenTstatMir*.setCoolingSetpoint(chgval) } } return true // let all this take effect } else { - LogAction("Remote Sensor: COOL - CoolSetpoint is already (${chgval}°${getTemperatureScale()}) ", "info", true) + LogAction("Remote Sensor: COOL - CoolSetpoint is already (${chgval}${t0}) ", "info", true) } } catch (ex) { @@ -1678,7 +1731,7 @@ def remSendoSetHeat(chgval, onTemp, offTemp) { def remSenTstatMir = schMotTstatMir try { - def hvacMode = remSenTstat ? remSenTstat?.currentThermostatMode.toString() : null + def hvacMode = remSenTstat ? remSenTstat?.currentThermostatMode?.toString() : null def curCoolSetpoint = getTstatSetpoint(remSenTstat, "cool") def curHeatSetpoint = getTstatSetpoint(remSenTstat, "heat") def tempChangeVal = !remSenTstatTempChgVal ? 5.0 : Math.min(Math.max(remSenTstatTempChgVal.toDouble(), 2.0), 5.0) @@ -1686,24 +1739,27 @@ def remSendoSetHeat(chgval, onTemp, offTemp) { chgval = (chgval < (onTemp - maxTempChangeVal)) ? onTemp - maxTempChangeVal : chgval chgval = (chgval > (offTemp + maxTempChangeVal)) ? offTemp + maxTempChangeVal : chgval + + def t0 = "${tUnitStr()}" + if(chgval != curHeatSetpoint) { - scheduleAutomationEval(60) + scheduleAutomationEval(70) def cCool = null if(hvacMode in ["auto"]) { if(curCoolSetpoint <= (offTemp+tempChangeVal)) { cCool = offTemp + tempChangeVal - LogAction("Remote Sensor: COOL - Adjusting CoolSetpoint to (${cCool}°${getTemperatureScale()}) to allow HEAT setting", "info", true) + LogAction("Remote Sensor: COOL - Adjusting CoolSetpoint to (${cCool}${t0}) to allow HEAT setting", "info", true) if(remSenTstatMir) { remSenTstatMir*.setCoolingSetpoint(cCool) } } } if(setTstatAutoTemps(remSenTstat, cCool, chgval, "remSen")) { - //LogAction("Remote Sensor: HEAT - Adjusting HeatSetpoint to (${chgval}°${getTemperatureScale()})", "info", true) - //storeLastAction("Adjusted Heat Setpoint to (${chgval}°${getTemperatureScale()}) Cool Setpoint to (${cCool}°${getTemperatureScale()})", getDtNow(), "remSen") + //LogAction("Remote Sensor: HEAT - Adjusting HeatSetpoint to (${chgval}${t0})", "info", true) + //storeLastAction("Adjusted Heat Setpoint to (${chgval}${t0}) Cool Setpoint to (${cCool}${t0})", getDtNow(), "remSen") if(remSenTstatMir) { remSenTstatMir*.setHeatingSetpoint(chgval) } } return true // let all this take effect } else { - LogAction("Remote Sensor: HEAT - HeatSetpoint is already (${chgval}°${getTemperatureScale()})", "info", true) + LogAction("Remote Sensor: HEAT - HeatSetpoint is already (${chgval}${t0})", "info", true) } } catch (ex) { @@ -1740,7 +1796,8 @@ private remSenCheck() { } else { //log.info "remSenCheck: Evaluating Event" - def hvacMode = remSenTstat ? remSenTstat?.currentnestThermostatMode.toString() : null + def tempScaleStr = "${tUnitStr()}" + def hvacMode = remSenTstat ? remSenTstat?.currentnestThermostatMode?.toString() : null if(hvacMode in [ "off", "eco"] ) { LogAction("Remote Sensor: Skipping Evaluation; The Current Thermostat Mode is '${strCapitalize(hvacMode)}'", "info", true) disableOverrideTemps() @@ -1765,7 +1822,7 @@ private remSenCheck() { def tempChangeVal = !remSenTstatTempChgVal ? 5.0 : Math.min(Math.max(remSenTstatTempChgVal.toDouble(), 2.0), 5.0) def maxTempChangeVal = tempChangeVal * 3 def curTstatTemp = getDeviceTemp(remSenTstat).toDouble() - def curSenTemp = (settings?.remSensorDay) ? getRemoteSenTemp().toDouble() : null + def curSenTemp = getRemoteSenTemp().toDouble() def curTstatOperState = remSenTstat?.currentThermostatOperatingState.toString() def curTstatFanMode = remSenTstat?.currentThermostatFanMode.toString() @@ -1872,7 +1929,7 @@ private remSenCheck() { } def coolDiff1 = Math.abs(curTstatTemp - curCoolSetpoint) LogAction("Remote Sensor: COOL - coolDiff1: ${coolDiff1} tempChangeVal: ${tempChangeVal}", "trace", false) - if(coolDiff1 < (tempChangeVal / 2)) { // + if(coolDiff1 < (tempChangeVal / 2)) { chg = true LogAction("Remote Sensor: COOL - Adjusting CoolSetpoint to maintain state", "info", true) } @@ -1884,7 +1941,7 @@ private remSenCheck() { } } else { - LogAction("Remote Sensor: NO CHANGE TO COOL - CoolSetpoint is (${curCoolSetpoint}°${getTemperatureScale()}) ", "info", false) + LogAction("Remote Sensor: NO CHANGE TO COOL - CoolSetpoint is (${curCoolSetpoint}${tempScaleStr}) ", "info", false) } } } @@ -1943,7 +2000,7 @@ private remSenCheck() { return // let all this take effect } } else { - LogAction("Remote Sensor: NO CHANGE TO HEAT - HeatSetpoint is already (${curHeatSetpoint}°${getTemperatureScale()})", "info", false) + LogAction("Remote Sensor: NO CHANGE TO HEAT - HeatSetpoint is already (${curHeatSetpoint}${tempScaleStr})", "info", false) } } } @@ -1975,17 +2032,19 @@ def getRemSenTempsToList() { } if(!sensors) { sensors = settings?.remSensorDay } if(sensors?.size() >= 1) { + def t0 = "${tUnitStr()}" def info = [] sensors?.sort().each { - info.push("${it?.displayName}": " ${it?.currentTemperature.toString()}°${getTemperatureScale()}") + info.push("${it?.displayName}": " ${it?.currentTemperature.toString()}${t0}") } return info } } def getDeviceTemp(dev) { - def temp = dev?.currentValue("temperature") ? dev?.currentValue("temperature").toString()?.replaceAll("\\[|\\]", "") : 0 - return temp && "$temp"?.isNumber() ? temp?.toDouble() : 0 + def t0 = dev?.currentValue("temperature") + def temp = t0 ? t0?.toString()?.replaceAll("\\[|\\]", "") : 0 + return temp && "$temp"?.isNumber() ? temp?.toDouble() : 0 } def getTstatSetpoint(tstat, type) { @@ -2019,8 +2078,8 @@ def getRemoteSenThreshold() { def getRemoteSenTemp() { def mySched = getCurrentSchedule() - if(!atomicState.remoteTempSourceStr) { atomicState.remoteTempSourceStr = null } - if(!atomicState.currentSchedNum) { atomicState.currentSchedNum = null } + if(atomicState?.remoteTempSourceStr != null) { atomicState.remoteTempSourceStr = null } + if(atomicState?.currentSchedNum != null) { atomicState.currentSchedNum = null } def sens if(mySched) { def sLbl = "schMot_${mySched}_" @@ -2031,12 +2090,11 @@ def getRemoteSenTemp() { return getDeviceTempAvg(sens).toDouble() } } - if(settings?.remSensorDay) { + if(isRemSenConfigured()) { atomicState.remoteTempSourceStr = "Remote Sensor" atomicState.currentSchedNum = null return getDeviceTempAvg(settings?.remSensorDay).toDouble() - } - else { + } else { atomicState.remoteTempSourceStr = "Thermostat" atomicState.currentSchedNum = null return getDeviceTemp(schMotTstat).toDouble() @@ -2048,16 +2106,16 @@ def getRemoteSenTemp() { } } -def fixTempSetting(Double temp) { - def newtemp = temp +def fixTempSetting(temp) { + Double newtemp = temp?.toDouble() if(temp != null) { if(getTemperatureScale() == "C") { if(temp > 35) { // setting was done in F - newtemp = roundTemp( ((newtemp - 32.0) * (5 / 9)) as Double) // + newtemp = roundTemp( ((newtemp - 32.0) * (5 / 9)) as Double) } } else if(getTemperatureScale() == "F") { if(temp < 40) { // setting was done in C - newtemp = roundTemp( (((newtemp * (9 / 5)) as Double) + 32.0) ).toInteger() // + newtemp = roundTemp( (((newtemp * (9 / 5)) as Double) + 32.0) ).toInteger() } } } @@ -2069,17 +2127,19 @@ def setRemoteSenTstat(val) { atomicState.remSenTstat = val } -def getRemSenCoolSetTemp(curMode=null, useCurrent=true) { - def coolTemp +def getRemSenCoolSetTemp(curMode=null, isEco=false, useCurrent=true) { + Double coolTemp def theMode = curMode != null ? curMode : null if(theMode == null) { def tstat = schMotTstat theMode = tstat ? tstat?.currentnestThermostatMode.toString() : null } + atomicState.remoteCoolSetSourceStr = "" if(theMode != "eco") { if(getLastOverrideCoolSec() < (3600 * 4)) { if(atomicState?.coolOverride != null) { coolTemp = fixTempSetting(atomicState?.coolOverride.toDouble()) + atomicState.remoteCoolSetSourceStr = "Remote Sensor Override" } } else { atomicState?.coolOverride = null } @@ -2089,38 +2149,62 @@ def getRemSenCoolSetTemp(curMode=null, useCurrent=true) { def useMotion = atomicState?."motion${mySched}UseMotionSettings" def hvacSettings = atomicState?."sched${mySched}restrictions" coolTemp = !useMotion ? hvacSettings?.ctemp : hvacSettings?.mctemp ?: hvacSettings?.ctemp + atomicState.remoteCoolSetSourceStr = "Schedule" } - if(coolTemp == null && remSenDayCoolTemp) { - coolTemp = remSenDayCoolTemp.toDouble() - } +// ERS if Remsensor is enabled + if(isRemSenConfigured()) { + if(theMode == "cool" && coolTemp == null /* && isEco */) { + if(atomicState?.extTmpLastDesiredTemp) { + coolTemp = atomicState?.extTmpLastDesiredTemp.toDouble() + atomicState.remoteCoolSetSourceStr = "Last Desired Temp" + } + } + if(theMode == "auto" && coolTemp == null /* && isEco */) { + if(atomicState?.extTmpLastDesiredCTemp) { + coolTemp = atomicState?.extTmpLastDesiredCTemp.toDouble() + atomicState.remoteCoolSetSourceStr = "Last Desired CTemp" + } + } - if(coolTemp == null) { - def desiredCoolTemp = getGlobalDesiredCoolTemp() - if(desiredCoolTemp) { coolTemp = desiredCoolTemp.toDouble() } - } + if(coolTemp == null && remSenDayCoolTemp) { + coolTemp = remSenDayCoolTemp.toDouble() + atomicState.remoteCoolSetSourceStr = "RemSen Day Cool Temp" + } - if(coolTemp) { - coolTemp = fixTempSetting(coolTemp) + if(coolTemp == null) { + def desiredCoolTemp = getGlobalDesiredCoolTemp() + if(desiredCoolTemp) { + coolTemp = desiredCoolTemp.toDouble() + atomicState.remoteCoolSetSourceStr = "Global Desired Cool Temp" + } + } + + if(coolTemp) { + coolTemp = fixTempSetting(coolTemp) + } } } } if(coolTemp == null && useCurrent) { coolTemp = schMotTstat ? getTstatSetpoint(schMotTstat, "cool") : coolTemp + atomicState.remoteCoolSetSourceStr = "Thermostat" } return coolTemp } -def getRemSenHeatSetTemp(curMode=null, useCurrent=true) { - def heatTemp +def getRemSenHeatSetTemp(curMode=null, isEco=false, useCurrent=true) { + Double heatTemp def theMode = curMode != null ? curMode : null if(theMode == null) { def tstat = schMotTstat theMode = tstat ? tstat?.currentnestThermostatMode.toString() : null } + atomicState.remoteHeatSetSourceStr = "" if(theMode != "eco") { if(getLastOverrideHeatSec() < (3600 * 4)) { if(atomicState?.heatOverride != null) { heatTemp = fixTempSetting(atomicState.heatOverride.toDouble()) + atomicState.remoteHeatSetSourceStr = "Remote Sensor Override" } } else { atomicState?.heatOverride = null } @@ -2130,24 +2214,46 @@ def getRemSenHeatSetTemp(curMode=null, useCurrent=true) { def useMotion = atomicState?."motion${mySched}UseMotionSettings" def hvacSettings = atomicState?."sched${mySched}restrictions" heatTemp = !useMotion ? hvacSettings?.htemp : hvacSettings?.mhtemp ?: hvacSettings?.htemp + atomicState.remoteHeatSetSourceStr = "Schedule" } - if(heatTemp == null && remSenDayHeatTemp) { - heatTemp = remSenDayHeatTemp.toDouble() - } +// ERS if Remsensor is enabled + if(isRemSenConfigured()) { + if(theMode == "heat" && heatTemp == null /* && isEco */) { + if(atomicState?.extTmpLastDesiredTemp) { + heatTemp = atomicState?.extTmpLastDesiredTemp.toDouble() + atomicState.remoteHeatSetSourceStr = "Last Desired Temp" + } + } + if(theMode == "auto" && heatTemp == null /* && isEco */) { + if(atomicState?.extTmpLastDesiredHTemp) { + heatTemp = atomicState?.extTmpLastDesiredHTemp.toDouble() + atomicState.remoteHeatSetSourceStr = "Last Desired HTemp" + } + } - if(heatTemp == null) { - def desiredHeatTemp = getGlobalDesiredHeatTemp() - if(desiredHeatTemp) { heatTemp = desiredHeatTemp.toDouble() } - } + if(heatTemp == null && remSenDayHeatTemp) { + heatTemp = remSenDayHeatTemp.toDouble() + atomicState.remoteHeatSetSourceStr = "RemSen Day Heat Temp" + } + + if(heatTemp == null) { + def desiredHeatTemp = getGlobalDesiredHeatTemp() + if(desiredHeatTemp) { + heatTemp = desiredHeatTemp.toDouble() + atomicState.remoteHeatSetSourceStr = "Global Desired Heat Temp" + } + } - if(heatTemp) { - heatTemp = fixTempSetting(heatTemp) + if(heatTemp) { + heatTemp = fixTempSetting(heatTemp) + } } } } if(heatTemp == null && useCurrent) { heatTemp = schMotTstat ? getTstatSetpoint(schMotTstat, "heat") : heatTemp + atomicState.remoteHeatSetSourceStr = "Thermostat" } return heatTemp } @@ -2236,7 +2342,7 @@ def remSenRuleEnum(type=null) { } /************************************************************************ -| FAN CONTROL AUTOMATION CODE | +| FAN CONTROL AUTOMATION CODE | *************************************************************************/ def fanCtrlPrefix() { return "fanCtrl" } @@ -2253,10 +2359,6 @@ def isFanCircConfigured() { return (settings?.schMotOperateFan && settings?.schMotCirculateTstatFan && settings?.schMotFanRuleType) ? true : false } -def getTempScaleStr() { - return "°${getTemperatureScale()}" -} - def getFanSwitchDesc(showOpt = true) { def swDesc = "" def swCnt = 0 @@ -2282,7 +2384,7 @@ def getFanSwitchDesc(showOpt = true) { swDesc += (settings?.schMotCirculateTstatFan) ? "\n • Fan Circulation Enabled" : "" swDesc += (settings?.schMotCirculateTstatFan) ? "\n • Fan Circulation Rule:\n └(${getEnumValue(remSenRuleEnum("fan"), settings?.schMotFanRuleType)})" : "" - swDesc += (settings?.schMotCirculateTstatFan && settings?.fanCtrlTempDiffDegrees) ? ("\n • Threshold: (${settings?.fanCtrlTempDiffDegrees}${getTempScaleStr()})") : "" + swDesc += (settings?.schMotCirculateTstatFan && settings?.fanCtrlTempDiffDegrees) ? ("\n • Threshold: (${settings?.fanCtrlTempDiffDegrees}${tUnitStr()})") : "" swDesc += (settings?.schMotCirculateTstatFan && settings?.fanCtrlOnTime) ? ("\n • Circulate Time: (${getEnumValue(fanTimeSecEnum(), settings?.fanCtrlOnTime)})") : "" swDesc += (settings?.schMotCirculateTstatFan && settings?.fanCtrlTimeBetweenRuns) ? ("\n • Time Between Cycles:\n └ (${getEnumValue(longTimeSecEnum(), settings?.fanCtrlTimeBetweenRuns)})") : "" @@ -2315,10 +2417,33 @@ def fanCtrlCheck() { def execTime = now() //atomicState?.lastEvalDt = getDtNow() - def reqHeatSetPoint = getRemSenHeatSetTemp() - reqHeatSetPoint = reqHeatSetPoint ?: 0 + def curMode = schMotTstat ? schMotTstat?.currentnestThermostatMode?.toString() : null + def modeEco = (curMode in ["eco"]) ? true : false - def reqCoolSetPoint = getRemSenCoolSetTemp() + def reqHeatSetPoint + def reqCoolSetPoint + if(!modeEco) { + reqHeatSetPoint = getRemSenHeatSetTemp(curMode) + reqCoolSetPoint = getRemSenCoolSetTemp(curMode) + } + + def lastMode = schMotTstat ? schMotTstat?.currentpreviousthermostatMode?.toString() : null + if(!lastMode && modeEco && isRemSenConfigured()) { + if( /* !lastMode && */ atomicState?.extTmpTstatOffRequested && atomicState?.extTmplastMode) { + lastMode = atomicState?.extTmplastMode + } + } + if(lastMode) { + if(!reqHeatSetpoint) { reqHeatSetPoint = getRemSenHeatSetTemp(lastMode, modeEco, false) } + if(!reqCoolSetpoint) { reqCoolSetPoint = getRemSenCoolSetTemp(lastMode, modeEco, false) } + if(isRemSenConfigured()) { + if(!reqHeatSetPoint) { reqHeatSetPoint = atomicState?.extTmpLastDesiredHTemp } + if(!reqCoolSetPoint) { reqCoolSetPoint = atomicState?.extTmpLastDesiredCTemp } + } + LogAction("fanCtrlCheck: Using lastMode: ${lastMode} | extTmpTstatOffRequested: ${atomicState?.extTmpTstatOffRequested} | curMode: ${curMode}", "debug", true) + } + + reqHeatSetPoint = reqHeatSetPoint ?: 0 reqCoolSetPoint = reqCoolSetPoint ?: 0 def curTstatTemp = getRemoteSenTemp().toDouble() @@ -2327,13 +2452,13 @@ def fanCtrlCheck() { def curSetPoint = t0 ? t0.toDouble() : 0 def tempDiff = Math.abs(curSetPoint - curTstatTemp) - LogAction("fanCtrlCheck: Desired Temps - Heat: ${reqHeatSetPoint} | Cool: ${reqCoolSetPoint}", "info", false) - LogAction("fanCtrlCheck: Current Thermostat Sensor Temp: ${curTstatTemp} Temp Difference: (${tempDiff})", "info", false) + LogAction("fanCtrlCheck: Desired Temps - Heat: ${reqHeatSetPoint} | Cool: ${reqCoolSetPoint}", "info", true) + LogAction("fanCtrlCheck: Current Thermostat Sensor Temp: ${curTstatTemp} Temp Difference: (${tempDiff})", "info", true) if(isFanCircConfigured()) { def adjust = (getTemperatureScale() == "C") ? 0.5 : 1.0 def threshold = !fanCtrlTempDiffDegrees ? adjust : fanCtrlTempDiffDegrees.toDouble() - def hvacMode = schMotTstat ? schMotTstat?.currentnestThermostatMode.toString() : null + def hvacMode = curMode /* def curTstatFanMode = schMotTstat?.currentThermostatFanMode.toString() def fanOn = (curTstatFanMode == "on" || curTstatFanMode == "circulate") ? true : false @@ -2485,26 +2610,27 @@ def doFanOperation(tempDiff, curTstatTemp, curHeatSetpoint, curCoolSetpoint) { } } if(swOn && atomicState?.haveRunFan && checkFanSpeedSupport(sw)) { - def speed = sw?.currentValue("currentState") ?: null + def t0 = sw?.currentValue("currentState") + def speed = t0 ?: null if(settings?."${pName}FanSwitchSpeedCtrl" && settings?."${pName}FanSwitchHighSpeed" && settings?."${pName}FanSwitchMedSpeed" && settings?."${pName}FanSwitchLowSpeed") { if(tempDiff < settings?."${pName}FanSwitchMedSpeed".toDouble()) { if(speed != "LOW") { sw.lowSpeed() - LogAction("doFanOperation: Temp Difference (${tempDiff}°${getTemperatureScale()}) is BELOW the Medium Speed Threshold of (${settings?."${pName}FanSwitchMedSpeed"}) | Turning '${sw}' Fan Switch on (LOW SPEED)", "info", true) + LogAction("doFanOperation: Temp Difference (${tempDiff}${tUnitStr()}) is BELOW the Medium Speed Threshold of (${settings?."${pName}FanSwitchMedSpeed"}) | Turning '${sw}' Fan Switch on (LOW SPEED)", "info", true) storeLastAction("Set Fan $sw to Low Speed", getDtNow(), pName) } } else if(tempDiff >= settings?."${pName}FanSwitchMedSpeed".toDouble() && tempDiff < settings?."${pName}FanSwitchHighSpeed".toDouble()) { if(speed != "MED") { sw.medSpeed() - LogAction("doFanOperation: Temp Difference (${tempDiff}°${getTemperatureScale()}) is ABOVE the Medium Speed Threshold of (${settings?."${pName}FanSwitchMedSpeed"}) | Turning '${sw}' Fan Switch on (MEDIUM SPEED)", "info", true) + LogAction("doFanOperation: Temp Difference (${tempDiff}${tUnitStr()}) is ABOVE the Medium Speed Threshold of (${settings?."${pName}FanSwitchMedSpeed"}) | Turning '${sw}' Fan Switch on (MEDIUM SPEED)", "info", true) storeLastAction("Set Fan $sw to Medium Speed", getDtNow(), pName) } } else if(tempDiff >= settings?."${pName}FanSwitchHighSpeed".toDouble()) { if(speed != "HIGH") { sw.highSpeed() - LogAction("doFanOperation: Temp Difference (${tempDiff}°${getTemperatureScale()}) is ABOVE the High Speed Threshold of (${settings?."${pName}FanSwitchHighSpeed"}) | Turning '${sw}' Fan Switch on (HIGH SPEED)", "info", true) + LogAction("doFanOperation: Temp Difference (${tempDiff}${tUnitStr()}) is ABOVE the High Speed Threshold of (${settings?."${pName}FanSwitchHighSpeed"}) | Turning '${sw}' Fan Switch on (HIGH SPEED)", "info", true) storeLastAction("Set Fan $sw to High Speed", getDtNow(), pName) } } @@ -2550,7 +2676,7 @@ def circulateFanControl(operType, Double curSenTemp, Double reqSetpointTemp, Dou def fanOn = (curTstatFanMode == "on" || curTstatFanMode == "circulate") ? true : false def returnToAuto = can_Circ ? false : true - if(hvacMode in ["off", "eco"]) { returnToAuto = true } + if(hvacMode in ["off", "eco"]) { returnToAuto = true } // This overrides ECO... // Track approximate fan on / off times if( !fanOn && atomicState?.lastfanCtrlRunDt > atomicState?.lastfanCtrlFanOffDt ) { @@ -2641,6 +2767,7 @@ def circulateFanControl(operType, Double curSenTemp, Double reqSetpointTemp, Dou def getCirculateFanTempOk(Double senTemp, Double reqsetTemp, Double threshold, Boolean fanOn, operType) { def turnOn = false + def tempScaleStr = "${tUnitStr()}" /* def adjust = (getTemperatureScale() == "C") ? 0.5 : 1.0 if(threshold > (adjust * 2.0)) { @@ -2652,11 +2779,11 @@ def getCirculateFanTempOk(Double senTemp, Double reqsetTemp, Double threshold, B return false } - LogAction(" ├ adjust: ${adjust}}°${getTemperatureScale()}", "debug", false) + LogAction(" ├ adjust: ${adjust}}${tUnitStr()}", "debug", false) */ - LogAction(" ├ operType: (${strCapitalize(operType)}) | Temp Threshold: ${threshold}°${getTemperatureScale()} | FanAlreadyOn: (${strCapitalize(fanOn)})", "debug", false) - LogAction(" ├ Sensor Temp: ${senTemp}°${getTemperatureScale()} | Requested Setpoint Temp: ${reqsetTemp}°${getTemperatureScale()}", "debug", false) + LogAction(" ├ operType: (${strCapitalize(operType)}) | Temp Threshold: ${threshold}${tempScaleStr} | FanAlreadyOn: (${strCapitalize(fanOn)})", "debug", false) + LogAction(" ├ Sensor Temp: ${senTemp}${tempScaleStr} | Requested Setpoint Temp: ${reqsetTemp}${tempScaleStr}", "debug", false) if(!reqsetTemp) { LogAction("getCirculateFanTempOk: Bad reqsetTemp ${reqsetTemp}", "warn", false) @@ -2680,8 +2807,8 @@ def getCirculateFanTempOk(Double senTemp, Double reqsetTemp, Double threshold, B // if((senTemp < offtemp) && (senTemp >= (ontemp + adjust))) { turnOn = true } } -// LogAction(" ├ onTemp: ${ontemp} | offTemp: ${offtemp}}°${getTemperatureScale()}", "debug", false) - LogAction(" ├ offTemp: ${offtemp}°${getTemperatureScale()} | Temp Threshold: ${threshold}°${getTemperatureScale()}", "debug", false) +// LogAction(" ├ onTemp: ${ontemp} | offTemp: ${offtemp}}${tempScaleStr}", "debug", false) + LogAction(" ├ offTemp: ${offtemp}${tempScaleStr} | Temp Threshold: ${threshold}${tempScaleStr}", "debug", false) LogAction(" ┌ Final Result: (${strCapitalize(turnOn)})", "debug", false) // LogAction("getCirculateFanTempOk: ", "debug", false) @@ -2711,12 +2838,12 @@ def getCirculateFanTempOk(Double senTemp, Double reqsetTemp, Double threshold, B /******************************************************************************** -| HUMIDITY CONTROL AUTOMATION CODE | +| HUMIDITY CONTROL AUTOMATION CODE | *********************************************************************************/ def humCtrlPrefix() { return "humCtrl" } def isHumCtrlConfigured() { - return ((settings?.humCtrlUseWeather || settings?.humCtrlTempSensor) && settings?.humCtrlHumidity && settings?.humCtrlSwitches) ? true : false + return (settings?.schMotHumidityControl && (settings?.humCtrlUseWeather || settings?.humCtrlTempSensor) && settings?.humCtrlHumidity && settings?.humCtrlSwitches) ? true : false } def getDeviceVarAvg(items, var) { @@ -2725,7 +2852,7 @@ def getDeviceVarAvg(items, var) { if(!items) { return tempVal } else { tmpAvg = items*."${var}" - if(tmpAvg && tmpAvg?.size() > 0) { tempVal = (tmpAvg?.sum().toDouble() / tmpAvg?.size().toDouble()).round(1) } // + if(tmpAvg && tmpAvg?.size() > 0) { tempVal = (tmpAvg?.sum().toDouble() / tmpAvg?.size().toDouble()).round(1) } } return tempVal.toDouble() } @@ -2761,7 +2888,8 @@ def humCtrlHumidityDesc() { str += "Sensor Humidity (average): (${getDeviceVarAvg(settings.humCtrlHumidity, "currentHumidity")}%)" settings?.humCtrlHumidity?.sort { it?.displayName }?.each { dev -> cnt = cnt+1 - def val = strCapitalize(dev?.currentHumidity) ?: "Not Set" + def t0 = strCapitalize(dev?.currentHumidity) + def val = t0 ?: "Not Set" str += "${(cnt >= 1) ? "${(cnt == cCnt) ? "\n└" : "\n├"}" : "\n└"} ${dev?.label}: ${(dev?.label?.toString()?.length() > 10) ? "\n${(cCnt == 1 || cnt == cCnt) ? " " : "│"}└ " : ""}(${val}%)" } return str @@ -2914,14 +3042,16 @@ def humCtrlCheck() { /******************************************************************************** -| EXTERNAL TEMP AUTOMATION CODE | +| EXTERNAL TEMP AUTOMATION CODE | *********************************************************************************/ def extTmpPrefix() { return "extTmp" } def isExtTmpConfigured() { - return ((settings?.extTmpUseWeather || settings?.extTmpTempSensor) && settings?.extTmpDiffVal) ? true : false + return (settings?.schMotExternalTempOff && (settings?.extTmpUseWeather || settings?.extTmpTempSensor) && settings?.extTmpDiffVal) ? true : false } +def getLastextConditionsEvalSec() { return !atomicState?.lastgetExtCond ? 100000 : GetTimeDiffSeconds(atomicState?.lastgetExtCond, null, "getLastextConditionsEvalSec").toInteger() } + def getExtConditions( doEvent = false ) { LogTrace("getExtConditions") if(atomicState?.weatherDeviceInst == null) { @@ -2931,34 +3061,39 @@ def getExtConditions( doEvent = false ) { } //log.debug "set weatherDeviceInst to ${atomicState?.weatherDeviceInst}" } - if(atomicState?.needWeathUpd && atomicState?.weatherDeviceInst) { + if(atomicState?.needWeathUpd && atomicState?.weatherDeviceInst && getLastextConditionsEvalSec() > 15) { try { + atomicState?.lastgetExtCond = getDtNow() def cur = parent?.getWData() def weather = parent.getWeatherDevice() - if(cur && weather && cur?.current_observation) { - atomicState?.curWeather = cur?.current_observation - atomicState?.curWeatherTemp_f = Math.round(cur?.current_observation?.temp_f) as Integer - atomicState?.curWeatherTemp_c = Math.round(cur?.current_observation?.temp_c.toDouble()) - atomicState?.curWeatherLoc = cur?.current_observation?.display_location?.full.toString() // This is not available as attribute in dth - //atomicState?.curWeatherHum = cur?.current_observation?.relative_humidity?.toString().replaceAll("\\%", "") + if(cur && weather /* && cur?.current_observation */) { + atomicState?.curWeather = cur + atomicState?.curWeatherTemp_f = getTemperatureScale() == "C" ? Math.round(cur?.temperature * 9/5 + 32) : Math.round(cur?.temperature) as Integer + atomicState?.curWeatherTemp_c = getTemperatureScale() == "C" ? Math.round(cur?.temperature.toDouble()) : Math.round( ((cur?.temperature - 32) * 5/9) as Double) + + def curLoc = parent?.getWLocation() + atomicState?.curWeatherLoc = curLoc?.location?.city + curLoc?.location?.adminDistrict // This is not available as attribute in dth + //atomicState?.curWeatherHum = cur?.relativeHumidity def dp = 0.0 if(weather) { // Dewpoint is calculated in dth - dp = weather?.currentValue("dewpoint")?.toString().replaceAll("\\[|\\]", "").toDouble() + def t0 = weather?.currentValue("dewpoint") + dp = t0 ? t0?.toString()?.replaceAll("\\[|\\]", "")?.toDouble() : 0.0 } def c_temp = 0.0 def f_temp = 0 as Integer if(getTemperatureScale() == "C") { c_temp = dp as Double - f_temp = ((c_temp * (9 / 5)) + 32) as Integer // + f_temp = ((c_temp * (9 / 5)) + 32) as Integer } else { f_temp = dp as Integer - c_temp = ((f_temp - 32) * (5 / 9)) as Double // + c_temp = ((f_temp - 32) * (5 / 9)) as Double } - atomicState?.curWeatherDewpointTemp_c = Math.round(c_temp.round(1) * 2) / 2.0f // + atomicState?.curWeatherDewpointTemp_c = Math.round(c_temp.round(1) * 2) / 2.0f atomicState?.curWeatherDewpointTemp_f = Math.round(f_temp) as Integer + atomicState?.lastgetExtCond = getDtNow() atomicState.needWeathUpd = false } } catch (ex) { @@ -2993,7 +3128,7 @@ def getExtTmpDewPoint() { def getDesiredTemp() { def extTmpTstat = settings?.schMotTstat - def curMode = extTmpTstat.currentnestThermostatMode.toString() + def curMode = extTmpTstat ? extTmpTstat?.currentnestThermostatMode?.toString() : null def modeOff = (curMode in ["off"]) ? true : false def modeEco = (curMode in ["eco"]) ? true : false def modeCool = (curMode == "cool") ? true : false @@ -3009,8 +3144,10 @@ def getDesiredTemp() { //atomicState?.extTmpLastDesiredTemp } if(lastMode) { - desiredHeatTemp = getRemSenHeatSetTemp(lastMode, false) - desiredCoolTemp = getRemSenCoolSetTemp(lastMode, false) + desiredHeatTemp = getRemSenHeatSetTemp(lastMode, modeEco, false) + desiredCoolTemp = getRemSenCoolSetTemp(lastMode, modeEco, false) + if(!desiredHeatTemp) { desiredHeatTemp = atomicState?.extTmpLastDesiredHTemp } + if(!desiredCoolTemp) { desiredCoolTemp = atomicState?.extTmpLastDesiredCTemp } LogAction("getDesiredTemp: Using lastMode: ${lastMode} | extTmpTstatOffRequested: ${atomicState?.extTmpTstatOffRequested} | curMode: ${curMode}", "debug", false) modeOff = (lastMode in ["off"]) ? true : false modeCool = (lastMode == "cool") ? true : false @@ -3024,7 +3161,7 @@ def getDesiredTemp() { if(desiredHeatTemp && modeHeat) { desiredTemp = desiredHeatTemp } else if(desiredCoolTemp && modeCool) { desiredTemp = desiredCoolTemp } else if(desiredHeatTemp && desiredCoolTemp && (desiredHeatTemp < desiredCoolTemp) && modeAuto ) { - desiredTemp = (desiredCoolTemp + desiredHeatTemp) / 2.0 // + desiredTemp = (desiredCoolTemp + desiredHeatTemp) / 2.0 } //else if(desiredHeatTemp && modeEco) { desiredTemp = desiredHeatTemp } //else if(desiredCoolTemp && modeEco) { desiredTemp = desiredCoolTemp } @@ -3051,7 +3188,7 @@ def extTmpTempOk(disp=false, last=false) { def curDp = getExtTmpDewPoint() def diffThresh = Math.abs(getExtTmpTempDiffVal()) - def curMode = extTmpTstat.currentnestThermostatMode.toString() + def curMode = extTmpTstat ? extTmpTstat?.currentnestThermostatMode?.toString() : null def modeOff = (curMode == "off") ? true : false def modeCool = (curMode == "cool") ? true : false def modeHeat = (curMode == "heat") ? true : false @@ -3064,7 +3201,8 @@ def extTmpTempOk(disp=false, last=false) { LogAction("extTmpTempOk: Inside Temp: ${intTemp} | curMode: ${curMode} | modeOff: ${modeOff} | modeEco: ${modeEco} | modeAuto: ${modeAuto} || extTmpTstatOffRequested: ${atomicState?.extTmpTstatOffRequested}", "debug", false) def retval = true - def tempOk = true + def externalTempOk = true + def internalTempOk = true def dpOk = (curDp < dpLimit || !canCool) ? true : false if(!dpOk) { retval = false } @@ -3085,17 +3223,22 @@ def extTmpTempOk(disp=false, last=false) { if(!getSafetyTempsOk(extTmpTstat)) { retval = false - tempOk = false + externalTempOk = false str = "within safety Temperatures " LogAction("extTmpTempOk: Safety Temps not OK", "warn", true) } + if(modeOff) { + retval = false + } + def desiredHeatTemp def desiredCoolTemp if(modeAuto && retval) { desiredHeatTemp = getRemSenHeatSetTemp(curMode) desiredCoolTemp = getRemSenCoolSetTemp(curMode) } + def lastMode = extTmpTstat?.currentpreviousthermostatMode?.toString() if(curMode == "eco") { if(!lastMode && atomicState?.extTmpTstatOffRequested && atomicState?.extTmplastMode) { @@ -3104,8 +3247,8 @@ def extTmpTempOk(disp=false, last=false) { } if(lastMode) { LogAction("extTmpTempOk: Resetting mode curMode: ${curMode} | to previous mode lastMode: ${lastMode} | extTmpTstatOffRequested: ${atomicState?.extTmpTstatOffRequested}", "debug", false) - desiredHeatTemp = getRemSenHeatSetTemp(lastMode, false) - desiredCoolTemp = getRemSenCoolSetTemp(lastMode, false) + desiredHeatTemp = getRemSenHeatSetTemp(lastMode, modeEco, false) + desiredCoolTemp = getRemSenCoolSetTemp(lastMode, modeEco, false) if(!desiredHeatTemp) { desiredHeatTemp = atomicState?.extTmpLastDesiredHTemp } if(!desiredCoolTemp) { desiredCoolTemp = atomicState?.extTmpLastDesiredCTemp } //modeOff = (lastMode == "off") ? true : false @@ -3119,9 +3262,10 @@ def extTmpTempOk(disp=false, last=false) { if(modeAuto && retval && desiredHeatTemp && desiredCoolTemp) { if( !(extTemp >= (desiredHeatTemp+diffThresh) && extTemp <= (desiredCoolTemp-diffThresh)) ) { retval = false - tempOk = false + externalTempOk = false str = "within range (${desiredHeatTemp} ${desiredCoolTemp})" } +//ERS atomicState?.extTmpLastDesiredHTemp = desiredHeatTemp atomicState?.extTmpLastDesiredCTemp = desiredCoolTemp } @@ -3132,6 +3276,8 @@ def extTmpTempOk(disp=false, last=false) { if(!modeAuto && retval) { desiredTemp = getDesiredTemp() +//ERS + if(desiredTemp) { atomicState?.extTmpLastDesiredTemp = desiredTemp } if(!desiredTemp) { desiredTemp = intTemp if(!modeOff) { @@ -3142,36 +3288,36 @@ def extTmpTempOk(disp=false, last=false) { tempDiff = Math.abs(extTemp - desiredTemp) str = "enough different (${tempDiff})" insideThresh = getExtTmpInsideTempDiffVal() - LogAction("extTmpTempOk: Outside Temp: ${extTemp} | Desired Temp: ${desiredTemp} | Inside Temp Threshold: ${insideThresh} | Outside Temp Threshold: ${diffThresh} | Actual Difference: ${tempDiff} | Outside Dew point: ${curDp} | Dew point Limit: ${dpLimit}", "debug", false) + LogAction("extTmpTempOk: Outside Temp: ${extTemp} | Inside Temp: ${intTemp} | Desired Temp: ${desiredTemp} | Inside Temp Threshold: ${insideThresh} | Outside Temp Threshold: ${diffThresh} | Actual Difference: ${tempDiff} | Outside Dew point: ${curDp} | Dew point Limit: ${dpLimit}", "debug", true) if(diffThresh && tempDiff < diffThresh) { retval = false - tempOk = false + externalTempOk = false } def extTempHigh = (extTemp >= desiredTemp) ? true : false def extTempLow = (extTemp <= desiredTemp) ? true : false def oldMode = atomicState?.extTmpRestoreMode if(modeCool || oldMode == "cool" || (!canHeat && canCool)) { str = "greater than" - if(extTempHigh) { retval = false; tempOk = false } - else if (intTemp > desiredTemp+insideThresh) { retval = false; tempOk = false } // too hot inside + if(extTempHigh) { retval = false; externalTempOk = false } + if(intTemp > desiredTemp+insideThresh) { retval = false; internalTempOk = false } // too hot inside } if(modeHeat || oldMode == "heat" || (!canCool && canHeat)) { str = "less than" - if(extTempLow) { retval = false; tempOk = false } - else if (intTemp < desiredTemp-insideThresh) { retval = false; tempOk = false } // too cold inside + if(extTempLow) { retval = false; externalTempOk = false } + if(intTemp < desiredTemp-insideThresh) { retval = false; internalTempOk = false } // too cold inside } LogAction("extTmpTempOk: extTempHigh: ${extTempHigh} | extTempLow: ${extTempLow}", "debug", false) } } def showRes = disp ? (retval != last ? true : false) : false if(!dpOk) { - LogAction("extTmpTempOk: ${retval} Dewpoint: (${curDp}°${getTemperatureScale()}) is ${dpOk ? "ok" : "TOO HIGH"}", "info", showRes) + LogAction("extTmpTempOk: ${retval} Dewpoint: (${curDp}${tUnitStr()}) is ${dpOk ? "ok" : "TOO HIGH"}", "info", showRes) } else { if(!modeAuto) { - LogAction("extTmpTempOk: ${retval} Desired Inside Temp: (${desiredTemp}°${getTemperatureScale()}) is ${tempOk ? "" : "Not"} ${str} $diffThresh° of Outside Temp: (${extTemp}°${getTemperatureScale()}) or Inside Temp: (${intTemp}) is ${tempOk ? "" : "Not"} within Inside Threshold: ${insideThresh} of desired (${desiredTemp})", "info", showRes) + LogAction("extTmpTempOk: ${retval} Desired Inside Temp: (${desiredTemp}${tUnitStr()}) is ${externalTempOk ? "" : "Not"} ${str} $diffThresh\u00b0 of Outside Temp: (${extTemp}${tUnitStr()}) ${retval ? "AND" : "OR"} Inside Temp: (${intTemp}) is ${internalTempOk ? "" : "Not"} within Inside Threshold: ${insideThresh} of desired (${desiredTemp})", "info", showRes) } else { - LogAction("extTmpTempOk: ${retval} Exterior Temperature (${extTemp}°${getTemperatureScale()}) is ${tempOk ? "" : "Not"} ${str} using $diffThresh° offset | Inside Temp: (${intTemp})", "info", showRes) + LogAction("extTmpTempOk: ${retval} Exterior Temperature (${extTemp}${tUnitStr()}) is ${externalTempOk ? "" : "Not"} ${str} using $diffThresh\u00b0 offset | Inside Temp: (${intTemp}${tUnitStr()})", "info", showRes) } } @@ -3207,19 +3353,21 @@ def extTmpTempCheck(cTimeOut = false) { def execTime = now() //atomicState?.lastEvalDt = getDtNow() - if(!atomicState?."${pName}timeOutOn") { atomicState."${pName}timeOutOn" = false } + if(atomicState?."${pName}timeOutOn" == null) { atomicState."${pName}timeOutOn" = false } if(cTimeOut) { atomicState."${pName}timeOutOn" = true } def timeOut = atomicState."${pName}timeOutOn" ?: false - def curMode = extTmpTstat?.currentnestThermostatMode?.toString() - def modeOff = (curMode in ["off", "eco"]) ? true : false + def curMode = extTmpTstat ? extTmpTstat?.currentnestThermostatMode?.toString() : null + def modeOff = (curMode in ["off"]) ? true : false + def modeInActive = (curMode in ["off", "eco"]) ? true : false def modeEco = (curMode in ["eco"]) ? true : false + def modeAuto = (curMode == "auto") ? true : false def allowNotif = settings?."${pName}NotificationsOn" ? true : false def allowSpeech = allowNotif && settings?."${pName}AllowSpeechNotif" ? true : false def allowAlarm = allowNotif && settings?."${pName}AllowAlarmNotif" ? true : false def speakOnRestore = allowSpeech && settings?."${pName}SpeechOnRestore" ? true : false - if(!modeOff) { atomicState."${pName}timeOutOn" = false; timeOut = false } + if(!modeInActive) { atomicState."${pName}timeOutOn" = false; timeOut = false } // if we requested off; and someone switched us on or nMode took over... if( atomicState?.extTmpTstatOffRequested && (!modeEco || (modeEco && parent.setNModeActive(null))) ) { // reset timer and states LogAction("extTmpTempCheck: | ${!modeEco ? "HVAC turned on when automation had OFF" : "Automation overridden by nMODE"}, resetting state to match", "warn", true) @@ -3231,14 +3379,30 @@ def extTmpTempCheck(cTimeOut = false) { unschedTimeoutRestore(pName) } + if(modeOff) { + storeExecutionHistory((now() - execTime), "extTmpTempCheck") + return + } + def mylastMode = atomicState?."${pName}lastMode" // when we state change that could change desired Temp ensure delays happen before off can happen again def lastDesired = atomicState?.extTmpLastDesiredTemp // this catches scheduled temp or hvac mode changes def desiredTemp = getDesiredTemp() if( (mylastMode != curMode) || (desiredTemp && desiredTemp != lastDesired)) { - if(!modeOff) { + if(!modeInActive) { atomicState?."${pName}lastMode" = curMode +//ERS if(desiredTemp) { atomicState?.extTmpLastDesiredTemp = desiredTemp } + def desiredHeatTemp + def desiredCoolTemp + if(modeAuto) { + desiredHeatTemp = getRemSenHeatSetTemp(curMode) + desiredCoolTemp = getRemSenCoolSetTemp(curMode) + if(desiredHeatTemp && desiredCoolTemp) { + atomicState?.extTmpLastDesiredHTemp = desiredHeatTemp + atomicState?.extTmpLastDesiredCTemp = desiredCoolTemp + } + } atomicState.extTmpChgWhileOnDt = getDtNow() } else { //atomicState.extTmpChgWhileOffDt = getDtNow() @@ -3261,7 +3425,7 @@ def extTmpTempCheck(cTimeOut = false) { if(!lastMode) { lastMode = atomicState?.extTmpRestoreMode } } if(lastMode && (lastMode != curMode || timeOut || !safetyOk || !schedOk)) { - scheduleAutomationEval(60) + scheduleAutomationEval(70) if(setTstatMode(extTmpTstat, lastMode, pName)) { storeLastAction("Restored Mode ($lastMode)", getDtNow(), pName, extTmpTstat) atomicState?.extTmpRestoreMode = null @@ -3320,7 +3484,7 @@ def extTmpTempCheck(cTimeOut = false) { } } } else { - if(modeOff) { + if(modeInActive) { if(timeout || !safetyOk) { LogAction("extTmpTempCheck: | Timeout or Safety temps exceeded and Unable to restore settings okToRestore is false", "warn", true) atomicState."${pName}timeOutOn" = false @@ -3337,7 +3501,7 @@ def extTmpTempCheck(cTimeOut = false) { if(tempWithinThreshold && !timeOut && safetyOk && schedOk && !modeEco) { def rmsg = "" - if(!modeOff) { + if(!modeInActive) { if(getExtTmpWhileOnDtSec() >= (getExtTmpOffDelayVal() - 2)) { atomicState."${pName}timeOutOn" = false atomicState?.extTmpRestoreMode = curMode @@ -3348,7 +3512,7 @@ def extTmpTempCheck(cTimeOut = false) { atomicState?.extTmpTstatOffRequested = true atomicState.extTmpChgWhileOffDt = getDtNow() scheduleTimeoutRestore(pName) - modeOff = true + modeInActive = true modeEco = true rmsg = "${extTmpTstat.label} turned 'ECO': External Temp is at the temp threshold for (${getEnumValue(longTimeSecEnum(), extTmpOffDelay)})" if(extTmpTstatMir) { @@ -3398,6 +3562,14 @@ def extTmpGenericEvt(evt) { def extTmpDpOrTempEvt(type) { if(atomicState?.disableAutomation) { return } else { + def extTmpTstat = settings?.schMotTstat + def curMode = extTmpTstat ? extTmpTstat?.currentnestThermostatMode?.toString() : null + def modeOff = (curMode in ["off"]) ? true : false + if(modeOff) { + LogAction("${type} | Thermostat is off HVAC mode: ${curMode}", "info", false) + return + } + atomicState.needWeathUpd = true if(settings?.extTmpUseWeather) { getExtConditions() } @@ -3407,14 +3579,14 @@ def extTmpDpOrTempEvt(type) { if(lastTempWithinThreshold == null || tempWithinThreshold != lastTempWithinThreshold) { - def extTmpTstat = settings?.schMotTstat - def curMode = extTmpTstat?.currentnestThermostatMode.toString() - def modeOff = (curMode in ["off", "eco"]) ? true : false + //def extTmpTstat = settings?.schMotTstat + //def curMode = extTmpTstat ? extTmpTstat?.currentnestThermostatMode?.toString() : null + def modeActive = !(curMode in ["off", "eco"]) ? true : false def offVal = getExtTmpOffDelayVal() def onVal = getExtTmpOnDelayVal() def timeVal - if(!modeOff) { + if(modeActive) { atomicState.extTmpChgWhileOnDt = getDtNow() timeVal = ["valNum":offVal, "valLabel":getEnumValue(longTimeSecEnum(), offVal)] } else { @@ -3431,7 +3603,7 @@ def extTmpDpOrTempEvt(type) { } /****************************************************************************** -| WATCH CONTACTS AUTOMATION CODE | +| WATCH CONTACTS AUTOMATION CODE | *******************************************************************************/ def conWatPrefix() { return "conWat" } @@ -3454,7 +3626,8 @@ def conWatContactDesc() { str += "Contact Status:" settings?.conWatContacts?.sort { it?.displayName }?.each { dev -> cnt = cnt+1 - def val = strCapitalize(dev?.currentContact) ?: "Not Set" + def t0 = strCapitalize(dev?.currentContact) + def val = t0 ?: "Not Set" str += "${(cnt >= 1) ? "${(cnt == cCnt) ? "\n└" : "\n├"}" : "\n└"} ${dev?.label}: (${val})" } return str @@ -3463,7 +3636,7 @@ def conWatContactDesc() { } def isConWatConfigured() { - return (settings?.conWatContacts && settings?.conWatOffDelay) ? true : false + return (settings?.schMotContactOff && settings?.conWatContacts && settings?.conWatOffDelay) ? true : false } def getConWatContactsOk() { return settings?.conWatContacts?.currentState("contact")?.value.contains("open") ? false : true } @@ -3496,14 +3669,13 @@ def conWatCheck(cTimeOut = false) { def execTime = now() //atomicState?.lastEvalDt = getDtNow() - if(!atomicState?."${pName}timeOutOn") { atomicState."${pName}timeOutOn" = false } + if(atomicState?."${pName}timeOutOn" == null) { atomicState."${pName}timeOutOn" = false } if(cTimeOut) { atomicState."${pName}timeOutOn" = true } def timeOut = atomicState."${pName}timeOutOn" ?: false def curMode = conWatTstat ? conWatTstat?.currentnestThermostatMode.toString() : null def modeEco = (curMode in ["eco"]) ? true : false //def curNestPres = getTstatPresence(conWatTstat) def modeOff = (curMode in ["off", "eco"]) ? true : false - def openCtDesc = getOpenContacts(conWatContacts) ? " '${getOpenContacts(conWatContacts)?.join(", ")}' " : " a selected contact " def allowNotif = settings?."${pName}NotificationsOn" ? true : false def allowSpeech = allowNotif && settings?."${pName}AllowSpeechNotif" ? true : false def allowAlarm = allowNotif && settings?."${pName}AllowAlarmNotif" ? true : false @@ -3544,7 +3716,7 @@ def conWatCheck(cTimeOut = false) { if(!lastMode) { lastMode = atomicState?.conWatRestoreMode } } if(lastMode && (lastMode != curMode || timeOut || !safetyOk || !schedOk)) { - scheduleAutomationEval(60) + scheduleAutomationEval(70) if(setTstatMode(conWatTstat, lastMode, pName)) { storeLastAction("Restored Mode ($lastMode) to $conWatTstat", getDtNow(), pName, conWatTstat) atomicState?.conWatRestoreMode = null @@ -3624,8 +3796,10 @@ def conWatCheck(cTimeOut = false) { if((getConWatOpenDtSec() >= (getConWatOffDelayVal() - 2)) && (getConWatRestoreDelayBetweenDtSec() >= (getConWatRestoreDelayBetweenVal() - 2))) { atomicState."${pName}timeOutOn" = false atomicState?.conWatRestoreMode = curMode + def t0 = getOpenContacts(conWatContacts) + def openCtDesc = t0 ? " '${t0?.join(", ")}' " : " a selected contact " LogAction("conWatCheck: Saving ${conWatTstat?.label} mode (${strCapitalize(atomicState?.conWatRestoreMode)})", "info", true) - LogAction("conWatCheck: ${openCtDesc}${getOpenContacts(conWatContacts).size() > 1 ? "are" : "is"} still Open: Turning 'OFF' '${conWatTstat?.label}'", "debug", true) + LogAction("conWatCheck: ${openCtDesc}${t0?.size() > 1 ? "are" : "is"} still Open: Turning 'OFF' '${conWatTstat?.label}'", "debug", true) scheduleAutomationEval(60) if(setTstatMode(conWatTstat, "eco", pName)) { storeLastAction("Set $conWatTstat to 'ECO'", getDtNow(), pName, conWatTstat) @@ -3683,7 +3857,7 @@ def conWatContactEvt(evt) { if(atomicState?.disableAutomation) { return } else { def conWatTstat = settings?.schMotTstat - def curMode = conWatTstat?.currentnestThermostatMode.toString() + def curMode = conWatTstat ? conWatTstat?.currentnestThermostatMode?.toString() : null def isModeOff = (curMode in ["eco"]) ? true : false def conOpen = (evt?.value == "open") ? true : false def canSched = false @@ -3712,7 +3886,7 @@ def conWatContactEvt(evt) { } /****************************************************************************** -| WATCH FOR LEAKS AUTOMATION LOGIC CODE | +| WATCH FOR LEAKS AUTOMATION LOGIC CODE | ******************************************************************************/ def leakWatPrefix() { return "leakWat" } @@ -3724,7 +3898,8 @@ def leakWatSensorsDesc() { str += "Leak Sensors:" settings?.leakWatSensors?.sort { it?.displayName }?.each { dev -> cnt = cnt+1 - def val = strCapitalize(dev?.currentWater) ?: "Not Set" + def t0 = strCapitalize(dev?.currentWater) + def val = t0 ?: "Not Set" str += "${(cnt >= 1) ? "${(cnt == cCnt) ? "\n└" : "\n├"}" : "\n└"} ${dev?.label}: (${val})" } return str @@ -3733,11 +3908,11 @@ def leakWatSensorsDesc() { } def isLeakWatConfigured() { - return (settings?.leakWatSensors) ? true : false + return (settings?.schMotWaterOff && settings?.leakWatSensors) ? true : false } def getLeakWatSensorsOk() { return settings?.leakWatSensors?.currentState("water")?.value.contains("wet") ? false : true } -def leakWatSensorsOk() { return (!settings?.leakWatSensors) ? false : true } +//def leakWatSensorsOk() { return (!settings?.leakWatSensors) ? false : true } //def leakWatScheduleOk() { return autoScheduleOk(leakWatPrefix()) } // TODO allow override from schedule? @@ -3763,7 +3938,6 @@ def leakWatCheck() { def curMode = leakWatTstat?.currentThermostatMode.toString() //def curNestPres = getTstatPresence(leakWatTstat) def modeOff = (curMode == "off") ? true : false - def wetCtDesc = getWetWaterSensors(leakWatSensors) ? " '${getWetWaterSensors(leakWatSensors)?.join(", ")}' " : " a selected leak sensor " def allowNotif = settings?."${pName}NotificationsOn" ? true : false def allowSpeech = allowNotif && settings?."${pName}AllowSpeechNotif" ? true : false def allowAlarm = allowNotif && settings?."${pName}AllowAlarmNotif" ? true : false @@ -3789,7 +3963,7 @@ def leakWatCheck() { def lastMode = null if(atomicState?.leakWatRestoreMode) { lastMode = atomicState?.leakWatRestoreMode } if(lastMode && (lastMode != curMode || !safetyOk)) { - scheduleAutomationEval(60) + scheduleAutomationEval(70) if(setTstatMode(leakWatTstat, lastMode, pName)) { storeLastAction("Restored Mode ($lastMode) to $leakWatTstat", getDtNow(), pName, leakWatTstat) atomicState?.leakWatTstatOffRequested = false @@ -3858,8 +4032,10 @@ def leakWatCheck() { def rmsg = "" if(!modeOff) { atomicState?.leakWatRestoreMode = curMode + def t0 = getWetWaterSensors(leakWatSensors) + def wetCtDesc = t0 ? " '${t0?.join(", ")}' " : " a selected leak sensor " LogAction("leakWatCheck: Saving ${leakWatTstat?.label} mode (${strCapitalize(atomicState?.leakWatRestoreMode)})", "info", true) - LogAction("leakWatCheck: ${wetCtDesc}${getWetWaterSensors(leakWatSensors).size() > 1 ? "are" : "is"} Wet: Turning 'OFF' '${leakWatTstat?.label}'", "debug", true) + LogAction("leakWatCheck: ${wetCtDesc}${t0?.size() > 1 ? "are" : "is"} Wet: Turning 'OFF' '${leakWatTstat?.label}'", "debug", true) scheduleAutomationEval(60) if(setTstatMode(leakWatTstat, "off", pName)) { storeLastAction("Turned Off $leakWatTstat", getDtNow(), pName, leakWatTstat) @@ -3930,7 +4106,7 @@ def leakWatSensorEvt(evt) { } /******************************************************************************** -| MODE AUTOMATION CODE | +| MODE AUTOMATION CODE | *********************************************************************************/ def nModePrefix() { return "nMode" } @@ -3986,7 +4162,7 @@ def nestModePresPage() { input (name: "nModeCamOffHome", type: "bool", title: "Turn Off Nest Cams when Home?", required: false, defaultValue: false, submitOnChange: true, image: getAppImg("camera_gray_icon.png")) if(settings?.nModeCamOffHome || settings?.nModeCamOnAway) { paragraph title: "Optional" , "You can choose which cameras are changed when Home/Away. If you don't select any devices all will be changed." - input (name: "nModeCamsSel", type: "device.nestCamera", title: "Select your Nest Cams?", required: false, multiple: true, submitOnChange: true, image: getAppImg("camera_blue_icon.png")) + input (name: "nModeCamsSel", type: "capability.soundSensor", title: "Select your Nest Cams?", required: false, multiple: true, submitOnChange: true, image: getAppImg("camera_blue_icon.png")) } } } @@ -3994,7 +4170,7 @@ def nestModePresPage() { section("Additional Settings:") { input (name: "nModeSetEco", type: "bool", title: "Set ECO mode when away?", required: false, defaultValue: false, submitOnChange: true, image: getDevImg("eco_icon.png")) input (name: "nModeDelay", type: "bool", title: "Delay Changes?", required: false, defaultValue: false, submitOnChange: true, image: getAppImg("delay_time_icon.png")) - if(nModeDelay) { + if(settings?.nModeDelay) { input "nModeDelayVal", "enum", title: "Delay before change?", required: false, defaultValue: 60, metadata: [values:longTimeSecEnum()], submitOnChange: true, image: getAppImg("configure_icon.png") } @@ -4004,10 +4180,11 @@ def nestModePresPage() { section(getDmtSectionDesc(nModePrefix())) { def pageDesc = getDayModeTimeDesc(pName) href "setDayModeTimePage", title: "Configured Restrictions", description: pageDesc, params: ["pName": "${pName}"], state: (pageDesc ? "complete" : null), - image: getAppImg("cal_filter_icon.png") + image: getAppImg("cal_filter_icon.png") } section("Notifications:") { - def pageDesc = getNotifConfigDesc(pName) + def t0 = getNotifConfigDesc(pName) + def pageDesc = t0 ? "${t0}\n\nTap to modify" : "" href "setNotificationPage", title: "Configured Alerts", description: pageDesc, params: ["pName":"${pName}", "allowSpeech":false, "allowAlarm":false, "showSchedule":true], state: (pageDesc ? "complete" : null), image: getAppImg("notification_icon.png") } @@ -4020,25 +4197,25 @@ def nestModePresPage() { } } -def nModePresenceDesc() { +String nModePresenceDesc() { if(settings?.nModePresSensor) { - def cCnt = nModePresSensor?.size() ?: 0 - def str = "" - def cnt = 0 + Integer cCnt = settings?.nModePresSensor?.size() ?: 0 + String str = "" + Integer cnt = 0 str += "Presence Status:" settings?.nModePresSensor?.sort { it?.displayName }?.each { dev -> cnt = cnt+1 - def presState = strCapitalize(dev?.currentPresence) ?: "No State" - str += "${(cnt >= 1) ? "${(cnt == cCnt) ? "\n└" : "\n├"}" : "\n└"} ${dev?.label}: ${(dev?.label?.toString()?.length() > 10) ? "\n${(cCnt == 1 || cnt == cCnt) ? " " : "│"}└ " : ""}(${presState})" + String t0 = strCapitalize(dev?.currentPresence) + String presState = t0 ?: "No State" + str += "${(cnt >= 1) ? "${(cnt == cCnt) ? "\n└" : "\n├"}" : "\n└"} ${dev?.label}: ${(dev?.label?.toString()?.length() > 10) ? "\n${(cCnt == 1 || cnt == cCnt) ? " " : " │"} └ " : ""}(${presState})" } return str } return null } -def isNestModesConfigured() { - def devOk = ((!nModePresSensor && !nModeSwitch && (nModeHomeModes && nModeAwayModes)) || (nModePresSensor && !nModeSwitch) || (!nModePresSensor && nModeSwitch)) ? true : false - return devOk +Boolean isNestModesConfigured() { + return ((!settings?.nModePresSensor && !settings?.nModeSwitch && (settings?.nModeHomeModes && settings?.nModeAwayModes)) || (settings?.nModePresSensor && !settings?.nModeSwitch) || (!settings?.nModePresSensor && settings?.nModeSwitch)) } def nModeGenericEvt(evt) { @@ -4047,10 +4224,10 @@ def nModeGenericEvt(evt) { LogAction("${evt?.name.toUpperCase()} Event | Device: ${evt?.displayName} | Value: (${strCapitalize(evt?.value)}) with a delay of ${eventDelay}ms", "trace", true) if(atomicState?.disableAutomation) { return } storeLastEventData(evt) - if(nModeDelay) { - def delay = nModeDelayVal.toInteger() ?: 60 + if(settings?.nModeDelay) { + Integer delay = settings?.nModeDelayVal.toInteger() ?: 60 if(delay > defaultAutomationTime()) { - LogAction("Event | A Check is scheduled (${getEnumValue(longTimeSecEnum(), nModeDelayVal)})", "info", false) + LogAction("Event | A Check is scheduled (${getEnumValue(longTimeSecEnum(), settings?.nModeDelayVal)})", "info", false) scheduleAutomationEval(delay) } else { scheduleAutomationEval() } } else { @@ -4059,11 +4236,11 @@ def nModeGenericEvt(evt) { } def adjustCameras(on, sendAutoType=null) { - def cams = settings?.nModeCamsSel ?: parent?.getCams() - def foundCams + def cams = parent?.getCams() if(cams) { + def foundCams if(settings?.nModeCamsSel) { - foundCams = cams + foundCams = settings?.nModeCamsSel } else { foundCams = cams?.collect { parent.getCameraDevice(it) } } @@ -4082,7 +4259,7 @@ def adjustCameras(on, sendAutoType=null) { } catch (ex) { log.error "adjustCameras() Exception: ${dev?.label} does not support commands on / off", ex - sendNofificationMsg("Warning", "Camera commands not found, check IDE logs and installation instructions") + sendEventPushNotifications("Camera commands not found, check IDE logs and installation instructions", "Warning", nModePrefix()) parent?.sendExceptionData(ex, "adjustCameras", true, getAutoType()) } return dev @@ -4099,25 +4276,30 @@ def adjustEco(on, senderAutoType=null) { def d1 = parent.getThermostatDevice(dni) if(d1) { def didstr = null + def tstatAction = null def curMode = d1?.currentnestThermostatMode?.toString() - if(on && (curMode in ["eco"])) { - if(senderAutoType) { sendEcoActionDescToDevice(d1, senderAutoType) } // THIS ONLY WORKS ON NEST THERMOSTATS - } + def prevMode = d1?.currentpreviousthermostatMode?.toString() + //LogAction("adjustEco: CURMODE: ${curMode} ON: ${on} PREVMODE: ${prevMode}", "trace", false) + if(on && !(curMode in ["eco", "off"])) { didstr = "ECO" - setTstatMode(d1, "eco", senderAutoType) + tstatAction = "eco" } - def prevMode = d1?.currentpreviousthermostatMode?.toString() - LogAction("adjustEco: CURMODE: ${curMode} ON: ${on} PREVMODE: ${prevMode}", "trace", false) if(!on && curMode in ["eco"]) { if(prevMode && prevMode != curMode) { didstr = "$prevMode" - setTstatMode(d1, prevMode, senderAutoType) + tstatAction = prevMode } } if(didstr) { + setTstatMode(d1, tstatAction, senderAutoType) LogAction("adjustEco($on): | Thermostat: ${d1?.displayName} setting to HVAC mode $didstr was $curMode", "trace", true) storeLastAction("Set ${d1?.displayName} to $didstr", getDtNow(), senderAutoType, d1) + } else { + if(on && (curMode in ["eco"])) { // override device to know nMODE is active + if(senderAutoType) { sendEcoActionDescToDevice(d1, senderAutoType) } // THIS ONLY WORKS ON NEST THERMOSTATS + } + LogAction("adjustEco: | Thermostat: ${d1?.displayName} NOCHANGES CURMODE: ${curMode} ON: ${on} PREVMODE: ${prevMode}", "trace", false) } return d1 } else { LogAction("adjustEco NO D1", "warn", true) } @@ -4155,6 +4337,7 @@ def setAway(away) { } def nModeScheduleOk() { return autoScheduleOk(nModePrefix()) } +def getnModeEvalDtSec() { return !atomicState?.nModelastEvalDt ? 100000 : GetTimeDiffSeconds(atomicState?.nModelastEvalDt, null, "getnModeEvalDtSec").toInteger() } def checkNestMode() { LogAction("checkNestMode", "trace", false) @@ -4184,6 +4367,7 @@ def checkNestMode() { def away = false def home = false +// ERS figure out what state we are in if(nModePresSensor && !nModeSwitch) { if(!isPresenceHome(nModePresSensor)) { away = true @@ -4207,12 +4391,56 @@ def checkNestMode() { LogAction("checkNestMode: Nothing Matched", "info", true) } +// Track changes that happen outside of nMode +// this won't attempt to reset Nest device eco or camera state - you chose to do it outside the automation + Boolean NMisEnabled = parent.automationNestModeEnabled(true) + Boolean NMecoisEnabled = parent.setNModeActive(null) + Boolean t0 = (!nModeSetEco) + Boolean t1 = (home && (!nestModeAway) ) + if( (t0 || t1) && NMecoisEnabled) { + LogAction("checkNestMode adjusting manager state NM is not setting eco", "warn", true) + parent.setNModeActive(false) // clear nMode has it in manager + } + if(t1) { atomicState?.nModeTstatLocAway = false } + def t2 = (away && nestModeAway) ? true : false + if(nModeSetEco && t2 && (!NMecoisEnabled)) { + LogAction("checkNestMode adjusting manager state NM will clear eco", "warn", true) + parent.setNModeActive(true) // set nMode has it in manager + } + if(t2) { atomicState?.nModeTstatLocAway = true } + + def homeChgd = false + def nestModeChgd = false + if(atomicState?.nModeLastHome != home) { + homeChgd = true; + LogAction("NestMode Home Changed: ${homeChgd} Home: ${home}", "info", true) + atomicState.nModeLastHome = home + } + def t5 = getNestLocPres() + if(atomicState?.nModeLastNestMode != t5) { + nestModeChgd = true; + def t6 = "info" + if(!homeChgd) { + t6 = "warn" + } + LogAction("Nest location mode Changed: ${t5}", t6, true) + atomicState.nModeLastNestMode = t5 + } + def didsomething = false +// Manage state changes if(away && !nestModeAway) { - LogAction("checkNestMode: ${awayDesc} Nest 'Away'", "info", true) + LogAction("checkNestMode: ${awayDesc} Nest 'Away' ${away} ${nestModeAway}", "info", true) + if(getnModeEvalDtSec() < 4*60) { + LogAction("checkNestMode did change recently - SKIPPING", "warn", true) + scheduleAutomationEval(90) + storeExecutionHistory((now() - execTime), "checkNestMode") + return + } didsomething = true setAway(true) + atomicState.nModeLastNestMode = "away" atomicState?.nModeTstatLocAway = true if(nModeSetEco) { parent.setNModeActive(true) // set nMode has it in manager @@ -4224,10 +4452,17 @@ def checkNestMode() { if(nModeCamOnAway) { adjustCameras(true, pName) } } else if(home && nestModeAway) { - LogAction("checkNestMode: ${homeDesc} Nest 'Home'", "info", true) + LogAction("checkNestMode: ${homeDesc} Nest 'Home' ${home} ${nestModeAway}", "info", true) + if(getnModeEvalDtSec() < 4*60) { + LogAction("checkNestMode did change recently - SKIPPING", "warn", true) + scheduleAutomationEval(90) + storeExecutionHistory((now() - execTime), "checkNestMode") + return + } didsomething = true setAway(false) parent.setNModeActive(false) // clear nMode has it in manager + atomicState.nModeLastNestMode = "home" atomicState?.nModeTstatLocAway = false if(nModeSetEco) { adjustEco(false, pName) } if(allowNotif) { @@ -4239,6 +4474,7 @@ def checkNestMode() { LogAction("checkNestMode: No Changes | ${nModePresSensor ? "isPresenceHome: ${isPresenceHome(nModePresSensor)} | " : ""}ST-Mode: ($curStMode) | NestModeAway: ($nestModeAway) | Away: ($away) | Home: ($home)", "info", false) } if(didsomething) { + atomicState?.nModelastEvalDt = getDtNow() scheduleAutomationEval(90) } storeExecutionHistory((now() - execTime), "checkNestMode") @@ -4431,7 +4667,9 @@ def getCurrentSchedule() { } if(ccnt > schedList?.size()) { noSched = true } else { mySched = ccnt } - LogTrace("getCurrentSchedule: mySched: $mySched noSched: $noSched ccnt: $ccnt res1: $res1") + if(mySched != null) { + LogTrace("getCurrentSchedule: mySched: $mySched noSched: $noSched ccnt: $ccnt res1: $res1") + } return mySched } @@ -4692,7 +4930,7 @@ def checkOnMotion(mySched) { LogAction("checkOnMotion: [ActiveDt: ${lastActiveMotionDt} (${lastActiveMotionSec} sec) | InActiveDt: ${lastInactiveMotionDt} (${lastInactiveMotionSec} sec) | MotionOn: ($motionOn)", "trace", false) - def ontimedelay = (settings."${sLbl}MDelayValOn"?.toInteger() ?: 60) * 1000 // default to 60s + def ontimedelay = (settings."${sLbl}MDelayValOn"?.toInteger() ?: 60) * 1000 // default to 60s def offtimedelay = (settings."${sLbl}MDelayValOff"?.toInteger() ?: 30*60) * 1000 // default to 30 min def ontimeNum = lastActiveMotionDt + ontimedelay @@ -4895,7 +5133,7 @@ def setTstatTempCheck() { } /******************************************************************************** -| MASTER AUTOMATION FOR THERMOSTATS | +| MASTER AUTOMATION FOR THERMOSTATS | *********************************************************************************/ def schMotPrefix() { return "schMot" } @@ -4908,7 +5146,7 @@ def schMotModePage() { def dupTstat3 def tStatPhys def tempScale = getTemperatureScale() - def tempScaleStr = "°${tempScale}" + def tempScaleStr = "${tUnitStr()}" section("Configure Thermostat") { input name: "schMotTstat", type: "capability.thermostat", title: "Select Thermostat?", multiple: false, submitOnChange: true, required: true, image: getAppImg("thermostat_icon.png") //log.debug "schMotTstat: ${schMotTstat}" @@ -4927,11 +5165,11 @@ def schMotModePage() { def tempSrcStr = (getCurrentSchedule() && atomicState?.remoteTempSourceStr == "Schedule") ? "Schedule ${getCurrentSchedule()} (${"${getSchedLbl(getCurrentSchedule())}" ?: "Not Found"})" : "(${atomicState?.remoteTempSourceStr})" str += tempSrcStr ? "Zone Status:\n• Temp Source:${tempSrcStr?.toString().length() > 15 ? "\n └" : ""} ${tempSrcStr}" : "" - str += curZoneTemp ? "\n• Temperature: (${curZoneTemp}°${getTemperatureScale()})" : "" + str += curZoneTemp ? "\n• Temperature: (${curZoneTemp}${tempScaleStr})" : "" - def hstr = canHeat ? "H: ${reqSenHeatSetPoint}°${getTemperatureScale()}" : "" + def hstr = canHeat ? "H: ${reqSenHeatSetPoint}${tempScaleStr}" : "" def cstr = canHeat && canCool ? "/" : "" - cstr += canCool ? "C: ${reqSenCoolSetPoint}°${getTemperatureScale()}" : "" + cstr += canCool ? "C: ${reqSenCoolSetPoint}${tempScaleStr}" : "" str += "\n• Setpoints: (${hstr}${cstr})\n" str += "\nThermostat Status:\n• Temperature: (${getDeviceTemp(tstat)}${tempScaleStr})" @@ -4944,7 +5182,7 @@ def schMotModePage() { str += (atomicState?.schMotTstatHasFan) ? "\n• FanMode: (${strCapitalize(tstat?.currentThermostatFanMode)})" : "\n• No Fan on HVAC system" str += "\n• Presence: (${strCapitalize(getTstatPresence(tstat))})" def safetyTemps = getSafetyTemps(tstat) - str += safetyTemps ? "\n• Safety Temps:\n └ Min: ${safetyTemps.min}°${getTemperatureScale()}/Max: ${safetyTemps.max}${tempScaleStr}" : "" + str += safetyTemps ? "\n• Safety Temps:\n └ Min: ${safetyTemps.min}${tempScaleStr}/Max: ${safetyTemps.max}${tempScaleStr}" : "" str += "\n• Virtual: (${tstat?.currentNestType.toString() == "virtual" ? "True" : "False"})" paragraph "${str}", title: "${tstat.displayName} Zone Status", state: (str != "" ? "complete" : null), image: getAppImg("info_icon2.png") @@ -4954,7 +5192,7 @@ def schMotModePage() { if(dupTstat1) { paragraph "ERROR:\nThe Virtual version of the Primary Thermostat was found in Mirror Thermostat List.\nPlease Correct to Proceed", required: true, state: null, image: getAppImg("error_icon.png") } - } else { // if physcial thermostat, see if virtual version is in mirror list + } else { // if physcial thermostat, see if virtual version is in mirror list def mylist = [ deviceNetworkId:"v${tstat.deviceNetworkId.toString()}" ] dupTstat2 = checkThermostatDupe(mylist, tstatMir) if(dupTstat2) { @@ -5028,7 +5266,7 @@ def schMotModePage() { section("Remote Sensor:") { if(tStatPhys || settings?.schMotRemoteSensor) { def desc = "" - input (name: "schMotRemoteSensor", type: "bool", title: "Use Alternate Temp Sensors Control Zone temperature?", description: desc, required: false, defaultValue: false, submitOnChange: true, + input (name: "schMotRemoteSensor", type: "bool", title: "Use Alternate Temp Sensors to Control Zone temperature?", description: desc, required: false, defaultValue: false, submitOnChange: true, image: getAppImg("remote_sensor_icon.png")) if(settings?.schMotRemoteSensor) { def remSenDescStr = "" @@ -5058,6 +5296,12 @@ def schMotModePage() { def remSenDesc = isRemSenConfigured() ? "${remSenDescStr}\n\nTap to modify" : null href "tstatConfigAutoPage", title: "Remote Sensor Config", description: remSenDesc ?: "Not Configured", params: ["configType":"remSen"], required: true, state: (remSenDesc ? "complete" : null), image: getAppImg("configure_icon.png") + } else { + if(settings?.vthermostat != null) { +//ERS + settingRemove("vthermostat") + removeVstat("automation Selection") + } } } else if(!tStatPhys) { paragraph "Remote Sensor is not available on a VIRTUAL Thermostat", state: "complete", image: getAppImg("info_icon2.png") } @@ -5084,7 +5328,7 @@ def schMotModePage() { leakDesc += (settings?.leakWatSensors) ? "\n\nTap to modify" : "" def leakWatDesc = isLeakWatConfigured() ? "${leakDesc}" : null href "tstatConfigAutoPage", title: "Leak Sensor Automation", description: leakWatDesc ?: "Tap to configure", params: ["configType":"leakWat"], required: true, state: (leakWatDesc ? "complete" : null), - image: getAppImg("configure_icon.png") + image: getAppImg("configure_icon.png") } } else if(!tStatPhys) { paragraph "Leak Detection is not available on a VIRTUAL Thermostat", state: "complete", image: getAppImg("info_icon2.png") @@ -5110,7 +5354,7 @@ def schMotModePage() { conDesc += (settings?.conWatContacts) ? "\n\nTap to modify" : "" def conWatDesc = isConWatConfigured() ? "${conDesc}" : null href "tstatConfigAutoPage", title: "Contact Sensors Config", description: conWatDesc ?: "Tap to configure", params: ["configType":"conWat"], required: true, state: (conWatDesc ? "complete" : null), - image: getAppImg("configure_icon.png") + image: getAppImg("configure_icon.png") } } else if(!tStatPhys) { paragraph "Contact automation is not available on a VIRTUAL Thermostat", state: "complete", image: getAppImg("info_icon2.png") @@ -5134,7 +5378,7 @@ def schMotModePage() { humDesc += ((settings?.humCtrlTempSensor || settings?.humCtrlUseWeather) ) ? "\n\nTap to modify" : "" def humCtrlDesc = isHumCtrlConfigured() ? "${humDesc}" : null href "tstatConfigAutoPage", title: "Humidifier Config", description: humCtrlDesc ?: "Tap to configure", params: ["configType":"humCtrl"], required: true, state: (humCtrlDesc ? "complete" : null), - image: getAppImg("configure_icon.png") + image: getAppImg("configure_icon.png") } } section("External Temp:") { @@ -5158,7 +5402,7 @@ def schMotModePage() { extDesc += ((settings?.extTmpTempSensor || settings?.extTmpUseWeather) ) ? "\n\nTap to modify" : "" def extTmpDesc = isExtTmpConfigured() ? "${extDesc}" : null href "tstatConfigAutoPage", title: "External Temps Config", description: extTmpDesc ?: "Tap to configure", params: ["configType":"extTmp"], required: true, state: (extTmpDesc ? "complete" : null), - image: getAppImg("configure_icon.png") + image: getAppImg("configure_icon.png") } } else if(!tStatPhys) { paragraph "External Temp automation is not available on a VIRTUAL Thermostat", state: "complete", image: getAppImg("info_icon2.png") @@ -5260,7 +5504,7 @@ def tstatConfigAutoPage(params) { def tstat = settings?.schMotTstat if (tstat) { def tempScale = getTemperatureScale() - def tempScaleStr = "°${tempScale}" + def tempScaleStr = "${tUnitStr()}" def tStatName = tstat?.displayName.toString() def tStatHeatSp = getTstatSetpoint(tstat, "heat") def tStatCoolSp = getTstatSetpoint(tstat, "cool") @@ -5288,7 +5532,7 @@ def tstatConfigAutoPage(params) { section { def str = "" str += "• Temperature: (${tStatTemp})" - str += "\n• Setpoints: (H: ${canHeat ? "${tStatHeatSp}${tempScaleStr}" : "NA"}/C: ${canCool ? "${tStatCoolSp}${tempScaleStr}" : "NA"})" // + str += "\n• Setpoints: (H: ${canHeat ? "${tStatHeatSp}${tempScaleStr}" : "NA"}/C: ${canCool ? "${tStatCoolSp}${tempScaleStr}" : "NA"})" paragraph title: "${tStatName}\nSchedules and Setpoints:", "${str}", state: "complete", image: getAppImg("info_icon2.png") } showUpdateSchedule(null, hidestr) @@ -5342,7 +5586,7 @@ def tstatConfigAutoPage(params) { section(getDmtSectionDesc(fanCtrlPrefix())) { def pageDesc = getDayModeTimeDesc(pName) href "setDayModeTimePage", title: "Configured Restrictions", description: pageDesc, params: ["pName": "${pName}"], state: (pageDesc ? "complete" : null), - image: getAppImg("cal_filter_icon.png") + image: getAppImg("cal_filter_icon.png") } if(settings?."${pName}FanSwitches") { @@ -5364,13 +5608,11 @@ def tstatConfigAutoPage(params) { if(!getMyLockId()) { setMyLockId(app.id) } +//ERS +// this deals with changing the tstat on the automation if(atomicState?.remSenTstat) { if(tstat.deviceNetworkId != atomicState?.remSenTstat) { - parent?.addRemoveVthermostat(atomicState.remSenTstat, false, getMyLockId()) - if( parent?.remSenUnlock(atomicState.remSenTstat, getMyLockId()) ) { // attempt unlock old ID - atomicState.oldremSenTstat = atomicState?.remSenTstat - atomicState?.remSenTstat = null - } + removeVstat("settings pages") } } if(settings?.schMotRemoteSensor) { @@ -5381,13 +5623,11 @@ def tstatConfigAutoPage(params) { } if(configType == "remSen") { - // can check if any vthermostat is owned by us, and delete it - // have issue request for vthermostat is still on as input below - if(cannotLock) { section("") { paragraph "Cannot Lock thermostat for remote sensor - thermostat may already be in use. Please Correct", required: true, state: null, image: getAppImg("error_icon.png") } + settingRemove("vthermostat") } if(!cannotLock) { @@ -5477,9 +5717,10 @@ def tstatConfigAutoPage(params) { image: getAppImg("delay_time_icon.png") } section("Notifications:") { - def pageDesc = getNotifConfigDesc(pName) + def t0 = getNotifConfigDesc(pName) + def pageDesc = t0 ? "${t0}\n\nTap to modify" : "" href "setNotificationPage", title: "Configured Alerts", description: pageDesc, params: ["pName":"${pName}", "allowSpeech":true, "allowAlarm":true, "showSchedule":true], - state: (pageDesc ? "complete" : null), image: getAppImg("notification_icon.png") + state: (pageDesc ? "complete" : null), image: getAppImg("notification_icon.png") } } } @@ -5514,12 +5755,13 @@ def tstatConfigAutoPage(params) { section(getDmtSectionDesc(conWatPrefix())) { def pageDesc = getDayModeTimeDesc(pName) href "setDayModeTimePage", title: "Configured Restrictions", description: pageDesc, params: ["pName": "${pName}"], state: (pageDesc ? "complete" : null), - image: getAppImg("cal_filter_icon.png") + image: getAppImg("cal_filter_icon.png") } section("Notifications:") { - def pageDesc = getNotifConfigDesc(pName) + def t0 = getNotifConfigDesc(pName) + def pageDesc = t0 ? "${t0}\n\nTap to modify" : "" href "setNotificationPage", title: "Configured Alerts", description: pageDesc, params: ["pName":"${pName}", "allowSpeech":true, "allowAlarm":true, "showSchedule":true], - state: (pageDesc ? "complete" : null), image: getAppImg("notification_icon.png") + state: (pageDesc ? "complete" : null), image: getAppImg("notification_icon.png") } } } @@ -5601,7 +5843,7 @@ this does not work... section(getDmtSectionDesc(humCtrlPrefix())) { def pageDesc = getDayModeTimeDesc(pName) href "setDayModeTimePage", title: "Configured Restrictions", description: pageDesc, params: ["pName": "${pName}"], state: (pageDesc ? "complete" : null), - image: getAppImg("cal_filter_icon.png") + image: getAppImg("cal_filter_icon.png") } } } @@ -5657,12 +5899,13 @@ this does not work... section(getDmtSectionDesc(extTmpPrefix())) { def pageDesc = getDayModeTimeDesc(pName) href "setDayModeTimePage", title: "Configured Restrictions", description: pageDesc, params: ["pName": "${pName}"], state: (pageDesc ? "complete" : null), - image: getAppImg("cal_filter_icon.png") + image: getAppImg("cal_filter_icon.png") } section("Notifications:") { - def pageDesc = getNotifConfigDesc(pName) + def t0 = getNotifConfigDesc(pName) + def pageDesc = t0 ? "${t0}\n\nTap to modify" : "" href "setNotificationPage", title: "Configured Alerts", description: pageDesc, params: ["pName":"${pName}", "allowSpeech":true, "allowAlarm":true, "showSchedule":true], - state: (pageDesc ? "complete" : null), image: getAppImg("notification_icon.png") + state: (pageDesc ? "complete" : null), image: getAppImg("notification_icon.png") } def schTitle if(!atomicState?.activeSchedData?.size()) { @@ -5698,18 +5941,19 @@ def scheduleConfigPage(params) { def reqSenCoolSetPoint = getRemSenCoolSetTemp() def curZoneTemp = getRemoteSenTemp() def tempSrcStr = atomicState?.remoteTempSourceStr + def tempScaleStr = "${tUnitStr()}" section { - str += "Zone Status:\n• Temp Source: (${tempSrcStr})\n• Temperature: (${curZoneTemp}°${getTemperatureScale()})" + str += "Zone Status:\n• Temp Source: (${tempSrcStr})\n• Temperature: (${curZoneTemp}${tempScaleStr})" - def hstr = canHeat ? "H: ${reqSenHeatSetPoint}°${getTemperatureScale()}" : "" + def hstr = canHeat ? "H: ${reqSenHeatSetPoint}${tempScaleStr}" : "" def cstr = canHeat && canCool ? "/" : "" - cstr += canCool ? "C: ${reqSenCoolSetPoint}°${getTemperatureScale()}" : "" + cstr += canCool ? "C: ${reqSenCoolSetPoint}${tempScaleStr}" : "" str += "\n• Setpoints: (${hstr}${cstr})\n" - str += "\nThermostat Status:\n• Temperature: (${getDeviceTemp(tstat)}°${getTemperatureScale()})" - hstr = canHeat ? "H: ${getTstatSetpoint(tstat, "heat")}°${getTemperatureScale()}" : "" + str += "\nThermostat Status:\n• Temperature: (${getDeviceTemp(tstat)}${tempScaleStr})" + hstr = canHeat ? "H: ${getTstatSetpoint(tstat, "heat")}${tempScaleStr}" : "" cstr = canHeat && canCool ? "/" : "" - cstr += canCool ? "C: ${getTstatSetpoint(tstat, "cool")}°${getTemperatureScale()}" : "" + cstr += canCool ? "C: ${getTstatSetpoint(tstat, "cool")}${tempScaleStr}" : "" str += "\n• Setpoints: (${hstr}${cstr})" str += "\n• Mode: (${tstat ? ("${strCapitalize(tstat?.currentThermostatOperatingState)}/${strCapitalize(tstat?.currentThermostatMode)}") : "unknown"})" @@ -5739,9 +5983,9 @@ def schMotSchedulePage(params) { } def getScheduleList() { - def cnt = parent ? parent?.state?.appData?.schedules?.count : null - def maxCnt = cnt ? cnt.toInteger() : 4 - maxCnt = Math.min( Math.max(cnt,4), 8) + def cnt = parent ? parent?.state?.appData?.settings?.schedules?.count : null + def maxCnt = cnt ? cnt.toInteger() : 8 + maxCnt = Math.min( Math.max(maxCnt,4), 8) if(maxCnt < atomicState?.lastScheduleList?.size()) { maxCnt = atomicState?.lastScheduleList?.size() LogAction("A schedule size issue has occurred. The configured schedule size is smaller than the previous configuration restoring previous schedule size.", "warn", true) @@ -5785,7 +6029,7 @@ def editSchedule(schedData) { def sLbl = "schMot_${cnt}_" def canHeat = atomicState?.schMotTstatCanHeat def canCool = atomicState?.schMotTstatCanCool - def tempScaleStr = "°${getTemperatureScale()}" + def tempScaleStr = "${tUnitStr()}" def act = settings["${sLbl}SchedActive"] def actIcon = act ? "active" : "inactive" def sectStr = schedData?.secData?.schName ? (act ? "Enabled" : "Disabled") : "Tap to Enable" @@ -5878,7 +6122,7 @@ def getScheduleDesc(num = null) { def result = [:] def schedData = atomicState?.activeSchedData def actSchedNum = getCurrentSchedule() - def tempScaleStr = "°${getTemperatureScale()}" + def tempScaleStr = "${tUnitStr()}" def schNum def schData @@ -5945,15 +6189,15 @@ def getScheduleDesc(num = null) { str += schData?.p1 ? "\n │ ${(schData?.p0 || isSw) ? "│" : " "} └ (${schData?.p1.size()} Selected)" : "" str += schData?.p0 ? "\n │ ${isSw ? "├" : "└"} Presence Away:${!isSomebodyHome(settings["${sLbl}restrictionPresAway"]) ? " (${okSym()})" : " (${notOkSym()})"}" : "" //str += schData?.p0 ? "$p0Str" : "" - str += schData?.p0 ? "\n │ ${isSw ? "│" : " "} └ (${schData?.p0.size()} Selected)" : "" + str += schData?.p0 ? "\n │ ${isSw ? "│" : " "} └ (${schData?.p0.size()} Selected)" : "" str += schData?.s1 ? "\n │ ${schData?.s0 ? "├" : "└"} Switches On:${isSwitchOn(settings["${sLbl}restrictionSwitchOn"]) ? " (${okSym()})" : " (${notOkSym()})"}" : "" str += schData?.s1 ? "\n │ ${schData?.s0 ? "│" : " "} └ (${schData?.s1.size()} Selected)" : "" str += schData?.s0 ? "\n │ └ Switches Off:${!isSwitchOn(settings["${sLbl}restrictionSwitchOff"]) ? " (${okSym()})" : " (${notOkSym()})"}" : "" - str += schData?.s0 ? "\n │ └ (${schData?.s0.size()} Selected)" : "" + str += schData?.s0 ? "\n │ └ (${schData?.s0.size()} Selected)" : "" //Temp Setpoints - str += isTemp ? "${isRestrict ? "\n │\n" : "\n"} ${(isMot || isRemSen) ? "├" : "└"} Temp Setpoints:" : "" + str += isTemp ? "${isRestrict ? "\n │\n" : "\n"} ${(isMot || isRemSen) ? "├" : "└"} Temp Setpoints:" : "" str += schData?.ctemp ? "\n ${tempPreBar} ${schData?.htemp ? "├" : "└"} Cool Setpoint: (${fixTempSetting(schData?.ctemp)}${tempScaleStr})" : "" str += schData?.htemp ? "\n ${tempPreBar} ${schData?.hvacm ? "├" : "└"} Heat Setpoint: (${fixTempSetting(schData?.htemp)}${tempScaleStr})" : "" str += schData?.hvacm ? "\n ${tempPreBar} └ HVAC Mode: (${strCapitalize(schData?.hvacm)})" : "" @@ -5967,23 +6211,23 @@ def getScheduleDesc(num = null) { // m0dSize = m0dSize+1 // } str += isMot ? "${isTemp || isFanEn || isRemSen || isRestrict ? "\n │\n" : "\n"} ${isRemSen ? "├" : "└"} Motion Settings:" : "" - str += isMot ? "\n ${motPreBar ? "│" : " "} ${(schData?.mctemp || schData?.mhtemp) ? "├" : "└"} Motion Sensors: (${schData?.m0.size()})" : "" + str += isMot ? "\n ${motPreBar ? "│" : " "} ${(schData?.mctemp || schData?.mhtemp) ? "├" : "└"} Motion Sensors: (${schData?.m0.size()})" : "" //str += schData?.m0 ? "$m0Str" : "" //str += isMot ? "\n ${motPreBar ? "│" : " "} ${schData?.mctemp || schData?.mhtemp ? "│" : ""} └ (${isMotionActive(settings["${sLbl}Motion"]) ? "Active" : "None Active"})" : "" - str += isMot && schData?.mctemp ? "\n ${motPreBar ? "│" : " "} ${(schData?.mctemp || schData?.mhtemp) ? "├" : "└"} Mot. Cool Setpoint: (${fixTempSetting(schData?.mctemp)}${tempScaleStr})" : "" - str += isMot && schData?.mhtemp ? "\n ${motPreBar ? "│" : " "} ${schData?.mdelayOn || schData?.mdelayOff ? "├" : "└"} Mot. Heat Setpoint: (${fixTempSetting(schData?.mhtemp)}${tempScaleStr})" : "" - str += isMot && schData?.mhvacm ? "\n ${motPreBar ? "│" : " "} ${(schData?.mdelayOn || schData?.mdelayOff) ? "├" : "└"} Mot. HVAC Mode: (${strCapitalize(schData?.mhvacm)})" : "" - str += isMot && schData?.mdelayOn ? "\n ${motPreBar ? "│" : " "} ${schData?.mdelayOff ? "├" : "└"} Mot. On Delay: (${getEnumValue(longTimeSecEnum(), schData?.mdelayOn)})" : "" - str += isMot && schData?.mdelayOff ? "\n ${motPreBar ? "│" : " "} └ Mot. Off Delay: (${getEnumValue(longTimeSecEnum(), schData?.mdelayOff)})" : "" + str += isMot && schData?.mctemp ? "\n ${motPreBar ? "│" : " "} ${(schData?.mctemp || schData?.mhtemp) ? "├" : "└"} Mot. Cool Setpoint: (${fixTempSetting(schData?.mctemp)}${tempScaleStr})" : "" + str += isMot && schData?.mhtemp ? "\n ${motPreBar ? "│" : " "} ${schData?.mdelayOn || schData?.mdelayOff ? "├" : "└"} Mot. Heat Setpoint: (${fixTempSetting(schData?.mhtemp)}${tempScaleStr})" : "" + str += isMot && schData?.mhvacm ? "\n ${motPreBar ? "│" : " "} ${(schData?.mdelayOn || schData?.mdelayOff) ? "├" : "└"} Mot. HVAC Mode: (${strCapitalize(schData?.mhvacm)})" : "" + str += isMot && schData?.mdelayOn ? "\n ${motPreBar ? "│" : " "} ${schData?.mdelayOff ? "├" : "└"} Mot. On Delay: (${getEnumValue(longTimeSecEnum(), schData?.mdelayOn)})" : "" + str += isMot && schData?.mdelayOff ? "\n ${motPreBar ? "│" : " "} └ Mot. Off Delay: (${getEnumValue(longTimeSecEnum(), schData?.mdelayOff)})" : "" //Remote Sensor Info str += isRemSen && schData?.sen0 ? "${isRemSen || isRestrict ? "\n │\n" : "\n"} └ Alternate Remote Sensor:" : "" - //str += isRemSen && schData?.sen0 ? "\n ├ Temp Sensors: (${schData?.sen0.size()})" : "" + //str += isRemSen && schData?.sen0 ? "\n ├ Temp Sensors: (${schData?.sen0.size()})" : "" settings["${sLbl}remSensor"]?.each { t -> - str += "\n ├ ${t?.label}: ${(t?.label?.toString()?.length() > 10) ? "\n │ └ " : ""}(${getDeviceTemp(t)}°${getTemperatureScale()})" + str += "\n ├ ${t?.label}: ${(t?.label?.toString()?.length() > 10) ? "\n │ └ " : ""}(${getDeviceTemp(t)}${tempScaleStr})" } - str += isRemSen && schData?.sen0 ? "\n └ Temp${(settings["${sLbl}remSensor"]?.size() > 1) ? " (avg):" : ":"} (${getDeviceTempAvg(settings["${sLbl}remSensor"])}${tempScaleStr})" : "" - str += isRemSen && schData?.thres ? "\n └ Threshold: (${settings["${sLbl}remSenThreshold"]}${tempScaleStr})" : "" + str += isRemSen && schData?.sen0 ? "\n └ Temp${(settings["${sLbl}remSensor"]?.size() > 1) ? " (avg):" : ":"} (${getDeviceTempAvg(settings["${sLbl}remSensor"])}${tempScaleStr})" : "" + str += isRemSen && schData?.thres ? "\n └ Threshold: (${settings["${sLbl}remSenThreshold"]}${tempScaleStr})" : "" //log.debug "str: \n$str" if(str != "") { result[schNum] = str } } @@ -6077,7 +6321,7 @@ def roundTemp(Double temp) { if(temp == null) { return null } def newtemp if( getTemperatureScale() == "C") { - newtemp = Math.round(temp.round(1) * 2) / 2.0f // + newtemp = Math.round(temp.round(1) * 2) / 2.0f } else { if(temp instanceof Integer) { //log.debug "roundTemp: ($temp) is Integer" @@ -6289,14 +6533,12 @@ def storeExecutionHistory(val, method = null) { def addToList(val, list, listSize) { if(list?.size() < listSize) { list.push(val) - } - else if(list?.size() > listSize) { + } else if(list?.size() > listSize) { def nSz = (list?.size()-listSize) + 1 def nList = list?.drop(nSz) nList?.push(val) list = nList - } - else if(list?.size() == listSize) { + } else if(list?.size() == listSize) { def nList = list?.drop(1) nList?.push(val) list = nList @@ -6320,7 +6562,7 @@ def getAverageValue(items) { *************************************************************************************************/ def setNotificationPage(params) { - def pName = params.pName + def pName = params?.pName def allowSpeech = false def allowAlarm = false def showSched = false @@ -6332,48 +6574,92 @@ def setNotificationPage(params) { } dynamicPage(name: "setNotificationPage", title: "Configure Notification Options", uninstall: false) { section("Notification Preferences:") { - input "${pName}NotificationsOn", "bool", title: "Enable Notifications?", description: (!settings["${pName}NotificationsOn"] ? "Enable Text, Voice, Ask Alexa, or Alarm Notifications" : ""), required: false, defaultValue: false, submitOnChange: true, - image: getAppImg("notification_icon.png") + input "${pName}NotificationsOn", "bool", title: "Enable Notifications?", description: (!settings["${pName}NotificationsOn"] ? "Enable Text, Voice, Ask Alexa, or Alarm Notifications" : ""), required: false, + defaultValue: false, submitOnChange: true, image: getAppImg("notification_icon.png") } + def fixSettings = false if(settings["${pName}NotificationsOn"]) { - def notifDesc = !location.contactBookEnabled ? "Enable Push Messages Below" : "(Manager App Recipients are used by default)" - section("${notifDesc}") { - if(!location.contactBookEnabled) { + section("Use NST Manager Settings:") { + input "${pName}UseMgrNotif", "bool", title: "Use Manager Settings?", defaultValue: true, submitOnChange: true, required: false, image: getAppImg("notification_icon2.png") + } + if(!settings?."${pName}UseMgrNotif") { + + section("Enable Text Messaging:") { + input "${pName}NotifPhones", "phone", title: "Send SMS to\n(Optional)", submitOnChange: true, required: false, image: getAppImg("notification_icon2.png") + } + section("Enable Push Messages:") { input "${pName}UsePush", "bool", title: "Send Push Notitifications\n(Optional)", required: false, submitOnChange: true, defaultValue: false, image: getAppImg("notification_icon.png") - } else { - input("${pName}NotifRecips", "contact", title: "Select Recipients\n(Optional)", required: false, multiple: true, submitOnChange: true, image: getAppImg("recipient_icon.png")) { - input ("${pName}NotifPhones", "phone", title: "Phone Number to Send SMS to\n(Optional)", submitOnChange: true, required: false) + } + section("Enable Pushover Support:") { + input "${pName}PushoverEnabled", "bool", title: "Use Pushover Integration", required: false, submitOnChange: true, image: getAppImg("pushover_icon.png") + if(settings?."${pName}PushoverEnabled" == true) { + if(atomicState?.isInstalled) { + if(!atomicState?.pushoverManager) { + paragraph "If this is the first time enabling Pushover than leave this page and come back if the devices list is empty" + pushover_init() + } else { + input "${pName}PushoverDevices", "enum", title: "Select Pushover Devices", description: "Tap to select", groupedOptions: getPushoverDevices(), multiple: true, required: true, submitOnChange: true + if(settings?."${pName}PushoverDevices") { + def t0 = [(-2):"Lowest", (-1):"Low", 0:"Normal", 1:"High", 2:"Emergency"] + input "${pName}PushoverPriority", "enum", title: "Notification Priority (Optional)", description: "Tap to select", defaultValue: 0, required: false, multiple: false, submitOnChange: true, options: t0 + input "${pName}PushoverSound", "enum", title: "Notification Sound (Optional)", description: "Tap to select", defaultValue: "pushover", required: false, multiple: false, submitOnChange: true, options: getPushoverSounds() + } + } + } else { paragraph "New Install Detected!!!\n\nPlease complete the NST Automation Install. Then return later to resume Pushover configuration.", state: "complete" } } } + if(settings?."${pName}NotifPhones" || settings?."${pName}UsePush" || (settings?."${pName}PushoverEnabled" /* && settings?."${pName}PushoverDevices" */)) { + section("Notification Restrictions:") { + input "${pName}UseParentNotifRestrictions", "bool", title: "Use Notification Schedule From Manager", required: false, defaultValue: true, submitOnChange: true + if(!settings?."${pName}UseParentNotifRestrictions") { + def t1 = getNotifSchedDesc(pName) + href "setNotificationTimePage", title: "Notification Restrictions", description: (t1 ?: "Tap to configure"), params: ["pName": pName], state: (t1 ? "complete" : null), image: getAppImg("restriction_icon.png") + } + } + } + + } else { + fixSettings = true } + } else { + fixSettings = true + } + if(fixSettings) { + settingRemove("${pName}NotifPhones") + settingRemove("${pName}UsePush") + settingRemove("${pName}PushoverEnabled") + settingRemove("${pName}PushoverDevices") + settingRemove("${pName}PushoverPriority") + settingRemove("${pName}PushoverSound") + settingRemove("${pName}UseParentNotifRestrictions") + settingRemove("${pName}qStartInput") + settingRemove("${pName}qStartTime") + settingRemove("${pName}qStopInput") + settingRemove("${pName}qStopTime") + settingRemove("${pName}quietDays") + settingRemove("${pName}quietModes") + settingRemove("${pName}NotifRecips") + stateRemove("pushoverManager") } if(allowSpeech && settings?."${pName}NotificationsOn") { section("Voice Notification Preferences:") { input "${pName}AllowSpeechNotif", "bool", title: "Enable Voice Notifications?", description: "Media players, Speech Devices, or Ask Alexa", required: false, defaultValue: (settings?."${pName}AllowSpeechNotif" ? true : false), submitOnChange: true, image: getAppImg("speech_icon.png") if(settings["${pName}AllowSpeechNotif"]) { - if(pName == "leakWat") { - if(!atomicState?."${pName}OffVoiceMsg" || !settings["${pName}UseCustomSpeechNotifMsg"]) { atomicState?."${pName}OffVoiceMsg" = "ATTENTION: %devicename% has been turned OFF because %wetsensor% has reported it is WET" } - if(!atomicState?."${pName}OnVoiceMsg" || !settings["${pName}UseCustomSpeechNotifMsg"]) { atomicState?."${pName}OnVoiceMsg" = "Restoring %devicename% to %lastmode% Mode because ALL water sensors have been Dry again for (%ondelay%)" } - } - if(pName == "conWat") { - if(!atomicState?."${pName}OffVoiceMsg" || !settings["${pName}UseCustomSpeechNotifMsg"]) { atomicState?."${pName}OffVoiceMsg" = "ATTENTION: %devicename% has been turned OFF because %opencontact% has been Opened for (%offdelay%)" } - if(!atomicState?."${pName}OnVoiceMsg" || !settings["${pName}UseCustomSpeechNotifMsg"]) { atomicState?."${pName}OnVoiceMsg" = "Restoring %devicename% to %lastmode% Mode because ALL contacts have been Closed again for (%ondelay%)" } - } - if(pName == "extTmp") { - if(!atomicState?."${pName}OffVoiceMsg" || !settings["${pName}UseCustomSpeechNotifMsg"]) { atomicState?."${pName}OffVoiceMsg" = "ATTENTION: %devicename% has been turned to ECO because External Temp is above the temp threshold for (%offdelay%)" } - if(!atomicState?."${pName}OnVoiceMsg" || !settings["${pName}UseCustomSpeechNotifMsg"]) { atomicState?."${pName}OnVoiceMsg" = "Restoring %devicename% to %lastmode% Mode because External Temp has been above the temp threshold for (%ondelay%)" } - } + setInitialVoiceMsgs(pName) input "${pName}SendToAskAlexaQueue", "bool", title: "Send to Ask Alexa Message Queue?", required: false, defaultValue: (settings?."${pName}AllowSpeechNotif" ? false : true), submitOnChange: true, image: askAlexaImgUrl() input "${pName}SpeechMediaPlayer", "capability.musicPlayer", title: "Select Media Player(s)", hideWhenEmpty: true, multiple: true, required: false, submitOnChange: true, image: getAppImg("media_player.png") + input "${pName}EchoDevices", "device.echoSpeaksDevice", title: "Select Alexa Devices(s)", hideWhenEmpty: true, multiple: true, required: false, submitOnChange: true, image: getAppImg('echo_speaks.png') input "${pName}SpeechDevices", "capability.speechSynthesis", title: "Select Speech Synthesizer(s)", hideWhenEmpty: true, multiple: true, required: false, submitOnChange: true, image: getAppImg("speech2_icon.png") - if(settings["${pName}SpeechMediaPlayer"]) { + if(settings["${pName}SpeechMediaPlayer"] || settings["${pName}EchoDevices"]) { input "${pName}SpeechVolumeLevel", "number", title: "Default Volume Level?", required: false, defaultValue: 30, range: "0::100", submitOnChange: true, image: getAppImg("volume_icon.png") - input "${pName}SpeechAllowResume", "bool", title: "Can Resume Playing Media?", required: false, defaultValue: false, submitOnChange: true, image: getAppImg("resume_icon.png") + if(settings["${pName}SpeechMediaPlayer"]) { + input "${pName}SpeechAllowResume", "bool", title: "Can Resume Playing Media?", required: false, defaultValue: false, submitOnChange: true, image: getAppImg("resume_icon.png") + } } def desc = "" if(pName in ["conWat", "extTmp", "leakWat"]) { - if( (settings["${pName}SpeechMediaPlayer"] || settings["${pName}SpeechDevices"] || settings["${pName}SendToAskAlexaQueue"]) ) { + if( (settings["${pName}SpeechMediaPlayer"] || settings["${pName}SpeechDevices"] || settings["${pName}EchoDevices"] || settings["${pName}SendToAskAlexaQueue"]) ) { switch(pName) { case "conWat": desc = "Contact Close" @@ -6387,7 +6673,7 @@ def setNotificationPage(params) { } input "${pName}SpeechOnRestore", "bool", title: "Speak when restoring HVAC on (${desc})?", required: false, defaultValue: false, submitOnChange: true, image: getAppImg("speech_icon.png") - // TODO There are more messages and errors than ON / OFF + // TODO: There are more messages and errors than ON / OFF input "${pName}UseCustomSpeechNotifMsg", "bool", title: "Customize Notitification Message?", required: false, defaultValue: (settings?."${pName}AllowSpeechNotif" ? false : true), submitOnChange: true, image: getAppImg("speech_icon.png") if(settings["${pName}UseCustomSpeechNotifMsg"]) { @@ -6448,6 +6734,111 @@ def setNotificationPage(params) { } } +def setInitialVoiceMsgs(pName) { + if(settings["${pName}AllowSpeechNotif"]) { + if(pName in ["conWat", "extTmp", "leakWat"]) { + if(pName == "leakWat") { + if(!atomicState?."${pName}OffVoiceMsg" || !settings["${pName}UseCustomSpeechNotifMsg"]) { + atomicState?."${pName}OffVoiceMsg" = "ATTENTION: %devicename% has been turned OFF because %wetsensor% has reported it is WET" } + if(!atomicState?."${pName}OnVoiceMsg" || !settings["${pName}UseCustomSpeechNotifMsg"]) { + atomicState?."${pName}OnVoiceMsg" = "Restoring %devicename% to %lastmode% Mode because ALL water sensors have been Dry again for (%ondelay%)" } + } + if(pName == "conWat") { + if(!atomicState?."${pName}OffVoiceMsg" || !settings["${pName}UseCustomSpeechNotifMsg"]) { + atomicState?."${pName}OffVoiceMsg" = "ATTENTION: %devicename% has been turned OFF because %opencontact% has been Opened for (%offdelay%)" } + if(!atomicState?."${pName}OnVoiceMsg" || !settings["${pName}UseCustomSpeechNotifMsg"]) { + atomicState?."${pName}OnVoiceMsg" = "Restoring %devicename% to %lastmode% Mode because ALL contacts have been Closed again for (%ondelay%)" } + } + if(pName == "extTmp") { + if(!atomicState?."${pName}OffVoiceMsg" || !settings["${pName}UseCustomSpeechNotifMsg"]) { + atomicState?."${pName}OffVoiceMsg" = "ATTENTION: %devicename% has been turned to ECO because External Temp is above the temp threshold for (%offdelay%)" } + if(!atomicState?."${pName}OnVoiceMsg" || !settings["${pName}UseCustomSpeechNotifMsg"]) { + atomicState?."${pName}OnVoiceMsg" = "Restoring %devicename% to %lastmode% Mode because External Temp has been above the temp threshold for (%ondelay%)" } + } + } + } +} + +//ERS +def setCustomVoice(pName) { + if(settings["${pName}AllowSpeechNotif"]) { + if(pName in ["conWat", "extTmp", "leakWat"]) { + if(settings["${pName}UseCustomSpeechNotifMsg"]) { + atomicState?."${pName}OffVoiceMsg" = settings?."${pName}CustomOffSpeechMessage" + atomicState?."${pName}OnVoiceMsg" = settings?."${pName}CustomOnSpeechMessage" + } + } + } +} + +def setNotificationTimePage(params) { + def pName = params?.pName + if(params?.pName) { + atomicState.curNotifTimePageData = params + } else { pName = atomicState?.curNotifTimePageData?.pName } + dynamicPage(name: "setNotificationTimePage", title: "Prevent Notifications\nDuring these Days, Times or Modes", uninstall: false) { + def timeReq = (settings["${pName}qStartTime"] || settings["${pName}qStopTime"]) ? true : false + section() { + input "${pName}qStartInput", "enum", title: "Starting at", options: ["A specific time", "Sunrise", "Sunset"], defaultValue: null, submitOnChange: true, required: false, image: getAppImg("start_time_icon.png") + if(settings["${pName}qStartInput"] == "A specific time") { + input "${pName}qStartTime", "time", title: "Start time", required: timeReq, image: getAppImg("start_time_icon.png") + } + input "${pName}qStopInput", "enum", title: "Stopping at", options: ["A specific time", "Sunrise", "Sunset"], defaultValue: null, submitOnChange: true, required: false, image: getAppImg("stop_time_icon.png") + if(settings?."${pName}qStopInput" == "A specific time") { + input "${pName}qStopTime", "time", title: "Stop time", required: timeReq, image: getAppImg("stop_time_icon.png") + } + input "${pName}quietDays", "enum", title: "Prevent during these days of the week", multiple: true, required: false, image: getAppImg("day_calendar_icon.png"), options: timeDayOfWeekOptions() + input "${pName}quietModes", "mode", title: "Prevent when these Modes are Active", multiple: true, submitOnChange: true, required: false, image: getAppImg("mode_icon.png") + } + } +} + +String getNotifSchedDesc(pName) { + def sun = getSunriseAndSunset() + def startInput = settings?."${pName}qStartInput" + def startTime = settings?."${pName}qStartTime" + def stopInput = settings?."${pName}qStopInput" + def stopTime = settings?."${pName}qStopTime" + def dayInput = settings?."${pName}quietDays" + def modeInput = settings?."${pName}quietModes" + def notifDesc = "" + if(settings?."${pName}UseParentNotifRestrictions" == false) { + def getNotifTimeStartLbl = ( (startInput == "Sunrise" || startInput == "Sunset") ? ( (startInput == "Sunset") ? epochToTime(sun?.sunset.time) : epochToTime(sun?.sunrise.time) ) : (startTime ? time2Str(startTime) : "") ) + def getNotifTimeStopLbl = ( (stopInput == "Sunrise" || stopInput == "Sunset") ? ( (stopInput == "Sunset") ? epochToTime(sun?.sunset.time) : epochToTime(sun?.sunrise.time) ) : (stopTime ? time2Str(stopTime) : "") ) + notifDesc += (getNotifTimeStartLbl && getNotifTimeStopLbl) ? "• Silent Time: ${getNotifTimeStartLbl} - ${getNotifTimeStopLbl}" : "" + def days = getInputToStringDesc(dayInput) + def modes = getInputToStringDesc(modeInput) + notifDesc += days ? "${(getNotifTimeStartLbl || getNotifTimeStopLbl) ? "\n" : ""}• Silent Day${isPluralString(dayInput)}: ${days}" : "" + notifDesc += modes ? "${(getNotifTimeStartLbl || getNotifTimeStopLbl || days) ? "\n" : ""}• Silent Mode${isPluralString(modeInput)}: ${modes}" : "" + } else { + notifDesc += "• Using Manager Restrictions" + } + return (notifDesc != "") ? "${notifDesc}" : null +} + +def getOk2Notify(pName) { + return ((settings["${pName}NotificationsOn"] == true) && (daysOk(settings?."${pName}quietDays") == true) && (notificationTimeOk(pName) == true) && (modesOk(settings?."${pName}quietModes") == true)) +} + +def notificationTimeOk(pName) { + def strtTime = null + def stopTime = null + def now = new Date() + def sun = getSunriseAndSunset() // current based on geofence, previously was: def sun = getSunriseAndSunset(zipCode: zipCode) + if(settings?."${pName}qStartTime" && settings?."${pName}qStopTime") { + if(settings?."${pName}qStartInput" == "sunset") { strtTime = sun.sunset } + else if(settings?."${pName}qStartInput" == "sunrise") { strtTime = sun.sunrise } + else if(settings?."${pName}qStartInput" == "A specific time" && settings?."${pName}qStartTime") { strtTime = settings?."${pName}qStartTime" } + + if(settings?."${pName}qStopInput" == "sunset") { stopTime = sun.sunset } + else if(settings?."${pName}qStopInput" == "sunrise") { stopTime = sun.sunrise } + else if(settings?."${pName}qStopInput" == "A specific time" && settings?."${pName}qStopTime") { stopTime = settings?."${pName}qStopTime" } + } else { return true } + if(strtTime && stopTime) { + return timeOfDayIsBetween(strtTime, stopTime, new Date(), getTimeZone()) ? false : true + } else { return true } +} + def getNotifVariables(pName) { def str = "" str += "\n • DeviceName: %devicename%" @@ -6471,7 +6862,7 @@ def voiceNotifString(phrase, pName) { if(pName == "conWat" && phrase?.toLowerCase().contains("%opencontact%")) { phrase = phrase?.toLowerCase().replace('%opencontact%', (getOpenContacts(conWatContacts) ? getOpenContacts(conWatContacts)?.join(", ").toString() : "a selected contact")) } if(pName == "extTmp" && phrase?.toLowerCase().contains("%tempthreshold%")) { - phrase = phrase?.toLowerCase().replace('%tempthreshold%', "${extTmpDiffVal.toString()}(°${getTemperatureScale()})") } + phrase = phrase?.toLowerCase().replace('%tempthreshold%', "${extTmpDiffVal.toString()}(${tUnitStr()})") } if(phrase?.toLowerCase().contains("%offdelay%")) { phrase = phrase?.toLowerCase().replace('%offdelay%', getEnumValue(longTimeSecEnum(), settings?."${pName}OffDelay").toString()) } if(phrase?.toLowerCase().contains("%ondelay%")) { phrase = phrase?.toLowerCase().replace('%ondelay%', getEnumValue(longTimeSecEnum(), settings?."${pName}OnDelay").toString()) } } catch (ex) { @@ -6481,31 +6872,37 @@ def voiceNotifString(phrase, pName) { return phrase } -def getNotificationOptionsConf(pName) { - LogTrace("getNotificationOptionsConf pName: $pName") - def res = (settings?."${pName}NotificationsOn" && - (getRecipientDesc(pName) || - (settings?."${pName}AllowSpeechNotif" && (settings?."${pName}SpeechDevices" || settings?."${pName}SpeechMediaPlayer")) || - (settings?."${pName}AllowAlarmNofif" && settings?."${pName}AlarmDevices") - ) ) ? true : false - return res -} - def getNotifConfigDesc(pName) { LogTrace("getNotifConfigDesc pName: $pName") def str = "" if(settings?."${pName}NotificationsOn") { - str += ( getRecipientDesc(pName) || (settings?."${pName}AllowSpeechNotif" && (settings?."${pName}SpeechDevices" || settings?."${pName}SpeechMediaPlayer"))) ? - "Notification Status:" : "" - str += (settings?."${pName}NotifRecips") ? "${str != "" ? "\n" : ""} • Contacts: (${settings?."${pName}NotifRecips"?.size()})" : "" - str += (settings?."${pName}UsePush") ? "\n • Push Messages: Enabled" : "" - str += (settings?."${pName}NotifPhones") ? "\n • SMS: (${settings?."${pName}NotifPhones"?.size()})" : "" - def t0 = getVoiceNotifConfigDesc(pName) - str += t0 ? ("${(str != "") ? "\n\n" : "\n"}Voice Status:${t0}") : "" - def t1 = getAlarmNotifConfigDesc(pName) - str += t1 ? ("${(str != "") ? "\n\n" : "\n"}Alarm Status:${t1}") : "" - def t2 = getAlertNotifConfigDesc(pName) - str += t2 ? "\n${t2}" : "" + // str += "Notification Status:" + // if(!getRecipientDesc(pName)) { + // str += "\n • Contacts: Using Manager Settings" + // } + def t0 + if(settings?."${pName}UseMgrNotif" == false) { + str += (settings?."${pName}UsePush") ? "${str != "" ? "\n" : ""} • Push Messages: Enabled" : "" + str += (settings?."${pName}NotifPhones") ? "${str != "" ? "\n" : ""} • SMS: (${settings?."${pName}NotifPhones"?.size()})" : "" + str += (settings?."${pName}PushoverEnabled") ? "${str != "" ? "\n" : ""}Pushover: (Enabled)" : "" + str += (settings?."${pName}PushoverEnabled" && settings?."${pName}PushoverDevices") ? "${str != "" ? "\n" : ""} • Pushover Devices: (${settings?."${pName}PushoverDevices"})" : "" + str += (settings?."${pName}PushoverEnabled" && settings?."${pName}PushoverPriority") ? "${str != "" ? "\n" : ""} • Priority: (${settings?."${pName}PushoverPriority"})" : "" + str += (settings?."${pName}PushoverEnabled" && settings?."${pName}PushoverSound") ? "${str != "" ? "\n" : ""} • Sound: (${settings?."${pName}PushoverSound"})" : "" + t0 = getNotifSchedDesc(pName) + str += t0 ? "\n\nAlert Restrictions:\n${t0}" : "" + } else { + str += " • Enabled Using Manager Settings" + } + t0 = str + if(t0) { + str = "Notification Settings\n${t0}" + } + t0 = getVoiceNotifConfigDesc(pName) + str += t0 ? "\n\nVoice Status:${t0}" : "" + t0 = getAlarmNotifConfigDesc(pName) + str += t0 ? "\n\nAlarm Status:${t0}" : "" + t0 = getAlertNotifConfigDesc(pName) + str += t0 ? "\n\n${t0}" : "" } return (str != "") ? "${str}" : null } @@ -6515,13 +6912,20 @@ def getVoiceNotifConfigDesc(pName) { if(settings?."${pName}NotificationsOn" && settings["${pName}AllowSpeechNotif"]) { def speaks = settings?."${pName}SpeechDevices" def medias = settings?."${pName}SpeechMediaPlayer" + def echos = settings["${pName}EchoDevices"] str += settings["${pName}SendToAskAlexaQueue"] ? "\n• Send to Ask Alexa: (True)" : "" - str += speaks ? "\n• Speech Devices:" : "" + str += speaks ? "\n • Speech Devices:" : "" if(speaks) { def cnt = 1 speaks?.each { str += it ? "\n ${cnt < speaks.size() ? "├" : "└"} $it" : ""; cnt = cnt+1; } } - str += medias ? "${speaks ? "\n\n" : "\n"}• Media Players:" : "" + str += echos ? "\n • Alexa Devices:" : "" + if(echos) { + def cnt = 1 + echos?.each { str += it ? "\n ${cnt < echos.size() ? "├" : "└"} $it" : ""; cnt = cnt+1; } + str += (echos && settings?."${pName}SpeechVolumeLevel") ? "\n└ Volume: (${settings?."${pName}SpeechVolumeLevel"})" : "" + } + str += medias ? "${(speaks || echos) ? "\n\n" : "\n"} • Media Players:" : "" if(medias) { def cnt = 1 medias?.sort { it?.displayName }?.each { str += it ? "\n│${cnt < medias.size() ? "├" : "└"} $it" : ""; cnt = cnt+1; } @@ -6580,10 +6984,9 @@ def isPluralString(obj) { } def getRecipientsNames(val) { - def n = "" - def i = 0 + String n = "" + Integer i = 0 if(val) { - //def valLabel = //log.debug "val: $val" val?.each { r -> i = i + 1 @@ -6594,7 +6997,7 @@ def getRecipientsNames(val) { } def getRecipientDesc(pName) { - return ((settings?."${pName}NotifRecips") || (settings?."${pName}NotifPhones" || settings?."${pName}NotifUsePush")) ? getRecipientsNames(settings?."${pName}NotifRecips") : null + return (settings?."${pName}NotifPhones" || settings?."${pName}NotifUsePush" || (settings?."${pName}PushoverEnabled" && settings?."${pName}PushoverDevices")) ? true : false } def setDayModeTimePage(params) { @@ -6664,7 +7067,7 @@ def getDmtSectionDesc(autoType) { } /************************************************************************************************ -| AUTOMATION SCHEDULE CHECK | +| AUTOMATION SCHEDULE CHECK | *************************************************************************************************/ def autoScheduleOk(autoType) { @@ -6717,44 +7120,69 @@ def autoScheduleOk(autoType) { } /************************************************************************************************ -| SEND NOTIFICATIONS VIA PARENT APP | +| SEND NOTIFICATIONS VIA PARENT APP | *************************************************************************************************/ -def sendNofificationMsg(msg, msgType, recips = null, sms = null, push = null) { - LogAction("sendNofificationMsg($msg, $msgType, $recips, $sms, $push)", "trace", false) - if(recips || sms || push) { - parent?.sendMsg(msgType, msg, true, recips, sms, push) - //LogAction("Send Push Notification to $recips", "info", true) +def sendNofificationMsg(msg, msgType, pName, pushoverMap=null, sms=null, push=null) { + LogAction("sendNofificationMsg($msg, $msgType, $pName, $pushoverMap, $sms, $push)", "trace", false) + if(settings?."${pName}NotificationsOn" == true) { + if(settings?."${pName}UseMgrNotif" == false) { + def ok2Notify = setting?."${pName}UseParentNotifRestrictions" != false ? getOk2Notify(pName) : true //parent?.getOk2Notify() + if(!ok2Notify) { + LogAction("sendMsg: Message Skipped During Quiet Time ($msg)", "info", true) + } else { + def mySms = sms ?: settings?."${pName}NotifPhones" + def myPush = push ?: settings?."${pName}UsePush" + if(mySms || myPush) { + parent?.sendMsg(msgType, msg, true, null, myPhone, myPush) + //LogAction("Send Push Notification to $recips", "info", true) + } + if(settings?."${getAutoType()}PushoverEnabled" && settings?."${getAutoType()}PushoverDevices") { + Map msgObj = [:] + msgObj = pushoverMap ?: [title: msgType, message: msg, priority: (settings?."${getAutoType()}PushoverPriority" ?: 0)] + if(settings?."${getAutoType()}PushoverSound") { msgObj?.sound = settings?."${getAutoType()}PushoverSound" } + parent?.buildPushMessage(settings?."${getAutoType()}PushoverDevices", msgObj, true) + } + } + } else { + parent?.sendMsg(msgType, msg, true) + } } else { - parent?.sendMsg(msgType, msg, true) - } -} - + LogAction("sendMsg: Message Skipped as notifications off ($msg)", "info", true) + } +} + +//PushOver-Manager Input Generation Functions +private getPushoverSounds(){return (Map) atomicState?.pushoverManager?.sounds?:[:]} +private getPushoverDevices(){List opts=[];Map pmd=atomicState?.pushoverManager?:[:];pmd?.apps?.each{k,v->if(v&&v?.devices&&v?.appId){Map dm=[:];v?.devices?.sort{}?.each{i->dm["${i}_${v?.appId}"]=i};addInputGrp(opts,v?.appName,dm);}};return opts;} +private inputOptGrp(List groups,String title){def group=[values:[],order:groups?.size()];group?.title=title?:"";groups<r[v]=v;return r;}} +private addInputGrp(List groups,String title,values){if(values instanceof List){values=listToMap(values)};values.inject(inputOptGrp(groups,title)){r,k,v->return addInputValues(r,k,v)};return groups;} +private addInputGrp(values){addInputGrp([],null,values)} +//PushOver-Manager Location Event Subscription Events, Polling, and Handlers +public pushover_init(){subscribe(location,"pushoverManager",pushover_handler);pushover_poll()} +public pushover_cleanup(){state?.remove("pushoverManager");unsubscribe("pushoverManager");} +public pushover_poll(){sendLocationEvent(name:"pushoverManagerCmd",value:"poll",data:[empty:true],isStateChange:true,descriptionText:"Sending Poll Event to Pushover-Manager")} +public pushover_msg(List devs,Map data){if(devs&&data){sendLocationEvent(name:"pushoverManagerMsg",value:"sendMsg",data:data,isStateChange:true,descriptionText:"Sending Message to Pushover Devices: ${devs}");}} +public pushover_handler(evt){Map pmd=atomicState?.pushoverManager?:[:];switch(evt?.value){case"refresh":def ed = evt?.jsonData;String id = ed?.appId;Map pA = pmd?.apps?.size() ? pmd?.apps : [:];if(id){pA[id]=pA?."${id}"instanceof Map?pA[id]:[:];pA[id]?.devices=ed?.devices?:[];pA[id]?.appName=ed?.appName;pA[id]?.appId=id;pmd?.apps = pA;};pmd?.sounds=ed?.sounds;break;case "reset":pmd=[:];break;};atomicState?.pushoverManager=pmd;} +//Builds Map Message object to send to Pushover Manager +private buildPushMessage(List devices,Map msgData,timeStamp=false){if(!devices||!msgData){return};Map data=[:];data?.appId=app?.getId();data.devices=devices;data?.msgData=msgData;if(timeStamp){data?.msgData?.timeStamp=new Date().getTime()};pushover_msg(devices,data);} /************************************************************************************************ -| GLOBAL Code | Logging AND Diagnostic | +| GLOBAL Code | Logging AND Diagnostic | *************************************************************************************************/ - def sendEventPushNotifications(message, type, pName) { LogTrace("sendEventPushNotifications($message, $type, $pName)") - if(settings["${pName}_Alert_1_Send_Push"] || settings["${pName}_Alert_2_Send_Push"]) { -//TODO this portion is never reached - if(settings["${pName}_Alert_1_CustomPushMessage"]) { - sendNofificationMsg(settings["${pName}_Alert_1_CustomPushMessage"].toString(), type, settings?."${pName}NotifRecips", settings?."${pName}NotifPhones", settings?."${pName}UsePush") - } else { - sendNofificationMsg(message, type, settings?."${pName}NotifRecips", settings?."${pName}NotifPhones", settings?."${pName}UsePush") - } - } else { - sendNofificationMsg(message, type, settings?."${pName}NotifRecips", settings?."${pName}NotifPhones", settings?."${pName}UsePush") - } + sendNofificationMsg(message, type, pName) } def sendEventVoiceNotifications(vMsg, pName, msgId, rmAAMsg=false, rmMsgId) { def allowNotif = settings?."${pName}NotificationsOn" ? true : false def allowSpeech = allowNotif && settings?."${pName}AllowSpeechNotif" ? true : false - def ok2Notify = parent.getOk2Notify() + def ok2Notify = setting?."${pName}UseParentNotifRestrictions" != false ? getOk2Notify(pName) : parent?.getOk2Notify() - LogAction("sendEventVoiceNotifications($vMsg, $pName) ok2Notify: $ok2Notify", "trace", false) + LogAction("sendEventVoiceNotifications($vMsg, $pName) | ok2Notify: $ok2Notify", "trace", false) if(allowNotif && allowSpeech) { - if(ok2Notify && (settings["${pName}SpeechDevices"] || settings["${pName}SpeechMediaPlayer"])) { + if(ok2Notify && (settings["${pName}SpeechDevices"] || settings["${pName}SpeechMediaPlayer"] || settings["${pName}EchoDevices"])) { sendTTS(vMsg, pName) } if(settings["${pName}SendToAskAlexaQueue"]) { // we queue to Alexa regardless of quiet times @@ -6792,11 +7220,10 @@ def removeAskAlexaQueueMsg(msgId, queue=null) { } } - def scheduleAlarmOn(autoType) { LogAction("scheduleAlarmOn: autoType: $autoType a1DelayVal: ${getAlert1DelayVal(autoType)}", "debug", true) def timeVal = getAlert1DelayVal(autoType).toInteger() - def ok2Notify = parent.getOk2Notify() + def ok2Notify = setting?."${autoType}UseParentNotifRestrictions" != false ? getOk2Notify(autoType) : parent?.getOk2Notify() LogAction("scheduleAlarmOn timeVal: $timeVal ok2Notify: $ok2Notify", "info", true) if(canSchedule() && ok2Notify) { @@ -6928,12 +7355,13 @@ def getAlarmEvt2RuntimeDtSec() { return !atomicState?.alarmEvt2StartDt ? 100000 void sendTTS(txt, pName) { LogAction("sendTTS(data: ${txt})", "trace", true) try { - def msg = txt.toString().replaceAll("\\[|\\]|\\(|\\)|\\'|\\_", "") + def msg = txt?.toString()?.replaceAll("\\[|\\]|\\(|\\)|\\'|\\_", "") def spks = settings?."${pName}SpeechDevices" def meds = settings?."${pName}SpeechMediaPlayer" + def echos = settings?."${pName}EchoDevices" def res = settings?."${pName}SpeechAllowResume" def vol = settings?."${pName}SpeechVolumeLevel" - LogAction("sendTTS msg: $msg | speaks: $spks | medias: $meds | resume: $res | volume: $vol", "debug", true) + LogAction("sendTTS msg: $msg | speaks: $spks | medias: $meds | echos: $echos| resume: $res | volume: $vol", "debug", false) if(settings?."${pName}AllowSpeechNotif") { if(spks) { spks*.speak(msg) @@ -6955,6 +7383,9 @@ void sendTTS(txt, pName) { } } } + if(echos) { + echos*.setVolumeAndSpeak(settings?."${pName}SpeechVolumeLevel", msg as String) + } } } catch (ex) { log.error "sendTTS Exception:", ex @@ -7038,7 +7469,8 @@ def checkFanSpeedSupport(dev) { devData.each { cmd -> if(cmd.name in req) { devCnt = devCnt+1 } } - def speed = dev?.currentValue("currentState") ?: null + def t0 = dev?.currentValue("currentState") + def speed = t0 ?: null //log.debug "checkFanSpeedSupport (speed: $speed | devCnt: $devCnt)" return (speed && devCnt == 3) ? true : false } @@ -7113,12 +7545,12 @@ def getSafetyTempsOk(tstat) { } def getGlobalDesiredHeatTemp() { - def t0 = parent?.settings?.locDesiredHeatTemp?.toDouble() + Double t0 = parent?.settings?.locDesiredHeatTemp?.toDouble() return t0 ?: null } def getGlobalDesiredCoolTemp() { - def t0 = parent?.settings?.locDesiredCoolTemp?.toDouble() + Double t0 = parent?.settings?.locDesiredCoolTemp?.toDouble() return t0 ?: null } @@ -7198,7 +7630,7 @@ def getTstatPresence(tstat) { def setTstatMode(tstat, mode, autoType=null) { def result = false - if(mode) { + if(mode && tstat) { def curMode = tstat?.currentnestThermostatMode?.toString() if (curMode != mode) { try { @@ -7216,7 +7648,7 @@ def setTstatMode(tstat, mode, autoType=null) { } catch (ex) { log.error "setTstatMode() Exception: ${tstat?.label} does not support mode ${mode}; check IDE and install instructions", ex - parent?.sendExceptionData(ex, "setTstatMode", true, getAutoType()) + //parent?.sendExceptionData(ex, "setTstatMode", true, getAutoType()) } } @@ -7234,7 +7666,7 @@ def setMultipleTstatMode(tstats, mode, autoType=null) { tstats?.each { ts -> def retval // try { - retval = setTstatMode(ts, mode, autoType) // THERE IS A PROBLEM HERE IF MIRROR THERMOSTATS ARE NOT NEST + retval = setTstatMode(ts, mode, autoType) // } catch (ex) { // log.error "setMultipleTstatMode() Exception:", ex // parent?.sendExceptionData(ex, "setMultipleTstatMode", true, getAutoType()) @@ -7267,10 +7699,11 @@ def setTstatAutoTemps(tstat, coolSetpoint, heatSetpoint, pName, mir=null) { def reqHeat def curCoolSetpoint def curHeatSetpoint + def tempScaleStr = "${tUnitStr()}" if(tstat) { hvacMode = tstat?.currentnestThermostatMode.toString() - LogAction("setTstatAutoTemps: [tstat: ${tstat?.displayName} | Mode: ${hvacMode} | coolSetpoint: ${coolSetpoint}${tUnitStr()} | heatSetpoint: ${heatSetpoint}${tUnitStr()}]", "info", true) + LogAction("setTstatAutoTemps: [tstat: ${tstat?.displayName} | Mode: ${hvacMode} | coolSetpoint: ${coolSetpoint}${tempScaleStr} | heatSetpoint: ${heatSetpoint}${tempScaleStr}]", "info", true) retVal = true setStr = "" @@ -7284,8 +7717,8 @@ def setTstatAutoTemps(tstat, coolSetpoint, heatSetpoint, pName, mir=null) { if(!reqCool && !reqHeat) { retVal = false; setStr += "Missing COOL and HEAT Setpoints" } if(hvacMode in ["auto"]) { - if(!reqCool && reqHeat) { reqCool = (double) (curCoolSetpoint > (reqHeat + diff)) ? curCoolSetpoint : (reqHeat + diff) } - if(!reqHeat && reqCool) { reqHeat = (double) (curHeatSetpoint < (reqCool - diff)) ? curHeatSetpoint : (reqCool - diff) } + if(!reqCool && reqHeat) { reqCool = (double) ((curCoolSetpoint > (reqHeat + diff)) ? curCoolSetpoint : (reqHeat + diff)) } + if(!reqHeat && reqCool) { reqHeat = (double) ((curHeatSetpoint < (reqCool - diff)) ? curHeatSetpoint : (reqCool - diff)) } if((reqCool && reqHeat) && (reqCool >= (reqHeat + diff))) { if(reqHeat <= curHeatSetpoint) { heatFirst = true } else if(reqCool >= curCoolSetpoint) { heatFirst = false } @@ -7316,15 +7749,15 @@ def setTstatAutoTemps(tstat, coolSetpoint, heatSetpoint, pName, mir=null) { } if(retVal) { if(heatFirst && setHeat) { - setStr += "heatSetpoint: (${reqHeat}${tUnitStr()}) " + setStr += "heatSetpoint: (${reqHeat}${tempScaleStr}) " if(reqHeat != curHeatSetpoint) { tstat?.setHeatingSetpoint(reqHeat) - storeLastAction("Set ${tstat} Heat Setpoint ${reqHeat}${tUnitStr()}", getDtNow(), pName, tstat) + storeLastAction("Set ${tstat} Heat Setpoint ${reqHeat}${tempScaleStr}", getDtNow(), pName, tstat) if(mir) { mir*.setHeatingSetpoint(reqHeat) } } } if(setCool) { - setStr += "coolSetpoint: (${reqCool}${tUnitStr()}) " + setStr += "coolSetpoint: (${reqCool}${tempScaleStr}) " if(reqCool != curCoolSetpoint) { tstat?.setCoolingSetpoint(reqCool) storeLastAction("Set ${tstat} Cool Setpoint ${reqCool}", getDtNow(), pName, tstat) @@ -7332,10 +7765,10 @@ def setTstatAutoTemps(tstat, coolSetpoint, heatSetpoint, pName, mir=null) { } } if(!heatFirst && setHeat) { - setStr += "heatSetpoint: (${reqHeat}${tUnitStr()})" + setStr += "heatSetpoint: (${reqHeat}${tempScaleStr})" if(reqHeat != curHeatSetpoint) { tstat?.setHeatingSetpoint(reqHeat) - storeLastAction("Set ${tstat} Heat Setpoint ${reqHeat}${tUnitStr()}", getDtNow(), pName, tstat) + storeLastAction("Set ${tstat} Heat Setpoint ${reqHeat}${tempScaleStr}", getDtNow(), pName, tstat) if(mir) { mir*.setHeatingSetpoint(reqHeat) } } } @@ -7348,7 +7781,7 @@ def setTstatAutoTemps(tstat, coolSetpoint, heatSetpoint, pName, mir=null) { /****************************************************************************** -* Keep These Methods * +* Keep These Methods * *******************************************************************************/ /* def switchEnumVals() { return [0:"Off", 1:"On", 2:"On/Off"] } @@ -7389,8 +7822,8 @@ def shortTimeEnum() { def smallTempEnum() { def tempUnit = getTemperatureScale() def vals = [ - 1:"1°${tempUnit}", 2:"2°${tempUnit}", 3:"3°${tempUnit}", 4:"4°${tempUnit}", 5:"5°${tempUnit}", 6:"6°${tempUnit}", 7:"7°${tempUnit}", - 8:"8°${tempUnit}", 9:"9°${tempUnit}", 10:"10°${tempUnit}" + 1:"1\u00b0${tempUnit}", 2:"2\u00b0${tempUnit}", 3:"3\u00b0${tempUnit}", 4:"4\u00b0${tempUnit}", 5:"5\u00b0${tempUnit}", 6:"6\u00b0${tempUnit}", 7:"7\u00b0${tempUnit}", + 8:"8\u00b0${tempUnit}", 9:"9\u00b0${tempUnit}", 10:"10\u00b0${tempUnit}" ] return vals } @@ -7495,14 +7928,13 @@ def getDevOpt() { def devPageFooter(var, eTime) { def res = [] if(getDevOpt()) { - res += section() { - paragraph " Page Loads: (${atomicState?.usageMetricsStore["${var}"] ?: 0}) | LoadTime: (${eTime ? (now()-eTime) : 0}ms)" + res += section() { + paragraph " Page Loads: (${atomicState?.usageMetricsStore["${var}"] ?: 0}) | LoadTime: (${eTime ? (now()-eTime) : 0}ms)" } } return res?.size() ? res : "" } - def askAlexaImgUrl() { return "https://raw.githubusercontent.com/MichaelStruck/SmartThingsPublic/master/smartapps/michaelstruck/ask-alexa.src/AskAlexa512.png" } def savetoRemDiagChild(List newdata) { @@ -7515,20 +7947,23 @@ def savetoRemDiagChild(List newdata) { } if(newdata?.size() > 0) { def data = atomicState?.remDiagLogDataStore ?: [] + def pdata = atomicState?.remDiagLogpDataStore ?: [] def cnt = 0 - while(data && stateSz >= 70 && cnt < 50) { + while(data && stateSz >= 60 && cnt < 50) { data.remove(0) atomicState?.remDiagLogDataStore = data stateSz = getStateSizePerc() cnt += 1 } newdata?.each { logItem -> + pdata << logItem data << logItem cnt -= 1 //log.debug "item: $logItem" //def item = ["dt":getDtNow(), "type":type, "src":(logSrcType ?: "Not Set"), "msg":msg] } atomicState?.remDiagLogDataStore = data + atomicState?.remDiagLogpDataStore = pdata stateSz = getStateSizePerc() while(data && stateSz >= 75 && cnt < 50) { data.remove(0) @@ -7536,17 +7971,50 @@ def savetoRemDiagChild(List newdata) { stateSz = getStateSizePerc() cnt += 1 } - log.debug "(${data?.size()} | State: ${stateSz}%)" + runIn(6, "displayLogData", [overwrite: true]) + log.debug "Log Items (${data?.size()}) | State Size: (${stateSz}%)" } else { log.error "bad call to savetoRemDiagChild - no data" } } else { Logger("bad call to savetoRemDiagChild - wrong automation") } } +def displayLogData() { + def logData = atomicState?.remDiagLogpDataStore ?: [] + def logSz = logData?.size() ?: 0 + def cnt = 1 + if(logSz > 0) { + logData?.sort { it?.dt }.reverse()?.each { logItem -> + switch(logItem?.type) { + case "info": + log.info "${logItem?.src} ${logItem.msg}" + break + case "warn": + log.warn "${logItem?.src} ${logItem.msg}" + break + case "error": + log.error "${logItem?.src} ${logItem.msg}" + break + case "trace": + log.trace "${logItem?.src} ${logItem.msg}" + break + case "debug": + log.debug "${logItem?.src} ${logItem.msg}" + break + default: + log.debug "${logItem?.src} ${logItem.msg}" + break + } + } + atomicState?.remDiagLogpDataStore = [] + } +} + def getRemLogData() { try { def appHtml = "" def navHtml = "" def scrStr = "" def logData = atomicState?.remDiagLogDataStore + def homeUrl = parent?.getAppEndpointUrl("diagHome") def resultStr = "" def tf = new SimpleDateFormat("h:mm:ss a") tf.setTimeZone(getTimeZone()) @@ -7634,15 +8102,42 @@ def getRemLogData() { - - - - + - +
+
${camHtml}
@@ -1280,35 +1449,21 @@ def getCamHtml() { -
- - - - - - - - - - - - - -
Video History (Min.)Video History (Max.)
${getRecTimeDesc(state?.minVideoHistoryHours) ?: "Not Available"}${getRecTimeDesc(state?.maxVideoHistoryHours) ?: "Not Available"}
-
+ - - + + +
Nest Aware Public Video Mic Status
${state?.publicShareEnabled.toString()}${state?.audioInputEnabled.toString()}${state?.nestAwareActive == true ? "Active" : "Not Active"}${state?.publicShareEnabled?.toString()}${state?.audioInputEnabled?.toString()}
@@ -1319,14 +1474,14 @@ def getCamHtml() { - FW Version + Firmware Debug Device Type - v${state?.softwareVer.toString()} + v${state?.softwareVer?.toString()} ${state?.debugStatus} - ${state?.devTypeVer.toString()} + ${state?.devTypeVer?.toString()}
@@ -1338,8 +1493,8 @@ def getCamHtml() { - ${state?.lastConnection.toString()} - ${state?.lastUpdatedDt.toString()} + ${state?.lastConnection?.toString()} + ${state?.lastUpdatedDt?.toString()} @@ -1347,16 +1502,17 @@ def getCamHtml() {
-
-

Swipe/Tap to Change Slide

-
+
+ -
- -
+ ${refreshBtnHtml} """ -/* """ */ incHtmlLoadCnt() render contentType: "text/html", data: mainHtml, status: 200 } catch (ex) { - log.error "getCamHtml Exception:", ex - exceptionDataHandler(ex.message, "getCamHtml") + log.error "getCamHtml Exception: ${ex?.message}", ex + exceptionDataHandler(ex?.message, "getCamHtml") + } +} + +def getDeviceTile(devNum) { + try { + def updateAvail = !state.updateAvailable ? "" : """
Device Update Available!
""" + def clientBl = state?.clientBl ? """
Your Manager client has been blacklisted!\nPlease contact the NST Manager developer to get the issue resolved!!!
""" : "" + def pubVidUrl = state?.public_share_url + def camHtml = (pubVidUrl && state?.camUUID && state?.isStreaming && state?.isOnline) ? showCamHtml(true) : hideCamHtml() + def mainHtml = """ + ${clientBl} + ${updateAvail} + ${getCamIframHtml()} +
+
+
+ ${camHtml} +
+
+

Device Info

+ + + + + + + + + + ${state?.onlineStatus} + ${state?.apiStatus} + + +
Network StatusAPI Status
+
+
+ + + + + + + + + + + + + + + + +
Nest AwarePublic VideoMic Status
${state?.nestAwareActive == true ? "Active" : "Not Active"}${state?.publicShareEnabled?.toString()}${state?.audioInputEnabled?.toString()}
+
+
+ + + + + + + + + + + + + + +
FW VersionDebugDevice Type
v${state?.softwareVer?.toString()}${state?.debugStatus}${state?.devTypeVer?.toString()}
+
+
+ + + + + + + + + + + +
Last Online ChangeData Last Received
${state?.lastConnection?.toString()}${state?.lastUpdatedDt?.toString()}
+
+
+
+
+

Swipe/Drag to Change Slide

+
+
+
+
+ + """ + return mainHtml + } + catch (ex) { + log.error "getDeviceTile Exception: ${ex?.message}", ex + exceptionDataHandler(ex?.message, "getDeviceTile") } } -def showCamHtml() { +def showCamHtml(tile=false) { def pubVidUrl = state?.public_share_url if(!state?.camUUID) { getCamUUID(getPublicVidID()) } def camUUID = state?.camUUID @@ -1413,8 +1706,8 @@ def showCamHtml() { def camImgUrl = "${apiServer}/get_image?uuid=${camUUID}&width=410" def camPlaylistUrl = "https://${liveStreamURL}/nexus_aac/${camUUID}/playlist.m3u8" - def animationUrl = state?.animation_url ? getFileBase64(state?.animation_url, 'image', 'gif') : null - def pubSnapUrl = state?.snapshot_url ? getFileBase64(state?.snapshot_url, 'image', 'jpeg') : null + def animationUrl = state?.animation_url ?: null + def pubSnapUrl = state?.snapshot_url ?: null def vidBtn = (!state?.isStreaming || !liveStreamURL) ? "" : """
Live Video""" def imgBtn = (!state?.isStreaming || !pubSnapUrl) ? "" : """Still Image""" @@ -1423,10 +1716,10 @@ def showCamHtml() { def data = """
${androidDisclaimerMsg()} -
-
+
+

Last Camera Event

- +
@@ -1438,8 +1731,8 @@ def showCamHtml() {
-
- +
+
@@ -1457,9 +1750,9 @@ def showCamHtml() {
-
+

Still Image

-
+
""" : "" + def schedData = state?.curAutoSchedData + def schedHtml = "" + if(schedData) { + schedHtml = """ +
+

Automation Schedule

+
@@ -1500,4 +1793,4 @@ def hideCamHtml() { private def textDevName() { return "Nest Camera${appDevName()}" } private def appDevType() { return false } -private def appDevName() { return appDevType() ? " (Dev)" : "" } \ No newline at end of file +private def appDevName() { return appDevType() ? " (Dev)" : "" } diff --git a/devicetypes/tonesto7/nest-presence.src/nest-presence.groovy b/devicetypes/tonesto7/nest-presence.src/nest-presence.groovy index 844dce35f..7742e0bc0 100644 --- a/devicetypes/tonesto7/nest-presence.src/nest-presence.groovy +++ b/devicetypes/tonesto7/nest-presence.src/nest-presence.groovy @@ -3,7 +3,7 @@ * Author: Anthony S. (@tonesto7) * Co-Authors: Ben W. (@desertBlade), Eric S. (@E_Sch) * - * Copyright (C) 2017 Anthony S., Ben W. + * Copyright (C) 2017, 2018, 2019 Anthony S., Ben W. * Licensing Info: Located at https://raw.githubusercontent.com/tonesto7/nest-manager/master/LICENSE.md */ @@ -11,7 +11,7 @@ import java.text.SimpleDateFormat preferences { } -def devVer() { return "5.2.0" } +def devVer() { return "5.4.4" } // for the UI metadata { @@ -57,19 +57,20 @@ metadata { state("default", label: 'Data Last Received:\n${currentValue}') } valueTile("apiStatus", "device.apiStatus", width: 2, height: 1, decoration: "flat", wordWrap: true) { - state "ok", label: "API Status:\nOK" - state "issue", label: "API Status:\nISSUE ", backgroundColor: "#FFFF33" + state "Good", label: "API Status:\nOK" + state "Sporadic", label: "API Status:\nISSUE ", backgroundColor: "#FFFF33" + state "Outage", label: "API Status:\nISSUE ", backgroundColor: "#FFFF33" } standardTile("refresh", "device.refresh", width:2, height:2, decoration: "flat") { state "default", action:"refresh.refresh", icon:"https://raw.githubusercontent.com/tonesto7/nest-manager/master/Images/Devices/refresh_icon.png" } valueTile("devTypeVer", "device.devTypeVer", width: 2, height: 1, decoration: "flat") { - state("default", label: 'Device Type:\nv${currentValue}') + state("default", label: 'Device Type:\nv${currentValue}', defaultState: true) } - htmlTile(name:"html", action: "getHtml", width: 6, height: 4, whitelist: ["raw.githubusercontent.com", "cdn.rawgit.com"]) + // htmlTile(name:"html", action: "getHtml", width: 6, height: 4, whitelist: ["raw.githubusercontent.com", "cdn.rawgit.com"]) main ("presence") - details ("presence", "nestPresence", "refresh", "html") + details ("presence", "nestPresence", "lastUpdateDt", "apiStatus", "devTypeVer", "refresh") } } @@ -79,8 +80,7 @@ mappings { void installed() { Logger("installed...") - initialize() - state?.isInstalled = true + runIn(5, "initialize", [overwrite: true]) } def initialize() { @@ -89,6 +89,7 @@ def initialize() { if (!state.updatedLastRanAt || now() >= state.updatedLastRanAt + 2000) { state.updatedLastRanAt = now() verifyHC() + state?.isInstalled = true } else { log.trace "initialize(): Ran within last 2 seconds - SKIPPING" } @@ -96,7 +97,7 @@ def initialize() { void updated() { Logger("updated...") - initialize() + runIn(5, "initialize", [overwrite: true]) } def useTrackedHealth() { return state?.useTrackedHealth ?: false } @@ -130,9 +131,7 @@ def modifyDeviceStatus(status) { def ping() { Logger("ping...") -// if(useTrackedHealth()) { - keepAwakeEvent() -// } + keepAwakeEvent() } def keepAwakeEvent() { @@ -193,20 +192,19 @@ def processEvent(data) { def eventData = data?.evt state.remove("eventData") //log.trace("processEvent Parsing data ${eventData}") - try { +// try { LogAction("------------START OF API RESULTS DATA------------", "warn") if(eventData) { state.isBeta = eventData?.isBeta == true ? true : false state.hcRepairEnabled = eventData?.hcRepairEnabled == true ? true : false state.showLogNamePrefix = eventData?.logPrefix == true ? true : false state.enRemDiagLogging = eventData?.enRemDiagLogging == true ? true : false - state.healthMsg = eventData?.healthNotify == true ? true : false -// if(useTrackedHealth()) { - if(eventData.hcTimeout && (state?.hcTimeout != eventData?.hcTimeout || !state?.hcTimeout)) { - state.hcTimeout = eventData?.hcTimeout - verifyHC() - } -// } + state.healthMsg = eventData?.healthNotify?.healthMsg == true ? true : false + state.healthMsgWait = eventData?.healthNotify?.healthMsgWait + if(eventData.hcTimeout && (state?.hcTimeout != eventData?.hcTimeout || !state?.hcTimeout)) { + state.hcTimeout = eventData?.hcTimeout + verifyHC() + } state.nestTimeZone = eventData?.tz ?: null state.clientBl = eventData?.clientBl == true ? true : false state.mobileClientType = eventData?.mobileClientType @@ -215,11 +213,11 @@ def processEvent(data) { presenceEvent(eventData?.pres) apiStatusEvent((!eventData?.apiIssues ? false : true)) deviceVerEvent(eventData?.latestVer.toString()) - if(eventData?.allowDbException) { state?.allowDbException = eventData?.allowDbException = false ? false : true } + if(eventData?.allowDbException) { state?.allowDbException = eventData?.allowDbException == false ? false : true } lastUpdatedEvent(true) - if(eventData?.lastStrucDataUpd) { - def newDt = formatDt(Date.parse("E MMM dd HH:mm:ss z yyyy", eventData?.lastStrucDataUpd?.toString())) + if(eventData?.lastStrDataUpd) { + def newDt = formatDt(Date.parse("E MMM dd HH:mm:ss z yyyy", eventData?.lastStrDataUpd?.toString())) //log.debug "newDt: $newDt" def curDt = Date.parse("E MMM dd HH:mm:ss z yyyy", getDtNow()) def lastDt = Date.parse("E MMM dd HH:mm:ss z yyyy", newDt?.toString()) @@ -234,17 +232,20 @@ def processEvent(data) { //This will return all of the devices state data to the logs. //log.debug "Device State Data: ${getState()}" return null - } +/* } catch (ex) { log.error "generateEvent Exception:", ex - exceptionDataHandler(ex.message, "generateEvent") + exceptionDataHandler(ex?.message, "generateEvent") } +*/ } def getDataByName(String name) { state[name] ?: device.getDataValue(name) } +def getDevTypeId() { return device?.getTypeId() } + def getDeviceStateData() { return getState() } @@ -337,8 +338,7 @@ def presenceEvent(presence) { def apiStatusEvent(issue) { def curStat = device.currentState("apiStatus")?.value - def newStat = issue ? "issue" : "ok" - state?.apiStatus = newStat + def newStat = issue if(isStateChange(device, "apiStatus", newStat.toString())) { Logger("UPDATED | API Status is: (${newStat}) | Original State: (${curStat})") sendEvent(name: "apiStatus", value: newStat, descriptionText: "API Status is: ${newStat}", displayed: true, isStateChange: true, state: newStat) @@ -363,7 +363,8 @@ def healthNotifyOk() { def lastDt = state?.lastHealthNotifyDt if(lastDt) { def ldtSec = getTimeDiffSeconds(lastDt) - if(ldtSec < 600) { + def t0 = state?.healthMsgWait ?: 3600 + if(ldtSec < t0) { return false } } @@ -393,7 +394,7 @@ void setPresence() { } catch (ex) { log.error "setPresence Exception:", ex - exceptionDataHandler(ex.message, "setPresence") + exceptionDataHandler(ex?.message, "setPresence") } } @@ -405,7 +406,7 @@ void setAway() { } catch (ex) { log.error "setAway Exception:", ex - exceptionDataHandler(ex.message, "setAway") + exceptionDataHandler(ex?.message, "setAway") } } @@ -417,7 +418,7 @@ void setHome() { } catch (ex) { log.error "setHome Exception:", ex - exceptionDataHandler(ex.message, "setHome") + exceptionDataHandler(ex?.message, "setHome") } } @@ -425,29 +426,30 @@ void setHome() { | LOGGING FUNCTIONS | *************************************************************************************************/ void Logger(msg, logType = "debug") { - def smsg = state?.showLogNamePrefix ? "${device.displayName}: ${msg}" : "${msg}" - switch (logType) { - case "trace": - log.trace "${smsg}" - break - case "debug": - log.debug "${smsg}" - break - case "info": - log.info "${smsg}" - break - case "warn": - log.warn "${smsg}" - break - case "error": - log.error "${smsg}" - break - default: - log.debug "${smsg}" - break - } + def smsg = state?.showLogNamePrefix ? "${device.displayName} (v${devVer()}) | ${msg}" : "${msg}" if(state?.enRemDiagLogging) { parent.saveLogtoRemDiagStore(smsg, logType, "Presence") + } else { + switch (logType) { + case "trace": + log.trace "${smsg}" + break + case "debug": + log.debug "${smsg}" + break + case "info": + log.info "${smsg}" + break + case "warn": + log.warn "${smsg}" + break + case "error": + log.error "${smsg}" + break + default: + log.debug "${smsg}" + break + } } } @@ -499,7 +501,6 @@ def getTimeDiffSeconds(strtDate, stpDate=null, methName=null) { //LogTrace("[GetTimeDiffSeconds] StartDate: $strtDate | StopDate: ${stpDate ?: "Not Sent"} | MethodName: ${methName ?: "Not Sent"})") try { if(strtDate) { - //if(strtDate?.contains("dtNow")) { return 10000 } def now = new Date() def stopVal = stpDate ? stpDate.toString() : getDtNow() def startDt = Date.parse("E MMM dd HH:mm:ss z yyyy", strtDate) @@ -515,42 +516,26 @@ def getTimeDiffSeconds(strtDate, stpDate=null, methName=null) { } } -def getFileBase64(url,preType,fileType) { - def params = [ - uri: url, - contentType: '$preType/$fileType' - ] +def getFileBase64(url, preType, fileType) { + def params = [uri: url, contentType: "$preType/$fileType"] httpGet(params) { resp -> - if(resp.data) { - def respData = resp?.data - ByteArrayOutputStream bos = new ByteArrayOutputStream() - int len - int size = 4096 - byte[] buf = new byte[size] - while ((len = respData.read(buf, 0, size)) != -1) - bos.write(buf, 0, len) - buf = bos.toByteArray() - //log.debug "buf: $buf" - String s = buf?.encodeBase64() - //log.debug "resp: ${s}" - return s ? "data:${preType}/${fileType};base64,${s.toString()}" : null + if(resp?.status == 200) { + if(resp.data) { + def respData = resp?.data + byte[] byteData = resp?.data?.getBytes() + String enc = byteData?.encodeBase64() + // log.debug "enc: ${enc}" + return enc ? "data:${preType}/${fileType};base64,${enc?.toString()}" : null + } + } else { + LogAction("getFileBase64 Resp: ${resp?.status} ${url}", "error") + exceptionDataHandler("resp ${ex?.response?.status} ${url}", "getFileBase64") + return null } } } -def getCssData() { - def cssData = null - def htmlInfo = state?.htmlInfo - if(htmlInfo?.cssUrl && htmlInfo?.cssVer) { - cssData = getFileBase64(htmlInfo.cssUrl, "text", "css") - state?.cssVer = htmlInfo?.cssVer - } else { - cssData = getFileBase64(cssUrl(), "text", "css") - } - return cssData -} - -def cssUrl() { return "https://raw.githubusercontent.com/tonesto7/nest-manager/master/Documents/css/ST-HTML.min.css" } +def hasHtml() { return false } def getHtml() { try { @@ -568,7 +553,7 @@ def getHtml() { - + ${clientBl} @@ -581,10 +566,10 @@ def getHtml() { } catch (ex) { log.error "getHtml Exception:", ex - exceptionDataHandler(ex.message, "getHtml") + exceptionDataHandler(ex?.message, "getHtml") } } -private def textDevName() { return "Nest Presence${appDevName()}" } -private def appDevType() { return false } -private def appDevName() { return appDevType() ? " (Dev)" : "" } \ No newline at end of file +private def textDevName() { return "Nest Presence${appDevName()}" } +private def appDevType() { return false } +private def appDevName() { return appDevType() ? " (Dev)" : "" } diff --git a/devicetypes/tonesto7/nest-protect.src/nest-protect.groovy b/devicetypes/tonesto7/nest-protect.src/nest-protect.groovy index 8d7ac635e..363e34a53 100644 --- a/devicetypes/tonesto7/nest-protect.src/nest-protect.groovy +++ b/devicetypes/tonesto7/nest-protect.src/nest-protect.groovy @@ -3,7 +3,7 @@ * Author: Anthony S. (@tonesto7) * Co-Authors: Ben W. (@desertblade), Eric S. (@E_Sch) * - * Copyright (C) 2017 Anthony S. + * Copyright (C) 2017, 2018, 2019 Anthony S. * Licensing Info: Located at https://raw.githubusercontent.com/tonesto7/nest-manager/master/LICENSE.md */ @@ -11,10 +11,10 @@ import java.text.SimpleDateFormat preferences { } -def devVer() { return "5.2.0" } +def devVer() { return "5.4.3" } metadata { - definition (name: "${textDevName()}", author: "Anthony S.", namespace: "tonesto7") { + definition (name: "${textDevName()}", author: "Anthony S.", namespace: "tonesto7", ocfDeviceType: "x.com.st.d.sensor.smoke", vid: "generic-smoke-co") { //capability "Polling" capability "Actuator" capability "Sensor" @@ -110,7 +110,7 @@ metadata { valueTile("uiColor", "device.uiColor", inactiveLabel: false, width: 2, height: 1, decoration: "flat", wordWrap: true) { state("default", label: 'UI Color:\n${currentValue}') } - valueTile("softwareVer", "device.softwareVer", inactiveLabel: false, width: 2, height: 1, decoration: "flat", wordWrap: true) { + valueTile("softwareVer", "device.softwareVer", inactiveLabel: false, width: 3, height: 1, decoration: "flat", wordWrap: true) { state("default", label: 'Firmware:\nv${currentValue}') } valueTile("lastConnection", "device.lastConnection", inactiveLabel: false, width: 3, height: 1, decoration: "flat", wordWrap: true) { @@ -122,24 +122,29 @@ metadata { standardTile("refresh", "device.refresh", width:2, height:2, decoration: "flat") { state "default", action:"refresh.refresh", icon:"https://raw.githubusercontent.com/tonesto7/nest-manager/master/Images/Devices/refresh_icon.png" } - valueTile("lastUpdatedDt", "device.lastUpdatedDt", width: 4, height: 1, decoration: "flat", wordWrap: true) { + valueTile("lastUpdatedDt", "device.lastUpdatedDt", width: 3, height: 1, decoration: "flat", wordWrap: true) { state("default", label: 'Data Last Received:\n${currentValue}') } - valueTile("devTypeVer", "device.devTypeVer", width: 2, height: 1, decoration: "flat") { - state("default", label: 'Device Type:\nv${currentValue}') + valueTile("devTypeVer", "device.devTypeVer", width: 3, height: 1, decoration: "flat") { + state("default", label: 'Device Type:\nv${currentValue}', defaultState: true) } valueTile("apiStatus", "device.apiStatus", width: 2, height: 1, decoration: "flat", wordWrap: true) { - state "ok", label: "API Status:\nOK" - state "issue", label: "API Status:\nISSUE ", backgroundColor: "#FFFF33" + state "Good", label: "API Status:\nOK" + state "Sporadic", label: "API Status:\nISSUE ", backgroundColor: "#FFFF33" + state "Outage", label: "API Status:\nISSUE ", backgroundColor: "#FFFF33" } valueTile("debugOn", "device.debugOn", width: 2, height: 1, decoration: "flat") { state "true", label: 'Debug:\n${currentValue}' state "false", label: 'Debug:\n${currentValue}' } + valueTile("remind", "device.blah", inactiveLabel: false, width: 6, height: 2, decoration: "flat", wordWrap: true) { + state("default", label: 'Reminder:\nHTML Content is Available in SmartApp', defaultState: true) + } htmlTile(name:"devInfoHtml", action: "getInfoHtml", width: 6, height: 8) main "main2" - details(["alarmState", "devInfoHtml", "refresh"]) + // details(["alarmState", "devInfoHtml","remind", "refresh"]) + details(["alarmState", "smoke", "batteryState", "carbonMonoxide", "onlineStatus","debugOn", "apiStatus", "lastConnection", "lastUpdatedDt", "lastTested","devTypeVer", "softwareVer","remind", "refresh"]) } } @@ -153,7 +158,7 @@ def initialize() { if (!state.updatedLastRanAt || now() >= state.updatedLastRanAt + 2000) { state.updatedLastRanAt = now() verifyHC() - //poll() + state?.isInstalled = true } else { log.trace "initialize(): Ran within last 2 seconds - SKIPPING" } @@ -161,13 +166,12 @@ def initialize() { void installed() { Logger("installed...") - initialize() - state?.isInstalled = true + runIn(5, "initialize", [overwrite: true]) } void updated() { Logger("updated...") - initialize() + runIn(5, "initialize", [overwrite: true]) } def useTrackedHealth() { return state?.useTrackedHealth ?: false } @@ -175,7 +179,7 @@ def useTrackedHealth() { return state?.useTrackedHealth ?: false } def getHcTimeout() { def toBatt = state?.hcBattTimeout def toWire = state?.hcWireTimeout - return ((device.currentValue("powerSourceNest") == "wired") ? (toWire instanceof Integer ? toWire : 35) : (toBatt instanceof Integer ? toBatt : 1500))*60 + return ((device.currentValue("powerSourceNest") == "wired") ? (toWire instanceof Integer ? toWire : 45) : (toBatt instanceof Integer ? toBatt : 1500))*60 } void verifyHC() { @@ -201,10 +205,8 @@ def modifyDeviceStatus(status) { } def ping() { -// if(useTrackedHealth()) { - Logger("ping...") - keepAwakeEvent() -// } + Logger("ping...") + keepAwakeEvent() } def keepAwakeEvent() { @@ -254,7 +256,7 @@ void runSmokeTest() { schedEndTest() } catch (ex) { log.error "runSmokeTest Exception:", ex - exceptionDataHandler(ex.message, "runSmokeTest") + exceptionDataHandler(ex?.message, "runSmokeTest") } } @@ -267,7 +269,7 @@ void runCoTest() { schedEndTest() } catch (ex) { log.error "runCoTest Exception:", ex - exceptionDataHandler(ex.message, "runCoTest") + exceptionDataHandler(ex?.message, "runCoTest") } } @@ -280,7 +282,7 @@ void runBatteryTest() { schedEndTest() } catch (ex) { log.error "runBatteryTest Exception:", ex - exceptionDataHandler(ex.message, "runBatteryTest") + exceptionDataHandler(ex?.message, "runBatteryTest") } } @@ -290,7 +292,7 @@ void schedEndTest() { refresh() // this typically takes more than 5 seconds to complete } catch (ex) { log.error "schedEndTest Exception:", ex - exceptionDataHandler(ex.message, "schedEndTest") + exceptionDataHandler(ex?.message, "schedEndTest") } } @@ -302,7 +304,7 @@ void endTest() { refresh() } catch (ex) { log.error "endTest Exception:", ex - exceptionDataHandler(ex.message, "endTest") + exceptionDataHandler(ex?.message, "endTest") } } @@ -326,7 +328,7 @@ def processEvent(data) { state.remove("eventData") //log.trace("processEvent Parsing data ${eventData}") - try { +// try { LogAction("------------START OF API RESULTS DATA------------", "warn") if(eventData) { def results = eventData?.data @@ -335,14 +337,13 @@ def processEvent(data) { state.restStreaming = eventData?.restStreaming == true ? true : false state.showLogNamePrefix = eventData?.logPrefix == true ? true : false state.enRemDiagLogging = eventData?.enRemDiagLogging == true ? true : false - state.healthMsg = eventData?.healthNotify == true ? true : false -// if(useTrackedHealth()) { - if((eventData.hcBattTimeout && (state?.hcBattTimeout != eventData?.hcBattTimeout || !state?.hcBattTimeout)) || (eventData.hcWireTimeout && (state?.hcWireTimeout != eventData?.hcWireTimeout || !state?.hcWireTimeout))) { - state.hcBattTimeout = eventData?.hcBattTimeout - state.hcWireTimeout = eventData?.hcWireTimeout - verifyHC() - } -// } + state.healthMsg = eventData?.healthNotify?.healthMsg == true ? true : false + state.healthMsgWait = eventData?.healthNotify?.healthMsgWait + if((eventData.hcBattTimeout && (state?.hcBattTimeout != eventData?.hcBattTimeout || !state?.hcBattTimeout)) || (eventData.hcWireTimeout && (state?.hcWireTimeout != eventData?.hcWireTimeout || !state?.hcWireTimeout))) { + state.hcBattTimeout = eventData?.hcBattTimeout + state.hcWireTimeout = eventData?.hcWireTimeout + verifyHC() + } state?.useMilitaryTime = eventData?.mt ? true : false state.clientBl = eventData?.clientBl == true ? true : false state.mobileClientType = eventData?.mobileClientType @@ -361,19 +362,19 @@ def processEvent(data) { softwareVerEvent(results?.software_version.toString()) deviceVerEvent(eventData?.latestVer.toString()) state?.devBannerData = eventData?.devBannerData ?: null - if(eventData?.htmlInfo) { state?.htmlInfo = eventData?.htmlInfo } - if(eventData?.allowDbException) { state?.allowDbException = eventData?.allowDbException = false ? false : true } + if(eventData?.allowDbException) { state?.allowDbException = eventData?.allowDbException == false ? false : true } determinePwrSrc() - lastUpdatedEvent() + lastUpdatedEvent(true) checkHealth() } return null - } +/* } catch (ex) { log.error "generateEvent Exception:", ex - exceptionDataHandler(ex.message, "generateEvent") + exceptionDataHandler(ex?.message, "generateEvent") } +*/ } def getDtNow() { @@ -410,6 +411,7 @@ def getTimeDiffSeconds(strtDate, stpDate=null, methName=null) { def getStateSize() { return state?.toString().length() } def getStateSizePerc() { return (int) ((stateSize/100000)*100).toDouble().round(0) } +def getDevTypeId() { return device?.getTypeId() } def getDataByName(String name) { state[name] ?: device.getDataValue(name) @@ -472,8 +474,6 @@ def lastCheckinEvent(checkin, isOnline) { tf.setTimeZone(getTimeZone()) def lastChk = device.currentState("lastConnection")?.value - def lastConnSeconds = lastChk ? getTimeDiffSeconds(lastChk) : 9000 // try not to disrupt running average for pwr determination - def prevOnlineStat = device.currentState("onlineStatus")?.value def hcTimeout = getHcTimeout() @@ -482,11 +482,6 @@ def lastCheckinEvent(checkin, isOnline) { def curConnSeconds = (checkin && curConnFmt != "Not Available") ? getTimeDiffSeconds(curConnFmt) : 3000 def onlineStat = isOnline.toString() == "true" ? "online" : "offline" - LogAction("lastCheckinEvent($checkin, $isOnline) | onlineStatus: $onlineStat | lastConnSeconds: $lastConnSeconds | hcTimeout: ${hcTimeout} | curConnSeconds: ${curConnSeconds}") - if(hcTimeout && isOnline.toString() == "true" && curConnSeconds > hcTimeout && lastConnSeconds > hcTimeout) { - onlineStat = "offline" - LogAction("lastCheckinEvent: UPDATED onlineStatus: $onlineStat") - } state?.lastConnection = curConn?.toString() if(isStateChange(device, "lastConnection", curConnFmt.toString())) { @@ -495,6 +490,17 @@ def lastCheckinEvent(checkin, isOnline) { if(lastConnSeconds >= 0 && onlineStat == "online") { addCheckinTime(lastConnSeconds) } } else { LogAction("Last Nest Check-in was: (${curConnFmt}) | Original State: (${lastChk})") } + lastChk = device.currentState("lastConnection")?.value + def lastConnSeconds = lastChk ? getTimeDiffSeconds(lastChk) : 9000 // try not to disrupt running average for pwr determination + + if(hcTimeout && isOnline.toString() == "true" && curConnSeconds > hcTimeout && lastConnSeconds > hcTimeout) { + onlineStat = "offline" + LogAction("lastCheckinEvent: UPDATED onlineStatus: $onlineStat") + Logger("lastCheckinEvent($checkin, $isOnline) | onlineStatus: $onlineStat | lastConnSeconds: $lastConnSeconds | hcTimeout: ${hcTimeout} | curConnSeconds: ${curConnSeconds}") + } else { + LogAction("lastCheckinEvent($checkin, $isOnline) | onlineStatus: $onlineStat | lastConnSeconds: $lastConnSeconds | hcTimeout: ${hcTimeout} | curConnSeconds: ${curConnSeconds}") + } + state?.onlineStatus = onlineStat modifyDeviceStatus(onlineStat) if(isStateChange(device, "onlineStatus", onlineStat.toString())) { @@ -526,16 +532,16 @@ def addCheckinTime(val) { def determinePwrSrc() { if(!state?.checkinTimeList) { state?.checkinTimeList = [] } def checkins = state?.checkinTimeList - def checkinAvg = checkins?.size() ? (checkins?.sum()/checkins?.size()).toDouble().round(0).toInteger() : null // + def checkinAvg = checkins?.size() ? ( checkins?.sum()?.div(checkins?.size()))?.toDouble()?.round(0).toInteger() : null if(checkins?.size() > 7) { if(checkinAvg && checkinAvg < 10000) { powerTypeEvent(true) - } else { powerTypeEvent(false) } + } else { powerTypeEvent() } } //log.debug "checkins: $checkins | Avg: $checkinAvg" } -def powerTypeEvent(wired) { +def powerTypeEvent(wired=false) { def curVal = device.currentState("powerSourceNest")?.value def newValSt = wired == true ? "wired" : "battery" def newVal = wired == true ? "mains" : "battery" @@ -583,7 +589,7 @@ def debugOnEvent(debug) { def apiStatusEvent(issue) { def curStat = device.currentState("apiStatus")?.value - def newStat = issue ? "Has Issue" : "Good" + def newStat = issue state?.apiStatus = newStat if(isStateChange(device, "apiStatus", newStat.toString())) { Logger("UPDATED | API Status is: (${newStat.toString().capitalize()}) | Original State: (${curStat.toString().capitalize()})") @@ -680,7 +686,8 @@ def healthNotifyOk() { def lastDt = state?.lastHealthNotifyDt if(lastDt) { def ldtSec = getTimeDiffSeconds(lastDt) - if(ldtSec < 600) { + def t0 = state?.healthMsgWait ?: 3600 + if(ldtSec < t0) { return false } } @@ -705,30 +712,31 @@ def lastN(String input, n) { } void Logger(msg, logType = "debug") { - def smsg = state?.showLogNamePrefix ? "${device.displayName}: ${msg}" : "${msg}" - switch (logType) { - case "trace": - log.trace "${smsg}" - break - case "debug": - log.debug "${smsg}" - break - case "info": - log.info "${smsg}" - break - case "warn": - log.warn "${smsg}" - break - case "error": - log.error "${smsg}" - break - default: - log.debug "${smsg}" - break - } + def smsg = state?.showLogNamePrefix ? "${device.displayName} (v${devVer()}) | ${msg}" : "${msg}" def theId = lastN(device.getId().toString(),5) if(state?.enRemDiagLogging) { parent.saveLogtoRemDiagStore(smsg, logType, "Protect-${theId}") + } else { + switch (logType) { + case "trace": + log.trace "${smsg}" + break + case "debug": + log.debug "${smsg}" + break + case "info": + log.info "${smsg}" + break + case "warn": + log.warn "${smsg}" + break + case "error": + log.error "${smsg}" + break + default: + log.debug "${smsg}" + break + } } } @@ -759,48 +767,48 @@ def getMetricCntData() { return [protHtmlLoadCnt:(state?.htmlLoadCnt ?: 0)]//, protInfoBtnTapCnt:(state?.infoBtnTapCnt ?: 0)] } -def getCarbonImg() { +def getCarbonImg(b64=true) { def carbonVal = device.currentState("nestCarbonMonoxide")?.value //values in ST are tested, clear, detected //values from nest are ok, warning, emergency def img = "" - def caption = "${carbonVal?.toString().toUpperCase()}" + def caption = "${carbonVal ? carbonVal?.toString().toUpperCase() : ""}" def captionClass = "" switch(carbonVal) { case "warning": - img = getFileBase64(getImg("co2_warn_status.png"), "image", "png") + img = getImg("co2_warn_status.png") captionClass = "alarmWarnCap" break case "emergency": - img = getFileBase64(getImg("co2_emergency_status.png"), "image", "png") + img = getImg("co2_emergency_status.png") captionClass = "alarmEmerCap" break default: - img = getFileBase64(getImg("co2_clear_status.png"), "image", "png") + img = getImg("co2_clear_status.png") captionClass = "alarmClearCap" break } return ["img":img, "caption": caption, "captionClass":captionClass] } -def getSmokeImg() { +def getSmokeImg(b64=true) { def smokeVal = device.currentState("nestSmoke")?.value //values in ST are tested, clear, detected //values from nest are ok, warning, emergency def img = "" - def caption = "${smokeVal?.toString().toUpperCase()}" + def caption = "${smokeVal ? smokeVal?.toString().toUpperCase() : ""}" def captionClass = "" switch(smokeVal) { case "warning": - img = getFileBase64(getImg("smoke_warn_status.png"), "image", "png") + img = getImg("smoke_warn_status.png") captionClass = "alarmWarnCap" break case "emergency": - img = getFileBase64(getImg("smoke_emergency_status.png"), "image", "png") + img = getImg("smoke_emergency_status.png") captionClass = "alarmEmerCap" break default: - img = getFileBase64(getImg("smoke_clear_status.png"), "image", "png") + img = getImg("smoke_clear_status.png") captionClass = "alarmClearCap" break } @@ -843,47 +851,28 @@ def devVerInfo() { return getWebData([uri: "https://raw.githubusercontent.com/${ def getFileBase64(url, preType, fileType) { try { - def params = [ - uri: url, - contentType: '$preType/$fileType' - ] + def params = [uri: url, contentType: "$preType/$fileType"] httpGet(params) { resp -> - if(resp.data) { - def respData = resp?.data - ByteArrayOutputStream bos = new ByteArrayOutputStream() - int len - int size = 4096 - byte[] buf = new byte[size] - while ((len = respData.read(buf, 0, size)) != -1) - bos.write(buf, 0, len) - buf = bos.toByteArray() - //log.debug "buf: $buf" - String s = buf?.encodeBase64() - //log.debug "resp: ${s}" - return s ? "data:${preType}/${fileType};base64,${s.toString()}" : null + if(resp?.status == 200) { + if(resp.data) { + def respData = resp?.data + byte[] byteData = resp?.data?.getBytes() + String enc = byteData?.encodeBase64() + // log.debug "enc: ${enc}" + return enc ? "data:${preType}/${fileType};base64,${enc?.toString()}" : null + } + } else { + LogAction("getFileBase64 Resp: ${resp?.status} ${url}", "error") + exceptionDataHandler("resp ${ex?.response?.status} ${url}", "getFileBase64") + return null } } - } - catch (ex) { + } catch (ex) { log.error "getFileBase64 Exception:", ex - exceptionDataHandler(ex.message, "getFileBase64") - } -} - -def getCssData() { - def cssData = null - def htmlInfo = state?.htmlInfo - if(htmlInfo?.cssUrl && htmlInfo?.cssVer) { - cssData = getFileBase64(htmlInfo.cssUrl, "text", "css") - state?.cssVer = htmlInfo?.cssVer - } else { - cssData = getFileBase64(cssUrl(), "text", "css") + exceptionDataHandler(ex?.message, "getFileBase64") } - return cssData } -def cssUrl() { return "https://raw.githubusercontent.com/tonesto7/nest-manager/master/Documents/css/ST-HTML.min.css" } - def disclaimerMsg() { if(!state?.disclaimerMsgShown) { state.disclaimerMsgShown = true @@ -903,7 +892,7 @@ def getChgLogHtml() { if(!state?.shownChgLog == true) { chgStr = """ - + - - - - + + + + ${getChgLogHtml()} @@ -1072,10 +1060,114 @@ def getInfoHtml() { } catch (ex) { log.error "getInfoHtml Exception:", ex - exceptionDataHandler(ex.message, "getInfoHtml") + exceptionDataHandler(ex?.message, "getInfoHtml") } } +def getDeviceTile(devNum) { + try { + def battImg = (state?.battVal == "replace") ? """""" : """""" + + def testVal = device.currentState("isTesting")?.value + def testModeHTML = (testVal.toString() == "true") ? "

Test Mode

" : "" + def updateAvail = !state.updateAvailable ? "" : """
Device Update Available!
""" + def clientBl = state?.clientBl ? """
Your Manager client has been blacklisted!\nPlease contact the Nest Manager developer to get the issue resolved!!!
""" : "" + + def smokeImg = getSmokeImg(false) + def carbonImg = getCarbonImg(false) + def html = """ + ${testModeHTML} + ${clientBl} + ${updateAvail} +
+
+

Alarm Status

+ + + + + + + + + + + + + +
Smoke DetectorCarbon Monoxide
+ + ${smokeImg?.caption} + + + ${carbonImg?.caption} +
+
+
+
+

Device Info

+ + + + + + + + + + + + ${state?.onlineStatus.toString().capitalize()} + + ${state?.apiStatus} + + +
Network StatusPower TypeAPI Status
${state?.powerSource != null ? state?.powerSource.toString().capitalize() : "Not Available Yet"}
+
+
+ + + + + + + + + + + + + + + + +
Firmware VersionDebugDevice Type
v${state?.softwareVer.toString()}${state?.debugStatus}${state?.devTypeVer.toString()}
+
+
+ + + + + + + + + + + +
Last Check-InData Last Received
${state?.lastConnection.toString()}${state?.lastUpdatedDt.toString()}
+
+
+ """ + return html + } + catch (ex) { + log.error "getDeviceTile Exception:", ex + exceptionDataHandler(ex?.message, "getInfoHtml") + } +} + + private def textDevName() { return "Nest Protect${appDevName()}" } private def appDevType() { return false } -private def appDevName() { return appDevType() ? " (Dev)" : "" } \ No newline at end of file +private def appDevName() { return appDevType() ? " (Dev)" : "" } diff --git a/devicetypes/tonesto7/nest-thermostat.src/nest-thermostat.groovy b/devicetypes/tonesto7/nest-thermostat.src/nest-thermostat.groovy index e5508d2a8..9f1391b6e 100644 --- a/devicetypes/tonesto7/nest-thermostat.src/nest-thermostat.groovy +++ b/devicetypes/tonesto7/nest-thermostat.src/nest-thermostat.groovy @@ -6,29 +6,23 @@ * Graphing Modeled on code from Andreas Amann (@ahndee) * * Modeled after the EcoBee thermostat under Templates in the IDE - * Copyright (C) 2017 Anthony S. + * Copyright (C) 2017, 2018, 2019 Anthony S. * Licensing Info: Located at https://raw.githubusercontent.com/tonesto7/nest-manager/master/LICENSE.md */ import java.text.SimpleDateFormat import groovy.time.* -def devVer() { return "5.2.0" } +def devVer() { return "5.4.6" } // for the UI metadata { - definition (name: "${textDevName()}", namespace: "tonesto7", author: "Anthony S.") { + definition (name: "${textDevName()}", namespace: "tonesto7", author: "Anthony S.", vid: "SmartThings-smartthings-Z-Wave_Thermostat", ocfDeviceType: "oic.d.thermostat") { capability "Actuator" capability "Relative Humidity Measurement" capability "Refresh" capability "Sensor" capability "Thermostat" - capability "Thermostat Cooling Setpoint" - capability "Thermostat Fan Mode" - capability "Thermostat Heating Setpoint" - capability "Thermostat Mode" - capability "Thermostat Operating State" - capability "Thermostat Setpoint" capability "Temperature Measurement" capability "Health Check" @@ -60,7 +54,10 @@ metadata { command "updateNestReportData" command "ecoDesc", ["string"] command "whoMadeChanges", ["string", "string", "string"] + command "setNestEta", ["string", "string", "string"] + command "cancelNestEta", ["string"] + attribute "etaBegin", "string" attribute "devVer", "string" attribute "temperatureUnit", "string" attribute "targetTemp", "string" @@ -95,6 +92,7 @@ metadata { attribute "sunlightCorrectionActive", "string" attribute "timeToTarget", "string" attribute "nestType", "string" + attribute "usingEmergencyHeat", "string" attribute "pauseUpdates", "string" attribute "nestReportData", "string" attribute "previousthermostatMode", "string" @@ -102,6 +100,7 @@ metadata { attribute "whoMadeChangesDesc", "string" attribute "whoMadeChangesDescDt", "string" attribute "whoSetEcoMode", "string" + attribute "temperatureur", "string" } simulator { @@ -111,20 +110,20 @@ metadata { tiles(scale: 2) { multiAttributeTile(name:"temperature", type:"thermostat", width:6, height:4, canChangeIcon: true) { tileAttribute("device.temperature", key: "PRIMARY_CONTROL") { - attributeState("default", label:'${currentValue}°') + attributeState("temperature", label:'${currentValue}\u00b0') } tileAttribute("device.temperature", key: "VALUE_CONTROL") { - attributeState("default", action: "levelUpDown") + // attributeState("default", action: "levelUpDown") attributeState("VALUE_UP", action: "levelUp") attributeState("VALUE_DOWN", action: "levelDown") } tileAttribute("device.humidity", key: "SECONDARY_CONTROL") { - attributeState("default", label:'${currentValue}%', unit:"%") + attributeState("humidity", label:'${currentValue}%', unit:"%", defaultState: true) } tileAttribute("device.thermostatOperatingState", key: "OPERATING_STATE") { attributeState("idle", backgroundColor:"#44B621") - attributeState("heating", backgroundColor:"#FFA81E") - attributeState("cooling", backgroundColor:"#2ABBF0") + attributeState("heating", backgroundColor:"#e86d13") + attributeState("cooling", backgroundColor:"#00a0dc") attributeState("fan only", backgroundColor:"#145D78") attributeState("pending heat", backgroundColor:"#B27515") attributeState("pending cool", backgroundColor:"#197090") @@ -146,50 +145,49 @@ metadata { } } valueTile("temp2", "device.temperature", width: 2, height: 2, decoration: "flat") { - state("default", label:'${currentValue}°', icon:"https://raw.githubusercontent.com/tonesto7/nest-manager/master/Images/App/nest_like.png", + state("default", label:'${currentValue}\u00b0', icon:"https://raw.githubusercontent.com/tonesto7/nest-manager/master/Images/App/nest_like.png", backgroundColors: getTempColors()) } - standardTile("thermostatMode", "device.nestThermostatMode", width:2, height:2, decoration: "flat") { - state("off", action:"changeMode", nextState: "updating", icon: "https://raw.githubusercontent.com/tonesto7/nest-manager/master/Images/Devices/off_btn_icon.png") - state("heat", action:"changeMode", nextState: "updating", icon: "https://raw.githubusercontent.com/tonesto7/nest-manager/master/Images/Devices/heat_btn_icon.png") - state("cool", action:"changeMode", nextState: "updating", icon: "https://raw.githubusercontent.com/tonesto7/nest-manager/master/Images/Devices/cool_btn_icon.png") - state("auto", action:"changeMode", nextState: "updating", icon: "https://raw.githubusercontent.com/tonesto7/nest-manager/master/Images/Devices/heat_cool_btn_icon.png") - state("eco", action:"changeMode", nextState: "updating", icon: "https://raw.githubusercontent.com/tonesto7/nest-manager/master/Images/Devices/eco_icon.png") + standardTile("thermostatMode", "device.nestThermostatMode", width: 2, height: 2, supportedStates: "device.supportedThermostatModes", decoration: "flat") { + state("off", action:"changeMode", nextState: "updating", icon: "https://raw.githubusercontent.com/tonesto7/nest-manager/master/Images/Devices/off_btn_icon.png") + state("heat", action:"changeMode", nextState: "updating", icon: "https://raw.githubusercontent.com/tonesto7/nest-manager/master/Images/Devices/heat_btn_icon.png") + state("cool", action:"changeMode", nextState: "updating", icon: "https://raw.githubusercontent.com/tonesto7/nest-manager/master/Images/Devices/cool_btn_icon.png") + state("auto", action:"changeMode", nextState: "updating", icon: "https://raw.githubusercontent.com/tonesto7/nest-manager/master/Images/Devices/heat_cool_btn_icon.png") + state("eco", action:"changeMode", nextState: "updating", icon: "https://raw.githubusercontent.com/tonesto7/nest-manager/master/Images/Devices/eco_icon.png") state("emergency heat", action:"changeMode", nextState: "updating", icon: "st.thermostat.emergency") state("updating", label:"", icon: "https://raw.githubusercontent.com/tonesto7/nest-manager/master/Images/Devices/cmd_working.png") } - - standardTile("offBtn", "device.off", width:1, height:1, decoration: "flat") { + standardTile("offBtn", "device.off", width:2, height:2, decoration: "flat") { state("default", action: "offbtn", icon: "https://raw.githubusercontent.com/tonesto7/nest-manager/master/Images/Devices/off_btn_icon.png") } - standardTile("ecoBtn", "device.eco", width:1, height:1, decoration: "flat") { + standardTile("ecoBtn", "device.eco", width:2, height:2, decoration: "flat") { state("default", action: "ecobtn", icon: "https://raw.githubusercontent.com/tonesto7/nest-manager/master/Images/Devices/eco_icon.png") } - standardTile("heatBtn", "device.canHeat", width:1, height:1, decoration: "flat") { + standardTile("heatBtn", "device.canHeat", width:2, height:2, decoration: "flat") { state("true", action: "heatbtn", icon: "https://raw.githubusercontent.com/tonesto7/nest-manager/master/Images/Devices/heat_btn_icon.png") state "false", label: '' } - standardTile("coolBtn", "device.canCool", width:1, height:1, decoration: "flat") { + standardTile("coolBtn", "device.canCool", width:2, height:2, decoration: "flat") { state("true", action: "coolbtn", icon: "https://raw.githubusercontent.com/tonesto7/nest-manager/master/Images/Devices/cool_btn_icon.png") state "false", label: '' } - standardTile("autoBtn", "device.hasAuto", width:1, height:1, decoration: "flat") { + standardTile("autoBtn", "device.hasAuto", width:2, height:2, decoration: "flat") { state("true", action: "autobtn", icon: "https://raw.githubusercontent.com/tonesto7/nest-manager/master/Images/Devices/heat_cool_btn_icon.png") state "false", label: '' } standardTile("thermostatFanMode", "device.thermostatFanMode", width:2, height:2, decoration: "flat") { - state("auto", action: "changeFanMode", nextState: "updating", icon: "https://raw.githubusercontent.com/tonesto7/nest-manager/master/Images/Devices/fan_auto_icon.png") - state("on", action: "changeFanMode", nextState: "updating", icon: "https://raw.githubusercontent.com/tonesto7/nest-manager/master/Images/Devices/fan_on_icon.png") + state("auto", action: "changeFanMode", nextState: "updating", icon: "https://raw.githubusercontent.com/tonesto7/nest-manager/master/Images/Devices/fan_auto_icon.png") + state("on", action: "changeFanMode", nextState: "updating", icon: "https://raw.githubusercontent.com/tonesto7/nest-manager/master/Images/Devices/fan_on_icon.png") state("updating", label:"", icon: "https://raw.githubusercontent.com/tonesto7/nest-manager/master/Images/Devices/cmd_working.png") state "disabled", icon: "https://raw.githubusercontent.com/tonesto7/nest-manager/master/Images/Devices/fan_disabled_icon.png" } standardTile("nestPresence", "device.nestPresence", width:2, height:2, decoration: "flat") { - state "home", action: "setPresence", icon: "https://raw.githubusercontent.com/tonesto7/nest-manager/master/Images/Devices/pres_home_icon.png" - state "away", action: "setPresence", icon: "https://raw.githubusercontent.com/tonesto7/nest-manager/master/Images/Devices/pres_away_icon.png" - state "auto-away", action: "setPresence", icon: "https://raw.githubusercontent.com/tonesto7/nest-manager/master/Images/Devices/pres_autoaway_icon.png" - state "unknown", action: "setPresence", icon: "st.unknown.unknown.unknown" + state "home", action: "setPresence", icon: "https://raw.githubusercontent.com/tonesto7/nest-manager/master/Images/Devices/pres_home_icon.png" + state "away", action: "setPresence", icon: "https://raw.githubusercontent.com/tonesto7/nest-manager/master/Images/Devices/pres_away_icon.png" + state "auto-away", action: "setPresence", icon: "https://raw.githubusercontent.com/tonesto7/nest-manager/master/Images/Devices/pres_autoaway_icon.png" + state "unknown", action: "setPresence", icon: "st.unknown.unknown.unknown" } standardTile("refresh", "device.refresh", width:2, height:2, decoration: "flat") { state "default", action:"refresh.refresh", icon:"https://raw.githubusercontent.com/tonesto7/nest-manager/master/Images/Devices/refresh_icon.png" @@ -224,20 +222,51 @@ metadata { state "default", label:'', action:"coolingSetpointDown", icon:"https://raw.githubusercontent.com/tonesto7/nest-manager/master/Images/Devices/cool_arrow_down.png" state "", label: '' } - controlTile("coolSliderControl", "device.coolingSetpoint", "slider", height: 1, width: 3, range: getRange(), inactiveLabel: false) { + controlTile("coolSliderControl", "device.coolingSetpoint", "slider", height: 1, width: 3, range: getRange(), debouncePeriod: 1500, inactiveLabel: false) { state "setCoolingSetpoint", action:"setCoolingSetpoint", backgroundColor:"#0099FF" state "", label: '' } - + valueTile("softwareVer", "device.softwareVer", inactiveLabel: false, width: 3, height: 1, decoration: "flat", wordWrap: true) { + state("default", label: 'Firmware:\nv${currentValue}') + } + valueTile("lastConnection", "device.lastConnection", inactiveLabel: false, width: 3, height: 1, decoration: "flat", wordWrap: true) { + state("default", label: 'Tstat Last Checked-In:\n${currentValue}') + } + valueTile("lastUpdatedDt", "device.lastUpdatedDt", width: 3, height: 1, decoration: "flat", wordWrap: true) { + state("default", label: 'Data Last Received:\n${currentValue}') + } + valueTile("devTypeVer", "device.devTypeVer", width: 3, height: 1, decoration: "flat") { + state("default", label: 'Device Type:\nv${currentValue}', defaultState: true) + } + valueTile("apiStatus", "device.apiStatus", width: 2, height: 1, decoration: "flat", wordWrap: true) { + state "Good", label: "API Status:\nOK" + state "Sporadic", label: "API Status:\nISSUE ", backgroundColor: "#FFFF33" + state "Outage", label: "API Status:\nISSUE ", backgroundColor: "#FFFF33" + } + valueTile("debugOn", "device.debugOn", width: 2, height: 1, decoration: "flat") { + state "true", label: 'Debug:\n${currentValue}' + state "false", label: 'Debug:\n${currentValue}' + } + valueTile("onlineStatus", "device.onlineStatus", width: 2, height: 1, wordWrap: true, decoration: "flat") { + state("default", label: 'Network Status:\n${currentValue}') + } standardTile("blank", "device.heatingSetpoint", width: 1, height: 1, canChangeIcon: false, decoration: "flat") { state "default", label: '' } + standardTile("blank2", "device.heatingSetpoint", width: 2, height: 2, canChangeIcon: false, decoration: "flat") { + state "default", label: '' + } htmlTile(name:"graphHTML", action: "graphHTML", width: 6, height: 13, whitelist: ["www.gstatic.com", "raw.githubusercontent.com", "cdn.rawgit.com"]) - + valueTile("remind", "device.blah", inactiveLabel: false, width: 6, height: 2, decoration: "flat", wordWrap: true) { + state("default", label: 'Reminder:\nHTML Graph and History Content is Available in SmartApp', defaultState: true) + } main("temp2") - details( ["temperature", "thermostatMode", "nestPresence", "thermostatFanMode", - "heatingSetpointDown", "heatingSetpoint", "heatingSetpointUp", "coolingSetpointDown", "coolingSetpoint", "coolingSetpointUp", - "heatSliderControl", "coolSliderControl", "graphHTML", "offBtn", "ecoBtn", "heatBtn", "coolBtn", "autoBtn", "blank", "refresh"] ) + details([ + "temperature", "thermostatMode", "nestPresence", "thermostatFanMode", + "heatingSetpointDown", "heatingSetpoint", "heatingSetpointUp", "coolingSetpointDown", "coolingSetpoint", "coolingSetpointUp", + "heatSliderControl", "coolSliderControl", "autoBtn", "heatBtn", "coolBtn", "offBtn", "ecoBtn", "blank2", "onlineStatus","debugOn", + "apiStatus", "lastConnection", "lastUpdatedDt", "devTypeVer", "softwareVer", "graphHTML", "remind", "refresh" + ]) } preferences { input "resetHistoryOnly", "bool", title: "Reset History Data", description: "", displayDuringSetup: false @@ -246,36 +275,30 @@ metadata { } def compileForC() { - def retVal = false // if using C mode, set this to true so that enums and colors are correct (due to ST issue of compile time evaluation) - return retVal + // if using C mode, set this to true so that enums and colors are correct (due to ST issue of compile time evaluation) + return false } def getTempColors() { def colorMap -//getTemperatureScale() == "C" wantMetric() - if(compileForC()) { colorMap = [ // Celsius Color Range [value: 0, color: "#153591"], [value: 7, color: "#1e9cbb"], [value: 15, color: "#90d2a7"], [value: 23, color: "#44b621"], - [value: 29, color: "#f1d801"], - [value: 33, color: "#d04e00"], - [value: 36, color: "#bc2323"] - ] - } else { - colorMap = [ + [value: 28, color: "#f1d801"], + [value: 35, color: "#d04e00"], + [value: 37, color: "#bc2323"], // Fahrenheit Color Range [value: 40, color: "#153591"], [value: 44, color: "#1e9cbb"], [value: 59, color: "#90d2a7"], [value: 74, color: "#44b621"], [value: 84, color: "#f1d801"], - [value: 92, color: "#d04e00"], + [value: 95, color: "#d04e00"], [value: 96, color: "#bc2323"] ] - } } def lowRange() { return compileForC() ? 9 : 50 } @@ -302,10 +325,19 @@ void checkStateClear() { Logger("checkStateClear...resetting ALL toggle") state.resetAllData = false } + if(before > 65) { + Logger("checkStateClear...Clearing HISTORY ${before}") + def data = getState()?.findAll { + (it?.key in ["today", "temperatureTable", "operatingStateTable", "humidityTable", "coolSetpointTable", "heatSetpointTable", "extTempTable", "fanModeTable", "historyStoreMap", "temperatureTableYesterday", "operatingStateTableYesterday", "humidityTableYesterday", "coolSetpointTableYesterday", "heatSetpointTableYesterday", "extTempTableYesterday", "fanModeTableYesterday" ]) + } + data.each { item -> + state.remove(item?.key.toString()) + } + } if(!state?.resetHistoryOnly && resetHistoryOnly) { Logger("checkStateClear...Clearing HISTORY") def data = getState()?.findAll { - (it?.key in ["today", "temperatureTable", "operatingStateTable", "humidityTable", "historyStoreMap", "temperatureTableYesterday", "operatingStateTableYesterday", "humidityTableYesterday"]) + (it?.key in ["today", "temperatureTable", "operatingStateTable", "humidityTable", "coolSetpointTable", "heatSetpointTable", "extTempTable", "fanModeTable", "historyStoreMap", "temperatureTableYesterday", "operatingStateTableYesterday", "humidityTableYesterday", "coolSetpointTableYesterday", "heatSetpointTableYesterday", "extTempTableYesterday", "fanModeTableYesterday" ]) } data.each { item -> state.remove(item?.key.toString()) @@ -326,6 +358,7 @@ def initialize() { state.updatedLastRanAt = now() checkVirtualStatus() verifyHC() + state.isInstalled = true } else { log.trace "initialize(): Ran within last 2 seconds - SKIPPING" } @@ -333,13 +366,14 @@ def initialize() { void installed() { Logger("installed...") - initialize() - state.isInstalled = true + runIn( 5, "initialize", [overwrite: true] ) } void updated() { Logger("Device Updated...") - initialize() + //setNestEta("EricTst", "2018-01-27T01:02:00.000Z", "2018-01-27T02:15:00.000Z") + //cancelNestEta("EricTst") + runIn( 5, "initialize", [overwrite: true] ) } void checkVirtualStatus() { @@ -360,7 +394,7 @@ def useTrackedHealth() { return state?.useTrackedHealth ?: false } def getHcTimeout() { def to = state?.hcTimeout - return ((to instanceof Integer) ? to.toInteger() : 35)*60 + return ((to instanceof Integer) ? to.toInteger() : 45)*60 } void verifyHC() { @@ -387,9 +421,7 @@ def modifyDeviceStatus(status) { def ping() { Logger("ping...") -// if(useTrackedHealth()) { - keepAwakeEvent() -// } + keepAwakeEvent() } def keepAwakeEvent() { @@ -448,7 +480,7 @@ void processEvent(data) { checkStateClear() //LogAction("processEvent Parsing data ${eventData}", "trace") - try { +// try { LogAction("------------START OF API RESULTS DATA------------", "warn") if(eventData) { state.isBeta = eventData?.isBeta == true ? true : false @@ -457,18 +489,17 @@ void processEvent(data) { state.useMilitaryTime = eventData?.mt ? true : false state.showLogNamePrefix = eventData?.logPrefix == true ? true : false state.enRemDiagLogging = eventData?.enRemDiagLogging == true ? true : false - state.healthMsg = eventData?.healthNotify == true ? true : false + state.healthMsg = eventData?.healthNotify?.healthMsg == true ? true : false + state.healthMsgWait = eventData?.healthNotify?.healthMsgWait state.showGraphs = eventData?.showGraphs != null ? eventData?.showGraphs : true - if(eventData?.allowDbException) { state?.allowDbException = eventData?.allowDbException = false ? false : true } + if(eventData?.allowDbException) { state?.allowDbException = eventData?.allowDbException == false ? false : true } debugOnEvent(eventData?.debug ? true : false) deviceVerEvent(eventData?.latestVer.toString()) if(virtType()) { nestTypeEvent("virtual") } else { nestTypeEvent("physical") } -// if(useTrackedHealth()) { - if(eventData.hcTimeout && (state?.hcTimeout != eventData?.hcTimeout || !state?.hcTimeout)) { - state.hcTimeout = eventData?.hcTimeout - verifyHC() - } -// } + if(eventData.hcTimeout && (state?.hcTimeout != eventData?.hcTimeout || !state?.hcTimeout)) { + state.hcTimeout = eventData?.hcTimeout + verifyHC() + } if(state?.swVersion != devVer()) { initialize() state.swVersion = devVer() @@ -485,6 +516,7 @@ void processEvent(data) { canHeatCool(eventData?.data?.can_heat, eventData?.data?.can_cool) hasFan(eventData?.data?.has_fan.toString()) presenceEvent(eventData?.pres) + etaEvent(eventData?.etaBegin) def curMode = device?.currentState("nestThermostatMode")?.stringValue hvacModeEvent(eventData?.data?.hvac_mode.toString()) @@ -507,10 +539,10 @@ void processEvent(data) { softwareVerEvent(eventData?.data?.software_version.toString()) //onlineStatusEvent(eventData?.data?.is_online.toString()) apiStatusEvent(eventData?.apiIssues) - if(eventData?.htmlInfo) { state?.htmlInfo = eventData?.htmlInfo } safetyTempsEvent(eventData?.safetyTemps) comfortHumidityEvent(eventData?.comfortHumidity) comfortDewpointEvent(eventData?.comfortDewpoint) + emergencyHeatEvent(eventData?.data?.is_using_emergency_heat) state.voiceReportPrefs = eventData?.vReportPrefs autoSchedDataEvent(eventData?.autoSchedData) state?.devBannerData = eventData?.devBannerData ?: null @@ -618,21 +650,23 @@ void processEvent(data) { break } getSomeData(true) - lastUpdatedEvent() + lastUpdatedEvent(true) checkHealth() } //This will return all of the devices state data to the logs. //LogAction("Device State Data: ${getState()}") return null +/* } catch (ex) { log.error "generateEvent Exception:", ex - exceptionDataHandler(ex.message, "generateEvent") + exceptionDataHandler(ex?.message, "generateEvent") } +*/ } def getStateSize() { return state?.toString().length() } -def getStateSizePerc() { return (int) ((stateSize/100000)*100).toDouble().round(0) } // +def getStateSizePerc() { return (int) ((stateSize/100000)*100).toDouble().round(0) } def getDataByName(String name) { state[name] ?: device.getDataValue(name) @@ -651,7 +685,7 @@ def getTimeZone() { } def tUnitStr() { - return "°${state?.tempUnit}" + return "\u00b0${state?.tempUnit}" } def isCodeUpdateAvailable(newVer, curVer) { @@ -774,13 +808,11 @@ def lastCheckinEvent(checkin, isOnline) { tf.setTimeZone(getTimeZone()) def lastChk = device.currentState("lastConnection")?.value - def lastConnSeconds = (lastChk && lastChk != "Not Available") ? getTimeDiffSeconds(lastChk) : 3000 - def prevOnlineStat = device.currentState("onlineStatus")?.value def hcTimeout = getHcTimeout() - def curConn = checkin ? "${tf.format(Date.parse("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", checkin))}" : "Not Available" - def curConnFmt = checkin ? "${formatDt(Date.parse("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", checkin))}" : "Not Available" + def curConn = checkin ? tf.format(Date.parse("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", checkin)) : "Not Available" + def curConnFmt = checkin ? formatDt(Date.parse("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", checkin)) : "Not Available" def curConnSeconds = (checkin && curConnFmt != "Not Available") ? getTimeDiffSeconds(curConnFmt) : 3000 def onlineStat = isOnline.toString() == "true" ? "online" : "offline" @@ -791,11 +823,15 @@ def lastCheckinEvent(checkin, isOnline) { sendEvent(name: 'lastConnection', value: curConnFmt?.toString(), isStateChange: true) } else { LogAction("Last Nest Check-in was: (${curConnFmt}) | Original State: (${lastChk})") } - LogAction("lastCheckinEvent($checkin, $isOnline) | onlineStatus: $onlineStat | lastConnSeconds: $lastConnSeconds | hcTimeout: ${hcTimeout} | curConnSeconds: ${curConnSeconds}") + lastChk = device.currentState("lastConnection")?.value + def lastConnSeconds = (lastChk && lastChk != "Not Available") ? getTimeDiffSeconds(lastChk) : 3000 if(hcTimeout && isOnline.toString() == "true" && curConnSeconds > hcTimeout && lastConnSeconds > hcTimeout) { onlineStat = "offline" LogAction("lastCheckinEvent: UPDATED onlineStatus: $onlineStat") + Logger("lastCheckinEvent($checkin, $isOnline) | onlineStatus: $onlineStat | lastConnSeconds: $lastConnSeconds | hcTimeout: ${hcTimeout} | curConnSeconds: ${curConnSeconds}") + } else { + LogAction("lastCheckinEvent($checkin, $isOnline) | onlineStatus: $onlineStat | lastConnSeconds: $lastConnSeconds | hcTimeout: ${hcTimeout} | curConnSeconds: ${curConnSeconds}") } state?.onlineStatus = onlineStat @@ -808,7 +844,7 @@ def lastCheckinEvent(checkin, isOnline) { def lastUpdatedEvent(sendEvt=false) { def now = new Date() - def formatVal = state.useMilitaryTime ? "MMM d, yyyy - HH:mm:ss" : "MMM d, yyyy - h:mm:ss a" + def formatVal = state?.useMilitaryTime ? "MMM d, yyyy - HH:mm:ss" : "MMM d, yyyy - h:mm:ss a" def tf = new SimpleDateFormat(formatVal) tf.setTimeZone(getTimeZone()) def lastDt = "${tf?.format(now)}" @@ -878,10 +914,14 @@ def thermostatSetpointEvent(Double targetTemp) { def temperatureEvent(Double tempVal) { def temp = device.currentState("temperature")?.stringValue def rTempVal = wantMetric() ? tempVal.round(1) : tempVal.round(0).toInteger() + def unrounded_rTempVal = tempVal.round(1) if(isStateChange(device, "temperature", rTempVal.toString())) { LogAction("UPDATED | Temperature is (${rTempVal}${tUnitStr()}) | Original Temp: (${temp}${tUnitStr()})") sendEvent(name:'temperature', value: rTempVal, unit: state?.tempUnit, descriptionText: "Ambient Temperature is ${rTempVal}${tUnitStr()}", displayed: true, isStateChange: true) } else { LogAction("Temperature is (${rTempVal}${tUnitStr()}) | Original Temp: (${temp})${tUnitStr()}") } + if(isStateChange(device, "temperatureur", unrounded_rTempVal.toString())) { + sendEvent(name:'temperatureur', value: unrounded_rTempVal, unit: state?.tempUnit, descriptionText: "Ambient Temperature is ${rTempVal}${tUnitStr()}", displayed: false, isStateChange: true) + } checkSafetyTemps() } @@ -971,6 +1011,16 @@ def humidityEvent(humidity) { } else { LogAction("Humidity is (${humidity}) | Original State: (${hum})") } } +def etaEvent(eta) { + if(eta) { + def oeta = device.currentState("etaBegin")?.value + if(isStateChange(device, "etaBegin", eta.toString())) { + LogAction("UPDATED | Eta Begin is (${eta}) | Original State: (${oeta})") + sendEvent(name:'etaBegin', value: eta, descriptionText: "Eta is ${eta}", displayed: true, isStateChange: true) + } else { LogAction("Eta Begin is (${eta}) | Original State: (${oeta})") } + } +} + def presenceEvent(String presence) { // log.trace "presenceEvent($presence)" def val = getPresence() @@ -1013,7 +1063,8 @@ void whoMadeChanges(autoType, desc, dt) { def ecoDescEvent(val, updChk=false) { //log.debug "ecoDescEvent($val)" def curMode = device?.currentState("nestThermostatMode")?.stringValue - def curEcoDesc = device?.currentState("whoSetEcoMode")?.value ?: null + def t0 = device?.currentState("whoSetEcoMode")?.value + def curEcoDesc = t0 ?: null def newVal = updChk ? curEcoDesc : val def newEcoDesc = (curMode == "eco") ? (newVal == null ? "Set Outside of this DTH" : newVal) : "Not in Eco Mode" @@ -1032,15 +1083,17 @@ def ecoDescEvent(val, updChk=false) { def hvacModeEvent(mode) { def hvacMode = !state?.hvac_mode ? device.currentState("thermostatMode")?.stringValue : state.hvac_mode def newMode = (mode == "heat-cool") ? "auto" : mode +/* if(mode == "eco") { if(state?.can_cool && state?.can_heat) { newMode = "auto" } else if(state?.can_heat) { newMode = "heat" } else if(state?.can_cool) { newMode = "cool" } } +*/ state?.hvac_mode = newMode if(!hvacMode.equals(newMode)) { Logger("UPDATED | Hvac Mode is (${newMode.toString().capitalize()}) | Original State: (${hvacMode.toString().capitalize()})") - sendEvent(name: "thermostatMode", value: newMode, descriptionText: "HVAC mode is ${newMode} mode", displayed: true, isStateChange: true) + sendEvent(name: "thermostatMode", value: newMode, data:[supportedThermostatModes: device.currentValue("supportedThermostatModes")], descriptionText: "HVAC mode is ${newMode} mode", displayed: true, isStateChange: true) } def oldnestmode = state?.nestHvac_mode @@ -1208,7 +1261,7 @@ def onlineStatusEvent(online) { def apiStatusEvent(issue) { def curStat = device.currentState("apiStatus")?.value - def newStat = issue ? "Has Issue" : "Good" + def newStat = issue state?.apiStatus = newStat if(isStateChange(device, "apiStatus", newStat.toString())) { Logger("UPDATED | API Status is: (${newStat.toString().capitalize()}) | Original State: (${curStat.toString().capitalize()})") @@ -1235,8 +1288,18 @@ def autoSchedDataEvent(schedData) { state?.curAutoSchedData = schedData } +def emergencyHeatEvent(emerHeat) { + def curStat = device.currentState("usingEmergencyHeat")?.value + def newStat = emerHeat + if(isStateChange(device, "usingEmergencyHeat", newStat.toString())) { + state.is_using_emergency_heat = !!newStat + Logger("Using Emergency Heat is: (${newStat.toString().capitalize()}) | Previous State: (${curStat.toString().capitalize()})") + sendEvent(name: "usingEmergencyHeat", value: newStat, descriptionText: "Using Emergency Heat is: ${newStat}", displayed: true, isStateChange: true, state: newStat) + } +} + def canHeatCool(canHeat, canCool) { - def supportedThermostatModes = ["off"] + def supportedThermostatModes = ["off", "eco"] state?.can_heat = !canHeat ? false : true if(state.can_heat) { supportedThermostatModes << "heat" } state?.can_cool = !canCool ? false : true @@ -1258,7 +1321,7 @@ def canHeatCool(canHeat, canCool) { } def nestSupportedThermostatModes = supportedThermostatModes.collect() - nestSupportedThermostatModes << "eco" + //nestSupportedThermostatModes << "eco" if(state?.supportedNestThermostatModes != nestSupportedThermostatModes) { sendEvent(name: "supportedNestThermostatModes", value: nestSupportedThermostatModes) state.supportedNestThermostatModes = nestSupportedThermostatModes.collect() @@ -1348,9 +1411,11 @@ def getTempWaitVal() { def wantMetric() { return (state?.tempUnit == "C") } -def getHealthStatus(lower=false) { +def getDevTypeId() { return device?.getTypeId() } + +def getHealthStatus(lowerCase=false) { def res = device?.getStatus() - if(lower) { return res.toString().toLowerCase() } + if(lowerCase) { return res.toString().toLowerCase() } return res.toString() } @@ -1358,7 +1423,8 @@ def healthNotifyOk() { def lastDt = state?.lastHealthNotifyDt if(lastDt) { def ldtSec = getTimeDiffSeconds(lastDt) - if(ldtSec < 600) { + def t0 = state.healthMsgWait ?: 3600 + if(ldtSec < t0) { return false } } @@ -1576,7 +1642,7 @@ def GetTimeDiffSeconds(lastDate) { def lastDt = Date.parse("E MMM dd HH:mm:ss z yyyy", lastDate) def start = Date.parse("E MMM dd HH:mm:ss z yyyy", formatDt(lastDt)).getTime() def stop = Date.parse("E MMM dd HH:mm:ss z yyyy", formatDt(now)).getTime() - def diff = (int) (long) (stop - start) / 1000 // + def diff = (int) (long) (stop - start) / 1000 return diff } @@ -1590,7 +1656,7 @@ def getTimeDiffSeconds(strtDate, stpDate=null, methName=null) { def stopDt = Date.parse("E MMM dd HH:mm:ss z yyyy", stopVal) def start = Date.parse("E MMM dd HH:mm:ss z yyyy", formatDt(startDt)).getTime() def stop = Date.parse("E MMM dd HH:mm:ss z yyyy", stopVal).getTime() - def diff = (int) (long) (stop - start) / 1000 // + def diff = (int) (long) (stop - start) / 1000 //LogTrace("[GetTimeDiffSeconds] Results for '$methName': ($diff seconds)") return diff } else { return null } @@ -1686,11 +1752,14 @@ void changeSetpoint() { // Nest Only allows F temperatures as #.0 and C temperatures as either #.0 or #.5 void setHeatingSetpoint(temp, manChg=false) { - setHeatingSetpoint(temp.toDouble(), manChg) + if(temp != null) { + setHeatingSetpoint(temp.toDouble(), manChg) + } } void setHeatingSetpoint(Double reqtemp, manChg=false) { LogAction("setHeatingSetpoint()... ($reqtemp)", "trace") + if(reqtemp == null) { return } def hvacMode = getHvacMode() def tempUnit = state?.tempUnit def temp = 0.0 @@ -1708,7 +1777,7 @@ void setHeatingSetpoint(Double reqtemp, manChg=false) { if(canHeat && state?.nestHvac_mode != "eco") { switch (tempUnit) { case "C": - temp = Math.round(reqtemp.round(1) * 2) / 2.0f // + temp = Math.round(reqtemp.round(1) * 2) / 2.0f if(curMinTemp < 9.0) { curMinTemp = 9.0 } if(curMaxTemp > 32.0) { curMaxTemp = 32.0 } if(temp) { @@ -1761,11 +1830,14 @@ void setHeatingSetpoint(Double reqtemp, manChg=false) { } void setCoolingSetpoint(temp, manChg=false) { - setCoolingSetpoint( temp.toDouble(), manChg) + if(temp != null) { + setCoolingSetpoint( temp.toDouble(), manChg) + } } void setCoolingSetpoint(Double reqtemp, manChg=false) { LogAction("setCoolingSetpoint()... ($reqtemp)", "trace") + if(reqtemp == null) { return } def hvacMode = getHvacMode() def temp = 0.0 def tempUnit = state?.tempUnit @@ -1783,7 +1855,7 @@ void setCoolingSetpoint(Double reqtemp, manChg=false) { if(canCool && state?.nestHvac_mode != "eco") { switch (tempUnit) { case "C": - temp = Math.round(reqtemp.round(1) * 2) / 2.0f // + temp = Math.round(reqtemp.round(1) * 2) / 2.0f if(curMinTemp < 9.0) { curMinTemp = 9.0 } if(curMaxTemp > 32.0) { curMaxTemp = 32.0 } if(temp) { @@ -1873,6 +1945,16 @@ def setHome() { if(parent.setStructureAway(this, "false", virtType()) ) { presenceEvent("home") } } +def setNestEta(tripId, begin, end){ + LogAction("setNestEta()...", "trace") + parent?.setEtaState(this, ["trip_id": "${tripId}", "estimated_arrival_window_begin": "${begin}", "estimated_arrival_window_end": "${end}" ], virtType() ) +} + +def cancelNestEta(tripId){ + LogAction("cancelNestEta()...", "trace") + parent?.cancelEtaState(this, "${tripId}", virtType() ) +} + /************************************************************************************************ | HVAC MODE FUNCTIONS | ************************************************************************************************/ @@ -2065,7 +2147,7 @@ void fanOn() { } catch (ex) { log.error "fanOn Exception:", ex - exceptionDataHandler(ex.message, "fanOn") + exceptionDataHandler(ex?.message, "fanOn") } } @@ -2089,7 +2171,7 @@ void fanAuto() { } catch (ex) { log.error "fanAuto Exception:", ex - exceptionDataHandler(ex.message, "fanAuto") + exceptionDataHandler(ex?.message, "fanAuto") } } @@ -2125,30 +2207,31 @@ def lastN(String input, n) { } void Logger(msg, logType = "debug") { - def smsg = state?.showLogNamePrefix ? "${device.displayName}: ${msg}" : "${msg}" - switch (logType) { - case "trace": - log.trace "|| ${smsg}" - break - case "debug": - log.debug "${smsg}" - break - case "info": - log.info "||| ${smsg}" - break - case "warn": - log.warn "|| ${smsg}" - break - case "error": - log.error "| ${smsg}" - break - default: - log.debug "${smsg}" - break - } + def smsg = state?.showLogNamePrefix ? "${device.displayName} (v${devVer()}) | ${msg}" : "${msg}" def theId = lastN(device.getId().toString(),5) if(state?.enRemDiagLogging) { parent.saveLogtoRemDiagStore(smsg, logType, "Thermostat-${theId}") + } else { + switch (logType) { + case "trace": + log.trace "|| ${smsg}" + break + case "debug": + log.debug "${smsg}" + break + case "info": + log.info "||| ${smsg}" + break + case "warn": + log.warn "|| ${smsg}" + break + case "error": + log.error "| ${smsg}" + break + default: + log.debug "${smsg}" + break + } } } @@ -2185,78 +2268,39 @@ def exceptionDataHandler(msg, methodName) { def getFileBase64(url, preType, fileType) { try { - def params = [ - uri: url, - contentType: '$preType/$fileType' - ] + def params = [uri: url, contentType: "$preType/$fileType"] httpGet(params) { resp -> - if(resp.data) { - def respData = resp?.data - ByteArrayOutputStream bos = new ByteArrayOutputStream() - int len - int size = 4096 - byte[] buf = new byte[size] - while ((len = respData.read(buf, 0, size)) != -1) - bos.write(buf, 0, len) - buf = bos.toByteArray() - //LogAction("buf: $buf") - String s = buf?.encodeBase64() - //LogAction("resp: ${s}") - return s ? "data:${preType}/${fileType};base64,${s.toString()}" : null + if(resp?.status == 200) { + if(resp.data) { + def respData = resp?.data + byte[] byteData = resp?.data?.getBytes() + String enc = byteData?.encodeBase64() + // log.debug "enc: ${enc}" + return enc ? "data:${preType}/${fileType};base64,${enc?.toString()}" : null + } + } else { + LogAction("getFileBase64 Resp: ${resp?.status} ${url}", "error") + exceptionDataHandler("resp ${ex?.response?.status} ${url}", "getFileBase64") + return null } } - } - catch (ex) { - log.error "getFileBase64 Exception:", ex - exceptionDataHandler(ex.message, "getFileBase64") - } -} - -def getCssData() { - def cssData = null - def htmlInfo = state?.htmlInfo - if(htmlInfo?.cssUrl && htmlInfo?.cssVer) { - cssData = getFileBase64(htmlInfo.cssUrl, "text", "css") - state?.cssVer = htmlInfo?.cssVer - } else { - cssData = getFileBase64(cssUrl(), "text", "css") - } - return cssData -} - -def getChartJsData() { - def chartJsData = null - //def htmlInfo = state?.htmlInfo - def htmlInfo - state.chartJsData = null - - if(htmlInfo?.chartJsUrl && htmlInfo?.chartJsVer) { - if(state?.chartJsData) { - if(state?.chartJsVer?.toInteger() == htmlInfo?.chartJsVer?.toInteger()) { - //LogAction("getChartJsData: Chart Javascript Data is Current | Loading Data from State...") - chartJsData = state?.chartJsData - } else if(state?.chartJsVer?.toInteger() < htmlInfo?.chartJsVer?.toInteger()) { - //LogAction("getChartJsData: Chart Javascript Data is Outdated | Loading Data from Source...") - //chartJsData = getFileBase64(htmlInfo.chartJsUrl, "text", "javascript") - state.chartJsData = chartJsData - state?.chartJsVer = htmlInfo?.chartJsVer + } catch (ex) { + if(ex instanceof groovyx.net.http.ResponseParseException) { + if(ex?.statusCode != 200) { + LogAction("getFileBase64 Resp: ${ex?.statusCode} ${url}", "error") + log.error "getFileBase64 Exception:", ex } + } else if(ex instanceof groovyx.net.http.HttpResponseException && ex?.response) { + LogAction("getFileBase64 Resp: ${ex?.response?.status} ${url}", "error") + exceptionDataHandler("${ex?.response?.status} ${url}", "getFileBase64") } else { - //LogAction("getChartJsData: Chart Javascript Data is Missing | Loading Data from Source...") - chartJsData = getFileBase64(htmlInfo.chartJsUrl, "text", "javascript") - state?.chartJsData = chartJsData - state?.chartJsVer = htmlInfo?.chartJsVer + log.error "getFileBase64 Exception:", ex + exceptionDataHandler(ex, "getFileBase64") } - } else { - //LogAction("getChartJsData: No Stored Chart Javascript Data Found for Device... Loading for Static URL...") - chartJsData = getFileBase64(chartJsUrl(), "text", "javascript") - } - return chartJsData + return null + } } -def cssUrl() { return "https://raw.githubusercontent.com/tonesto7/nest-manager/master/Documents/css/ST-HTML.min.css" } -def chartJsUrl() { return "https://www.gstatic.com/charts/loader.js" } - def getImg(imgName) { return imgName ? "https://cdn.rawgit.com/tonesto7/nest-manager/master/Images/Devices/$imgName" : "" } def getWebData(params, desc, text=true) { @@ -2528,7 +2572,7 @@ void getSomeData(devpoll = false) { // hackery to test getting old data def tryNum = 2 - if(state.eric != tryNum ) { + if(state?.eric != tryNum ) { if(devpoll) { runIn( 33, "getSomeData", [overwrite: true]) return @@ -2703,101 +2747,108 @@ def updateOperatingHistory(today) { } if(dayChange) { - def Op_coolingusage = getSumUsage(state.operatingStateTableYesterday, "cooling").toInteger() - def Op_heatingusage = getSumUsage(state.operatingStateTableYesterday, "heating").toInteger() - def Op_idle = getSumUsage(state.operatingStateTableYesterday, "idle").toInteger() - def Op_fanonly = getSumUsage(state.operatingStateTableYesterday, "fan only").toInteger() - def fan_on = getSumUsage(state.fanModeTableYesterday, "on").toInteger() - def fan_auto = getSumUsage(state.fanModeTableYesterday, "auto").toInteger() - - log.info "fanon ${fan_on} fanauto: ${fan_auto} opidle: ${Op_idle} cool: ${Op_coolingusage} heat: ${Op_heatingusage} fanonly: ${Op_fanonly}" - - hm."OperatingState_Day${hm.currentDay}_cooling" = Op_coolingusage - hm."OperatingState_Day${hm.currentDay}_heating" = Op_heatingusage - hm."OperatingState_Day${hm.currentDay}_idle" = Op_idle - hm."OperatingState_Day${hm.currentDay}_fanonly" = Op_fanonly - hm."FanMode_Day${hm.currentDay}_On" = fan_on - hm."FanMode_Day${hm.currentDay}_auto" = fan_auto - - hm.currentDay = dayNum - hm.OperatingState_DayWeekago_cooling = hm."OperatingState_Day${hm.currentDay}_cooling" - hm.OperatingState_DayWeekago_heating = hm."OperatingState_Day${hm.currentDay}_heating" - hm.OperatingState_DayWeekago_idle = hm."OperatingState_Day${hm.currentDay}_idle" - hm.OperatingState_DayWeekago_fanonly = hm."OperatingState_Day${hm.currentDay}_fanonly" - hm.FanMode_DayWeekago_On = hm."FanMode_Day${hm.currentDay}_On" - hm.FanMode_DayWeekago_auto = hm."FanMode_Day${hm.currentDay}_auto" - hm."OperatingState_Day${hm.currentDay}_cooling" = 0L - hm."OperatingState_Day${hm.currentDay}_heating" = 0L - hm."OperatingState_Day${hm.currentDay}_idle" = 0L - hm."OperatingState_Day${hm.currentDay}_fanonly" = 0L - hm."FanMode_Day${hm.currentDay}_On" = 0L - hm."FanMode_Day${hm.currentDay}_auto" = 0L - - def t1 = hm["OperatingState_Month${hm.currentMonth}_cooling"]?.toInteger() ?: 0L - hm."OperatingState_Month${hm.currentMonth}_cooling" = t1 + Op_coolingusage - t1 = hm["OperatingState_Month${hm.currentMonth}_heating"]?.toInteger() ?: 0L - hm."OperatingState_Month${hm.currentMonth}_heating" = t1 + Op_heatingusage - t1 = hm["OperatingState_Month${hm.currentMonth}_idle"]?.toInteger() ?: 0L - hm."OperatingState_Month${hm.currentMonth}_idle" = t1 + Op_idle - t1 = hm["OperatingState_Month${hm.currentMonth}_fanonly"]?.toInteger() ?: 0L - hm."OperatingState_Month${hm.currentMonth}_fanonly" = t1 + Op_fanonly - t1 = hm["FanMode_Month${hm.currentMonth}_On"]?.toInteger() ?: 0L - hm."FanMode_Month${hm.currentMonth}_On" = t1 + fan_on - t1 = hm["FanMode_Month${hm.currentMonth}_auto"]?.toInteger() ?: 0L - hm."FanMode_Month${hm.currentMonth}_auto" = t1 + fan_auto - - if(monthChange) { - hm.currentMonth = monthNum - hm.OperatingState_MonthYearago_cooling = hm."OperatingState_Month${hm.currentMonth}_cooling" - hm.OperatingState_MonthYearago_heating = hm."OperatingState_Month${hm.currentMonth}_heating" - hm.OperatingState_MonthYearago_idle = hm."OperatingState_Month${hm.currentMonth}_idle" - hm.OperatingState_MonthYearago_fanonly = hm."OperatingState_Month${hm.currentMonth}_fanonly" - hm.FanMode_MonthYearago_On = hm."FanMode_Month${hm.currentMonth}_On" - hm.FanMode_MonthYearago_auto = hm."FanMode_Month${hm.currentMonth}_auto" - hm."OperatingState_Month${hm.currentMonth}_cooling" = 0L - hm."OperatingState_Month${hm.currentMonth}_heating" = 0L - hm."OperatingState_Month${hm.currentMonth}_idle" = 0L - hm."FanMode_Month${hm.currentMonth}_On" = 0L - hm."FanMode_Month${hm.currentMonth}_auto" = 0L - } + try { + long Op_coolingusage = getSumUsage(state.operatingStateTableYesterday, "cooling") + long Op_heatingusage = getSumUsage(state.operatingStateTableYesterday, "heating") + long Op_idle = getSumUsage(state.operatingStateTableYesterday, "idle") + long Op_fanonly = getSumUsage(state.operatingStateTableYesterday, "fan only") + long fan_on = getSumUsage(state.fanModeTableYesterday, "on") + long fan_auto = getSumUsage(state.fanModeTableYesterday, "auto") + + log.info "fanon ${fan_on} fanauto: ${fan_auto} opidle: ${Op_idle} cool: ${Op_coolingusage} heat: ${Op_heatingusage} fanonly: ${Op_fanonly}" + + hm."OperatingState_Day${hm.currentDay}_cooling" = Op_coolingusage + hm."OperatingState_Day${hm.currentDay}_heating" = Op_heatingusage + hm."OperatingState_Day${hm.currentDay}_idle" = Op_idle + hm."OperatingState_Day${hm.currentDay}_fanonly" = Op_fanonly + hm."FanMode_Day${hm.currentDay}_On" = fan_on + hm."FanMode_Day${hm.currentDay}_auto" = fan_auto + + hm.currentDay = dayNum + hm.OperatingState_DayWeekago_cooling = hm."OperatingState_Day${hm.currentDay}_cooling" + hm.OperatingState_DayWeekago_heating = hm."OperatingState_Day${hm.currentDay}_heating" + hm.OperatingState_DayWeekago_idle = hm."OperatingState_Day${hm.currentDay}_idle" + hm.OperatingState_DayWeekago_fanonly = hm."OperatingState_Day${hm.currentDay}_fanonly" + hm.FanMode_DayWeekago_On = hm."FanMode_Day${hm.currentDay}_On" + hm.FanMode_DayWeekago_auto = hm."FanMode_Day${hm.currentDay}_auto" + hm."OperatingState_Day${hm.currentDay}_cooling" = 0L + hm."OperatingState_Day${hm.currentDay}_heating" = 0L + hm."OperatingState_Day${hm.currentDay}_idle" = 0L + hm."OperatingState_Day${hm.currentDay}_fanonly" = 0L + hm."FanMode_Day${hm.currentDay}_On" = 0L + hm."FanMode_Day${hm.currentDay}_auto" = 0L + + long t1 = hm?."OperatingState_Month${hm.currentMonth}_cooling"?.toInteger() ?: 0L + hm."OperatingState_Month${hm.currentMonth}_cooling" = t1 + Op_coolingusage + t1 = hm?."OperatingState_Month${hm.currentMonth}_heating"?.toInteger() ?: 0L + hm."OperatingState_Month${hm.currentMonth}_heating" = t1 + Op_heatingusage + t1 = hm?."OperatingState_Month${hm.currentMonth}_idle"?.toInteger() ?: 0L + hm."OperatingState_Month${hm.currentMonth}_idle" = t1 + Op_idle + t1 = hm?."OperatingState_Month${hm.currentMonth}_fanonly"?.toInteger() ?: 0L + hm."OperatingState_Month${hm.currentMonth}_fanonly" = t1 + Op_fanonly + t1 = hm?."FanMode_Month${hm.currentMonth}_On"?.toInteger() ?: 0L + hm."FanMode_Month${hm.currentMonth}_On" = t1 + fan_on + t1 = hm?."FanMode_Month${hm.currentMonth}_auto"?.toInteger() ?: 0L + hm."FanMode_Month${hm.currentMonth}_auto" = t1 + fan_auto + + if(monthChange) { + hm.currentMonth = monthNum + hm.OperatingState_MonthYearago_cooling = hm."OperatingState_Month${hm.currentMonth}_cooling" + hm.OperatingState_MonthYearago_heating = hm."OperatingState_Month${hm.currentMonth}_heating" + hm.OperatingState_MonthYearago_idle = hm."OperatingState_Month${hm.currentMonth}_idle" + hm.OperatingState_MonthYearago_fanonly = hm."OperatingState_Month${hm.currentMonth}_fanonly" + hm.FanMode_MonthYearago_On = hm."FanMode_Month${hm.currentMonth}_On" + hm.FanMode_MonthYearago_auto = hm."FanMode_Month${hm.currentMonth}_auto" + hm."OperatingState_Month${hm.currentMonth}_cooling" = 0L + hm."OperatingState_Month${hm.currentMonth}_heating" = 0L + hm."OperatingState_Month${hm.currentMonth}_idle" = 0L + hm."FanMode_Month${hm.currentMonth}_On" = 0L + hm."FanMode_Month${hm.currentMonth}_auto" = 0L + } - t1 = hm[OperatingState_thisYear_cooling]?.toInteger() ?: 0L - hm.OperatingState_thisYear_cooling = t1 + Op_coolingusage - t1 = hm[OperatingState_thisYear_heating]?.toInteger() ?: 0L - hm.OperatingState_thisYear_heating = t1 + Op_heatingusage - t1 = hm[OperatingState_thisYear_idle]?.toInteger() ?: 0L - hm.OperatingState_thisYear_idle = t1 + Op_idle - t1 = hm[OperatingState_thisYear_fanonly]?.toInteger() ?: 0L - hm.OperatingState_thisYear_fanonly = t1 + Op_fanonly - t1 = hm[FanMode_thisYear_On]?.toInteger() ?: 0L - hm.FanMode_thisYear_On = t1 + fan_on - t1 = hm[FanMode_thisYear_auto]?.toInteger() ?: 0L - hm.FanMode_thisYear_auto = t1 + fan_auto - - if(yearChange) { - hm.currentYear = yearNum - hm.OperatingState_lastYear_cooling = hm.OperatingState_thisYear_cooling - hm.OperatingState_lastYear_heating = hm.OperatingState_thisYear_heating - hm.OperatingState_lastYear_idle = hm.OperatingState_thisYear_idle - hm.OperatingState_lastYear_fanonly = hm.OperatingState_thisYear_fanonly - hm.FanMode_lastYear_On = hm.FanMode_thisYear_On - hm.FanMode_lastYear_auto = hm.FanMode_thisYear_auto - - hm.OperatingState_thisYear_cooling = 0L - hm.OperatingState_thisYear_heating = 0L - hm.OperatingState_thisYear_idle = 0L - hm.OperatingState_thisYear_fanonly = 0L - hm.FanMode_thisYear_On = 0L - hm.FanMode_thisYear_auto = 0L + t1 = hm?.OperatingState_thisYear_cooling?.toInteger() ?: 0L + hm.OperatingState_thisYear_cooling = t1 + Op_coolingusage + t1 = hm?.OperatingState_thisYear_heating?.toInteger() ?: 0L + hm.OperatingState_thisYear_heating = t1 + Op_heatingusage + t1 = hm?.OperatingState_thisYear_idle?.toInteger() ?: 0L + hm.OperatingState_thisYear_idle = t1 + Op_idle + t1 = hm?.OperatingState_thisYear_fanonly?.toInteger() ?: 0L + hm.OperatingState_thisYear_fanonly = t1 + Op_fanonly + t1 = hm?.FanMode_thisYear_On?.toInteger() ?: 0L + hm.FanMode_thisYear_On = t1 + fan_on + t1 = hm?.FanMode_thisYear_auto?.toInteger() ?: 0L + hm.FanMode_thisYear_auto = t1 + fan_auto + + if(yearChange) { + hm.currentYear = yearNum + hm.OperatingState_lastYear_cooling = hm.OperatingState_thisYear_cooling + hm.OperatingState_lastYear_heating = hm.OperatingState_thisYear_heating + hm.OperatingState_lastYear_idle = hm.OperatingState_thisYear_idle + hm.OperatingState_lastYear_fanonly = hm.OperatingState_thisYear_fanonly + hm.FanMode_lastYear_On = hm.FanMode_thisYear_On + hm.FanMode_lastYear_auto = hm.FanMode_thisYear_auto + + hm.OperatingState_thisYear_cooling = 0L + hm.OperatingState_thisYear_heating = 0L + hm.OperatingState_thisYear_idle = 0L + hm.OperatingState_thisYear_fanonly = 0L + hm.FanMode_thisYear_On = 0L + hm.FanMode_thisYear_auto = 0L + } + state.historyStoreMap = hm + + } catch (ex) { + state.eric = 0 // force clear of stats + state.remove("historyStoreMap") + log.error "updateOperatingHistory Exception:", ex } - state.historyStoreMap = hm } } def getSumUsage(table, String strtyp) { //log.trace "getSumUsage...$strtyp Table size: ${table?.size()}" - def totseconds = 0L - def newseconds = 0L + long totseconds = 0L + long newseconds = 0L def hr def mins @@ -2845,7 +2896,7 @@ def getSumUsage(table, String strtyp) { } //log.info "$strtyp totseconds: $totseconds" - return totseconds.toInteger() + return totseconds } def initHistoryStore() { @@ -3015,12 +3066,12 @@ def getHistoryStore() { } def hm = thm.clone() - def Op_coolingusage = getSumUsage(state.operatingStateTable, "cooling").toInteger() - def Op_heatingusage = getSumUsage(state.operatingStateTable, "heating").toInteger() - def Op_idle = getSumUsage(state.operatingStateTable, "idle").toInteger() - def Op_fanonly = getSumUsage(state.operatingStateTable, "fan only").toInteger() - def fan_on = getSumUsage(state.fanModeTable, "on").toInteger() - def fan_auto = getSumUsage(state.fanModeTable, "auto").toInteger() + long Op_coolingusage = getSumUsage(state.operatingStateTable, "cooling") + long Op_heatingusage = getSumUsage(state.operatingStateTable, "heating") + long Op_idle = getSumUsage(state.operatingStateTable, "idle") + long Op_fanonly = getSumUsage(state.operatingStateTable, "fan only") + long fan_on = getSumUsage(state.fanModeTable, "on") + long fan_auto = getSumUsage(state.fanModeTable, "auto") //log.info "fanon ${fan_on} fanauto: ${fan_auto} opidle: ${Op_idle} cool: ${Op_coolingusage} heat: ${Op_heatingusage}" //log.debug "currentDay ${hm.currentDay} | currentMonth ${hm.currentMonth} | currentYear: ${hm.currentYear}" @@ -3032,30 +3083,30 @@ def getHistoryStore() { hm."FanMode_Day${hm.currentDay}_On" = fan_on hm."FanMode_Day${hm.currentDay}_auto" = fan_auto - def t1 = hm["OperatingState_Month${hm.currentMonth}_cooling"]?.toInteger() ?: 0L + long t1 = hm?."OperatingState_Month${hm.currentMonth}_cooling"?.toInteger() ?: 0L hm."OperatingState_Month${hm.currentMonth}_cooling" = t1 + Op_coolingusage - t1 = hm["OperatingState_Month${hm.currentMonth}_heating"]?.toInteger() ?: 0L + t1 = hm?."OperatingState_Month${hm.currentMonth}_heating"?.toInteger() ?: 0L hm."OperatingState_Month${hm.currentMonth}_heating" = t1 + Op_heatingusage - t1 = hm["OperatingState_Month${hm.currentMonth}_idle"]?.toInteger() ?: 0L + t1 = hm?."OperatingState_Month${hm.currentMonth}_idle"?.toInteger() ?: 0L hm."OperatingState_Month${hm.currentMonth}_idle" = t1 + Op_idle - t1 = hm["OperatingState_Month${hm.currentMonth}_fanonly"]?.toInteger() ?: 0L + t1 = hm?."OperatingState_Month${hm.currentMonth}_fanonly"?.toInteger() ?: 0L hm."OperatingState_Month${hm.currentMonth}_fanonly" = t1 + Op_fanonly - t1 = hm["FanMode_Month${hm.currentMonth}_On"]?.toInteger() ?: 0L + t1 = hm?."FanMode_Month${hm.currentMonth}_On"?.toInteger() ?: 0L hm."FanMode_Month${hm.currentMonth}_On" = t1 + fan_on - t1 = hm["FanMode_Month${hm.currentMonth}_auto"]?.toInteger() ?: 0L + t1 = hm?."FanMode_Month${hm.currentMonth}_auto"?.toInteger() ?: 0L hm."FanMode_Month${hm.currentMonth}_auto" = t1 + fan_auto - t1 = hm[OperatingState_thisYear_cooling]?.toInteger() ?: 0L + t1 = hm?.OperatingState_thisYear_cooling?.toInteger() ?: 0L hm.OperatingState_thisYear_cooling = t1 + Op_coolingusage - t1 = hm[OperatingState_thisYear_heating]?.toInteger() ?: 0L + t1 = hm?.OperatingState_thisYear_heating?.toInteger() ?: 0L hm.OperatingState_thisYear_heating = t1 + Op_heatingusage - t1 = hm[OperatingState_thisYear_idle]?.toInteger() ?: 0L + t1 = hm?.OperatingState_thisYear_idle?.toInteger() ?: 0L hm.OperatingState_thisYear_idle = t1 + Op_idle - t1 = hm[OperatingState_thisYear_fanonly]?.toInteger() ?: 0L + t1 = hm?.OperatingState_thisYear_fanonly?.toInteger() ?: 0L hm.OperatingState_thisYear_fanonly = t1 + Op_fanonly - t1 = hm[FanMode_thisYear_On]?.toInteger() ?: 0L + t1 = hm?.FanMode_thisYear_On?.toInteger() ?: 0L hm.FanMode_thisYear_On = t1 + fan_on - t1 = hm[FanMode_thisYear_auto]?.toInteger() ?: 0L + t1 = hm?.FanMode_thisYear_auto?.toInteger() ?: 0L hm.FanMode_thisYear_auto = t1 + fan_auto return hm @@ -3130,7 +3181,7 @@ def getIntListAvg(itemList) { def iCnt = itemList?.size() if(iCnt >= 1) { if(iCnt > 1) { - avgRes = (itemList?.sum().toDouble() / iCnt.toDouble()).round(0) // + avgRes = (itemList?.sum().toDouble() / iCnt.toDouble()).round(0) } else { itemList?.each { avgRes = avgRes + it.toInteger() } } } //log.debug "[getIntListAvg] avgRes: $avgRes" @@ -3139,10 +3190,10 @@ def getIntListAvg(itemList) { def secToTimeMap(long seconds) { long sec = (seconds % 60) ?: 0L - long minutes = ((seconds % 3600) / 60) ?: 0L // - long hours = ((seconds % 86400) / 3600) ?: 0L // - long days = (seconds / 86400) ?: 0L // - long years = (days / 365) ?: 0L // + long minutes = ((seconds % 3600) / 60) ?: 0L + long hours = ((seconds % 86400) / 3600) ?: 0L + long days = (seconds / 86400) ?: 0L + long years = (days / 365) ?: 0L def res = ["m":minutes, "h":hours, "d":days, "y":years] return res } @@ -3222,7 +3273,7 @@ def getChgLogHtml() { if(!state?.shownChgLog == true) { chgStr = """ - + - - + + + + + + + @@ -3400,7 +3450,7 @@ def getGraphHTML() { ${devBrdCastHtml} ${clientBl} ${updateAvail} -
+
@@ -3476,10 +3526,7 @@ def getGraphHTML() {
- -
-

Swipe-Tap to Change Slide

-
+
@@ -3530,14 +3575,259 @@ def getGraphHTML() { render contentType: "text/html", data: html, status: 200 } catch (ex) { log.error "graphHTML Exception:", ex - exceptionDataHandler(ex.message, "graphHTML") + exceptionDataHandler(ex?.message, "graphHTML") + } +} + +def hasHtml() { return true } + +def getDeviceTile(devNum) { + try { + def tempStr = "\u00b0F" + if( wantMetric() ) { + tempStr = "\u00b0C" + } + checkVirtualStatus() + //LogAction("State Size: ${getStateSize()} (${getStateSizePerc()}%)") + def canHeat = state?.can_heat == true ? true : false + def canCool = state?.can_cool == true ? true : false + def hasFan = state?.has_fan == true ? true : false + def leafImg = state?.hasLeaf ? getImg("nest_leaf_on.gif") : getImg("nest_leaf_off.gif") + def updateAvail = !state.updateAvailable ? "" : """
Device Update Available!
""" + def clientBl = state?.clientBl ? """
Your Manager client has been blacklisted!\nPlease contact the Nest Manager developer to get the issue resolved!!!
""" : "" + + def timeToTarget = device.currentState("timeToTarget").stringValue + def sunCorrectStr = state?.sunCorrectEnabled ? "Enabled (${state?.sunCorrectActive == true ? "Active" : "Inactive"})" : "Disabled" + def refreshBtnHtml = state.mobileClientType == "ios" ? + """
""" : "" + def chartHtml = ( + state?.showGraphs && + state?.temperatureTable?.size() > 0 && + state?.operatingStateTable?.size() > 0 && + state?.temperatureTableYesterday?.size() > 0 && + state?.humidityTable?.size() > 0 && + state?.coolSetpointTable?.size() > 0 && + state?.heatSetpointTable?.size() > 0) ? showChartHtml(devNum) : (state?.showGraphs ? hideChartHtml() : "") + + def whoSetEco = device?.currentValue("whoSetEcoMode") + def whoSetEcoDt = state?.ecoDescDt + def ecoDesc = whoSetEco && !(whoSetEco in ["Not in Eco Mode", "Unknown", "Not Set", "Set Outside of this DTH", "A ST Automation", "User Changed (ST)"]) ? "Eco Set By: ${getAutoChgType(whoSetEco)}" : "${whoSetEco}" + + def ecoDescDt = whoSetEcoDt != null ? """
${whoSetEcoDt ?: ""}
+ + + + + + + +
Active Schedule
#${schedData?.scdNum} - ${schedData?.schedName}
+

Zone Status

+ + + + + + + + + + + + + + +
Temp Source:Zone Temp:
${schedData?.tempSrcDesc}${schedData?.curZoneTemp}°${state?.tempUnit}
+ + + + + + + + + + + + + +
Desired Heat TempDesired Cool Temp
${schedData?.reqSenHeatSetPoint ? "${schedData?.reqSenHeatSetPoint}°${state?.tempUnit}": "Not Available"}${schedData?.reqSenCoolSetPoint ? "${schedData?.reqSenCoolSetPoint}°${state?.tempUnit}": "Not Available"}
+
+
+ """ + } + + def chgDescHtml = """ + ${schedHtml == "" ? "" : """
"""} +
+

Last Automation Event

+ + + + + + + + + +
${getAutoChgType(device?.currentValue("whoMadeChanges"))}
${device?.currentValue("whoMadeChangesDesc") ?: "Unknown"}
${device?.currentValue("whoMadeChangesDescDt") ?: ""}
+
+
+
+

Eco Set By

+ + + + ${ecoDescDt} + +
${ecoDesc}
+
+ ${schedHtml == "" ? "" : """
"""} + """ + + def html = """ + ${clientBl} + ${updateAvail} +
+
+ +
+ +
+ ${schedHtml == "" ? "" : "${schedHtml}"} +
+

Device Info

+ + + + + + + + + + + + + +
Time to TargetSun Correction
${timeToTarget}${sunCorrectStr}
+ + + + + + + + + + + + ${state?.onlineStatus.toString().capitalize()} + + ${state?.apiStatus} + + +
Network StatusLeafAPI Status
+ + + + + + + + + + + + + + + + +
Firmware VersionDebugDevice Type
${state?.softwareVer.toString()}${state?.debugStatus}${state?.devTypeVer.toString()}
+ + + + + + + + + + + +
Nest Checked-InData Last Received
${state?.lastConnection.toString()}${state?.lastUpdatedDt.toString()}
+
+ ${schedHtml == "" ? """
${chgDescHtml}""" : ""} +
+ ${schedHtml == "" ? "" : """${chgDescHtml}"""} + ${chartHtml} +
+ +
+

Swipe/Drag to Change Slide

+
+
+
+
+ + """ + render contentType: "text/html", data: html, status: 200 + } catch (ex) { + log.error "getDeviceTile Exception:", ex + exceptionDataHandler(ex?.message, "getDeviceTile") } } -def showChartHtml() { - def tempStr = "°F" +def showChartHtml(devNum="") { + def tempStr = "\u00b0F" if( wantMetric() ) { - tempStr = "°C" + tempStr = "\u00b0C" } def canHeat = state?.can_heat == true ? true : false def canCool = state?.can_cool == true ? true : false @@ -3636,12 +3926,12 @@ def showChartHtml() { //TODO fix for fanonly grpUseData?.each { mon -> def data = mon?.value - def heat = data?.heating ? (data?.heating?.tSec.toLong()/3600).toDouble().round(0) : 0 // - def cool = data?.cooling ? (data?.cooling?.tSec.toLong()/3600).toDouble().round(0) : 0 // - def idle = data?.idle ? (data?.idle?.tSec.toLong()/3600).toDouble().round(0) : 0 // - def fanonly = data?.fanonly ? (data?.fanonly?.tSec.toLong()/3600).toDouble().round(0) : 0 // - def fanOn = data?.fanOn ? (data?.fanOn?.tSec.toLong()/3600).toDouble().round(0) : 0 // - def fanAuto = data?.fanAuto ? (data?.fanAuto?.tSec.toLong()/3600).toDouble().round(0) : 0 // + def heat = data?.heating ? (data?.heating?.tSec.toLong()/3600).toDouble().round(0) : 0 + def cool = data?.cooling ? (data?.cooling?.tSec.toLong()/3600).toDouble().round(0) : 0 + def idle = data?.idle ? (data?.idle?.tSec.toLong()/3600).toDouble().round(0) : 0 + def fanonly = data?.fanonly ? (data?.fanonly?.tSec.toLong()/3600).toDouble().round(0) : 0 + def fanOn = data?.fanOn ? (data?.fanOn?.tSec.toLong()/3600).toDouble().round(0) : 0 + def fanAuto = data?.fanAuto ? (data?.fanAuto?.tSec.toLong()/3600).toDouble().round(0) : 0 def mName = getMonthNumToStr(mon?.key) lStr += "\n$mName Usage - Idle: ($idle) | Heat: ($heat) | Cool: ($cool) | Fanonly: (${fanonly}) FanOn: ($fanOn) | FanAuto: ($fanAuto)" def iNum = 1 @@ -3687,10 +3977,10 @@ def showChartHtml() { def data = """ " return dayName + forecastImageLink + modalHead + modalTitle + forecastImage + forecastTxt + modalClose @@ -1622,16 +1671,14 @@ def getChgLogHtml() { return chgStr } +def hasHtml() { return true } + def getWeatherHTML() { try { - if(!state?.curWeather || !state?.curForecast) { - return hideWeatherHtml() - } + if(!state?.curWeather || !state?.curForecast) { return hideWeatherHtml() } def updateAvail = !state.updateAvailable ? "" : """
Device Update Available!
""" def clientBl = state?.clientBl ? """
Your Manager client has been blacklisted!\nPlease contact the Nest Manager developer to get the issue resolved!!!
""" : "" - //def obsrvTime = "Last Updated:\n${convertRfc822toDt(state?.curWeather?.current_observation?.observation_time_rfc822)}" - def obsrvTime = "Last Updated:\n${state?.curWeather?.current_observation?.observation_time_rfc822}" - + def obsrvTime = "Last Updated:\n${state?.curWeather?.validTimeLocal}" def devBrdCastData = state?.devBannerData ?: null def devBrdCastHtml = "" if(devBrdCastData) { @@ -1657,17 +1704,16 @@ def getWeatherHTML() { - - - - - - - - + + + + - + + + + @@ -1679,42 +1725,42 @@ def getWeatherHTML() { ${clientBl} ${updateAvail} ${getWeatherAlertHtml()} -
+

Current Weather Conditions

-

${state?.curWeather?.current_observation?.display_location?.full}

+

${state?.curWeatherLoc}

Feels Like: ${getFeelslike()}
Precip %: ${device.currentState("percentPrecip")?.value}%
Precip: ${getPrecip()}
- Humidity: ${state?.curWeather?.current_observation?.relative_humidity}
+ Humidity: ${state?.curWeatherHum}
Dew Point: ${getDewpoint()}
Pressure: ${getPressure()}
- UV Index: ${state.curWeather?.current_observation?.UV}
+ UV Index: ${device.currentState("ultravioletIndex")?.value}
Visibility: ${getVisibility()}
Lux: ${getLux()}
Sunrise: ${state?.localSunrise}
Sunset: ${state?.localSunset}
Wind: ${state?.windStr}
-
+

${getTemp()}

${state.curWeatherCond}

-
${forecastDay(0)}
${forecastDay(1)}
${forecastDay(2)}
+
${forecastDay(3)}
-
${forecastDay(3)}
${forecastDay(4)}
${forecastDay(5)}
+
${forecastDay(6)}
-
${forecastDay(6)}
-
${forecastDay(7)}
+
${forecastDay(7)}
+
${forecastDay(8)}

Tap Icon to View Forecast

@@ -1722,20 +1768,17 @@ def getWeatherHTML() {
- Station Id: ${state?.curWeather?.current_observation?.station_id} - ${state?.curWeather?.current_observation?.observation_time} + ${state?.curWeather?.validTimeLocal}
-
@@ -1743,16 +1786,90 @@ def getWeatherHTML() { """ +/* """ */ incHtmlLoadCnt() render contentType: "text/html", data: mainHtml, status: 200 } catch (ex) { log.error "getWeatherHTML Exception:", ex - exceptionDataHandler(ex.message, "getWeatherHTML") + exceptionDataHandler(ex?.message, "getWeatherHTML") + } +} + +def getDeviceTile(devNum="") { + try { + if(!state?.curWeather || !state?.curForecast) { + return hideWeatherHtml() + } + def updateAvail = !state.updateAvailable ? "" : """
Device Update Available!
""" + def clientBl = state?.clientBl ? """
Your Manager client has been blacklisted!\nPlease contact the Nest Manager developer to get the issue resolved!!!
""" : "" + def obsrvTime = "Last Updated:\n${state?.curWeather?.validTimeLocal}" + + def mainHtml = """ + ${clientBl} + ${updateAvail} + ${getWeatherAlertHtml()} +
+
+

Current Weather Conditions

+

${state?.curWeatherLoc}

+
+
+ Feels Like: ${getFeelslike()}
+ Precip %: ${device.currentState("percentPrecip")?.value}%
+ Precip: ${getPrecip()}
+ Humidity: ${state?.curWeatherHum}
+ Dew Point: ${getDewpoint()}
+ Pressure: ${getPressure()}
+ UV Index: ${device.currentState("ultravioletIndex")?.value}
+ Visibility: ${getVisibility()}
+ Lux: ${getLux()}
+ Sunrise: ${state?.localSunrise}
Sunset: ${state?.localSunset}
+ Wind: ${state?.windStr}
+
+
+
+

${getTemp()}

+

${state.curWeatherCond}

+
+
+
+
${forecastDay(1)}
+
${forecastDay(2)}
+
${forecastDay(3)}
+
+
+
${forecastDay(4)}
+
${forecastDay(5)}
+
${forecastDay(6)}
+
+
+
${forecastDay(7)}
+
${forecastDay(8)}
+
+

Tap Icon to View Forecast

+ + ${historyGraphHtml(devNum)} + +
+
+ ${state?.curWeather?.validTimeLocal} +
+
+
+
+ + """ +/* """ */ + render contentType: "text/html", data: mainHtml, status: 200 + } + catch (ex) { + log.error "getDeviceTile Exception:", ex + exceptionDataHandler(ex?.message, "getDeviceTile") } } -def historyGraphHtml() { +def historyGraphHtml(devNum="") { def html = "" if(state?.showGraphs) { if (state?.temperatureTable?.size() > 0 && state?.dewpointTable?.size() > 0) { @@ -1771,8 +1888,8 @@ def historyGraphHtml() { html = """

Event History

-
+
""" } else { html = """ @@ -1873,4 +1990,4 @@ def hideWeatherHtml() { private def textDevName() { return "Nest Weather${appDevName()}" } private def appDevType() { return false } -private def appDevName() { return appDevType() ? " (Dev)" : "" } \ No newline at end of file +private def appDevName() { return appDevType() ? " (Dev)" : "" } diff --git a/smartapps/tonesto7/nest-manager.src/nest-manager.groovy b/smartapps/tonesto7/nest-manager.src/nest-manager.groovy index d4bae431c..bb05e7dd1 100644 --- a/smartapps/tonesto7/nest-manager.src/nest-manager.groovy +++ b/smartapps/tonesto7/nest-manager.src/nest-manager.groovy @@ -1,6 +1,6 @@ /******************************************************************************************** | Application Name: NST Manager | -| Copyright (C) 2017 Anthony S. | +| Copyright (C) 2017, 2018, 2019 Anthony S. | | Authors: Anthony S. (@tonesto7), Eric S. (@E_sch) | | Contributors: Ben W. (@desertblade) | | A few code methods are modeled from those in CoRE by Adrian Caramaliu | @@ -8,8 +8,8 @@ | License Info: https://github.com/tonesto7/nest-manager/blob/master/app_license.txt | | | | NOTE: I really hope that we don't have a ton of forks being released to the community, | -| and that we can collaborate to make the smartapp and devices that will accommodate | -| every use case | +| and that we can collaborate to make smartapps and devices that will accommodate to | +| all use cases | *********************************************************************************************/ import groovy.json.* @@ -23,11 +23,10 @@ definition( author: "${appAuthor()}", description: "${textDesc()}", category: "Convenience", - iconUrl: "https://raw.githubusercontent.com/${gitPath()}/Images/App/nst_manager_icon.png", - iconX2Url: "https://raw.githubusercontent.com/${gitPath()}/Images/App/nst_manager_icon%402x.png", - iconX3Url: "https://raw.githubusercontent.com/${gitPath()}/Images/App/nst_manager_icon%403x.png", - singleInstance: true, - oauth: true ) + iconUrl: "https://raw.githubusercontent.com/${gitPath()}/Images/App/nst_manager_5.png", + iconX2Url: "https://raw.githubusercontent.com/${gitPath()}/Images/App/nst_manager_5%402x.png", + iconX3Url: "https://raw.githubusercontent.com/${gitPath()}/Images/App/nst_manager_5%403x.png", + singleInstance: true) { appSetting "clientId" @@ -35,17 +34,17 @@ definition( appSetting "devOpt" } -def appVersion() { "5.2.3" } -def appVerDate() { "11-20-2017" } +def appVersion() { "5.6.4" } +def appVerDate() { "05-16-2019" } def minVersions() { return [ - "automation":["val":520, "desc":"5.2.0"], - "thermostat":["val":520, "desc":"5.2.0"], - "protect":["val":520, "desc":"5.2.0"], - "presence":["val":520, "desc":"5.2.0"], - "weather":["val":520, "desc":"5.2.0"], - "camera":["val":520, "desc":"5.2.0"], - "stream":["val":101, "desc":"1.0.1"] + "automation":["val":550, "desc":"5.5.0"], + "thermostat":["val":546, "desc":"5.4.6"], + "protect":["val":543, "desc":"5.4.3"], + "presence":["val":544, "desc":"5.4.4"], + "weather":["val":552, "desc":"5.5.2"], + "camera":["val":545, "desc":"5.4.5"], + "stream":["val":201, "desc":"2.0.1"] ] } @@ -57,6 +56,7 @@ preferences { page(name: "authPage") page(name: "mainPage") page(name: "deviceSelectPage") + page(name: "devWebTiles") page(name: "donationPage") page(name: "reviewSetupPage") page(name: "voiceRprtPrefPage") @@ -70,7 +70,7 @@ preferences { page(name: "devNamePage") page(name: "alarmTestPage") page(name: "simulateTestEventPage") - page(name: "devNameResetPage") +// page(name: "devNameResetPage") page(name: "resetDiagQueuePage") page(name: "devPrefPage") page(name: "camMotionZoneFltrPage") @@ -78,7 +78,6 @@ preferences { page(name: "nestTokenResetPage") page(name: "uninstallPage") page(name: "forceUninstallPage") - page(name: "diagnosticPage") page(name: "custWeatherPage") page(name: "automationsPage") page(name: "automationKickStartPage") @@ -87,7 +86,7 @@ preferences { page(name: "automationSchedulePage") page(name: "feedbackPage") page(name: "sendFeedbackPage") - + page(name: "codeUpdatesPage") page(name: "setNotificationPage") page(name: "notifConfigPage") page(name: "setNotificationTimePage") @@ -100,8 +99,19 @@ mappings { path("/oauth/initialize") {action: [GET: "oauthInitUrl"]} path("/oauth/callback") {action: [GET: "callback"]} + path("/deviceTiles") {action: [GET: "renderDeviceTiles"]} + path("/tstatTiles") {action: [GET: "getTstatTiles"]} + path("/protectTiles") {action: [GET: "getProtectTiles"]} + path("/cameraTiles") {action: [GET: "getCamTiles"]} + path("/weatherTile") {action: [GET: "getWeatherTile"]} + path("/renderInstallData") {action: [GET: "renderInstallData"]} + if(!(settings?.restStreamLocal && settings?.restStreamLocalHub)) { + path("/receiveEventData") {action: [POST: "receiveEventData"]} + path("/streamStatus") {action: [POST: "receiveStreamStatus"]} + } //Web Diagnostics Pages if(settings?.enDiagWebPage == true || getDevOpt()) { + path("/processCmd") {action: [POST: "procDiagCmd"]} path("/diagHome") {action: [GET: "renderDiagHome"]} path("/getLogData") {action: [GET: "renderLogData"]} //path("/getLogMap") {action: [GET: "getLogMap"]} @@ -111,26 +121,16 @@ mappings { path("/getInstData") {action: [GET: "renderInstData"]} path("/getAppData") {action: [GET: "renderAppData"]} } - // path("/execCmd/:command") {action: [GET: "execCmd"]} - // path("/setData/:value") {action: [GET: "getSetData", POST: "updateSetData", DELETE: "delSetData"]} - // path("/stateData/:value") {action: [GET: "getStateData", POST: "updateStateData", DELETE: "delStateData"]} - path("/renderInstallData") {action: [GET: "renderInstallData"]} - path("/receiveEventData") {action: [POST: "receiveEventData"]} - path("/streamStatus") {action: [POST: "receiveStreamStatus"]} } } /****************************************************************************** -| Application Pages | +| Application Pages | *******************************************************************************/ //This Page is used to load either parent or child app interface code def startPage() { - if(parent) { - atomicState?.isParent = false - } else { - atomicState?.isParent = true - authPage() - } + atomicState?.isParent = true + authPage() } def authPage() { @@ -146,19 +146,30 @@ def authPage() { if(!atomicState?.devHandlersTested) { deviceHandlerTest() } if(!atomicState?.accessToken || !nestDevAccountCheckOk() || (!atomicState?.isInstalled && (!atomicState?.devHandlersTested || !preReqOk)) || (stateSz > 80)) { - return dynamicPage(name: "authPage", title: "Status Page", nextPage: "", install: false, uninstall: false) { - section ("Status Page:") { + return dynamicPage(name: "authPage", title: "Status Page", nextPage: "", install: (atomicState?.isInstalled == true ? true : false), uninstall: false) { + section () { + def title = "" def desc = "" def showWiki = false + def wikiDesc = "View Instruction Projects Wiki" + def wikiObj = "" if(!atomicState?.accessToken) { - desc = "OAuth is not Enabled for ${appName()} application. Please click remove and review the installation directions again" + title = "OAuth Error" + desc = "OAuth is not Enabled for ${appName()} application. Please click remove and review the installation directions again" + wikiObj = "#Enabling_OAuth" + wikiDesc = "Enabling Oauth (Wiki)" } else if(!nestDevAccountCheckOk()) { - desc = "You are missing the Client ID and Secret.\n\nWe can no longer provide you with a built-in Nest Client ID and Secret. Please check the Wiki for Detailed instructions on creating your own Nest Dev ID and Secret." + title = "Nest Developer Data Missing" + desc = "Client ID and Secret\nAre both missing!\n\nThe built-in Client ID and Secret can no longer be provided.\n\nPlease visit the Wiki at the link below to resolve the issue." showWiki = true + wikiObj = "#Nest_Developer_Account" + wikiDesc = "Configure Nest Dev Account (Wiki)" } else if(!atomicState?.devHandlersTested) { - desc = "Device Handlers are Missing or Not Published. Please verify the installation instructions and device handlers are present before continuing." + desc = "Device Handlers are Missing or Not Published. Please verify the installation instructions and device handlers are present before continuing." + wikiObj = "#Installation_Instructions" + wikiDesc = "Device Installation (Wiki)" } else if(!preReqOk) { desc = "SmartThings Location is not returning (TimeZone: ${location?.timeZone}) or (ZipCode: ${location?.zipCode}) Please edit these settings under the ST IDE or Mobile App" @@ -167,12 +178,14 @@ def authPage() { desc = "Application Status has not received any messages to display" } if(stateSz > 80) { - desc += "${desc != "" ? "\n\n" : ""}Your Manager State Usage is Greater than 80% full. This is not normal and you should notify the developer." + desc += "${desc != "" ? "\n\n" : ""}Your Manager State Usage is Greater than 80% full. This is not normal and you should notify the developer." + settingUpdate("enDiagWebPage", "true", "bool") + href url: getAppEndpointUrl("diagHome"), style:"external", title:"NST Diagnostic Web Page", description:"Tap to view", required: true,state: "complete", image: getAppImg("web_icon.png") } LogAction("Status Message: $desc", "warn", true) - paragraph "$desc", required: true, state: null + paragraph title: title, "$desc", required: true, state: null if(showWiki) { - href url: getWikiPageUrl(), style:"embedded", required:false, title:"View the Projects Wiki", description:"Tap to open in browser", state: "complete", image: getAppImg("web_icon.png") + href url: getWikiPageUrl()+wikiObj, style:"embedded", required:false, title:wikiDesc, description:"Tap to open in browser", state: "complete", image: getAppImg("web_icon.png") } } devPageFooter("authErrLoadCnt", execTime) @@ -187,7 +200,7 @@ def authPage() { def result = ((atomicState?.appData?.updater?.setupVersion && !atomicState?.setupVersion) || (atomicState?.setupVersion?.toInteger() < atomicState?.appData?.updater?.setupVersion?.toInteger())) ? true : false if (result) { atomicState?.newSetupComplete = null } } - + if((settings.restStreamLocal == true) && (atomicState?.appData?.settings?.streaming.allowLocal != true)) { settingUpdate("restStreamLocal", "true", "bool") } def description def oauthTokenProvided = false @@ -203,7 +216,7 @@ def authPage() { LogAction("AuthToken not found: Directing to Login Page", "info", true) return dynamicPage(name: "authPage", title: "Login Page", nextPage: "mainPage", install: false, uninstall: false) { section("") { - paragraph appInfoDesc(), image: getAppImg("nst_manager_icon%402x.png", true) + paragraph appInfoDesc(), image: getAppImg("nst_manager_5%402x.png", true) } section(""){ paragraph "Tap 'Login to Nest' below to authorize SmartThings to your Nest Account.\n\nAfter login you will be taken to the 'Works with Nest' page. Read the info and if you 'Agree' press the 'Accept' button." @@ -213,6 +226,7 @@ def authPage() { devPageFooter("authLoadCnt", execTime) } } + else if(showChgLogOk()) { return changeLogPage() } else if(showDonationOk()) { return donationPage() } else { return mainPage() } @@ -225,18 +239,17 @@ def mainPage() { def setupComplete = (!atomicState?.newSetupComplete || !isInstalled) ? false : true return dynamicPage(name: "mainPage", title: "", nextPage: (!setupComplete ? "reviewSetupPage" : null), install: setupComplete, uninstall: false) { section("") { - href "changeLogPage", title: "", description: "${appInfoDesc()}", image: getAppImg("nst_manager_icon%402x.png", true) + href "changeLogPage", title: "", description: "${appInfoDesc()}", image: getAppImg("nst_manager_5%402x.png", true) if(settings?.restStreaming) { - def rStrEn = (atomicState?.appData?.eventStreaming?.enabled || getDevOpt() || betaMarker()) - href "pollPrefPage", title: "", state: ((atomicState?.restStreamingOn && rStrEn) ? "complete" : null), image: getAppImg("two_way_icon.png"), - description: "Nest Streaming: (${(!atomicState?.restStreamingOn || !rStrEn) ? "Inactive" : "Active"})" + Boolean strOn = atomicState?.restStreamingOn + href "pollPrefPage", title: "", state: (strOn ? "complete" : null), image: getAppImg("two_way_icon.png"), description: "Nest Streaming: (${!strOn ? "Inactive" : "Active"})" } if(atomicState?.appData && !appDevType()) { if(isAppUpdateAvail()) { href url: stIdeLink(), style:"external", required: false, title:"An Update is Available for ${appName()}!", - description:"Current: v${appVersion()} | New: ${atomicState?.appData?.updater?.versions?.app?.ver}\n\nTap to Open the IDE in Browser", state: "complete", image: getAppImg("update_icon.png") + description:"Current: v${appVersion()} | New: ${atomicState?.appData?.updater?.versions?.app?.ver}\n\nTap to Open the IDE in Browser", state: "complete", image: getAppImg("update_icon.png") } - if(atomicState?.clientBlacklisted) { + if(atomicState?.cltBlacklisted) { paragraph "This ID is blacklisted, please update software!\nIf software is up to date, contact developer", required: true, state: null } } @@ -244,12 +257,13 @@ def mainPage() { if(isInstalled) { if(settings?.structures && !atomicState?.structures) { atomicState.structures = settings?.structures } section("Devices & Location:") { - paragraph "Home/Away Status: (${strCapitalize(getLocationPresence())})", title: "Location: ${atomicState?.structName}", state: "complete", image: getAppImg("thermostat_icon.png") + paragraph "Home/Away Status: (${strCapitalize(getLocationPresence() ?: "Not Available Yet!")})", title: "Location: ${atomicState?.structName}", state: "complete", image: getAppImg("home_icon.png") def t1 = getDevicesDesc(false) def devDesc = t1 ? "${t1}\n\nTap to modify devices" : "Tap to configure" - href "deviceSelectPage", title: "Manage Devices", description: devDesc, state: "complete", image: "blank_icon.png" + href "deviceSelectPage", title: "Manage/View Devices", description: devDesc, state: "complete", image: "blank_icon.png" def devSelected = (atomicState?.structures && (atomicState?.thermostats || atomicState?.protects || atomicState?.cameras || atomicState?.presDevice || atomicState?.weatherDevice)) if(devSelected) { + href "devWebTiles", title: "View Device Tiles", description:"Tap to view", required: true,state: "complete", image: getAppImg("web_icon.png") href "devPrefPage", title: "Device Customization", description: "Tap to configure", image: getAppImg("device_pref_icon.png") } } @@ -258,18 +272,17 @@ def mainPage() { if(!isInstalled) { devicesPage() } - if(isInstalled && atomicState?.structures && (atomicState?.thermostats || atomicState?.protects || atomicState?.cameras)) { + if(isInstalled && atomicState?.structures && (atomicState?.thermostats || atomicState?.protects || atomicState?.cameras) && settings?.liteAppMode != true) { def t1 = getInstAutoTypesDesc() def autoDesc = t1 ? "${t1}\n\nTap to modify" : null section("Manage Automations:") { - href "automationsPage", title: "Automations", description: (autoDesc ? autoDesc : "Tap to configure"), state: (autoDesc ? "complete" : null), image: getAppImg("automation_icon.png") + href "automationsPage", title: "Automations", description: (autoDesc ? autoDesc : "Tap to configure"), state: (autoDesc ? "complete" : null), image: getAppImg("nst_automations_5.png") } } if(isInstalled) { section("Notifications Options:") { def t1 = getAppNotifConfDesc() - href "notifPrefPage", title: "Notifications", description: (t1 ? "${t1}\n\nTap to modify" : "Tap to configure"), state: (t1 ? "complete" : null), - image: getAppImg("notification_icon2.png") + href "notifPrefPage", title: "Notifications", description: (t1 ? "${t1}\n\nTap to modify" : "Tap to configure"), state: (t1 ? "complete" : null),image: getAppImg("notification_icon2.png") } section("Manage Polling, Logging, Nest Login, and More:") { def descStr = "" @@ -292,7 +305,9 @@ def mainPage() { section("Having Trouble?:") { href "helpPage", title: "Get Help | Diagnostics", description: "", image: getAppImg("help_ring_icon.png") if(settings?.enDiagWebPage) { - href url: getAppEndpointUrl("diagHome"), style:"external", title:"NST Diagnostic Web Page", description:"Tap to view", required: true,state: "complete", image: getAppImg("web_icon.png") + String diagTime = (getTimestampVal("remDiagLogActivatedDt") != null) ? "\n• Will Disable in:\n └ ${getDiagLogTimeRemaining()}" : "" + String diagStr = (settings?.enRemDiagLogging) ? "Diagnostic Logs: (ACTIVE)${diagTime}\n\nTap to view" : "Tap to view" + href url: getAppEndpointUrl("diagHome"), style:"external", title:"NST Diagnostic Web Page", description: diagStr, required: true, state: "complete", image: getAppImg("web_icon.png") } } section("Remove All Apps, Automations, and Devices:") { @@ -300,10 +315,91 @@ def mainPage() { } } atomicState.ok2InstallAutoFlag = false + // storageInfoSect() devPageFooter("mainLoadCnt", execTime) } } +// NEW STORAGE SmartApp +def storageInfoSect() { + //Integer stateSz = getStateSizePerc() + //if(!atomicState?.isInstalled || isAppLiteMode() || (stateSz < 50)) { return "" } + def storApp = getStorageApp(false) + section("Storage App Info:") { + if(storApp) { + def str = "" + str += "Version: V${storApp?.appVersion()}" + str += "\nUsage: ${storApp?.getStateSizePerc()}%" + paragraph str, state: "complete" + } else { + paragraph "Storage SmartApp Is Not Installed..." + } + } +} + +def getStorageVal(val) { + if(val) { + def storApp = getStorageApp() + def ret + if(storApp) { ret = storApp?.getStateVal(val as String) } // avoid multiple calls to child + return ret + } + return null +} + +def updStorageVal(sKey, sValue) { + if(sKey) { + def storApp = getStorageApp() + if(storApp) { return storApp?.stateUpdate(sKey as String, sValue) } + } +} + +def remStorageVal(String sKey) { + if(sKey) { + def storApp = getStorageApp() + if(storApp) { return storApp?.stateRemove(sKey as String) } + } +} + +def findStateStorageVal(String val) { + def storVal = getStorageVal(val) + def stateVal = atomicState?."$val" + if(storVal) { + if(stateVal) { state.remove(val) } + return storVal + } else if(stateVal) { return stateVal } + return null +} + +public storageAppInst(Boolean available) { + atomicState?.storageAppAvailable = (available == true) +} + +private getStorageApp(honorState = true) { + Integer stateSz = getStateSizePerc() + if(honorState && stateSz < 26) { return null } + if(honorState && isAppLiteMode()) { return null } + def storApp = getChildApps()?.find { it?.getAutomationType() == "storage" && it?.name == autoAppName() } + if(storApp) { + if(storApp?.label != getStorageAppChildLabel()) { storApp?.updateLabel(getStorageAppChildLabel()) } + storageAppInst(true) + return storApp + } else { + //runIn(5, "initStorageApp", [overwrite: true]) + storageAppInst(false) + return null + } +} + +private checkStorageApp() { + def oldStorApp = getChildApps()?.find{ it?.getAutomationType() == "storage" && it?.name != autoAppName() } + if(oldStorApp) { + LogAction("checkStorageApp | Removing Old Storage App", "warn", false) + deleteChildApp(oldStorApp) + updTimestampMap("lastAnalyticUpdDt", null) + } +} + def donationPage() { return dynamicPage(name: "donationPage", title: "", nextPage: "mainPage", install: false, uninstall: false) { section("") { @@ -348,29 +444,83 @@ def devicesPage() { } if (settings?.structures) { atomicState.structures = settings?.structures - def newStrucName = structs && structs?."${atomicState?.structures}" ? "${structs[atomicState?.structures]}" : null + def newStrucName = structs && structs?."${atomicState?.structures}" ? "${structs[atomicState?.structures]}" : null atomicState.structName = newStrucName ?: atomicState?.structName - //atomicState.structName = (settings?.structures && atomicState?.structures) ? "${structs[atomicState?.structures]}" : null + //atomicState.structName = (settings?.structures && atomicState?.structures) ? "${structs[atomicState?.structures]}" : null def stats = getNestThermostats() def statDesc = stats.size() ? "Found (${stats.size()}) Thermostats" : "No Thermostats" //LogAction("${statDesc} (${stats})", "info", false) + def str = "devicePage" + def dData = atomicState?.deviceData + + def t0 = [:] + t0 = dData?.thermostats?.findAll { it?.key?.toString() in settings?.thermostats } + def t1 = [] + t0?.each { devItem -> + LogAction("${str}: Found (${devItem?.value?.name})", "info", false) + if(devItem?.key && devItem?.value?.name) { + t1 << "${devItem.key.toString()}" + } + } + LogAction("${str} | Thermostats(${t0?.size()}): ${t1}", "info", true) + + def t3 = settings?.thermostats?.size() ?: 0 + if(t1?.size() != t3) { + LogAction("Thermostat Counts Wrong! | Current: (${t1?.size()}) | Expected: (${t3})", "error", true); + settingUpdate("thermostats", t1, "enum") + } + def coSmokes = getNestProtects() def coDesc = coSmokes.size() ? "Found (${coSmokes.size()}) Protects" : "No Protects" //LogAction("${coDesc} (${coSmokes})", "info", false) + t0 = [:] + t0 = dData?.smoke_co_alarms?.findAll { it?.key?.toString() in settings?.protects } + t1 = [] + t0?.each { devItem -> + LogAction("${str}: Found (${devItem?.value?.name})", "info", false) + if(devItem?.key && devItem?.value?.name) { + t1 << "${devItem.key.toString()}" + } + } + LogAction("${str} | Protects(${t0?.size()}): ${t1}", "info", true) + + t3 = settings?.protects?.size() ?: 0 + if(t1?.size() != t3) { + LogAction("Protects Counts Wrong! | Current: (${t1?.size()}) | Expected: (${t3})", "error", true); + settingUpdate("protects", t1, "enum") + } + def cams = getNestCameras() def camDesc = cams.size() ? "Found (${cams.size()}) Cameras" : "No Cameras" //LogAction("${camDesc} (${cams})", "info", false) + t0 = [:] + t0 = dData?.cameras?.findAll { it?.key?.toString() in settings?.cameras } + t1 = [] + t0?.each { devItem -> + LogAction("${str}: Found (${devItem?.value?.name})", "info", false) + if(devItem?.key && devItem?.value?.name) { + t1 << "${devItem.key.toString()}" + } + } + LogAction("${str} | Cameras(${t0?.size()}): ${t1}", "info", true) + + t3 = settings?.cameras?.size() ?: 0 + if(t1?.size() != t3) { + LogAction("Cameras Counts Wrong! | Current: (${t1?.size()}) | Expected: (${t3})", "error", true); + settingUpdate("cameras", t1, "enum") + } + section("Select Devices:") { if(!stats?.size() && !coSmokes.size() && !cams?.size()) { paragraph "No Devices were found" } if(stats?.size() > 0) { input(name: "thermostats", title:"Nest Thermostats", type: "enum", required: false, multiple: true, submitOnChange: true, metadata: [values:stats], image: getAppImg("thermostat_icon.png")) } - atomicState.thermostats = settings?.thermostats ? statState(settings?.thermostats) : null + atomicState.thermostats = settings?.thermostats ? statState(settings?.thermostats) : null if(coSmokes.size() > 0) { input(name: "protects", title:"Nest Protects", type: "enum", required: false, multiple: true, submitOnChange: true, metadata: [values:coSmokes], image: getAppImg("protect_icon.png")) @@ -387,6 +537,9 @@ def devicesPage() { atomicState.weatherDevice = settings?.weatherDevice ?: null } if(isInstalled) { + section("Device Web Tiles:") { + href "devWebTiles", title: "View Device Tiles", description:"Tap to view", required: true,state: "complete", image: getAppImg("web_icon.png") + } if(atomicState?.protects) { section("Nest Protect Alarm Simulation:") { def dt = atomicState?.isAlarmCoTestActiveDt @@ -397,6 +550,19 @@ def devicesPage() { } } +def devWebTiles() { + dynamicPage(name: "devWebTiles", title: "Device Tiles", uninstall: false) { + section("Device Web Tiles:") { + href url: getAppEndpointUrl("deviceTiles"), style:"external", title:"All Device Tiles\n(Take Longer to Load)", description:"Tap to view", required: true,state: "complete", image: getAppImg("view_icon.png") + if(atomicState?.thermostats) { href url: getAppEndpointUrl("tstatTiles"), style:"external", title:"Thermostat Tiles", description:"Tap to view", required: true,state: "complete", image: getAppImg("thermostat_icon.png") } + if(atomicState?.protects) { href url: getAppEndpointUrl("protectTiles"), style:"external", title:"Protect Tiles", description:"Tap to view", required: true,state: "complete", image: getAppImg("protect_icon.png") } + if(atomicState?.cameras) { href url: getAppEndpointUrl("cameraTiles"), style:"external", title:"Camera Tiles", description:"Tap to view", required: true,state: "complete", image: getAppImg("camera_icon.png") } + if(atomicState?.weatherDevice) { href url: getAppEndpointUrl("weatherTile"), style:"external", title:"Weather Tile", description:"Tap to view", required: true,state: "complete", image: getAppImg("weather_icon.png") } + } + } +} + + def devPrefPage() { def execTime = now() dynamicPage(name: "devPrefPage", title: "Device Options", uninstall: false) { @@ -409,17 +575,19 @@ def devPrefPage() { } if(atomicState?.cameras) { section("Camera Devices:") { - if(atomicState?.appData?.eventStreaming?.enabled == true || getDevOpt() || betaMarker()) { + // if(getDevOpt() || betaMarker()) { input "camTakeSnapOnEvt", "bool", title: "Take Snapshot on Motion Events?", required: false, defaultValue: true, submitOnChange: true, image: getAppImg("snapshot_icon.png") input "motionSndChgWaitVal", "enum", title: "Delay before Motion/Sound Events are marked Inactive?", required: false, defaultValue: 60, metadata: [values:waitValAltEnum(true)], submitOnChange: true, image: getAppImg("delay_time_icon.png") - // input "camEnMotionZoneFltr", "bool", title: "Allow filtering motion events by configured zones?", required: false, defaultValue: false, submitOnChange: true, image: getAppImg("motion_icon.png") - // if(settings?.camEnMotionZoneFltr) { - // href "camMotionZoneFltrPage", title: "Select the Zones for each camera to be used to trigger Motion?", description: "Tap to modify", image: getAppImg("zone_icon.png") - // } + input "camEnMotionZoneFltr", "bool", title: "Allow filtering motion events by configured zones?", required: false, defaultValue: false, submitOnChange: true, image: getAppImg("motion_icon.png") + if(settings?.camEnMotionZoneFltr) { + def camZones = getCamActivityZones() + def t0 = camMotionZoneDesc() + href "camMotionZoneFltrPage", title: "Restrict Motion to Certain Zones?", description: t0, params: [devices: atomicState?.cameras.sort{it?.value}, camZones: camZones], image: getAppImg("zone_icon.png"), state: (t0 ? "complete" : "") + } atomicState.needChildUpd = true - } else { - paragraph "No Camera Device Options Yet..." - } + // } else { + // paragraph "No Camera Device Options Yet..." + // } } } if(atomicState?.protects) { @@ -430,10 +598,8 @@ def devPrefPage() { } if(atomicState?.thermostats) { section("Thermostat Devices:") { - if(!inReview()) { - input ("tstatShowHistoryGraph", "bool", title: "Show Graph with Setpoint, Humidity, Temp History?", description: "This disables history collection", required: false, defaultValue: true, submitOnChange: true, - image: getAppImg("graph_icon2.png")) - } + input ("tstatShowHistoryGraph", "bool", title: "Show Graph with Setpoint, Humidity, Temp History?", description: "This disables history collection", required: false, defaultValue: true, submitOnChange: true, + image: getAppImg("graph_icon2.png")) input ("tempChgWaitVal", "enum", title: "Manual Temp Change Delay", required: false, defaultValue: 4, metadata: [values:waitValEnum()], submitOnChange: true, image: getAppImg("temp_icon.png")) atomicState.needChildUpd = true } @@ -457,46 +623,60 @@ def devPrefPage() { } } -def getCamActivityZones(devId) { - def actZones = atomicState?.deviceData?.cameras[devId]?.activity_zones +def getCamActivityZones() { def camZones = [:] - if(actZones.size()) { - actZones?.each { zn -> - def zId = zn?.id - def zName = zn?.name - def adni = [zId].join('.') - camZones[adni] = zName + atomicState?.cameras.sort{it?.value}.each { cam -> + camZones[cam?.key] = [:] + def actZones = atomicState?.deviceData?.cameras[cam?.key]?.activity_zones + if(actZones.size()) { + actZones?.each { zn -> + camZones[cam?.key][zn?.id as String] = zn?.name as String + } } } return camZones } -def camMotionZoneFltrPage() { +def camMotionZoneFltrPage(params) { + def cams = params?.devices + def camZones = params?.camZones + if(params?.devices && params?.camZones) { + atomicState.camFilterPageData = params + } else { + cams = atomicState?.camFilterPageData?.devices + camZones = atomicState?.camFilterPageData?.camZones + } def execTime = now() - dynamicPage(name: "camMotionZoneFltrPage", title: "", nextPage: "", install: false) { - def cnt = 1 - atomicState?.cameras.sort{it?.value}.each { cam -> - - def t0 = cam?.key - def t1 = cam?.value - def camZones = getCamActivityZones(t0) - def zoneDesc = camZones.size() ? "Found (${camZones.size()}) Zones" : "No Zones Found" - LogAction("${zoneDesc} (${camZones})", "info", true) - section("Camera: (${t1})") { - if(!camZones?.size()) { - paragraph "No Zones were found for this camera." - } else { - input(name: "${t0}_zones", title:"Available Zones", type: "enum", description: "${zoneDesc}", required: false, multiple: true, submitOnChange: true, - metadata: [values:camZones], image: getAppImg("zone_icon.png")) + dynamicPage(name: "camMotionZoneFltrPage", title: "", nextPage: "devPrefPage", install: false) { + if(cams && camZones) { + cams?.each { cm-> + def zones = camZones[cm?.key]?.sort { it?.value } + section("(${cm?.value}) Zones") { + if(!zones?.size()) { + paragraph "Camera has NO Zones..." + } else { + input("camera_${cm?.key}_zones", "enum", title:"Available Zones", description: "Found (${zones?.size()}) Zones", required: false, multiple: true, submitOnChange: true, options: zones, image: getAppImg("zone_icon.png")) + } } } - } - + } else { section() { paragraph "NO Camera Zones Found..." } } atomicState.needChildUpd = true devPageFooter("camZoneFltLoadCnt", execTime) } } +def camMotionZoneDesc() { + def desc = "" + if(atomicState?.cameras) { + atomicState?.cameras.sort{it?.value}.each { cam -> + if(settings?."camera_${cam?.key}_zones"?.size()) { + desc += "${desc == "" ? "" : "\n"}${cam?.value}: (${settings?."camera_${cam?.key}_zones"?.size()}) Zones" + } + } + } + return desc == "" ? null : desc +} + def custWeatherPage() { def execTime = now() dynamicPage(name: "custWeatherPage", title: "", nextPage: "", install: false) { @@ -506,6 +686,8 @@ def custWeatherPage() { input ("useCustWeatherLoc", "bool", title: "Use Custom Location?", description: "", required: false, defaultValue: false, submitOnChange: true, image: getAppImg("info_icon2.png")) } if(settings?.useCustWeatherLoc) { +//ERS todo no more search +/* section("Select the Search method:") { input ("custWeatherLocSrch", "bool", title: "Use semi-automated search?", description: "", required: false, defaultValue: false, submitOnChange: true, image: getAppImg("info_icon2.png")) } @@ -521,21 +703,28 @@ def custWeatherPage() { } } } else { +*/ section("Manually Enter a Location:") { +//ERS todo no more WU can set string... +/* href url:"https://www.wunderground.com/weatherstation/ListStations.asp", style:"embedded", required:false, title:"Weather Station ID Lookup", description: "Lookup Weather Station ID", image: getAppImg("search_icon.png") - input("custLocStr", "text", title: "Manaually Set Weather Location?", required: false, defaultValue: defZip, submitOnChange: true, image: getAppImg("weather_icon_grey.png")) - def validEnt = "\n\nWeather Stations: [pws:station_id]\nZipCodes: [90250]\nZWM: [zwm:zwm_number]" +*/ + input("custLocStr", "text", title: "Manually Set Weather Location?", required: false, defaultValue: defZip, submitOnChange: true, image: getAppImg("weather_icon_grey.png")) +//ERS todo no more PWS + //def validEnt = "\n\nWeather Stations: [pws:station_id]\nZipCodes: [90250]\nZWM: [zwm:zwm_number]" + def validEnt = "ZipCodes: [90250]" paragraph "Valid location entries are:${validEnt}", image: getAppImg("blank_icon.png") } - } +// } } - atomicState.lastWeatherUpdDt = 0 - atomicState?.lastForecastUpdDt = 0 + updTimestampMap("lastWeatherUpdDt", 0) + updTimestampMap("lastForecastUpdDt", 0) devPageFooter("custWeathLoadCnt", execTime) } } +/* def getWeatherQueryResults(query) { LogTrace("Getting Weather Query Results for '$query'") def objMap = [:] @@ -549,6 +738,32 @@ def getWeatherQueryResults(query) { } return objMap } +*/ + +def codeUpdatesPage(){ + dynamicPage(name: "codeUpdatesPage", uninstall: false, install: false) { + def theURL = "https://consigliere-regional.api.smartthings.com/?redirect=" + URLEncoder.encode(getAppEndpointUrl("stupdate")) + section() { + def desc = "\bSmartApps:" + desc += atomicState?.swVer?.mgrVer != null ? "${desc != "" ? "\n":""}Manager Version: (${atomicState?.swVer?.mgrVer})" : "" + desc += atomicState?.swVer?.autoSaVer != null ? "${desc != "" ? "\n":""}Automations Version: (${atomicState?.swVer?.autoSaVer})" : "" + desc += "\n\n\bDevices:" + desc += atomicState?.swVer?.tDevVer != null ? "${desc != "" ? "\n":""} • Thermostat Version: (${atomicState?.swVer?.tDevVer})" : "" + desc += atomicState?.swVer?.pDevVer != null ? "${desc != "" ? "\n":""} • Protect Version: (${atomicState?.swVer?.pDevVer})" : "" + desc += atomicState?.swVer?.camDevVer != null ? "${desc != "" ? "\n":""} • Camera Version: (${atomicState?.swVer?.camDevVer})" : "" + desc += atomicState?.swVer?.presDevVer != null ? "${desc != "" ? "\n":""} • Presence Version: (${atomicState?.swVer?.presDevVer})" : "" + desc += atomicState?.swVer?.weatDevVer != null ? "${desc != "" ? "\n":""} • Weather Version: (${atomicState?.swVer?.weatDevVer})" : "" + paragraph desc, state: "complete" + } + section() { + paragraph title: "What will this do?", "This process makes sure the following are up-to-date:\n • All SmartApps\n • All Devices\n\nAll you will need to do is sign in to the IDE and watch it go..." + href url: theURL, title: "Tap to Update", description: null, image: getAppImg("update_icon.png") + } + section("") { + href "changeLogPage", title: "View Change Log", description: "Tap to view", image: getAppImg("change_log_icon.png") + } + } +} def reviewSetupPage() { return dynamicPage(name: "reviewSetupPage", title: "Setup Review", install: true, uninstall: atomicState?.isInstalled) { @@ -573,10 +788,11 @@ def reviewSetupPage() { //getDevChgDesc() showVoiceRprtPrefs() - // section("App Mode: (Full or Lite)") { - // paragraph "Lite Mode will remove alot of the advanced features and allow for a very basic install. This will basically integrate Nest into ST without the bells and whistles." - // input ("liteAppMode", "bool", title: "Install the App in Lite Mode?", required: false, defaultValue: false, submitOnChange: true, image: getAppImg("app_analytics_icon.png")) - // } + section("App Mode: (Full or Lite)") { + def lmDesc = "Lite Mode will remove alot of the advanced features and allow for a very basic install. This will basically integrate Nest into ST without the bells and whistles." + input ("liteAppMode", "bool", title: "Lite App Mode?", description: lmDesc, required: false, defaultValue: false, submitOnChange: true, + image: getAppImg("app_analytics_icon.png")) + } section("Notifications:") { def t1 = getAppNotifConfDesc() href "notifPrefPage", title: "Notifications", description: (t1 ? "${t1}\n\nTap to modify" : "Tap to configure"), state: (t1 ? "complete" : null), image: getAppImg("notification_icon2.png") @@ -586,10 +802,8 @@ def reviewSetupPage() { href "pollPrefPage", title: "Device | Structure\nPolling Preferences", description: (pollDesc != "" ? "${pollDesc}\n\nTap to modify" : "Tap to configure"), state: (pollDesc != "" ? "complete" : null), image: getAppImg("timer_icon.png") } showDevSharePrefs() - if(atomicState?.showHelp) { - section("") { - href "infoPage", title: "Donations and Info", description: "Tap to view", image: getAppImg("info.png") - } + section("") { + href "infoPage", title: "Donations and Info", description: "Tap to view", image: getAppImg("info.png") } if(!atomicState?.isInstalled) { section("") { @@ -599,9 +813,13 @@ def reviewSetupPage() { } } +def isAppLiteMode() { + return (settings?.liteAppMode == true) +} + def showDevSharePrefs() { section("Share Data with Developer:") { - paragraph title: "What is this used for?", "These options send non-user identifiable information and error data to diagnose catch trending issues." + paragraph title: "What is this used for?", "These options send non-user identifiable information and error data to diagnose or catch trending issues." input ("optInAppAnalytics", "bool", title: "Send Install Data?", required: false, defaultValue: true, submitOnChange: true, image: getAppImg("app_analytics_icon.png")) input ("optInSendExceptions", "bool", title: "Send Error Data?", required: false, defaultValue: true, submitOnChange: true, image: getAppImg("diag_icon.png")) if(settings?.optInAppAnalytics != false) { @@ -618,14 +836,47 @@ def showDevSharePrefs() { def helpPage () { def execTime = now() dynamicPage(name: "helpPage", title: "Help and Diagnostics", install: false) { + section("App Info") { + paragraph "Current State Usage:\n${getStateSizePerc()}% (${getStateSize()} bytes)", required: true, state: (getStateSizePerc() <= 70 ? "complete" : null), + image: getAppImg("progress_bar.png") + if(atomicState?.isInstalled && atomicState?.structures && (atomicState?.thermostats || atomicState?.protects || atomicState?.cameras || atomicState?.weatherDevice)) { + input "enDiagWebPage", "bool", title: "Enable Diagnostic Web Page?", description: "", required: false, defaultValue: false, submitOnChange: true, image: getAppImg("diagnostic_icon.png") + if(settings?.enDiagWebPage) { + href url: getAppEndpointUrl("diagHome"), style:"external", title:"NST Diagnostic Web Page", description:"Tap to view", required: true,state: "complete", image: getAppImg("web_icon.png") + } + } + } + if(getDevOpt()) { + settingUpdate("enDiagWebPage","true", "bool") + } + if(settings?.enDiagWebPage) { + section("How's Does Log Collection Work:", hideable: true, hidden: true) { + paragraph title: "How will the log collection work?", "When logs are enabled this SmartApp will create a child diagnostic app to store your logs which you can view under the diagnostics web page or share the url with the developer for remote troubleshooting.\n\n Turn off to remove the diag app and all data." + } + section("Log Collection:") { +/* + def formatVal = settings?.useMilitaryTime ? "MMM d, yyyy - HH:mm:ss" : "MMM d, yyyy - h:mm:ss a" + def tf = new SimpleDateFormat(formatVal) + if(getTimeZone()) { tf.setTimeZone(getTimeZone()) } +*/ + paragraph "Logging will automatically turn off in 48 hours and all logs will be purged." + input (name: "enRemDiagLogging", type: "bool", title: "Enable Log Collection?", required: false, defaultValue: (atomicState?.enRemDiagLogging ?: false), submitOnChange: true, image: getAppImg("log.png")) + if(atomicState?.enRemDiagLogging) { + def str = "Press Done/Save all the way back to the main smartapp page to allow the Diagnostic App to Install" + paragraph str, required: true, state: "complete" + } + } + } + diagLogProcChange((settings?.enDiagWebPage && settings?.enRemDiagLogging)) section("Help and Feedback:") { href url: getWikiPageUrl(), style:"embedded", required:false, title:"View the Projects Wiki", description:"Tap to open in browser", state: "complete", image: getAppImg("web_icon.png") href url: getIssuePageUrl(), style:"embedded", required:false, title:"Report | View Issues", description:"Tap to open in browser", state: "complete", image: getAppImg("issue_icon.png") href "feedbackPage", title: "Send Developer Feedback", description: "", image: getAppImg("feedback_icon.png") } - section("Diagnostic Data:") { - def t1 = getRemDiagDesc() - href "diagnosticPage", title: "View Diagnostic Info", description: (t1 ? "${t1 ?: ""}\n\nTap to view" : "Tap to view"), state: (t1) ? "complete" : null, image: getAppImg("diagnostic_icon.png") + section("SmartApp Security") { + paragraph title:"What does resetting do?", "If you share a url with someone and want to remove their access you can reset your token and this will invalidate any URL you shared and create a new one for you." + input (name: "resetSTAccessToken", type: "bool", title: "Reset SmartThings Access Token?", required: false, defaultValue: false, submitOnChange: true, image: getAppImg("reset_icon.png")) + resetSTAccessToken(settings?.resetSTAccessToken == true) } devPageFooter("helpLoadCnt", execTime) } @@ -635,7 +886,7 @@ def infoPage () { def execTime = now() dynamicPage(name: "infoPage", title: "Info and Instructions", install: false) { section("About this App:") { - paragraph appInfoDesc(), image: getAppImg("nst_manager_icon%402x.png", true) + paragraph appInfoDesc(), image: getAppImg("nst_manager_5%402x.png", true) } section("Donations:") { href url: textDonateLink(), style:"external", required: false, title:"Donations", @@ -685,6 +936,8 @@ def prefsPage() { section ("Misc. Options:") { input ("useMilitaryTime", "bool", title: "Use Military Time (HH:mm)?", defaultValue: false, submitOnChange: true, required: false, image: getAppImg("military_time_icon.png")) input ("disAppIcons", "bool", title: "Disable App Icons?", required: false, defaultValue: false, submitOnChange: true, image: getAppImg("no_icon.png")) + input ("liteAppMode", "bool", title: "Lite App Mode?", description: "Removes Automations", required: false, defaultValue: false, submitOnChange: true, + image: getAppImg("app_analytics_icon.png")) atomicState.needChildUpd = true } section("Customize Application Label:") { @@ -699,12 +952,12 @@ def voiceRprtPrefPage() { return dynamicPage(name: "voiceRprtPrefPage", title: "Voice Report Preferences", install: false, uninstall: false) { section("Report Customization:") { paragraph "These options allow you to configure how much info is included in the Thermostat voice reporting." - if(!atomicState?.appData?.reportPrefs?.disVoiceZoneRprt) { - input ("vRprtIncSchedInfo", "bool", title: "Include Automation Source Schedule Info?", required: false, defaultValue: true, submitOnChange: false, image: getAppImg("automation_icon.png")) + if(!atomicState?.appData?.settings?.reports?.disVoiceZoneRprt) { + input ("vRprtIncSchedInfo", "bool", title: "Include Automation Source Schedule Info?", required: false, defaultValue: true, submitOnChange: false, image: getAppImg("nst_automations_5.png")) input ("vRprtIncZoneInfo", "bool", title: "Include Current Zone Info?", required: false, defaultValue: true, submitOnChange: false, image: getAppImg("thermostat_icon.png")) input ("vRprtIncExtWeatInfo", "bool", title: "Include External Info?", required: false, defaultValue: true, submitOnChange: false, image: getAppImg("weather_icon.png")) } - if(!atomicState?.appData?.reportPrefs?.disVoiceUsageRprt) { + if(!atomicState?.appData?.settings?.reports?.disVoiceUsageRprt) { input ("vRprtIncUsageInfo", "bool", title: "Include Usage Info?", required: false, defaultValue: true, submitOnChange: false, image: getAppImg("usage_icon.png")) } } @@ -715,29 +968,36 @@ def voiceRprtPrefPage() { def pollPrefPage() { def execTime = now() dynamicPage(name: "pollPrefPage", title: "Polling Preferences", install: false) { - if(atomicState?.appData?.eventStreaming?.enabled == true || getDevOpt()) { - section("Rest Streaming (Experimental):") { - input(name: "restStreaming", title:"Enable Rest Streaming?", type: "bool", defaultValue: false, required: false, submitOnChange: true, image: getAppImg("two_way_icon.png")) - if(!settings?.restStreaming) { - paragraph title: "Streaming is an Experimental Feature", "It requires the install of our local NodeJS streaming service running on your home network. \n\n(This is a donation only feature)\nPlease send me a PM in the Community Forum if you have already donated and are interested" - } - } - if(settings?.restStreaming) { - section("Configure Streaming Service:") { - href "restSrvcDiscovery", title: "Auto-Discover Local Service", state: (settings?.selectedRestDevice ? "complete" : null), image: getAppImg("search_icon.png"), - description: selectedRestDiscSrvcDesc() ? "Selected Service:\n${selectedRestDiscSrvcDesc()}" : "Discover NST Service on your local network" - if(!settings?.selectedRestDevice) { - input(name: "restStreamIp", title:"Rest Service Address", type: "text", required: true, submitOnChange: true, image: getAppImg("ip_icon.png")) - input(name: "restStreamPort", title:"Rest Service Port", type: "number", defaultValue: 3000, required: true, submitOnChange: true, image: getAppImg("port_icon.png")) + section("Rest Streaming (Experimental):") { + input(name: "restStreaming", title:"Enable Rest Streaming?", type: "bool", defaultValue: false, required: false, submitOnChange: true, image: getAppImg("two_way_icon.png")) + if(!settings?.restStreaming) { + paragraph title: "Streaming is an Experimental Feature (Even though it's Stable)", "It requires the install of our local NodeJS streaming service running on your home network." + href url: streamLink(), style:"external", required: false, title:"Setup Instructions", description:"Tap to open in browser", state: "complete", image: getAppImg("web_icon.png") + } + } + if(settings?.restStreaming) { + section("Configure Streaming Service:") { + href "restSrvcDiscovery", title: "Auto-Discover Local Service", state: (settings?.selectedRestDevice ? "complete" : null), image: getAppImg("search_icon.png"), + description: selectedRestDiscSrvcDesc() ? "Selected Service:\n${selectedRestDiscSrvcDesc()}" : "Discover NST Service on your local network" + if(!settings?.selectedRestDevice) { + input(name: "restStreamIp", title:"Rest Service Address", type: "text", required: true, submitOnChange: true, image: getAppImg("ip_icon.png")) + input(name: "restStreamPort", title:"Rest Service Port", type: "number", defaultValue: 3000, required: true, submitOnChange: true, image: getAppImg("port_icon.png")) + } + if(atomicState?.appData?.settings?.streaming.allowLocal == true) { + input(name: "restStreamLocal", title:"Use Local Network to Send Events?", type: "bool", defaultValue: false, required: false, submitOnChange: true, image: getAppImg("two_way_icon.png")) + if(settings?.restStreamLocal == true) { + input(name: "restStreamLocalHub", type: "hub", title: "Select Local Hub", description: "This is the hub Stream events will be sent to.", submitOnChange: true, image: getAppImg("hub_icon.png")) + if(settings?.restStreamLocal && settings?.restStreamLocalHub) { subscribe(location, null, lanStreamEvtHandler, [filterEvents:false]) } } - getRestSrvcDesc() - paragraph title: "Notice", "This is still an experimental feature. It's subject to your local network and internet connections. If communication is lost the Manager will default back to standard polling." } - } else { - restDiscoveryClean() + getRestSrvcDesc() + paragraph title: "Notice", "This is still an experimental feature. It's subject to your local network and internet connections. If communication is lost the Manager will default back to standard polling." } - startStopStream() + } else { + restDiscoveryClean() } + startStopStream() + section("Polling:") { if(settings?.restStreaming && getRestHost()) { paragraph title: "NOTICE!", "These settings are only used when rest streaming is inactive or disabled", required: true, state: null, image: getAppImg("info_icon2.png") @@ -833,7 +1093,7 @@ def restSrvcDiscovery(params=[:]) { if(((discRfshCnt % 3) == 0) && ((discRfshCnt % 5) != 0)) { verifyDevices() } - //LogAction("options: $options devices: $devices objsFound $objsFound", "debug", true) + //LogAction("options: $options devices: $devices objsFound $objsFound", "debug", true) return dynamicPage(name:"restSrvcDiscovery", title:"", nextPage:"", refreshInterval:5) { section("Please wait while we discover your local NST Service devices. Discovery can take a couple minutes or more, so sit back and relax! Select your service below once discovered.") { @@ -932,34 +1192,34 @@ def automationsPage() { } } section("") { - app(name: "autoApp", appName: autoAppName(), namespace: "tonesto7", multiple: true, title: "Create New Automation (NST)", image: getAppImg("automation_icon.png")) + app(name: "autoApp", appName: autoAppName(), namespace: "tonesto7", multiple: true, title: "Create New Automation (NST)", image: getAppImg("nst_automations_5.png")) } if(autoAppInst) { section("Automation Details:") { - def schEn = getChildApps()?.findAll { (!(it.getAutomationType() in ["nMode", "watchDog", "remDiag"]) && it?.getActiveScheduleState()) } + def schEn = getChildApps()?.findAll { (!(it.getAutomationType() in ["nMode", "watchDog", "remDiag", "storage"]) && it?.getActiveScheduleState()) } if(schEn?.size()) { href "automationSchedulePage", title: "View Automation Schedule(s)", description: "", image: getAppImg("schedule_icon.png") } href "automationStatisticsPage", title: "View Automation Statistics", description: "", image: getAppImg("app_analytics_icon.png") } - section("Advanced Options: (Tap + to Show) ", hideable: true, hidden: true) { + section("Advanced Options: (Tap + to Show) ", hideable: true, hidden: true) { def descStr = "" descStr += (settings?.locDesiredCoolTemp || settings?.locDesiredHeatTemp) ? "Comfort Settings:" : "" - descStr += settings?.locDesiredHeatTemp ? "\n • Desired Heat Temp: (${settings?.locDesiredHeatTemp}°${getTemperatureScale()})" : "" - descStr += settings?.locDesiredCoolTemp ? "\n • Desired Cool Temp: (${settings?.locDesiredCoolTemp}°${getTemperatureScale()})" : "" + descStr += settings?.locDesiredHeatTemp ? "\n • Desired Heat Temp: (${settings?.locDesiredHeatTemp}${tUnitStr()})" : "" + descStr += settings?.locDesiredCoolTemp ? "\n • Desired Cool Temp: (${settings?.locDesiredCoolTemp}${tUnitStr()})" : "" descStr += (settings?.locDesiredComfortDewpointMax) ? "${(settings?.locDesiredCoolTemp || settings?.locDesiredHeatTemp) ? "\n\n" : ""}Dew Point:" : "" - descStr += settings?.locDesiredComfortDewpointMax ? "\n • Max Dew Point: (${settings?.locDesiredComfortDewpointMax}${getTemperatureScale()})" : "" + descStr += settings?.locDesiredComfortDewpointMax ? "\n • Max Dew Point: (${settings?.locDesiredComfortDewpointMax}${tUnitStr()})" : "" descStr += "${(settings?.locDesiredCoolTemp || settings?.locDesiredHeatTemp) ? "\n\n" : ""}${getSafetyValuesDesc()}" ?: "" def prefDesc = (descStr != "") ? "${descStr}\n\nTap to modify" : "Tap to configure" href "automationGlobalPrefsPage", title: "Global Automation Preferences", description: prefDesc, state: (descStr != "" ? "complete" : null), image: getAppImg("global_prefs_icon.png") input "disableAllAutomations", "bool", title: "Disable All Automations?", required: false, defaultValue: false, submitOnChange: true, image: getAppImg("disable_icon2.png") if(atomicState?.disableAllAutomations == false && settings?.disableAllAutomations) { - toggleAllAutomations(settings?.disableAllAutomations) + toggleAllAutomations(true) } else if (atomicState?.disableAllAutomations && !settings?.disableAllAutomations) { - toggleAllAutomations(settings?.disableAllAutomations) + toggleAllAutomations(true) } - atomicState?.disableAllAutomations = settings?.disableAllAutomations + atomicState?.disableAllAutomations = settings?.disableAllAutomations == true ? true : false //input "enTstatAutoSchedInfoReq", "bool", title: "Allow Other Smart Apps to Retrieve Thermostat automation Schedule info?", required: false, defaultValue: false, submitOnChange: true, image: getAppImg("info_icon2.png") href "automationKickStartPage", title: "Re-Initialize All Automations", description: "Tap to Update All Automations", image: getAppImg("reset_icon.png") } @@ -1044,13 +1304,23 @@ def automationStatisticsPage() { section(" ") { paragraph "${chld?.label}", state: "complete", image: getAutoIcon(autoType) def data = chld?.getAutomationStats() + def fmt = "M/d/yyyy - h:mm a" +/* def tf = new SimpleDateFormat("M/d/yyyy - h:mm a") tf.setTimeZone(getTimeZone()) - def lastModDt = data?.lastUpdatedDt ? tf.format(Date.parse("E MMM dd HH:mm:ss z yyyy", data?.lastUpdatedDt.toString())) : null - def lastEvtDt = data?.lastEvent?.date ? tf.format(Date.parse("E MMM dd HH:mm:ss z yyyy", data?.lastEvent?.date.toString())) : null - def lastActionDt = data?.lastActionData?.dt ? tf.format(Date.parse("E MMM dd HH:mm:ss z yyyy", data?.lastActionData?.dt.toString())) : null - def lastEvalDt = data?.lastEvalDt ? tf.format(Date.parse("E MMM dd HH:mm:ss z yyyy", data?.lastEvalDt.toString())) : null - def lastSchedDt = data?.lastSchedDt ? tf.format(Date.parse("E MMM dd HH:mm:ss z yyyy", data?.lastSchedDt.toString())) : null + //def lastModDt = data?.lastUpdatedDt ? tf.format(Date.parse("E MMM dd HH:mm:ss z yyyy", data?.lastUpdatedDt.toString())) : null + //def lastEvtDt = data?.lastEvent?.date ? tf.format(Date.parse("E MMM dd HH:mm:ss z yyyy", data?.lastEvent?.date.toString())) : null + //def lastActionDt = data?.lastActionData?.dt ? tf.format(Date.parse("E MMM dd HH:mm:ss z yyyy", data?.lastActionData?.dt.toString())) : null + //def lastEvalDt = data?.lastEvalDt ? tf.format(Date.parse("E MMM dd HH:mm:ss z yyyy", data?.lastEvalDt.toString())) : null + //def lastSchedDt = data?.lastSchedDt ? tf.format(Date.parse("E MMM dd HH:mm:ss z yyyy", data?.lastSchedDt.toString())) : null +*/ + + def lastModDt = data?.lastUpdatedDt ? formatDt2(data?.lastUpdatedDt.toString(), fmt) : null + def lastEvtDt = data?.lastEvent?.date ? formatdt2(data?.lastEvent?.date.toString(), fmt) : null + def lastActionDt = data?.lastActionData?.dt ? formatDt2(data?.lastActionData?.dt.toString(), fmt) : null + def lastEvalDt = data?.lastEvalDt ? formatDt2(data?.lastEvalDt.toString(), fmt) : null + def lastSchedDt = data?.lastSchedDt ? formatDt2(data?.lastSchedDt.toString(), fmt) : null + def lastExecVal = data?.lastExecVal ?: null def execAvgVal = data?.execAvgVal ?: null @@ -1074,7 +1344,6 @@ def automationStatisticsPage() { paragraph "There is No Statistic Data to Display" } } - devPageFooter("viewAutoStatLoadCnt", execTime) } } @@ -1083,7 +1352,7 @@ def locDesiredClear() { LogTrace("locDesiredClear") def list = [ "locDesiredHeatTemp", "locDesiredCoolTemp","locDesiredComfortDewpointMax", "locDesiredTempScale", "locDesiredButton" ] list.each { item -> - settingUpdate(item.toString(), "") + settingRemove(item.toString()) } if(atomicState?.thermostats && settings?.clearLocDesired) { atomicState?.thermostats?.each { ts -> @@ -1091,24 +1360,24 @@ def locDesiredClear() { def canHeat = dev?.currentState("canHeat")?.stringValue == "false" ? false : true def canCool = dev?.currentState("canCool")?.stringValue == "false" ? false : true if(canHeat) { - settingUpdate("${dev?.deviceNetworkId}_safety_temp_min", "") + settingRemove("${dev?.deviceNetworkId}_safety_temp_min") } if(canCool) { - settingUpdate("${dev?.deviceNetworkId}_safety_temp_max", "") + settingRemove("${dev?.deviceNetworkId}_safety_temp_max") } if(settings?."${dev?.deviceNetworkId}_comfort_dewpoint_max") { - settingUpdate("${dev?.deviceNetworkId}_comfort_dewpoint_max", "") + settingRemove("${dev?.deviceNetworkId}_comfort_dewpoint_max") } if(settings?."${dev?.deviceNetworkId}_comfort_humidity_max") { - settingUpdate("${dev?.deviceNetworkId}_comfort_humidity_max", "") + settingRemove("${dev?.deviceNetworkId}_comfort_humidity_max") } } } - settingUpdate("clearLocDesired", false) + settingRemove("clearLocDesired") } def getGlobTitleStr(typ) { - return "Desired Default ${typ} Temp (°${getTemperatureScale()})" + return "Desired Default ${typ} Temp (${tUnitStr()})" } def automationGlobalPrefsPage() { @@ -1126,8 +1395,8 @@ def automationGlobalPrefsPage() { required: false, image: getAppImg("cool_icon.png") def tRange = (getTemperatureScale() == "C") ? "15..19" : "60..66" def wDev = getChildDevice(getNestWeatherId()) - def curDewPnt = wDev ? "${wDev?.currentDewpoint}°${getTemperatureScale()}" : 0 - input "locDesiredComfortDewpointMax", "decimal", title: "Default Dewpoint Threshold (${tRange} °${getTemperatureScale()})", required: false, range: trange, submitOnChange: true, + def curDewPnt = wDev ? "${wDev?.currentDewpoint}${tUnitStr()}" : 0 + input "locDesiredComfortDewpointMax", "decimal", title: "Default Dewpoint Threshold (${tRange} ${tUnitStr()})", required: false, range: trange, submitOnChange: true, image: getAppImg("dewpoint_icon.png") href url: "https://en.wikipedia.org/wiki/Dew_point#Relationship_to_human_comfort", style:"embedded", title: "What is Dew Point?", description:"Tap to view", image: getAppImg("instruct_icon.png") @@ -1158,15 +1427,15 @@ def automationGlobalPrefsPage() { def str = "" str += "Safety Values:" - str += safeTemp ? "\n• Safety Temps:\n └ Min: ${safeTemp.min}°${getTemperatureScale()}/Max: ${safeTemp.max}°${getTemperatureScale()}" : "\n• Safety Temps: (Not Set)" - str += dew_max ? "\n• Comfort Max Dewpoint:\n └ Max: ${dew_max}°${getTemperatureScale()}" : "\n• Comfort Max Dewpoint: (Not Set)" + str += safeTemp ? "\n• Safety Temps:\n └ Min: ${safeTemp.min}${tUnitStr()}/Max: ${safeTemp.max}${tUnitStr()}" : "\n• Safety Temps: (Not Set)" + str += dew_max ? "\n• Comfort Max Dewpoint:\n └ Max: ${dew_max}${tUnitStr()}" : "\n• Comfort Max Dewpoint: (Not Set)" paragraph "${str}", title:"${dev?.displayName}", state: "complete", image: getAppImg("instruct_icon.png") if(canHeat) { - input "${dev?.deviceNetworkId}_safety_temp_min", "decimal", title: "Low Safety Temp °(${getTemperatureScale()})", description: "Range within ${tempRangeValues()}", + input "${dev?.deviceNetworkId}_safety_temp_min", "decimal", title: "Low Safety Temp (${tUnitStr()})", description: "Range within ${tempRangeValues()}", range: tempRangeValues(), submitOnChange: true, required: false, image: getAppImg("heat_icon.png") } if(canCool) { - input "${dev?.deviceNetworkId}_safety_temp_max", "decimal", title: "High Safety Temp °(${getTemperatureScale()})", description: "Range within ${tempRangeValues()}", + input "${dev?.deviceNetworkId}_safety_temp_max", "decimal", title: "High Safety Temp (${tUnitStr()})", description: "Range within ${tempRangeValues()}", range: tempRangeValues(), submitOnChange: true, required: false, image: getAppImg("cool_icon.png") } def tmin = settings?."${dev?.deviceNetworkId}_safety_temp_min" @@ -1182,7 +1451,7 @@ def automationGlobalPrefsPage() { atomicState?."${dev?.deviceNetworkId}_safety_temp_max" = tmax def tRange = (getTemperatureScale() == "C") ? "15..19" : "60..66" - input "${dev?.deviceNetworkId}_comfort_dewpoint_max", "decimal", title: "Dewpoint Threshold (${tRange} °${getTemperatureScale()})", required: false, range: trange, + input "${dev?.deviceNetworkId}_comfort_dewpoint_max", "decimal", title: "Dewpoint Threshold (${tRange} ${tUnitStr()})", required: false, range: trange, submitOnChange: true, image: getAppImg("dewpoint_icon.png") // def hrange = "10..80" // input "${dev?.deviceNetworkId}_comfort_humidity_max", "number", title: "Max. Humidity Desired (%)", description: "Range within ${hrange}", range: hrange, @@ -1221,36 +1490,50 @@ def automationKickStartPage() { def notifPrefPage() { def execTime = now() dynamicPage(name: "notifPrefPage", install: false) { - def sectDesc = !location.contactBookEnabled ? "Enable push notifications below" : "Select People or Devices to Receive Notifications" - section(sectDesc) { - if(!location.contactBookEnabled) { - input(name: "usePush", type: "bool", title: "Send Push Notitifications", required: false, defaultValue: false, submitOnChange: true, image: getAppImg("notification_icon.png")) - } else { - input(name: "recipients", type: "contact", title: "Select Default Contacts", required: false, submitOnChange: true, image: getAppImg("recipient_icon.png")) { - input ("phone", "phone", title: "Phone Number to send SMS to", required: false, submitOnChange: true, image: getAppImg("notification_icon2.png")) - } + section("Enable Text Messaging:") { + input "phone", "phone", title: "Send SMS to Number\n(Optional)", required: false, submitOnChange: true, image: getAppImg("notification_icon2.png") + } + section("Enable Push Messages:") { + input "usePush", "bool", title: "Send Push Notifications\n(Optional)", required: false, submitOnChange: true, defaultValue: false, image: getAppImg("notification_icon.png") + } + section("Enable Pushover Support:") { + input ("pushoverEnabled", "bool", title: "Use Pushover Integration", required: false, submitOnChange: true, image: getAppImg("pushover_icon.png")) + if(settings?.pushoverEnabled == true) { + if(atomicState?.isInstalled) { + if(!atomicState?.pushoverManager) { + paragraph "If this is the first time enabling Pushover than leave this page and come back if the devices list is empty" + pushover_init() + } else { + input "pushoverDevices", "enum", title: "Select Pushover Devices", description: "Tap to select", groupedOptions: getPushoverDevices(), multiple: true, required: false, submitOnChange: true + if(settings?.pushoverDevices) { + def t0 = [(-2):"Lowest", (-1):"Low", 0:"Normal", 1:"High", 2:"Emergency"] + input "pushoverPriority", "enum", title: "Notification Priority (Optional)", description: "Tap to select", defaultValue: 0, required: false, multiple: false, submitOnChange: true, options: t0 + input "pushoverSound", "enum", title: "Notification Sound (Optional)", description: "Tap to select", defaultValue: "pushover", required: false, multiple: false, submitOnChange: true, options: getPushoverSounds() + } + } + } else { paragraph "New Install Detected!!!\n\n1. Press Done to Finish the Install.\n2. Goto the Automations Tab at the Bottom\n3. Tap on the SmartApps Tab above\n4. Select ${app?.getLabel()} and Resume configuration", state: "complete" } } - if(settings?.recipients || settings?.phone || settings?.usePush) { + } + if(settings?.phone || settings?.usePush || (settings?.pushoverEnabled && settings?.pushoverDevices)) { + section("Notification Restrictions:") { def t1 = getNotifSchedDesc() href "setNotificationTimePage", title: "Notification Restrictions", description: (t1 ?: "Tap to configure"), state: (t1 ? "complete" : null), image: getAppImg("restriction_icon.png") } - } - if(settings?.recipients || settings?.phone || settings?.usePush) { - if(settings?.recipients && !atomicState?.pushTested) { - if(sendMsg("Info", "Push Notification Test Successful. Notifications Enabled for ${appName()}", false)) { + if((settings?.usePush || (settings?.pushoverEnabled && settings?.pushoverDevices)) && !atomicState?.pushTested && atomicState?.pushoverManager) { + if(sendMsg("Info", "Push Notification Test Successful. Notifications Enabled for ${appName()}", true)) { atomicState.pushTested = true } } - section("Location Notifications:") { + section("Location Alerts:") { paragraph "Get notified when the Location changes from Home/Away", state: "complete" input name: "locPresChangeMsg", type: "bool", title: "Notify on Home/Away changes?", defaultValue: true, submitOnChange: true, image: getAppImg("presence_icon.png") } - section("Alert Configurations:") { + section("Other Alerts:") { def t1 = getAppNotifDesc() def appDesc = t1 ? "${t1}\n\n" : "" href "notifConfigPage", title: "App Notifications", description: "${appDesc}Tap to configure", params: [pType:"app"], state: (appDesc != "" ? "complete" : null), - image: getAppImg("nst_manager_icon.png") + image: getAppImg("nst_manager_5.png") t1 = getDevNotifDesc() def devDesc = t1 ? "${t1}\n\n" : "" href "notifConfigPage", title: "Device Notifications", description: "${devDesc}Tap to configure", params: [pType:"dev"], state: (devDesc != "" ? "complete" : null), @@ -1258,8 +1541,8 @@ def notifPrefPage() { t1 = getAutoNotifDesc() def autoDesc = t1 ? "${t1}\n\n" : "" href "notifConfigPage", title: "Automation Notifications", description: "${autoDesc}Tap to configure", params: [pType:"auto"], state: (autoDesc != "" ? "complete" : null), - image: getAppImg("automation_icon.png") - if(atomicState?.appData?.aaPrefs?.enAaMsgQueue == true) { + image: getAppImg("nst_automations_5.png") + if(atomicState?.appData?.settings?.askAlexa?.enAaMsgQueue == true) { t1 = getAskAlexaDesc() def aaDesc = t1 ? "${t1}\n\n" : "" href "notifConfigPage", title: "AskAlexa Integration", description: "${aaDesc}Tap to configure", params: [pType:"askAlexa"], state: (aaDesc != "" ? "complete" : null), @@ -1378,35 +1661,37 @@ def notifConfigPage(params) { def getAppNotifDesc() { def str = "" - str += settings?.appApiIssuesMsg != false && settings?.appApiFailedCmdMsg != false ? "\n• API CMD Failures: (${strCapitalize(settings?.appApiFailedCmdMsg ?: "True")})" : "" - str += settings?.appApiIssuesMsg != false && settings?.appApiRateLimitMsg != false ? "\n• API Rate-Limiting: (${strCapitalize(settings?.appApiRateLimitMsg ?: "True")})" : "" - str += settings?.sendMissedPollMsg != false ? "\n• Missed Poll Alerts: (${strCapitalize(settings?.sendMissedPollMsg ?: "True")})" : "" - str += settings?.appDbgDiagRemindMsg != false ? "\n• Debug Log Reminder: (${strCapitalize(settings?.appDbgDiagRemindMsg ?: "True")})" : "" - str += settings?.sendAppUpdateMsg != false ? "\n• Code Updates: (${strCapitalize(settings?.sendAppUpdateMsg ?: "True")})" : "" + str += settings?.appApiIssuesMsg != false && settings?.appApiFailedCmdMsg != false ? "${str != "" ? "\n" : ""} • API CMD Failures: (${strCapitalize(settings?.appApiFailedCmdMsg ?: "True")})" : "" + str += settings?.appApiIssuesMsg != false && settings?.appApiRateLimitMsg != false ? "${str != "" ? "\n" : ""} • API Rate-Limiting: (${strCapitalize(settings?.appApiRateLimitMsg ?: "True")})" : "" + str += settings?.sendMissedPollMsg != false ? "${str != "" ? "\n" : ""} • Missed Poll Alerts: (${strCapitalize(settings?.sendMissedPollMsg ?: "True")})" : "" + str += settings?.appDbgDiagRemindMsg != false ? "${str != "" ? "\n" : ""} • Debug Log Reminder: (${strCapitalize(settings?.appDbgDiagRemindMsg ?: "True")})" : "" + str += settings?.sendAppUpdateMsg != false ? "${str != "" ? "\n" : ""} • Code Updates: (${strCapitalize(settings?.sendAppUpdateMsg ?: "True")})" : "" return str != "" ? str : null } def getDevNotifDesc() { def str = "" - str += settings?.devHealthNotifyMsg != false ? "\n• Health Alerts: (${strCapitalize(settings?.devHealthNotifyMsg ?: "True")})" : "" - str += settings?.camStreamNotifMsg != false ? "\n• Camera Stream Alerts: (${strCapitalize(settings?.camStreamNotifMsg ?: "True")})" : "" - str += settings?.weathAlertNotif != false ? "\n• Weather Alerts: (${strCapitalize(settings?.weathAlertNotif ?: "True")})" : "" + str += settings?.devHealthNotifyMsg != false ? "${str != "" ? "\n" : ""} • Health Alerts: (${strCapitalize(settings?.devHealthNotifyMsg ?: "True")})" : "" + str += settings?.camStreamNotifMsg != false ? "${str != "" ? "\n" : ""} • Camera Stream Alerts: (${strCapitalize(settings?.camStreamNotifMsg ?: "True")})" : "" + str += settings?.weathAlertNotif != false ? "${str != "" ? "\n" : ""} • Weather Alerts: (${strCapitalize(settings?.weathAlertNotif ?: "True")})" : "" return str != "" ? str : null } def getAutoNotifDesc() { def str = "" - str += settings?.watchDogNotifMissedEco ? "\n• WatchDog Eco Alerts: (${strCapitalize(settings?.watchDogNotifMissedEco)})" : "" + str += settings?.watchDogNotifMissedEco ? "${str != "" ? "\n" : ""} • WatchDog Eco Alerts: (${strCapitalize(settings?.watchDogNotifMissedEco)})" : "" return str != "" ? str : null } def getAskAlexaDesc() { def str = "" - str += settings?.allowAskAlexaMQ ? "\n• Ask Alexa Msg Queue: (${strCapitalize(settings?.allowAskAlexaMQ)})" : "" - str += getAskAlexaMultiQueueEn() && atomicState?.askAlexaMQList ? "\nMultiple Queues Available:\n• Queues: (${atomicState?.askAlexaMQList?.size()})" : "" + str += settings?.allowAskAlexaMQ ? "${str != "" ? "\n" : ""} • Ask Alexa Msg Queue: (${strCapitalize(settings?.allowAskAlexaMQ)})" : "" + str += getAskAlexaMultiQueueEn() && atomicState?.askAlexaMQList ? "${str != "" ? "\n" : ""}Multiple Queues Available:\n• Queues: (${atomicState?.askAlexaMQList?.size()})" : "" return str != "" ? str : null } +def addNewline(str) { return "${str != "" ? "\n" : ""}${str}"} + def getAppNotifConfDesc() { def str = "" if(pushStatus()) { @@ -1414,14 +1699,16 @@ def getAppNotifConfDesc() { def de = getDevNotifDesc() def au = getAutoNotifDesc() def nd = getNotifSchedDesc() - str += (settings?.recipients) ? "Sending via Contact Book (True)" : "" - str += (settings?.usePush) ? "Sending via Push: (True)" : "" - str += (settings?.phone) ? "\nSending via SMS: (True)" : "" - str += (ap || de || au) ? "\nEnabled Alerts:" : "" - str += (ap) ? "\n• App Alerts (True)" : "" - str += (de) ? "\n• Device Alerts (True)" : "" - str += (au) ? "\n• Automation Alerts (True)" : "" - str += (nd) ? "\n\nAlert Restrictions:\n${nd}" : "" + str += (settings?.usePush) ? "${str != "" ? "\n" : ""}Sending via: (Push)" : "" + str += (settings?.pushoverEnabled) ? "${str != "" ? "\n" : ""}Pushover: (Enabled)" : "" + str += (settings?.pushoverEnabled && settings?.pushoverPriority) ? "${str != "" ? "\n" : ""} • Priority: (${settings?.pushoverPriority})" : "" + str += (settings?.pushoverEnabled && settings?.pushoverSound) ? "${str != "" ? "\n" : ""} • Sound: (${settings?.pushoverSound})" : "" + str += (settings?.phone) ? "${str != "" ? "\n" : ""}Sending via: (SMS)" : "" + str += (ap || de || au) ? "${str != "" ? "\n" : ""}\nEnabled Alerts:" : "" + str += (ap) ? "${str != "" ? "\n" : ""} • App Alerts (True)" : "" + str += (de) ? "${str != "" ? "\n" : ""} • Device Alerts (True)" : "" + str += (au) ? "${str != "" ? "\n" : ""} • Automation Alerts (True)" : "" + str += (nd) ? "${str != "" ? "\n" : ""}\nAlert Restrictions:\n${nd}" : "" } return str != "" ? str : null } @@ -1456,11 +1743,14 @@ def buildNotifPrefMap() { return res } -def toggleAllAutomations(disable=false) { - def dis = disable == null ? false : disable +def toggleAllAutomations(upd = false) { + def t0 = settings?.disableAllAutomations == true ? true : false + atomicState?.disableAllAutomations = t0 + def disStr = !t0 ? "Returning control to" : "Disabling" def cApps = getChildApps() cApps.each { ca -> - ca?.setAutomationStatus(dis, true) + LogAction("toggleAllAutomations: ${disStr} automation ${ca?.label}", "info", true) + ca?.setAutomationStatus(upd) } } @@ -1605,7 +1895,7 @@ def debugPrefPage() { section ("Application Logs") { input ("debugAppendAppName", "bool", title: "Show App/Device Name on all Log Entries?", required: false, defaultValue: true, submitOnChange: true, image: getAppImg("log.png")) input (name: "appDebug", type: "bool", title: "Show ${appName()} Logs in the IDE?", required: false, defaultValue: false, submitOnChange: true, image: getAppImg("log.png")) - if(appDebug) { + if(settings?.appDebug) { input (name: "advAppDebug", type: "bool", title: "Show Verbose Logs?", required: false, defaultValue: false, submitOnChange: true, image: getAppImg("list_icon.png")) } else { settingUpdate("advAppDebug", "false", "bool") @@ -1617,7 +1907,7 @@ def debugPrefPage() { } section("Diagnostics:") { def t1 = getRemDiagDesc() - href "diagnosticPage", title: "View Diagnostic Info", description: (t1 ? "${t1 ?: ""}\n\nTap to view" : "Tap to view"), state: (t1) ? "complete" : null, image: getAppImg("diagnostic_icon.png") + href "helpPage", title: "View Diagnostic Info", description: (t1 ? "${t1 ?: ""}\n\nTap to view" : "Tap to view"), state: (t1) ? "complete" : null, image: getAppImg("diagnostic_icon.png") } section ("Reset Application Data") { input (name: "resetAllData", type: "bool", title: "Reset Application Data?", required: false, defaultValue: false, submitOnChange: true, image: getAppImg("reset_icon.png")) @@ -1625,96 +1915,52 @@ def debugPrefPage() { else { LogAction("Reset Application Data Disabled", "info", true) } } if(settings?.appDebug || settings?.childDebug) { - if(atomicState?.debugEnableDt == null) { atomicState?.debugEnableDt = getDtNow() } - } else { atomicState?.debugEnableDt = null } + if(getTimestampVal("debugEnableDt") == null) { updTimestampMap("debugEnableDt", getDtNow()) } + } else { updTimestampMap("debugEnableDt", null) } atomicState.needChildUpd = true devPageFooter("logPrefLoadCnt", execTime) } } -def diagnosticPage () { - def execTime = now() - dynamicPage(name: "diagnosticPage", title: "Diagnostics Page", install: false) { - section("App Info") { - paragraph "Current State Usage:\n${getStateSizePerc()}% (${getStateSize()} bytes)", required: true, state: (getStateSizePerc() <= 70 ? "complete" : null), - image: getAppImg("progress_bar.png") - if(atomicState?.isInstalled && atomicState?.structures && (atomicState?.thermostats || atomicState?.protects || atomicState?.cameras || atomicState?.weatherDevice)) { - input "enDiagWebPage", "bool", title: "Enable Diagnostic Web Page?", description: "", required: false, defaultValue: false, submitOnChange: true, image: getAppImg("diagnostic_icon.png") - if(settings?.enDiagWebPage) { - href url: getAppEndpointUrl("diagHome"), style:"external", title:"NST Diagnostic Web Page", description:"Tap to view", required: true,state: "complete", image: getAppImg("web_icon.png") - } - } - } - if(getDevOpt()) { - settingUpdate("enDiagWebPage","true", "bool") - } - if(settings?.enDiagWebPage) { - section("Log Collection:") { - def formatVal = settings?.useMilitaryTime ? "MMM d, yyyy - HH:mm:ss" : "MMM d, yyyy - h:mm:ss a" - def tf = new SimpleDateFormat(formatVal) - if(getTimeZone()) { tf.setTimeZone(getTimeZone()) } - paragraph title: "How will the log collection work?", "Once enabled this SmartApp will create a child app to store your logs in this diagnostic app and you can view the page or share the url with the developer. Turn off to remove the diag app and all data." - paragraph "This will automatically turn off 48 hours" - input (name: "enRemDiagLogging", type: "bool", title: "Enable Log Collection?", required: false, defaultValue: (atomicState?.enRemDiagLogging ?: false), submitOnChange: true, image: getAppImg("log.png")) - if(atomicState?.enRemDiagLogging) { - def str = "Press Done/Save all the way back to the main smartapp page to allow the Diagnostic App to Install" - paragraph str, required: true, state: "complete" - } - } - } - diagLogProcChange((settings?.enDiagWebPage && settings?.enRemDiagLogging)) - - section("SmartApp Security") { - paragraph title:"What does resetting do?", "If you share a url with someone and want to remove their access you can reset your token and this will invalidate any URL you shared and create a new one for you." - input (name: "resetSTAccessToken", type: "bool", title: "Reset SmartThings Access Token?", required: false, defaultValue: false, submitOnChange: true, image: getAppImg("reset_icon.png")) - if(settings?.resetSTAccessToken) { resetSTAccessToken() } - } - - devPageFooter("diagLoadCnt", execTime) - } -} - def getRemDiagApp() { - def remDiagApp = null - def cApps = getChildApps() - cApps?.each { ca -> - if(ca?.getAutoType() == "remDiag") { - remDiagApp = ca - } + def remDiagApp = getChildApps()?.find { it?.getAutomationType() == "remDiag" && it?.name == autoAppName() } + if(remDiagApp) { + if(remDiagApp?.label != getRemDiagAppChildLabel()) { remDiagApp?.updateLabel(getRemDiagAppChildLabel()) } + return remDiagApp + } else { + return null } - return remDiagApp } -void diagLogProcChange(setOn) { - def diagAllowed = atomicState?.appData?.database?.allowRemoteDiag == true ? true : false - //log.debug "diagAllowed: $diagAllowed" +private diagLogProcChange(setOn) { + // log.trace "diagLogProcChange($setOn)" def doInit = false def msg = "Remote Diagnostic Logs " - if(diagAllowed && setOn) { - if(!atomicState?.enRemDiagLogging && atomicState?.remDiagLogActivatedDt == null) { + if(setOn) { + if(!atomicState?.enRemDiagLogging && getTimestampVal("remDiagLogActivatedDt") == null) { msg += "activated" doInit = true } } else { - if(atomicState?.remDiagLogActivatedDt != null) { + if(getTimestampVal("remDiagLogActivatedDt") != null || atomicState?.enRemDiagLogging) { msg += "deactivated" settingUpdate("enRemDiagLogging", "false","bool") atomicState?.enRemDiagLogging = false - atomicState?.remDiagLogActivatedDt = null // require toggle off then on again to force back on after timeout + updTimestampMap("remDiagLogActivatedDt", null) doInit = true } } if(doInit) { - def kdata = getState()?.findAll { (it?.key in ["remDiagLogDataStore", "remDiagDataSentDt" ]) } + def kdata = getState()?.findAll { (it?.key in ["remDiagLogDataStore" /* , "remDiagDataSentDt"*/ ]) } kdata.each { kitem -> state.remove(kitem?.key.toString()) } - if(diagAllowed && setOn) { - atomicState?.remDiagDataSentDt = getDtNow() // allow us some time for child to start - atomicState?.enRemDiagLogging = true - atomicState?.remDiagLogActivatedDt = getDtNow() - } + updTimestampMap("remDiagDataSentDt", getDtNow()) // allow us some time for child to start + //atomicState?.remDiagDataSentDt = getDtNow() // allow us some time for child to start + atomicState?.enRemDiagLogging = true + updTimestampMap("remDiagLogActivatedDt", getDtNow()) + initRemDiagApp() LogAction(msg, "info", true) if(!atomicState?.enRemDiagLogging) { //when turning off, tell automations; turn on - user does done @@ -1726,25 +1972,14 @@ void diagLogProcChange(setOn) { } } atomicState.forceChildUpd = true - atomicState?.lastAnalyticUpdDt = null // will force def autoDesc = getInstAutoTypesDesc() // This is a hack to get installedAutomations data updated without waiting for user to hit done + updTimestampMap("lastAnalyticUpdDt", null) } } -/* -def genRandId(int length){ - String alphabet = new String("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz") - int n = alphabet.length() - String result = new String() - Random r = new Random() - for (int i=0; i ctr) ? "\n\n" : "" ctr = (str != "") ? ctr += 1 : ctr siz = (str == "") ? siz -= 1 : siz @@ -1848,7 +2074,7 @@ def getSafetyValuesDesc() { } def showVoiceRprtPrefs() { - if(atomicState?.thermostats && (!atomicState?.appData?.reportPrefs?.disVoiceZoneRprt || !atomicState?.appData?.reportPrefs?.disVoiceUsageRprt)) { + if(atomicState?.thermostats && (!atomicState?.appData?.settings?.reports?.disVoiceZoneRprt || !atomicState?.appData?.settings?.reports?.disVoiceUsageRprt)) { def rPrefs = getVoiceRprtPrefDesc() section("Voice Reports:") { href "voiceRprtPrefPage", title: "Voice Report Preferences", description: (rPrefs ? "${rPrefs}\n\nTap to modify" : "Tap to configure"), state: (rPrefs ? "complete" : ""), image: getAppImg("speech2_icon.png") @@ -1858,8 +2084,8 @@ def showVoiceRprtPrefs() { def getVoiceRprtPrefs() { return [ - "allowVoiceUsageRprt":(atomicState?.appData?.reportPrefs?.disVoiceUsageRprt == true) ? false : true, - "allowVoiceZoneRprt":(atomicState?.appData?.reportPrefs?.disVoiceZoneRprt == true) ? false : true, + "allowVoiceUsageRprt":(atomicState?.appData?.settings?.reports?.disVoiceUsageRprt == true) ? false : true, + "allowVoiceZoneRprt":(atomicState?.appData?.settings?.reports?.disVoiceZoneRprt == true) ? false : true, "vRprtSched":(settings?.vRprtIncSchedInfo == false ? false : true), "vRprtZone":(settings?.vRprtIncZoneInfo == false ? false : true), "vRprtExtWeat":(settings?.vRprtIncExtWeatInfo == false ? false : true), @@ -1879,13 +2105,12 @@ def getVoiceRprtPrefDesc() { } def getPollingConfDesc() { - def rStrEn = (atomicState?.appData?.eventStreaming?.enabled || getDevOpt() || betaMarker()) def pollValDesc = (!settings?.pollValue || settings?.pollValue == "180") ? "" : (!atomicState?.streamPolling ? " (Custom)" : " (Stream)") def pollStrValDesc = (!settings?.pollStrValue || settings?.pollStrValue == "180") ? "" : (!atomicState?.streamPolling ? " (Custom)" : " (Stream)") def pollWeatherValDesc = (!settings?.pollWeatherValue || settings?.pollWeatherValue == "900") ? "" : " (Custom)" def pollWaitValDesc = (!settings?.pollWaitVal || settings?.pollWaitVal == "10") ? "" : " (Custom)" def pStr = "" - pStr += rStrEn ? "Nest Stream: (${(settings.restStreaming && rStrEn) ? "${(!atomicState?.restStreamingOn) ? "Not Active" : "Active"}" : "Off"})" : "" + pStr += "Nest Stream: (${settings.restStreaming ? (!atomicState?.restStreamingOn ? "Not Active" : "Active") : "Off"})" pStr += "\nPolling: (${!atomicState?.pollingOn ? "Not Active" : "Active"})" pStr += "\n• Device: (${getInputEnumLabel((!atomicState?.streamPolling ? (pollValue ?: 180) : 300), pollValEnum(true))}) ${pollValDesc}" pStr += "\n• Structure: (${getInputEnumLabel((!atomicState?.streamPolling ? (pollStrValue?:180) : 300), pollValEnum())}) ${pollStrValDesc}" @@ -1897,7 +2122,6 @@ def getPollingConfDesc() { // Parent only method def getNotifSchedDesc() { def sun = getSunriseAndSunset() - //def schedInverted = settings?.DmtInvert def startInput = settings?.qStartInput def startTime = settings?.qStartTime def stopInput = settings?.qStopInput @@ -1915,7 +2139,6 @@ def getNotifSchedDesc() { return (notifDesc != "") ? "${notifDesc}" : null } - def getWeatherConfDesc() { def str = "" def defZip = getStZipCode() ? getStZipCode() : getNestZipCode() @@ -1926,12 +2149,15 @@ def getWeatherConfDesc() { def getCustWeatherLoc(desc=false) { def res = null if(settings?.useCustWeatherLoc) { +/* if(settings?.custWeatherLocSrch == true) { if(settings?.custWeatherResultItems != null) { res = desc ? (settings?.custWeatherResultItems[0]?.split("\\:"))[1].split("\\.")[0] : settings?.custWeatherResultItems[0].toString() } - } else if(settings?.custLocStr != null) { - res = settings?.custLocStr + } else +*/ + if(settings?.custLocStr != null) { + res = settings?.custLocStr.toString() } } return res @@ -1981,7 +2207,7 @@ def getRemDiagDesc() { } /****************************************************************************** -* NEST LOGIN PAGES * +* NEST LOGIN PAGES * *******************************************************************************/ def nestLoginPrefPage () { if(!atomicState?.authToken) { @@ -1989,13 +2215,13 @@ def nestLoginPrefPage () { } else { def execTime = now() return dynamicPage(name: "nestLoginPrefPage", nextPage: atomicState?.authToken ? "" : "authPage", install: false) { - def formatVal = settings?.useMilitaryTime ? "MMM d, yyyy - HH:mm:ss" : "MMM d, yyyy - h:mm:ss a" - def tf = new SimpleDateFormat(formatVal) - if(getTimeZone()) { tf.setTimeZone(getTimeZone()) } - atomicState.authTokenCreatedDt = atomicState?.authTokenCreatedDt ?: getDtNow() + //def formatVal = settings?.useMilitaryTime ? "MMM d, yyyy - HH:mm:ss" : "MMM d, yyyy - h:mm:ss a" + //def tf = new SimpleDateFormat(formatVal) + //if(getTimeZone()) { tf.setTimeZone(getTimeZone()) } + updTimestampMap("authTokenCreatedDt", (getTimestampVal("authTokenCreatedDt") ?: getDtNow())) section() { - paragraph title: "Authorization Info:", "Authorization Date:\n• ${tf?.format(Date.parse("E MMM dd HH:mm:ss z yyyy", atomicState?.authTokenCreatedDt))}", state: "complete" - paragraph "Last Nest Connection:\n• ${tf?.format(Date.parse("E MMM dd HH:mm:ss z yyyy", atomicState.lastDevDataUpd))}" + paragraph title: "Authorization Info:", "Authorization Date:\n• ${getTimestampVal("authTokenCreatedDt")}", state: "complete" + paragraph "Last Nest Connection:\n• ${getTimestampVal("lastDevDataUpd")}" } section("Revoke Authorization Reset:") { href "nestTokenResetPage", title: "Log Out and Reset Nest Token", description: "Tap to Reset Nest Token", required: true, state: null, image: getAppImg("reset_icon.png") @@ -2010,7 +2236,7 @@ def nestTokenResetPage() { return dynamicPage(name: "nestTokenResetPage", install: false) { section ("Resetting Nest Token") { revokeNestToken() - paragraph "Token Reset Complete...", state: "complete" + paragraph "Token Reset Complete...", state: "complete" paragraph "Press Done/Save to return to Login page" } } @@ -2021,72 +2247,138 @@ def nestTokenResetPage() { ******************************************************************************/ def installed() { LogAction("Installed with settings: ${settings}", "debug", true) - if(!parent) { - atomicState?.installData = ["initVer":appVersion(), "dt":getDtNow().toString(), "updatedDt":"Not Set", "freshInstall":true, "shownDonation":false, "shownFeedback":false, "shownChgLog":true, "usingNewAutoFile":true] - sendInstallSlackNotif() - } + atomicState?.installData = ["initVer":appVersion(), "dt":getDtNow().toString(), "updatedDt":"Not Set", "freshInstall":true, "shownDonation":false, "shownFeedback":false, "shownChgLog":true, "usingNewAutoFile":true, "liteAppMode":isAppLiteMode()] + sendInstallSlackNotif() initialize() sendNotificationEvent("${appName()} installed") } def updated() { LogAction("${app.label} Updated...with settings: ${settings}", "debug", true) - if(atomicState?.migrationInProgress == true) { LogAction("Skipping updated() as migration in-progress", "warn", true); return } + atomicState?.pollBlocked = true + atomicState?.pollBlockedReason = "Running updated" + //restStreamHandler(true, false) // stop the rest stream + //atomicState?.restStreamingOn = false + //atomicState.ssdpOn = false + // if(atomicState?.migrationInProgress == true) { LogAction("Skipping updated() as migration in-progress", "warn", true); return } if(atomicState?.needToFinalize == true) { LogAction("Skipping updated() as auth change in-progress", "warn", true); return } initialize() sendNotificationEvent("${appName()} has updated settings") - if(parent) { - atomicState?.lastUpdatedDt = getDtNow() - } + atomicState?.lastUpdatedDt = getDtNow() } def uninstalled() { //LogTrace("uninstalled") - if(parent) { - uninstAutomationApp() - } else { - uninstManagerApp() - } - //sendNotificationEvent("${appName()} is uninstalled") + uninstManagerApp() } def initialize() { - //LogTrace("initialize") - + LogTrace("initialize") + atomicState?.pollBlocked = true + atomicState?.pollBlockedReason = "Running Initialize" + restStreamHandler(true, false) // stop the rest stream + //atomicState?.restStreamingOn = false + atomicState.ssdpOn = false + if(!atomicState?.tsMigration) { timestampMigration() } if(atomicState?.resetAllData || settings?.resetAllData) { - if(fixState()) { return } // runIn of fixState will call initAutoApp() or initManagerApp() - if (!parent) { settingUpdate("resetAllData", "false", "bool") } - } - if(parent) { - runIn(6, "initAutoApp", [overwrite: true]) + if(fixState()) { return } // runIn of fixState will call initManagerApp() + //settingUpdate("resetAllData", "false", "bool") } - else { - if(checkMigrationRequired()) { return true } // This will call updated later - reInitBuiltins() // These are to have these apps release subscriptions to devices (in case of delete) - runIn(21, "initManagerApp", [overwrite: true]) // need to give time for watchdog updates before we try to delete devices. - //runIn(34, "reInitBuiltins", [overwrite: true]) // need to have watchdog/nestmode check if we created devices + if(!isAppLiteMode()) { + runIn(5, "reInitBuiltins", [overwrite: true]) // These are to have these apps release subscriptions to devices (in case of delete) } + runIn(21, "initManagerApp", [overwrite: true]) // need to give time for watchdog updates before we try to delete devices. } def reInitBuiltins() { - initWatchdogApp() - initNestModeApp() - diagLogProcChange((settings?.enDiagWebPage && settings?.enRemDiagLogging)) + checkStorageApp() + if(!isAppLiteMode()) { + initWatchdogApp() + initNestModeApp() // this just removes extras + initStorageApp() + } + if(atomicState?.tsMigration) { initRemDiagApp() } } -def initNestModeApp() { - LogTrace("initNestModeApp") - if(automationNestModeEnabled()) { - def nestModeApp = getChildApps()?.findAll { it?.getAutomationType() == "nMode" } - if(nestModeApp?.size() >= 1) { +def initBuiltin(btype) { + LogTrace("initBuiltin(${btype})") + def keepApp = false + def autoStr = "" + switch (btype) { + case "initNestModeApp": + if(automationNestModeEnabled()) { + keepApp = true + autoStr = "nMode" + } + break + case "initWatchdogApp": + def t0 = settings?.thermostats?.size() + def t1 = atomicState?.thermostats?.size() + if(atomicState?.isInstalled && t0 && t1) { // only need watchDog if we have thermostats + keepApp = true + } + autoStr = "watchDog" + break + case "initRemDiagApp": + if(settings?.enRemDiagLogging) { + keepApp = true + } else { + settingUpdate("enRemDiagLogging", "false","bool") + atomicState?.enRemDiagLogging = false + updTimestampMap("remDiagLogActivatedDt", null) + } + autoStr = "remDiag" + break + case "initStorageApp": + autoStr = "storage" + keepApp = true + def stateSz = getStateSizePerc() + if(stateSz < 58) { keepApp = false } + else { + def kdata = getState()?.findAll { (it?.key in [ "curWeather", "curForecast", "curAstronomy", "curAlerts" ]) } + kdata.each { kitem -> + state.remove(kitem?.key.toString()) + } + } + break + default: + LogAction("initBuiltin BAD btype ${btype}", "warn", true) + break + } + if(isAppLiteMode()) { keepApp = false } + if(autoStr) { + def mynestApp = getChildApps()?.findAll { it?.getAutomationType() == autoStr } + if(keepApp && mynestApp?.size() < 1 && btype != "initNestModeApp") { + LogAction("Installing ${autoStr}", "info", true) + updTimestampMap("lastAnalyticUpdDt", null) + try { + if(btype == "initRemDiagApp") { + addChildApp(appNamespace(), autoAppName(), getRemDiagAppChildLabel(), [settings:[remDiagFlag:["type":"bool", "value":true]]]) + } + if(btype == "initWatchdogApp") { + addChildApp(appNamespace(), autoAppName(), getWatDogAppChildLabel(), [settings:[watchDogFlag:["type":"bool", "value":true]]]) + } + if(btype == "initStorageApp") { + def storageApp = getStorageApp(false) + if(!storageApp) { + addChildApp(appNamespace(), autoAppName(), getStorageAppChildLabel(), [settings:[storageFlag:[type:"bool", value:true]]]) + } + storageAppInst(true) + } + } catch (ex) { + appUpdateNotify(true, "automation") + } + } else if(mynestApp?.size() >= 1) { def cnt = 1 - nestModeApp?.each { chld -> - if(cnt == 1) { - //LogAction("Running Update Command on Nest Mode", "warn", true) + mynestApp?.each { chld -> + if(keepApp && cnt == 1) { + LogTrace("initBuiltin: Running Update Command on ${autoStr}") chld.update() - } else if(cnt > 1) { - LogAction("Deleting Extra nMode (${chld?.id})", "warn", true) + } else if(!keepApp || cnt > 1) { + def slbl = keepApp ? "warn" : "info" + LogAction("initBuiltin: Deleting ${keepApp ? "Extra " : ""}${autoStr} (${chld?.id})", slbl, true) deleteChildApp(chld) + updTimestampMap("lastAnalyticUpdDt", null) } cnt = cnt+1 } @@ -2094,71 +2386,35 @@ def initNestModeApp() { } } +def initNestModeApp() { + initBuiltin("initNestModeApp") +} + def initWatchdogApp() { - LogTrace("initWatchdogApp") - def watDogApp = getChildApps()?.findAll { it?.getAutomationType() == "watchDog" } - if(watDogApp?.size() < 1) { - LogAction("Installing Watchdog App", "info", true) - try { - addChildApp(appNamespace(), autoAppName(), getWatDogAppChildName(), [settings:[watchDogFlag:["type":"bool", "value":true]]]) - } catch (ex) { - appUpdateNotify(true) - } - } else if(watDogApp?.size() >= 1) { - def cnt = 1 - watDogApp?.each { chld -> - if(cnt == 1) { - LogTrace("initWatchdogApp: Running Update Command on Watchdog") - chld.update() - } else if(cnt > 1) { - LogAction("initWatchdogApp: Deleting Extra Watchdog (${chld?.id})", "warn", true) - deleteChildApp(chld) - } - cnt = cnt+1 - } - } + initBuiltin("initWatchdogApp") } def initRemDiagApp() { - LogTrace("initRemDiagApp") - def keepApp = atomicState?.enRemDiagLogging == true ? true : false - def remDiagApp = getChildApps()?.findAll { it?.getAutomationType() == "remDiag" } - if(keepApp && remDiagApp?.size() < 1) { - LogAction("Installing Remote Diag App", "info", true) - try { - addChildApp(appNamespace(), autoAppName(), getRemDiagAppChildName(), [settings:[remDiagFlag:["type":"bool", "value":true]]]) - } catch (ex) { - appUpdateNotify(true) - } - } else if(remDiagApp?.size() >= 1) { - def cnt = 1 - remDiagApp?.each { chld -> - if(keepApp && cnt == 1) { - LogTrace("initRemDiagApp: Running Update Command on Remote Diag") - chld.update() - } else if(!keepApp || cnt > 1) { - def slbl = keepApp ? "warn" : "info" - LogAction("initRemDiagApp: Deleting ${keepApp ? "Extra " : ""}Remote Diag Child (${chld?.id})", slbl, true) - deleteChildApp(chld) - } - cnt = cnt+1 - } - } + initBuiltin("initRemDiagApp") +} + +def initStorageApp() { + initBuiltin("initStorageApp") } def initManagerApp() { - LogTrace("initManagerApp") + LogTrace("initManagerApp (${atomicState?.pollBlocked}) (${atomicState?.pollBlockedReason})") setStateVar() - restStreamHandler(true) // stop the rest stream - atomicState?.restStreamingOn = false - atomicState.ssdpOn = false + //restStreamHandler(true, false) // stop the rest stream unschedule() unsubscribe() + atomicState?.pollingOn = false + atomicState?.restStreamingOn = false + atomicState?.streamPolling = false + atomicState.ssdpOn = false stateCleanup() - atomicState.pollingOn = false - atomicState.lastChildUpdDt = null // force child update on next poll - atomicState.lastForcePoll = null + initStorageApp() def sData = atomicState?.swVer ?: [:] sData["mgrVer"] = appVersion() atomicState?.swVer = sData @@ -2170,41 +2426,101 @@ def initManagerApp() { } if(!addRemoveDevices()) { // if we changed any devices or had an error trying, reset queues and polling atomicState.cmdQlist = [] + if(!isAppLiteMode()) { + runIn(15, "reInitBuiltins", [overwrite: true]) // need to have watchdog/nestmode check if we created devices + } } if(settings?.thermostats || settings?.protects || settings?.cameras || settings?.presDevice || settings?.weatherDevice) { atomicState?.isInstalled = true } else { atomicState.isInstalled = false } - if(atomicState?.autoMigrationComplete == true) { // fix for bug that removed this setting - temporary - def iData = atomicState?.installData - iData["usingNewAutoFile"] = true - atomicState?.installData = iData - } subscriber() - setPollingState() startStopStream() runIn(21, "finishInitManagerApp", [overwrite: true]) } def finishInitManagerApp() { - LogTrace("finishInitManagerApp") + LogTrace("finishInitManagerApp (${atomicState?.pollBlocked}) (${atomicState?.pollBlockedReason})") +// polling is still blocked coming into this + //atomicState?.appCodeIdData = [:] + setPollingState() // polling is unblocked + updTimestampMap("lastChildUpdDt", null) // force child update on next poll + updTimestampMap("lastDevDataUpd", null) + updTimestampMap("lastChildForceUpdDt", null) + updTimestampMap("lastForcePoll", null) if(atomicState?.isInstalled && atomicState?.installData?.usingNewAutoFile) { createSavedNest() if(app.label == "Nest Manager") { app.updateLabel("NST Manager") } + def badAutomation = false + def storId = null + if(!isAppLiteMode()) { + getChildApps()?.sort()?.each { chld -> + chld?.update() + } + } else { + badAutomation = true + } - getChildApps()?.sort()?.each { chld -> chld?.update() } - def tstatAutoApp = getChildApps()?.find { + if (!badAutomation) { + def tstatAutoApp = getChildApps()?.find { + def aa = null + try { + aa = it?.getAutomationType() + def bb = it?.getCurrentSchedule() + def ai = it?.getAutomationsInstalled() + } catch (Exception e) { + LogAction("BAD Automation file ${it?.label?.toString()} (${it?.id}), please INSTALL proper automation file", "error", true) + badAutomation = true + appUpdateNotify(true, "automation") + } + if( !badAutomation && !(aa in ["nMode", "watchDog", "remDiag", "schMot", "storage"]) ) { badAutomation = true } + } + } + if(badAutomation) { + LogAction("Deleting BAD Automations in 10 mins", "warn", true) + runIn(600, "removeBadAutomations", [overwrite: true]) + } + if(resetAllData) { // This is to cleanup state for resetAllData - children are given 90 seconds to fixState() + runIn(90, "cleanupResetSettings", [overwrite: true]) + } + } +} + +def cleanupResetSettings() { + settingUpdate("resetAllData", "false", "bool") + runIn(75, "initialize", [overwrite: true]) // cause cleanup to propagate to child apps +} + +def removeBadAutomations() { + def tstatAutoApp = getChildApps()?.find { + def bad = false + def aa = null + try { + aa = it?.getAutomationType() + def bb = it?.getCurrentSchedule() + def ai = it?.getAutomationsInstalled() + } catch (Exception e) { + LogAction("BAD Automation (${it?.id}) found", "warn", true) + bad = true + } + if( !bad && !(aa in ["nMode", "watchDog", "remDiag", "schMot", "storage"]) ) { bad = true } + if(bad || isAppLiteMode()) { try { - def aa = it?.getAutomationType() - def bb = it?.getCurrentSchedule() - def ai = it?.getAutomationsInstalled() + LogAction("Calling uninstall on Automation (${it?.id})", "warn", true) + it?.uninstAutomationApp() } catch (Exception e) { - LogAction("BAD Automation file ${it?.label?.toString()}, please INSTALL proper automation file", "error", true) - appUpdateNotify(true) + ; } + LogAction("Deleting Automation (${it?.id})", "warn", true) + deleteChildApp(it) + updTimestampMap("lastAnalyticUpdDt", null) } } } +def remDiagAppAvail(available) { + atomicState?.remDiagAppAvailable = (available == true) +} + def createSavedNest() { def str = "createSavedNest" LogTrace("${str}") @@ -2213,7 +2529,7 @@ def createSavedNest() { def bad = false if(settings?.structures && atomicState?.structures) { def structs = getNestStructures() - def newStrucName = structs && structs?."${atomicState?.structures}" ? "${structs[atomicState?.structures]}" : null + def newStrucName = structs && structs?."${atomicState?.structures}" ? "${structs[atomicState?.structures]}" : null if(newStrucName) { bbb.a_structures_setting = settings.structures bbb.a_structures_as = atomicState.structures @@ -2223,7 +2539,7 @@ def createSavedNest() { def t0 = [:] t0 = dData?.thermostats?.findAll { it?.key?.toString() in settings?.thermostats } - LogAction("${str} | Thermostats(${t0?.size()}): ${settings?.thermostats}", "info", false) + LogAction("${str} | Thermostats(${t0?.size()}): ${settings?.thermostats}", "info", true) def t1 = [:] t0?.each { devItem -> LogAction("${str}: Found (${devItem?.value?.name})", "info", false) @@ -2272,17 +2588,22 @@ def createSavedNest() { def t0 = atomicState?.savedNestSettings ?: null def t1 = t0 ? new groovy.json.JsonOutput().toJson(t0) : null def t2 = bbb != [:] ? new groovy.json.JsonOutput().toJson(bbb) : null - atomicState.savedNestSettingslastbuild = bbb - if(!bad && t2 && (!t0 || t1 != t2)) { + if(bad) { atomicState.savedNestSettingsprev = atomicState?.savedNestSettings + atomicState.savedNestSettingslastbuild = bbb + state.remove("savedNestSettings") + } + if(!bad && t2 && (!t0 || t1 != t2)) { atomicState.savedNestSettings = bbb + state.remove("savedNestSettingsprev") + state.remove("savedNestSettingslastbuild") return true } } else { LogAction("${str}: No Structure Settings", "warn", true) } } else { LogAction("${str}: NOT Installed!!!", "warn", true) } return false } -//ERSERS + def mySettingUpdate(name, value, type=null) { if(getDevOpt()) { LogAction("Setting $name set to type:($type) $value", "warn", true) @@ -2477,7 +2798,7 @@ def checkRemapping() { //LogAction("as.thermostats: ${atomicState?.thermostats}", "warn", true) atomicState.thermostats = null def t4 = newvThermostats ? newvThermostats?.size() : 0 - def t5 = atomicState?.vThermostats ? atomicState?.vThermostats.size() : 0 + def t5 = atomicState?.vThermostats ? atomicState?.vThermostats.size() : 0 if(t4 || t5) { if(t4 == t5) { astr += ", AS vThermostats ${newvThermostats}" @@ -2651,24 +2972,23 @@ def askAlexaMQHandler(evt) { } def startStopStream() { - def strEn = (atomicState?.appData?.eventStreaming?.enabled == true || getDevOpt() || betaMarker()) ? true : false - if((!strEn || !settings?.restStreaming) && !atomicState?.restStreamingOn) { + if((!settings?.restStreaming) && !atomicState?.restStreamingOn) { return } - if(strEn && settings?.restStreaming && atomicState?.restStreamingOn) { - runIn(5, "restStreamCheck", [overwrite: true]) + if(settings?.restStreaming && atomicState?.restStreamingOn) { + runIn(45, "restStreamCheck", [overwrite: true]) return } - if(strEn && settings?.restStreaming && !atomicState?.restStreamingOn) { - //LogAction("Sending restStreamHandler(Start) Event to local node service", "debug", true) + if(settings?.restStreaming && !atomicState?.restStreamingOn) { + LogTrace("startStopStream: Stream not on, Sending restStreamHandler(Start) Event to local node service") restStreamHandler() - runIn(5, "restStreamCheck", [overwrite: true]) + runIn(45, "restStreamCheck", [overwrite: true]) } - else if ((!settings?.restStreaming || !strEn) && atomicState?.restStreamingOn) { - //LogAction("Sending restStreamHandler(Stop) Event to local node service", "debug", true) + else if (!settings?.restStreaming && atomicState?.restStreamingOn) { + LogTrace("startStopStream: Streaming should not be running Sending restStreamHandler(Stop) Event to local node service") restStreamHandler(true) - atomicState?.restStreamingOn = false - runIn(5, "restStreamCheck", [overwrite: true]) + //atomicState?.restStreamingOn = false + runIn(45, "restStreamCheck", [overwrite: true]) } } @@ -2681,7 +3001,7 @@ def getRestHost() { def autoHost = settings?.selectedRestDevice ?: null def ip = settings?.restStreamIp ?: null def port = settings?.restStreamPort ?: 3000 - LogTrace("getRestHost: autoHost: ${autoHost} ip: ${ip} port: ${port}") + LogTrace("getRestHost: autoHost: ${autoHost} ip: ${ip} port: ${port}") if(autoHost) { res = autoHost } else { @@ -2695,16 +3015,16 @@ def getRestHost() { return res } -def restStreamHandler(close = false) { - LogTrace("restStreamHandler: close: ${close}") +def restStreamHandler(close = false, resetPoll=true) { + LogTrace("restStreamHandler: close: ${close}, resetPoll: ${resetPoll}") def toClose = close def host = getRestHost() if(!host) { atomicState.restStreamingOn = false; host = atomicState?.lastRestHost ?: null atomicState.lastRestHost = null - if(!host) { return } - toClose = true + return + //toClose = true } else { atomicState.lastRestHost = host } @@ -2716,12 +3036,16 @@ def restStreamHandler(close = false) { LogTrace("restStreamHandler(close: ${close}) host: ${host} lastRestHost: ${atomicState?.lastRestHost}") def connStatus = toClose ? false : true LogAction("restStreamHandler(${connStatus ? "Start" : "Stop"}) Event to local node service", "debug", true) + String hubIp = settings?.restStreamLocalHub?.getLocalIP() + Boolean localStream = (settings?.restStreamLocal == true && hubIp) try { def hubAction = new physicalgraph.device.HubAction( method: "POST", headers: [ "HOST": host, "nesttoken": "${atomicState?.authToken}", + "stHubIp": "${hubIp}", + "localStream": "${localStream}", "connStatus": "${connStatus}", "callback": "${getApiURL()}", "sttoken": "${atomicState?.accessToken}", @@ -2731,11 +3055,16 @@ def restStreamHandler(close = false) { body: "" ) sendHubCommand(hubAction) - } - catch (Exception e) { + } catch (Exception e) { log.error "restStreamHandler Exception $e on $hubAction" atomicState.restStreamingOn = false } + if(toClose) { + atomicState?.restStreamingOn = false + if(atomicState?.streamPolling && resetPoll) { + resetPolling() + } + } } def restStreamCheck() { @@ -2747,6 +3076,8 @@ def restStreamCheck() { return } LogTrace("restStreamCheck host: ${host}") + String hubIp = settings?.restStreamLocalHub?.getLocalIP() + Boolean localStream = (settings?.restStreamLocal == true && hubIp) try { atomicState.lastRestHost = host def hubAction = new physicalgraph.device.HubAction( @@ -2754,6 +3085,8 @@ def restStreamCheck() { headers: [ "HOST": host, "callback": "${getApiURL()}", + "stHubIp": "${hubIp}", + "localStream": "${localStream}", "sttoken": "${atomicState?.accessToken}", "structure": "${atomicState?.structures}" ], @@ -2768,8 +3101,8 @@ def restStreamCheck() { } } -def receiveStreamStatus() { - def resp = request?.JSON +def receiveStreamStatus(eventData=null) { + def resp = eventData == null ? request?.JSON : eventData if(resp) { def t0 = resp?.streaming == true ? true : false def t1 = atomicState?.restStreamingOn @@ -2778,13 +3111,13 @@ def receiveStreamStatus() { } atomicState?.restStreamingOn = t0 if(!settings?.restStreaming && t0) { // suppose to be off - //LogAction("Sending restStreamHandler(Stop) Event to local node service", "debug", false) + //LogAction("receiveStreamStatus: Sending restStreamHandler(Stop) Event to local node service", "debug", true) restStreamHandler(true) } else if (settings?.restStreaming && !atomicState?.restStreamingOn) { // suppose to be on - runIn(21, "startStopStream", [overwrite: true]) + runIn(45, "startStopStream", [overwrite: true]) } if(settings?.restStreaming && t0) { // All good - atomicState?.lastHeardFromNestDt = getDtNow() + updTimestampMap("lastHeardFromNestDt", getDtNow()) if(atomicState?.ssdpOn == true) { unsubscribe() atomicState.ssdpOn = false @@ -2801,15 +3134,18 @@ def receiveStreamStatus() { } } atomicState?.restServiceData = resp - - render contentType: 'text/html', data: "status received...ok", status: 200 + if(eventData) { + return [data: "status received...ok", status: 200] + } else { + render contentType: 'text/html', data: "status received...ok", status: 200 + } } } def uninstManagerApp() { LogTrace("uninstManagerApp") try { - restStreamHandler(true) // stop the rest stream + restStreamHandler(true, false) // stop the rest stream //Revokes Smartthings endpoint token revokeAccessToken() //Revokes Nest Auth Token @@ -2821,7 +3157,7 @@ def uninstManagerApp() { } //If any client related data exists on firebase it will be removed //clearRemDiagData(true) - clearAllAutomationBackupData() + // clearAllAutomationBackupData() //sends notification of uninstall sendNotificationEvent("${appName()} is uninstalled") } @@ -2840,19 +3176,21 @@ def isAutoAppInst() { } def getInstAutoTypesDesc() { - def dat = ["nestMode":0,"watchDog":0, "disabled":0, "remDiag":0, "schMot":["tSched":0, "remSen":0, "fanCtrl":0, "fanCirc":0, "conWat":0, "extTmp":0, "leakWat":0, "humCtrl":0 ]] + def dat = ["nestMode":0, "watchDog":0, "disabled":0, "remDiag":0, "storage":0, "schMot":["tSched":0, "remSen":0, "fanCtrl":0, "fanCirc":0, "conWat":0, "extTmp":0, "leakWat":0, "humCtrl":0 ]] def disItems = [] def nItems = [:] def schMotItems = [] //atomicState?.autoSaVer = minVersions()?.automation?.desc def sData = atomicState?.swVer ?: [:] sData["autoSaVer"] = null + sData["storVer"] = null atomicState?.swVer = sData childApps?.each { a -> - def type = a?.getAutomationType() + def type def ver def dis try { + type = a?.getAutomationType() dis = a?.getIsAutomationDisabled() ver = a?.appVersion() } @@ -2862,16 +3200,16 @@ def getInstAutoTypesDesc() { type = "old" } if(ver) { - def updVer = sData.autoSaVer ?: ver + def updVer = sData?.autoSaVer ?: ver if(versionStr2Int(ver) < versionStr2Int(updVer)) { updVer = ver } sData.autoSaVer = updVer atomicState?.swVer = sData } - if(ver==null || (versionStr2Int(ver) < minVersions()?.automation?.val) || (versionStr2Int(ver) > minVersions()?.automation?.val && !getDevOpt() )) { - LogAction("NST AUTOMATIONS UPDATE REQUIRED: Automation ${a?.label} (v${ver}) | REQUIRED: (v${minVersions()?.automation?.desc}) | Please install the current NST Automations software in the IDE", "error", true) - appUpdateNotify(true) + if(ver == null || (versionStr2Int(ver) < minVersions()?.automation?.val) || (versionStr2Int(ver) > minVersions()?.automation?.val && !getDevOpt())) { + LogAction("NST AUTOMATIONS UPDATE REQUIRED: Automation ${a?.label} (v${ver}) | REQUIRED: (v${minVersions()?.automation?.desc}) | Please install the current NST Automations SmartApp Code in the IDE", "error", true) + appUpdateNotify(true, "automation") } if(dis) { @@ -2885,6 +3223,7 @@ def getInstAutoTypesDesc() { dat.nestMode = dat.nestMode - 1 LogAction("Deleting Extra Nest Mode (${a?.id})", "warn", true) deleteChildApp(a) + updTimestampMap("lastAnalyticUpdDt", null) } break case "schMot": @@ -2895,7 +3234,7 @@ def getInstAutoTypesDesc() { } catch (Exception e) { log.error "BAD Automation file ${a?.label?.toString()}, please RE-INSTALL automation file" - appUpdateNotify(true) + appUpdateNotify(true, "automation") } if(ai) { ai?.each { aut -> @@ -2916,6 +3255,7 @@ def getInstAutoTypesDesc() { dat.watchDog = dat.watchDog - 1 LogAction("Deleting Extra Watchdog (${a?.id})", "warn", true) deleteChildApp(a) + updTimestampMap("lastAnalyticUpdDt", null) } break case "remDiag": @@ -2924,11 +3264,27 @@ def getInstAutoTypesDesc() { dat.remDiag = dat.remDiag - 1 LogAction("Deleting Extra Remote Diagnostic (${a?.id})", "warn", true) deleteChildApp(a) + updTimestampMap("lastAnalyticUpdDt", null) } break + case "storage": + dat["storage"] = dat["storage"] ? dat["storage"]+1 : 1 + if(dat.storage > 1) { + dat.storage = dat.storage - 1 + LogAction("Deleting Extra Storage Child (${a?.id})", "warn", true) + deleteChildApp(a) + updTimestampMap("lastAnalyticUpdDt", null) + } else if(a?.name == "NST Storage") { + LogAction("Deleting Old Storage Child (${a?.id})", "warn", true) + deleteChildApp(a) + updTimestampMap("lastAnalyticUpdDt", null) + } + checkStorageApp() + break default: LogAction("Deleting Unknown Automation (${a?.id})", "warn", true) deleteChildApp(a) + updTimestampMap("lastAnalyticUpdDt", null) break } } @@ -2937,6 +3293,7 @@ def getInstAutoTypesDesc() { def str = "" str += (dat?.watchDog > 0 || dat?.nestMode > 0 || dat?.schMot || dat?.disabled > 0) ? "Installed Automations:" : "" + str += (dat?.storage > 0) ? "\n• Storage (Active)" : "" str += (dat?.watchDog > 0) ? "\n• Watchdog (Active)" : "" str += (dat?.remDiag > 0) ? "\n• Diagnostic (Active)" : "" str += (dat?.nestMode > 0) ? ((dat?.nestMode > 1) ? "\n• Nest Home/Away (${dat?.nestMode})" : "\n• Nest Home/Away (Active)") : "" @@ -2954,12 +3311,20 @@ def getInstAutoTypesDesc() { def subscriber() { subscribe(app, onAppTouch) - if(atomicState.appData?.aaPrefs?.enMultiQueue && settings?.allowAskAlexaMQ) { + if(atomicState.appData?.settings?.askAlexa?.enMultiQueue && settings?.allowAskAlexaMQ) { subscribe(location, "askAlexaMQ", askAlexaMQHandler) //Refreshes list of available AA queues } + //Pushover Manager Init/cleanup + if(settings?.pushoverEnabled == true) { + pushover_init() + } else { pushover_cleanup() } + //Rest Stream Subriptions if(settings?.restStreaming && !getRestHost()) { restSrvcSubscribe() } + if(settings?.restStreaming && settings?.restStreamLocal && settings?.restStreamLocalHub) { + subscribe(location, null, lanStreamEvtHandler, [filterEvents:false]) + } } private adj_temp(tempF) { @@ -2967,7 +3332,7 @@ private adj_temp(tempF) { LogAction("adj_temp: error temp ${tempF} is list", "error", true) } if(getTemperatureScale() == "C") { - return (tempF - 32) * (5 / 9) as Double // + return (tempF - 32) * (5 / 9) as Double } else { return tempF } @@ -2980,6 +3345,9 @@ def setPollingState() { unschedule("poll") atomicState.streamPolling = false } else { + if(!atomicState?.authToken) { + atomicState.pollingOn = false + } if(!atomicState?.pollingOn && atomicState?.authToken) { //LogAction("Polling is ACTIVE", "info", true) atomicState.pollingOn = true @@ -2995,15 +3363,17 @@ def setPollingState() { pollStrTime = Math.max(pollStrTime, theMax) def weatherTimer = pollTime if(atomicState?.weatherDevice) { weatherTimer = (settings?.pollWeatherValue ? settings?.pollWeatherValue.toInteger() : 900) } - def timgcd = gcd([pollTime, pollStrTime, weatherTimer]) + Integer timgcd = gcd([pollTime, pollStrTime, weatherTimer]) def random = new Random() def random_int = random.nextInt(60) - timgcd = (timgcd.toInteger() / 60) < 1 ? 1 : timgcd.toInteger() / 60 + timgcd = (timgcd.div(60) < 1) ? 1 : (timgcd.div(60)) def random_dint = random.nextInt(timgcd.toInteger()) LogAction("POLL scheduled (${random_int} ${random_dint}/${timgcd} * * * ?)", "info", true) schedule("${random_int} ${random_dint}/${timgcd} * * * ?", poll) // this runs every timgcd minutes + atomicState?.pollBlocked = false + atomicState?.pollBlockedReason = null def timChk = atomicState?.streamPolling ? 1200 : 240 - if(!atomicState?.lastDevDataUpd || getLastDevicePollSec() > timChk) { + if(!getTimestampVal("lastDevDataUpd") || getLastDevPollSec() > timChk) { if(atomicState.streamPolling) { poll() } else { poll(true) } @@ -3030,9 +3400,15 @@ private gcd(input = []) { } def onAppTouch(event) { + /* + // ERS Debug to remove + def sData = atomicState?.swVer ?: [:] + sData["mgrVer"] = "tester" + atomicState?.swVer = sData + return + */ stateCleanup() createSavedNest() - fixStuckMigration() poll(true) } @@ -3048,73 +3424,13 @@ def refresh(child = null) { def pollFollow() { poll() } -def fixStuckMigration() { - if(atomicState?.migrationInProgress == true) { - atomicState?.migrationInProgress = false - atomicState?.pollBlocked = false - atomicState?.pollBlockedReason = null - atomicState?.autoMigrationComplete = true - def t0 = atomicState?.installData - t0["usingNewAutoFile"] = true - atomicState?.installData = t0 - } -} - -def cleanRestAutomationTest() { - /* - NOTE: - This is only here to allow testing. - It will be removed after testing is complete - */ - //log.trace "cleanRestAutomationTest..." - def cApps = getChildApps() - atomicState?.pollBlocked = true - atomicState.pollBlockedReason = "Cleaning Automation Migration" - atomicState?.migrationInProgress = true - atomicState?.autoMigrationComplete = true - def foundAll = true - if(keepBackups() == false) { - cApps.each { ca -> - def restId = ca?.getSettingVal("restoreId") - if(restId == null) { - foundAll = false - } - } - if(foundAll) { - cApps.each { ca -> - def restId = ca?.getSettingVal("restoreId") - if(restId != null) { - ca?.settingUpdate("restoreId", null) - } - } - } - } - cApps.each { ca -> - def restId = ca?.getSettingVal("restoreId") - if(restId != null) { - LogAction("CleanRestAutomationTest: removing ${ca?.label} ${restId}", "warn", true) - deleteChildApp(ca) - } - else { - LogAction("CleanRestAutomationTest: enabling ${ca?.label} ${restId}", "warn", true) - ca?.settingUpdate("disableAutomationreq", "false", "bool") - ca?.stateUpdate("disableAutomation", false) - ca?.stateUpdate("disableAutomationDt", null) - ca?.update() - } - } - atomicState?.migrationInProgress = false - atomicState?.pollBlocked = false - atomicState?.pollBlockedReason = null - atomicState?.autoMigrationComplete = false - def t0 = atomicState?.installData - t0["usingNewAutoFile"] = false - atomicState?.installData = t0 -} - def checkIfSwupdated() { - if(checkMigrationRequired()) { return true } + // if(checkMigrationRequired()) { return true } if(atomicState?.swVer?.mgrVer != appVersion()) { + def sData = atomicState?.swVer ?: [:] + sData["mgrVer"] = appVersion() + atomicState?.swVer = sData + updTimestampMap("lastAnalyticUpdDt", null) LogAction("checkIfSwupdated: new version ${appVersion()}", "info", true) def iData = atomicState?.installData iData["updatedDt"] = getDtNow().toString() @@ -3122,347 +3438,19 @@ def checkIfSwupdated() { iData["shownFeedback"] = false iData["shownDonation"] = false atomicState?.installData = iData -/* Updated does this - def sData = atomicState?.swVer ?: [:] - sData["mgrVer"] = appVersion() - atomicState?.swVer = sData - def cApps = getChildApps() - if(cApps) { - cApps?.sort()?.each { chld -> - chld?.update() - } - } -*/ +// force full fixState + settingUpdate("resetAllData", "true", "bool") + atomicState.resetAllData = false + atomicState.pollBlocked = true + atomicState.pollBlockedReason = "Software Update pending" + runIn(20, "updated", [overwrite: true]) + //updated() sendInstallSlackNotif(false) - updated() - return true - } - return false -} - -/* NOTE: - MIGRATION Pre-Check - This will be called as part of the version change logic. - It looks to see if the file version is greater than a set number and that the atomicState.autoMigrationComplete is false or null, - If the to are ok it schedules the "doAutoMigrationProcess" method for 5 seconds. -*/ -def checkMigrationRequired() { - if(atomicState?.migrationInProgress == true) { return true } - else if(atomicState?.installData?.usingNewAutoFile == true) { return false } - if(allowMigration()) { - if((versionStr2Int(appVersion()) >= 454 && !atomicState?.autoMigrationComplete == true)) { - LogAction("checkMigrationRequired: Scheduled Migration Process to New Automation File...(5 seconds)", "info", true) - //atomicState?.migrationInProgress == true - runIn(5, "doAutoMigrationProcess", [overwrite: true]) - return true - } - } - return false -} - -/* NOTE: - This is method creates the settings map with these items [type, value] so it can be easily restored. - The input reference data used is stored on our firebase -*/ -def buildSettingsMap() { - def inputData = getWebData([uri: "https://st-nest-manager.firebaseio.com/restoreInputData.json", contentType:"application/json"], "inputType", false) - def settingsMap = [:] - def setData = getSettings()?.sort()?.findAll { it } - setData?.sort().each { item -> - def itemType = inputData?.inputs?.find { item?.key.toString().contains(it?.key.toString()) } - settingsMap[item?.key] = ["type":itemType?.value, "value":item?.value] - } - return settingsMap -} - -/* NOTE: - This is method creates the JSON that is sent to Firebase with the Settings and State data -*/ -def createAutoBackupJson() { - //log.trace "createAutoBackupJson..." - def noShow = ["curAlerts", "curAstronomy", "curForecast", "curWeather", "detailEventHistory", "detailExecutionHistory", "evalExecutionHistory", "activeSchedData", "resetAllData"] - for(def i=1; i <= 8; i++) { noShow.push("schMot_${i}_MotionActiveDt"); noShow.push("schMot_${i}_MotionInActiveDt"); noShow.push("schMot_${i}_oldMotionActive"); } - def stData = getState()?.sort()?.findAll { !(it.key in noShow) } - def stateData = [:] - stData?.sort().each { item -> - stateData[item?.key] = item?.value - } - def setData = buildSettingsMap() - setData?.sort().each { item -> - //log.debug "item: $item" - def itemVal = item?.value?.value - def itemType = item?.value?.type - def tmpList = [] - def getIds4These = ["phone", "contact"] - def setObj = null - if(itemType?.contains("capability") || itemType in getIds4These) { - if(itemVal instanceof List) { setObj = settings[item?.key]?.collect { it?.id } } - else { setObj = settings[item?.key]?.id } - } - else { - if(itemType == "mode" || itemVal instanceof Integer || itemVal instanceof Double || itemVal instanceof Boolean || itemVal instanceof Float || itemVal instanceof Long || itemVal instanceof BigDecimal) { - setObj = itemVal - } - else { setObj = itemVal.toString() } - } - //log.debug "setting item ${item?.key}: ${getObjType(itemVal)} | result: $setObj" - setData[item?.key]?.value = setObj - } - setData["automationTypeFlag"] = getAutoType().toString() - //setData["backedUpData"] = true - def data = [:] - data["appLabel"] = app.label - data["stateData"] = stateData - data["settingsData"] = setData - data["backupDt"] = getDtNow() - def resultJson = new groovy.json.JsonOutput().toJson(data) - //log.debug "resultJson: $resultJson" - return resultJson -} - -// Child Method -// This is only necessary in the manager code to allow the backup to be created for migration to the new automation file -def backupConfigToFirebase() { - //log.trace "backupConfigToFirebase..." - unschedule() - unsubscribe() - uninstAutomationApp() // Cleanup any parent state this child owns - def data = createAutoBackupJson() - return parent?.sendAutomationBackupData(data, app.id) -} - -//Manager only -def sendAutomationBackupData(data, appId) { - try { - sendFirebaseData(data, "backupData/clients/${atomicState?.installationId}/automationApps/${appId}.json", null, "Automation ($appId) Backup", true) - } catch (ex) { - LogAction("sendAutomationBackupData Exception: ${ex}", "error", true) - return false - } -} - -def removeAutomationBackupData(childId, lbl=null) { - LogAction("removeAutomationBackupData(${lbl ? "$lbl" : "$childId"})", "info", true) - return removeFirebaseData("backupData/clients/${atomicState?.installationId}/automationApps/${childId}.json") -} - -def clearAllAutomationBackupData() { - LogAction("cleanAllAutomationBackupData()...", "trace", true) - return removeFirebaseData("backupData/clients/${atomicState?.installationId}.json") -} - -def getAutomationBackupData() { - return getWebData([uri: "https://st-nest-manager.firebaseio.com/backupData/clients/${atomicState?.installationId}/automationApps.json", contentType:"application/json"], "getAutomationBackup", false) -} - -def migrationInProgress() { - return atomicState?.migrationInProgress == true ? true : false -} - -/* - NOTE: MIGRATION STEP 1 - This is the process that is called to kick off the backup/restore process. - It set the state values of pollBlocked and migrationInProgress to true to prevent any polling - PARENT METHOD -*/ -void doAutoMigrationProcess() { - LogAction("doAutoMigrationProcess...", "trace", true) - if(atomicState?.migrationInProgress == true) { LogAction("Migration already in progress", "error", true) } - atomicState?.pollBlocked = true - atomicState?.pollBlockedReason = "Automation Migration in Progress" - atomicState?.migrationInProgress = true - atomicState?.migrationState1 = "Step 1 Start" - - // This is to control the parent/child state to reset using fixState() - atomicState?.resetAllData = false - settingUpdate("resetAllData", "false") - - def cApps = getChildApps() - if(cApps) { - cApps?.each { ca -> - def t0 = ca?.settings?.restoredFromBackup - atomicState?.migrationState1 = "Step 1 Backup - ${ca.label}" - if(t0 == null && backupAutomation(ca)) { - LogAction("backed up ${ca?.label}", "debug", true) - } else { - if(t0) { LogAction("skipping backup of the new style automation ${ca.label}", "debug", true) } - else { LogAction("backup failed of automation ${ca.label}", "warn", true) } - } - } - atomicState?.migrationState1 = "Step 1 Finish - Restore Scheduled" - runIn(15, "processAutoRestore", [overwrite:true]) - LogAction("Scheduled restore process for (15 seconds)...", "info", true) - } else { - atomicState?.migrationState1 = "Step 1 Finish - Nothing to Restore" - LogAction("There are no automations to restore.", "warn", true) - finishMigrationProcess(false) - } -} - -/* - NOTE: MIGRATION STEP 2 - This is the process calls the backupConfigToFirebase method on every child - PARENT METHOD -*/ -def backupAutomation(child) { - if(child?.backupConfigToFirebase()) { - child?.stateUpdate("lastBackupDt", getDtNow()) return true } return false } -/* - NOTE: MIGRATION STEP 3 - This process calls the automationRestore method with all of the backup data to restore - PARENT METHOD -*/ -void processAutoRestore() { - LogAction("processAutoRestore...", "trace", true) - atomicState?.migrationState3 = "Step 3 Start" - def backupData = getAutomationBackupData() - if(backupData instanceof List || backupData instanceof Map) { - atomicState?.migrationState3 = "Step 3 Automation Restore" - automationRestore(backupData) - } - atomicState?.migrationState3 = "Step 3 Finish" -} - -/* - NOTE: MIGRATION STEP 4 - This is the actual automation restore method for installing the automations from the backups - It loops through each backed up automation id and creates the map to send and creates the new automation - using the new file. - PARENT METHOD -*/ -def automationRestore(data, id=null) { - LogAction("automationRestore... size: ${data?.size()}", "trace", true) - try { - if(data) { - data?.each { bApp -> - if(id && id.toString() != bApp?.key.toString()) { return } - def appLbl = bApp?.value?.appLabel.toString() - def setData = bApp?.value?.settingsData - setData["restoreId"] = ["type":"text", "value":bApp?.key] - setData["restoredFromBackup"] = ["type":"bool", "value":true] - setData["restoreCompleted"] = ["type":"bool", "value":false] - setData["automationTypeFlag"] = ["type":"text", "value":setData?.automationTypeFlag] - - atomicState?.migrationState4 = "Step 4 Automation Restore - Restoring [${setData?.automationTypeFlag?.value}] Automation Named: ($appLbl)...." - LogAction("Restoring [${setData?.automationTypeFlag?.value}] Automation Named: ($appLbl)....", "info", true) - // log.debug "setData: $setData" - try { - addChildApp(appNamespace(), autoAppName(), "${appLbl} (NST)", [settings:setData]) - } catch (ex) { - appUpdateNotify(true) - return false - } - postChildRestore(bApp?.key) - } - atomicState?.migrationState4 = "Step 4 Automation Restore - Finishing" - runIn(25, "finishMigrationProcess", [overwrite:true]) - LogAction("Scheduling finishMigrationProcess for (25 seconds)...", "debug", true) - return true - } - } catch (ex) { - log.error "automationRestore Exception:", ex - } - return false -} - -/* - NOTE: MIGRATION STEP 5 - This is called by the child automations initAutoApp() method after the addChildApp() - creates that app from backup. On the first initialazation of the child it calls the - parent to restore the stateData from backup. BACKUP MUST STILL EXIST - PARENT METHOD -*/ -def callRestoreState(child, restId) { - atomicState?.migrationState5 = "Step 5 callRestoreState - Start ${child.label} RestoreID: ${restId}" - LogAction("callRestoreState ${child.label} RestoreID: ${restId}", "trace", true) - //log.debug "child: [Name: ${child.label} || ID: ${child?.getId()} | RestoreID: $restId" - if(restId) { - def data = getAutomationBackupData() - //log.debug "callRestoreState data: $data" - def newData = data.find { it?.key?.toString() == restId?.toString() } - if(newData?.value?.stateData) { - atomicState?.migrationState5 = "Step 5 callRestoreState - restoring child ${child.label} state RestoreID: ${restId}" - newData?.value?.stateData?.each { sKey -> - child?.stateUpdate(sKey?.key, sKey?.value) - } - return true - } else { - atomicState?.migrationState5 = "Step 5 callRestoreState - no backup data child ${child.label} RestoreID: ${restId}" - LogAction("Backup Data not found: ${child.label} RestoreID: ${restId}", "error", true) - } - } - return false -} - -/* - NOTE: MIGRATION STEP 3 (Really part of STEP 3) - This is called by the child once it's state data has been restored and it's purpose is - finalize the restore setting values and disable or remove the old automations. - The removal is controlled by the method keepBackups(). - PARENT METHOD -*/ -def postChildRestore(childId) { - atomicState?.migrationState3A = "Step 3A Start postChildRestore(childId: $childId)" - LogAction("postChildRestore(childId: $childId)", "trace", true) - def cApp = getChildApps() - cApp?.each { ca -> - atomicState?.migrationState3A = "Step 3A postChildRestore Checking Automation (${ca?.label})..." - LogAction("postChildRestore Checking Automation (${ca?.label})...", "info", true) - if(ca?.id.toString() == childId) { - if(keepBackups() == false) { - atomicState?.migrationState3A = "Step 3A postChildRestore Removing Old Automation (${ca?.label})..." - LogAction("postChildRestore Removing Old Automation (${ca?.label})...", "warn", true) - deleteChildApp(ca) - } else { - ca?.settingUpdate("disableAutomationreq", "true", "bool") - ca?.stateUpdate("disableAutomation", true) - ca?.stateUpdate("disableAutomationDt", getDtNow()) - ca?.update() - } - } else { - atomicState?.migrationState3A = "Step 3A postChildRestore No Match for Automation (${ca?.label})..." - LogAction("postChildRestore No Match for Automation (${ca?.label})...", "info", true) - } - } -} - -/* - NOTE: MIGRATION 6 - This is the final part of the migration process. It's supposed to if Successful restore polling state, - and mark the migration complete. Otherwise it leaves them set so the migration will try again after the - update is called. - PARENT METHOD -*/ -void finishMigrationProcess(result=true) { - atomicState?.migrationState6 = "Step 6 start - finishMigrationProcess result: $result" - LogAction("finishMigrationProcess result: $result", "trace", true) - if(result) { - LogAction("Auto Migration Process is complete...", "info", true) - def t0 = atomicState?.installData - t0["usingNewAutoFile"] = true - atomicState?.installData = t0 - } else { - LogAction("Auto Migration did not do anything...", "warn", true) - } - atomicState?.pollBlocked = false - atomicState?.pollBlockedReason = null - atomicState?.migrationInProgress = false - atomicState?.autoMigrationComplete = true - - // This is to force the parent/child state to reset using fixState() - atomicState?.resetAllData = false - settingUpdate("resetAllData", "true") - - // This will perform a cleanup of any backup data that wasn't removed - if(keepBackups() == false) { clearAllAutomationBackupData() } - app.update() -} - def poll(force = false, type = null) { if(isPollAllowed()) { if(checkIfSwupdated()) { return } @@ -3480,8 +3468,8 @@ def poll(force = false, type = null) { if(getLastHeardFromNestSec() > pollTimeout) { if(settings?.restStreaming && atomicState?.restStreamingOn) { LogAction("Have not heard from Rest Stream", "warn", true) - restStreamHandler(true) // close the stream if we have not heard from it in a while - atomicState?.restStreamingOn = false + restStreamHandler(true, false) // close the stream if we have not heard from it in a while + //atomicState?.restStreamingOn = false } } @@ -3502,17 +3490,6 @@ def poll(force = false, type = null) { } startStopStream() - //def pollStrTime = !settings?.pollStrValue ? 180 : settings?.pollStrValue.toInteger() - //if(pollTime < 60 || pollStrTime < 60) { - if(pollTime < 60 && inReview() && !atomicState?.apiRateLimited) { - if(atomicState?.pollTock) { - atomicState.pollTock = false - runIn(30, "pollFollow", [overwrite: true]) - } else { - atomicState.pollTock = true - } - } - def okStruct = ok2PollStruct() def okDevice = ok2PollDevice() def okMeta = ok2PollMetaData() @@ -3520,56 +3497,57 @@ def poll(force = false, type = null) { def dev = false def str = false if(!okDevice && !okStruct && !(getLastHeardFromNestSec() > pollTimeout*2)) { - LogAction("No Device or Structure poll - Devices Last Updated: ${getLastDevicePollSec()} seconds ago | Structures Last Updated ${getLastStructPollSec()} seconds ago", "info", true) - } - else { + LogAction("No Device or Structure poll - Devices Last Updated: ${getLastDevPollSec()} seconds ago | Structures Last Updated ${getLastStrPollSec()} seconds ago", "info", true) + } else { def sstr = "" - def allowAsync = false - def metstr = "sync" - if(atomicState?.appData && atomicState?.appData?.pollMethod?.allowAsync) { - allowAsync = true - metstr = "async" - } + def metstr = "async" if(okStruct) { - sstr += "Updating Structure Data (Last Updated: ${getLastStructPollSec()} seconds ago)" - if(allowAsync) { - str = queueGetApiData("str") - } else { - str = getApiData("str") - } + sstr += "Updating Structure Data (Last Updated: ${getLastStrPollSec()} seconds ago)" + str = queueGetApiData("str") } if(okDevice) { sstr += sstr != "" ? " | " : "" - sstr += "Updating Device Data (Last Updated: ${getLastDevicePollSec()} seconds ago)" - if(allowAsync) { - dev = queueGetApiData("dev") - } else { - dev = getApiData("dev") - } + sstr += "Updating Device Data (Last Updated: ${getLastDevPollSec()} seconds ago)" + dev = queueGetApiData("dev") } if(okMeta) { sstr += sstr != "" ? " | " : "" sstr += "Updating Meta Data(Last Updated: ${getLastMetaPollSec()} seconds ago)" - if(allowAsync) { - meta = queueGetApiData("meta") - } else { - meta = getApiData("meta") - } + meta = queueGetApiData("meta") } if(sstr != "") { LogAction("${sstr} (${metstr})", "info", true) } - if(allowAsync) { return } + return } finishPoll(str, dev) - } else if(atomicState?.clientBlacklisted) { - LogAction("Client poll is BLACKLISTED. Please contact the Developer", "warn", true) + } else if(atomicState?.cltBlacklisted) { + LogAction("Client poll is BLACKLISTED. Please contact the Developer", "warn", true) finishPoll(false, true) } } def finishPoll(str=null, dev=null) { LogTrace("finishPoll($str, $dev) received") - if(atomicState?.pollBlocked) { LogAction("Polling BLOCKED | Reason: (${atomicState?.pollBlockedReason})", "trace", true); schedNextWorkQ(null); return } - if(dev || str || atomicState?.forceChildUpd || atomicState?.needChildUpd) { updateChildData() } + def lastDevUpd = getLastChildUpdSec() + if(!atomicState?.pollingOn) { + LogAction("finishPoll: Polling not ON", "warn", true); + return + } + if(atomicState?.pollBlocked) { + LogAction("finishPoll: Polling BLOCKED | Reason: (${atomicState?.pollBlockedReason})", "warn", true); + if( (atomicState?.apiRateLimited && lastDevUpd > 35*60) || (lastDevUpd > 45*60 && (atomicState?.needChildUpd || atomicState?.forceChildUpd) ) ) { + LogAction("finishPoll: ReRunning Updated() | Polling blocked | Last device update ${lastDevUpd} | Rate Limited: ${atomicState?.apiRateLimited}", "warn", true); + runIn(5, "updated", [overwrite: false]) // ensure it does not keep delaying + return + } + if(getLastAnyCmdSentSeconds() > 75) { // if poll is blocked and we have not sent a command recently, try to kick the queues + schedNextWorkQ(); + } + return + } + if(getLastChildForceUpdSec() > (15*60)-2) { // if nest goes silent (no changes coming back); force all devices to get an update so they can check health + atomicState.forceChildUpd = true + } + if(dev || str || atomicState?.forceChildUpd || atomicState?.needChildUpd) { runIn(1, "updateChildData", [overwrite : true]) } updateWebStuff() notificationCheck() //Checks if a notification needs to be sent for a specific event broadcastCheck() @@ -3580,6 +3558,7 @@ def finishPoll(str=null, dev=null) { def resetPolling() { atomicState.pollingOn = false + atomicState.streamPolling = false unschedule("poll") unschedule("finishPoll") unschedule("postCmd") @@ -3588,7 +3567,9 @@ def resetPolling() { } def schedFinishPoll(devChg) { - finishPoll(false, devChg) + if(isPollAllowed()) { + finishPoll(false, devChg) + } return } @@ -3599,7 +3580,8 @@ def forcedPoll(type = null) { pollWaitVal = Math.max(pollWaitVal, 10) if(lastFrcdPoll > pollWaitVal) { // This limits manual forces to 10 seconds or more - atomicState?.lastForcePoll = getDtNow() + updTimestampMap("lastForcePoll", getDtNow()) + atomicState?.workQrunInActive = false atomicState?.pollBlocked = false atomicState?.pollBlockedReason = null cmdProcState(false) @@ -3617,17 +3599,18 @@ def forcedPoll(type = null) { LogAction("Updating Meta Data (forcedPoll)", "info", true) getApiData("meta") } - atomicState?.lastWebUpdDt = null - atomicState?.lastWeatherUpdDt = null - atomicState?.lastForecastUpdDt = null - schedNextWorkQ(null) + updTimestampMap("lastWebUpdDt", null) + updTimestampMap("lastWeatherUpdDt" , null) + updTimestampMap("lastForecastUpdDt", null) + schedNextWorkQ() } else { LogAction("Too Soon for Update; Elapsed (${lastFrcdPoll}) seconds; minimum (${settings?.pollWaitVal})", "debug", true) atomicState.needStrPoll = true atomicState.needDevPoll = true } atomicState.forceChildUpd = true - updateChildData() + //runIn(1, "updateChildData", [overwrite : true]) + //updateChildData() } def postCmd() { @@ -3636,8 +3619,8 @@ def postCmd() { } def getApiData(type = null) { - //LogTrace("getApiData($type)") - LogAction("getApiData($type)", "info", false) + LogTrace("getApiData($type)") + //LogAction("getApiData($type)", "info", false) def result = false if(!type || !atomicState?.authToken) { return result } @@ -3658,10 +3641,10 @@ def getApiData(type = null) { try { httpGet(params) { resp -> if(resp?.status == 200) { - atomicState?.lastHeardFromNestDt = getDtNow() + updTimestampMap("lastHeardFromNestDt", getDtNow()) apiIssueEvent(false) - atomicState?.apiRateLimited = false - atomicState?.apiCmdFailData = null + //atomicState?.apiRateLimited = false + //atomicState?.apiCmdFailData = null if(type == "str") { def t0 = resp?.data //LogTrace("API Structure Resp.Data: ${t0}") @@ -3673,21 +3656,21 @@ def getApiData(type = null) { atomicState.structName = newStrucName ?: atomicState?.structName locationPresNotify(getLocationPresence()) } - incApiStrReqCnt() + incrementCntByKey("apiStrReqCnt") } else if(type == "dev") { def t0 = resp?.data //LogTrace("API Device Resp.Data: ${t0}") def chg = didChange(atomicState?.deviceData, t0, "dev", "poll") if(chg) { result = true } - incApiDevReqCnt() + incrementCntByKey("apiDevReqCnt") } else if(type == "meta") { //LogTrace("API Metadata Resp.Data: ${resp?.data}") def nresp = resp?.data?.metadata def chg = didChange(atomicState?.metaData, nresp, "meta", "poll") if(chg) { result = true } - incApiMetaReqCnt() + incrementCntByKey("apiMetaReqCnt") } } else { LogAction("getApiData - ${type} Received: Resp (${resp?.status})", "error", true) @@ -3697,8 +3680,7 @@ def getApiData(type = null) { } } } catch (ex) { - apiIssueEvent(true) - atomicState?.apiRateLimited = false + //atomicState?.apiRateLimited = false atomicState.forceChildUpd = true log.error "getApiData (type: $type) Exception:", ex if(ex instanceof groovyx.net.http.HttpResponseException && ex?.response) { @@ -3709,6 +3691,7 @@ def getApiData(type = null) { else if(type == "meta") { atomicState?.needMetaPoll = true } sendExceptionData(ex, "getApiData") } + apiIssueEvent(true) } return result } @@ -3749,13 +3732,12 @@ def queueGetApiData(type = null, newUrl = null) { def procNestResponse(resp, data) { LogTrace("procNestResponse(${data?.type})") - LogAction("procNestResponse | resp: $resp | data: $data", "info", false) + LogAction("procNestResponse | Status: ${resp?.getStatus()} | data: $data", "info", false) def str = false def dev = false def meta = false def type = data?.type try { - if(!type) { return } if(resp?.status == 307) { @@ -3767,14 +3749,14 @@ def procNestResponse(resp, data) { } if(resp?.status == 200) { - atomicState?.lastHeardFromNestDt = getDtNow() + updTimestampMap("lastHeardFromNestDt", getDtNow()) apiIssueEvent(false) - atomicState?.apiRateLimited = false - atomicState?.apiCmdFailData = null + //atomicState?.apiRateLimited = false + //atomicState?.apiCmdFailData = null if(type == "str") { def t0 = resp?.json //LogTrace("API Structure Resp.Data: ${t0}") - if(atomicState?.structData == null) { atomicState?.structData = t0 } + //if(atomicState?.structData == null) { atomicState?.structData = t0 } def chg = didChange(atomicState?.structData, t0, "str", "poll(async)") if(chg) { str = true @@ -3783,7 +3765,7 @@ def procNestResponse(resp, data) { locationPresNotify(getLocationPresence()) } atomicState.qstrRequested = false - incApiStrReqCnt() + incrementCntByKey("apiStrReqCnt") } if(type == "dev") { def t0 = resp?.json @@ -3793,7 +3775,7 @@ def procNestResponse(resp, data) { dev = true } atomicState.qdevRequested = false - incApiDevReqCnt() + incrementCntByKey("apiDevReqCnt") } if(type == "meta") { def nresp = resp?.json?.metadata @@ -3802,7 +3784,7 @@ def procNestResponse(resp, data) { if(chg) { meta = true } - incApiMetaReqCnt() + incrementCntByKey("apiMetaReqCnt") } } else { def tstr = (type == "str") ? "Structure" : ((type == "dev") ? "Device" : "Metadata") @@ -3820,11 +3802,12 @@ def procNestResponse(resp, data) { atomicState.qdevRequested = false } if((atomicState?.qdevRequested == false && atomicState?.qstrRequested == false) && (dev || atomicState?.forceChildUpd || atomicState?.needChildUpd)) { - finishPoll(true, true) + if(isPollAllowed()) { + finishPoll(true, true) + } } } catch (ex) { - log.error "procNestResponse (type: $type) Exception:", ex def tstr = (type == "str") ? "Structure" : ((type == "dev") ? "Device" : "Metadata") tstr += " Poll async" //LogAction("procNestResponse - Received $tstr: Resp (${resp?.status})", "error", true) @@ -3846,18 +3829,19 @@ def procNestResponse(resp, data) { if(type == "str") { atomicState.needStrPoll = true } else if(type == "dev") { atomicState?.needDevPoll = true } else if(type == "meta") { atomicState?.needMetaPoll = true } + log.error "procNestResponse (type: $type) | Exception:", ex sendExceptionData("${ex}", "procNestResponse_${type}") } } -def receiveEventData() { +def receiveEventData(eventData=null) { def status = [:] try { - def evtData = request?.JSON + def evtData = eventData == null ? request?.JSON : eventData //LogAction("evtData: $evtData", "trace", true) def devChgd = false def gotSomething = false - if(evtData?.data && settings?.restStreaming) { + if(evtData?.data && settings?.restStreaming && atomicState?.restStreamingOn) { if(evtData?.data?.devices) { //LogTrace("API Device Resp.Data: ${evtData?.data?.devices}") gotSomething = true @@ -3884,72 +3868,144 @@ def receiveEventData() { //LogTrace("API Metadata Resp.Data: ${evtData?.data?.metadata}") gotSomething = true def chg = didChange(atomicState?.metaData, evtData?.data?.metadata, "meta", "stream") - if(!chg) { - LogTrace("got metaData") - } + if(!chg) { LogTrace("got metaData") } } } else { - LogTrace("receiveEventData: Sending restStreamHandler(Stop)") - restStreamHandler(true) + def forceStop = false + if(!settings?.restStreaming) { forceStop = true } + if(!forceStop && !atomicState?.restStreamingOn) { + LogAction("receiveEventData: stream not on yet, ignoring", "debug", true) + } + if(forceStop) { + LogAction("receiveEventData: Sending restStreamHandler(Stop)", "warn", true) + restStreamHandler(true) + } } if(gotSomething) { - atomicState?.lastHeardFromNestDt = getDtNow() + updTimestampMap("lastHeardFromNestDt", getDtNow()) if(atomicState?.ssdpOn == true) { unsubscribe() //These were causing exceptions - atomicState.ssdpOn = false + atomicState?.ssdpOn = false subscriber() } - apiIssueEvent(false) - atomicState?.apiRateLimited = false - atomicState?.apiCmdFailData = null - incRestStrEvtCnt() + //apiIssueEvent(false) + //atomicState?.apiRateLimited = false + //atomicState?.apiCmdFailData = null + incrementCntByKey("apiRestStrEvtCnt") } if(atomicState?.forceChildUpd || atomicState?.needChildUpd || devChgd) { schedFinishPoll(devChgd) } - status = ["data":"status received...ok", "code":200] + status = [data:"status received...ok", code:200] } catch (ex) { log.error "receiveEventData Exception:", ex LogAction("receiveEventData Exception: ${ex}", "error", true) - status = ["data":"${ex?.message}", "code":500] + status = [data:"${ex?.message}", code:500] + //apiIssueEvent(true) + } + if(eventData) { + return status + } else { + render contentType: 'text/html', data: status?.data, status: status?.code + } +} + +def lanStreamEvtHandler(evt) { + // log.trace "lanStreamEvtHandler..." + def status = [:] + try { + def msg = parseLanMessage(evt?.description) + Map headerMap = msg?.headers + // log.debug "lanStreamEvtHandler... | headers: ${headerMap}" + Map msgData = [:] + if (headerMap?.size()) { + if (headerMap?.evtSource && headerMap?.evtSource == "NST_Stream") { + if (msg?.body != null) { + def slurper = new groovy.json.JsonSlurper() + msgData = slurper.parseText(msg?.body) + // log.debug "msgData: $msgData" + if(headerMap?.evtType) { + switch(headerMap?.evtType) { + case "streamStatus": + status = receiveStreamStatus(msgData) + break + case "sendEventData": + status = receiveEventData(msgData) + break + } + } + } + } + } + } catch (ex) { + log.error "lanStreamEvtHandler Exception:", ex + status = [data:"${ex?.message}", code: 500] } render contentType: 'text/html', data: status?.data, status: status?.code } def didChange(old, newer, type, src) { - //LogTrace("didChange: type: $type src: $src") - def result = false - def srcStr = src.toString().toUpperCase() + //LogTrace("didChange: type: $type src: $src") + Boolean result = false + String srcStr = src.toString().toUpperCase() if(newer != null) { if(type == "str") { - atomicState?.lastStrucDataUpd = getDtNow() + updTimestampMap("lastStrDataUpd", getDtNow()) atomicState.needStrPoll = false - if(atomicState?.structures) { - LogAction("NestAPI AWAY Debug | Current: (${newer[atomicState?.structures]?.away})${(newer[atomicState?.structures]?.away != old[atomicState?.structures]?.away) ? " | Previous: (${old[atomicState?.structures]?.away})" : ""}", "trace", false) + newer.each { + if(it?.value) { + def myId = it?.value?.structure_id + if(myId) { + newer[myId].wheres = [:] + } + } } } if(type == "dev") { - atomicState?.lastDevDataUpd = getDtNow() + updTimestampMap("lastDevDataUpd", getDtNow()) atomicState?.needDevPoll = false + newer.each { t -> // This reduces stored state size + def dtyp = t.key + t.value.each { + if(it?.value) { + def myId = it?.value?.device_id + if(myId) { + newer."${dtyp}"[myId].where_id = "" + if(newer."${dtyp}"[myId]?.app_url) { + newer."${dtyp}"[myId].app_url = "" + } + if(newer."${dtyp}"[myId]?.last_event?.app_url) { + newer."${dtyp}"[myId].last_event.app_url = "" + } + if(newer."${dtyp}"[myId]?.last_event?.image_url) { + newer."${dtyp}"[myId].last_event.image_url = "" + } + } + } + } + } } if(type == "meta") { - atomicState?.lastMetaDataUpd = getDtNow() + updTimestampMap("lastMetaDataUpd", getDtNow()) atomicState.needMetaPoll = false } if(old != newer) { if(type == "str") { - def t0 = atomicState?.structData?.size() && atomicState?.structures ? atomicState?.structData[atomicState?.structures] : null - def t1 = newer && atomicState?.structures ? newer[atomicState?.structures] : null + def tt0 = atomicState?.structData?.size() ? atomicState?.structData : null + // Null safe does not work on array references that miss + def t0 = tt0 && atomicState?.structures && tt0?."${atomicState?.structures}" ? tt0[atomicState?.structures] : null + def t1 = newer && atomicState?.structures && newer?."${atomicState?.structures}" ? newer[atomicState?.structures] : null + if(t1 && t0 != t1) { result = true atomicState?.forceChildUpd = true LogTrace("structure old newer not the same ${atomicState?.structures}") // whatChanged(t0, t1, "/structures", "structure") - if(atomicState?.enRemDiagLogging == true && settings?.showDataChgdLogs != true) { - LogAction("API Structure Data HAS Changed ($srcStr)", "info", true) - } else { + if(settings?.showDataChgdLogs == true && atomicState?.enRemDiagLogging != true) { def chgs = getChanges(t0, t1, "/structures", "structure") if(chgs) { LogAction("STRUCTURE Changed ($srcStr): ${chgs}", "info", true) } + } else { + LogAction("API Structure Data HAS Changed ($srcStr)", "info", true) } } atomicState?.structData = newer @@ -4036,7 +4092,7 @@ def didChange(old, newer, type, src) { } } } - //LogAction("didChange: type: $type src: $src result: $result", "info", true) + //LogAction("didChange: type: $type src: $src result: $result", "info", true) return result } @@ -4050,16 +4106,19 @@ def getChanges(mapA, mapB, headstr, objType=null) { String[] leftKeys = left.keySet() String[] rightKeys = right.keySet() leftKeys.each { - // if ( (left[it] instanceof List) || (left[it] instanceof ArrayList) || (left[it] instanceof Map)) { - // // May detect matching items here if sort of objects is problem - // //whatChanged( left[it], right[it], "${headstr}/${it}" ) - // } else { + //if ( (left[it] instanceof List) || (left[it] instanceof ArrayList) || (left[it] instanceof Map)) { + if ( left[it] instanceof Map ) { + def chgs = getChanges( left[it], right[it], "${headstr}/${it}", objType ) + if(chgs && objType) { + itemsChgd += chgs + } + } else { if (left[it].toString() != right[it].toString()) { if(objType) { itemsChgd.push(it.toString()) } } - // } + } } if(itemsChgd.size()) { return itemsChgd } } @@ -4073,7 +4132,7 @@ def whatChanged(mapA, mapB, headstr) { def right = t1 if(left == null || right == null) { - LogAction("Object: $headstr NULL", "trace", true) + LogAction("Object: $headstr NULL", "trace", true) return false } @@ -4126,24 +4185,29 @@ def updateChildData(force = false) { def nforce = atomicState?.forceChildUpd atomicState.forceChildUpd = true try { - atomicState?.lastChildUpdDt = getDtNow() + updTimestampMap("lastChildUpdDt", getDtNow()) + if(force || nforce) { + updTimestampMap("lastChildForceUpdDt", getDtNow()) + } def useMt = !useMilitaryTime ? false : true def dbg = !childDebug ? false : true def logNamePrefix = (settings?.debugAppendAppName || settings?.debugAppendAppName == null) ? true : false - def remDiag = (atomicState?.appData?.database?.allowRemoteDiag && atomicState?.enRemDiagLogging) ? true: false + def remDiag = (atomicState?.enRemDiagLogging && settings?.enRemDiagLogging) ? true: false def nestTz = getNestTimeZone()?.toString() - def api = !apiIssues() ? false : true - def htmlInfo = getHtmlInfo() + def api = apiIssueType() def mobClientType = settings?.mobileClientType def vRprtPrefs = getVoiceRprtPrefs() - def clientBl = atomicState?.clientBlacklisted == true ? true : false - def hcCamTimeout = atomicState?.appData?.healthcheck?.camTimeout ?: 120 - def hcProtWireTimeout = atomicState?.appData?.healthcheck?.protWireTimeout ?: 35 - def hcProtBattTimeout = atomicState?.appData?.healthcheck?.protBattTimeout ?: 1500 - def hcTstatTimeout = atomicState?.appData?.healthcheck?.tstatTimeout ?: 35 - def hcLongTimeout = atomicState?.appData?.healthcheck?.longTimeout ?: 120 - def hcRepairEnabled = atomicState?.appData?.healthcheck?.repairEnabled != false ? true : false + def clientBl = atomicState?.cltBlacklisted == true ? true : false + def hcCamTimeout = atomicState?.appData?.settings?.healthcheck?.camTimeout ?: 120 + def hcProtWireTimeout = atomicState?.appData?.settings?.healthcheck?.protWireTimeout ?: 45 + def hcProtBattTimeout = atomicState?.appData?.settings?.healthcheck?.protBattTimeout ?: 1500 + def hcTstatTimeout = atomicState?.appData?.settings?.healthcheck?.tstatTimeout ?: 45 + def hcLongTimeout = atomicState?.appData?.settings?.healthcheck?.longTimeout ?: 120 + def hcRepairEnabled = atomicState?.appData?.settings?.healthcheck?.repairEnabled != false ? true : false def locPresence = getLocationPresence() + def locSecurityState = getSecurityState() + def locEtaBegin = getEtaBegin() + if(atomicState?.notificationPrefs == null) { atomicState?.notificationPrefs = buildNotifPrefMap() } def nPrefs = atomicState?.notificationPrefs def devBannerData = atomicState?.devBannerData ?: null def streamingActive = atomicState?.restStreamingOn == true ? true : false @@ -4152,26 +4216,26 @@ def updateChildData(force = false) { def curWeatherData = [:] if(atomicState?.thermostats && getWeatherDeviceInst()) { - def cur = getWData() + def cur = getWeatherData("curWeather") if(cur) { - curWeatherData["temp"] = getTemperatureScale() == "C" ? (cur?.current_observation?.temp_c ? Math.round(cur?.current_observation?.temp_c.toDouble()) : null) : (cur?.current_observation?.temp_f ? Math.round(cur?.current_observation?.temp_f).toInteger() : null) - curWeatherData["hum"] = cur?.current_observation?.relative_humidity ?: 0 + curWeatherData["temp"] = cur?.temperature ?: null + curWeatherData["hum"] = cur?.relativeHumidity ?: 0 } } def showGraphs = settings?.tstatShowHistoryGraph == false ? false : true - showGraphs = showGraphs && !inReview() ? true : false if(settings?.devNameOverride == null || atomicState?.devNameOverride == null) { // Upgrade force to on atomicState?.devNameOverride = true; settingUpdate("devNameOverride", "true", "bool") } def overRideNames = (atomicState?.devNameOverride) ? true : false - + //def devCodeIds = atomicState?.devCodeIdData ?: [:] def devices = app.getChildDevices(true) devices?.each { if(atomicState?.pollBlocked) { return true } def devId = it?.deviceNetworkId if(devId && atomicState?.thermostats && atomicState?.deviceData?.thermostats && atomicState?.deviceData?.thermostats[devId]) { + //devCodeIds["tstat"] = it?.getDevTypeId() def defmin = fixTempSetting(atomicState?."${devId}_safety_temp_min" ?: null) def defmax = fixTempSetting(atomicState?."${devId}_safety_temp_max" ?: null) def safetyTemps = [ "min":defmin, "max":defmax ] @@ -4181,12 +4245,20 @@ def updateChildData(force = false) { comfortDewpoint = fixTempSetting(settings?.locDesiredComfortDewpointMax ?: null) } def comfortHumidity = settings?."${devId}_comfort_humidity_max" ?: 80 - def autoSchedData = reqSchedInfoRprt(it, false) as Map + if(nforce) { + atomicState?."oldTstatSchedData${devId}" = null + } + def oldTstatSchedData = atomicState?."oldTstatSchedData${devId}" + if(oldTstatSchedData == null) { + oldTstatSchedData = reqSchedInfoRprt(it, false) as Map + atomicState?."oldTstatSchedData${devId}" = oldTstatSchedData + } + def autoSchedData = oldTstatSchedData as Map def tData = ["data":atomicState?.deviceData?.thermostats[devId], "mt":useMt, "debug":dbg, "tz":nestTz, "apiIssues":api, "safetyTemps":safetyTemps, "comfortHumidity":comfortHumidity, - "comfortDewpoint":comfortDewpoint, "pres":locPresence, "childWaitVal":getChildWaitVal().toInteger(), "htmlInfo":htmlInfo, "allowDbException":allowDbException, + "comfortDewpoint":comfortDewpoint, "pres":locPresence, "childWaitVal":getChildWaitVal().toInteger(), "allowDbException":allowDbException, "latestVer":latestTstatVer()?.ver?.toString(), "vReportPrefs":vRprtPrefs, "clientBl":clientBl, "curWeatherData":curWeatherData, "logPrefix":logNamePrefix, "hcTimeout":hcTstatTimeout, - "mobileClientType":mobClientType, "enRemDiagLogging":remDiag, "autoSchedData":autoSchedData, "healthNotify":nPrefs?.dev?.devHealth?.healthMsg, "showGraphs":showGraphs, - "devBannerData":devBannerData, "restStreaming":streamingActive, "isBeta":isBeta, "hcRepairEnabled":hcRepairEnabled] + "mobileClientType":mobClientType, "enRemDiagLogging":remDiag, "autoSchedData":autoSchedData, "healthNotify":nPrefs?.dev?.devHealth, "showGraphs":showGraphs, + "devBannerData":devBannerData, "restStreaming":streamingActive, "isBeta":isBeta, "hcRepairEnabled":hcRepairEnabled, "etaBegin":locEtaBegin ] def oldTstatData = atomicState?."oldTstatData${devId}" def tDataChecksum = generateMD5_A(tData.toString()) atomicState."oldTstatData${devId}" = tDataChecksum @@ -4199,8 +4271,7 @@ def updateChildData(force = false) { atomicState?.swVer = sData if(sData?.tDevVer != "" && (versionStr2Int(sData?.tDevVer) >= minVersions()?.thermostat?.val)) { //LogTrace("UpdateChildData >> Thermostat id: ${devId} | data: ${tData}") - LogTrace("updateChildData >> Thermostat id: ${devId} | oldTstatData: ${oldTstatData} tDataChecksum: ${tDataChecksum} force: $force nforce: $nforce") - it?.generateEvent(tData) + LogTrace("updateChildData >> Thermostat id: ${devId} | oldTstatData: ${oldTstatData} tDataChecksum: ${tDataChecksum} force: $force nforce: $nforce") if(atomicState?."lastUpdated${devId}Dt" != null) { state.remove("lastUpdated${devId}Dt" as String) } } else { if(atomicState?."lastUpdated${devId}Dt" == null) { @@ -4209,15 +4280,16 @@ def updateChildData(force = false) { LogAction("NST THERMOSTAT DEVICE UPDATE REQUIRED: Thermostat ${devId} (v${sData?.tDevVer}) | REQUIRED: (v${minVersions()?.thermostat?.desc}) | Update the Device code to the latest software in the IDE", "error", true) appUpdateNotify() } - it?.generateEvent(tData) } + it?.generateEvent(tData) } return true } else if(devId && atomicState?.protects && atomicState?.deviceData?.smoke_co_alarms && atomicState?.deviceData?.smoke_co_alarms[devId]) { + //devCodeIds["protect"] = it?.getDevTypeId() def pData = ["data":atomicState?.deviceData?.smoke_co_alarms[devId], "mt":useMt, "debug":dbg, "showProtActEvts":(!showProtActEvts ? false : true), "logPrefix":logNamePrefix, - "tz":nestTz, "htmlInfo":htmlInfo, "apiIssues":api, "allowDbException":allowDbException, "latestVer":latestProtVer()?.ver?.toString(), "clientBl":clientBl, - "hcWireTimeout":hcProtWireTimeout, "hcBattTimeout":hcProtBattTimeout, "mobileClientType":mobClientType, "enRemDiagLogging":remDiag, "healthNotify":nPrefs?.dev?.devHealth?.healthMsg, + "tz":nestTz, "apiIssues":api, "allowDbException":allowDbException, "latestVer":latestProtVer()?.ver?.toString(), "clientBl":clientBl, + "hcWireTimeout":hcProtWireTimeout, "hcBattTimeout":hcProtBattTimeout, "mobileClientType":mobClientType, "enRemDiagLogging":remDiag, "healthNotify":nPrefs?.dev?.devHealth, "devBannerData":devBannerData, "restStreaming":streamingActive, "isBeta":isBeta, "hcRepairEnabled":hcRepairEnabled ] def oldProtData = atomicState?."oldProtData${devId}" def pDataChecksum = generateMD5_A(pData.toString()) @@ -4231,8 +4303,7 @@ def updateChildData(force = false) { atomicState?.swVer = sData if(sData?.pDevVer != "" && (versionStr2Int(sData?.pDevVer) >= minVersions()?.protect?.val)) { //LogTrace("UpdateChildData >> Protect id: ${devId} | data: ${pData}") - LogTrace("UpdateChildData >> Protect id: ${devId} | oldProtData: ${oldProtData} pDataChecksum: ${pDataChecksum} force: $force nforce: $nforce") - it?.generateEvent(pData) + LogTrace("UpdateChildData >> Protect id: ${devId} | oldProtData: ${oldProtData} pDataChecksum: ${pDataChecksum} force: $force nforce: $nforce") if(atomicState?."lastUpdated${devId}Dt" != null) { state.remove("lastUpdated${devId}Dt" as String) } } else { if(atomicState?."lastUpdated${devId}Dt" == null) { @@ -4241,17 +4312,19 @@ def updateChildData(force = false) { LogAction("NST PROTECT DEVICE UPDATE REQUIRED: Protect ${devId} (v${sData?.pDevVer}) | REQUIRED: (v${minVersions()?.protect?.desc}) | Update the Device code to the latest software in the IDE", "error", true) appUpdateNotify() } - it?.generateEvent(pData) } + it?.generateEvent(pData) } return true } else if(devId && atomicState?.cameras && atomicState?.deviceData?.cameras && atomicState?.deviceData?.cameras[devId]) { - def camData = ["data":atomicState?.deviceData?.cameras[devId], "mt":useMt, "debug":dbg, "logPrefix":logNamePrefix, - "tz":nestTz, "htmlInfo":htmlInfo, "apiIssues":api, "allowDbException":allowDbException, "latestVer":latestCamVer()?.ver?.toString(), "clientBl":clientBl, - "hcTimeout":hcCamTimeout, "mobileClientType":mobClientType, "enRemDiagLogging":remDiag, "healthNotify":nPrefs?.dev?.devHealth?.healthMsg, + //devCodeIds["camera"] = it?.getDevTypeId() + List camMotionZones = (settings?.camEnMotionZoneFltr && settings?."camera_${devId}_zones"?.size()) ? settings?."camera_${devId}_zones" : [] + def camData = ["data":atomicState?.deviceData?.cameras[devId], "mt":useMt, "debug":dbg, "logPrefix":logNamePrefix, "camMotionZones": camMotionZones, + "tz":nestTz, "apiIssues":api, "allowDbException":allowDbException, "latestVer":latestCamVer()?.ver?.toString(), "clientBl":clientBl, + "hcTimeout":hcCamTimeout, "mobileClientType":mobClientType, "enRemDiagLogging":remDiag, "healthNotify":nPrefs?.dev?.devHealth, "streamNotify":nPrefs?.dev?.camera?.streamMsg, "devBannerData":devBannerData, "restStreaming":streamingActive, "motionSndChgWaitVal":motionSndChgWaitVal, - "isBeta":isBeta, "camTakeSnapOnEvt": camTakeSnapOnEvt, "hcRepairEnabled":hcRepairEnabled ] + "isBeta":isBeta, "camTakeSnapOnEvt": camTakeSnapOnEvt, "hcRepairEnabled":hcRepairEnabled, "secState":locSecurityState ] def oldCamData = atomicState?."oldCamData${devId}" def cDataChecksum = generateMD5_A(camData.toString()) atomicState."oldCamData${devId}" = cDataChecksum @@ -4263,9 +4336,8 @@ def updateChildData(force = false) { sData["camDevVer"] = t1 ?: "" atomicState?.swVer = sData if(sData?.camDevVer != "" && (versionStr2Int(sData?.camDevVer) >= minVersions()?.camera?.val)) { - //LogTrace("UpdateChildData >> Camera id: ${devId} | data: ${camData}") - LogTrace("UpdateChildData >> Camera id: ${devId} | oldCamData: ${oldCamData} cDataChecksum: ${cDataChecksum} force: $force nforce: $nforce") - it?.generateEvent(camData) + // LogTrace("UpdateChildData >> Camera id: ${devId} | data: ${camData}") + LogTrace("UpdateChildData >> Camera id: ${devId} | oldCamData: ${oldCamData} cDataChecksum: ${cDataChecksum} force: $force nforce: $nforce") if(atomicState?."lastUpdated${devId}Dt" != null) { state.remove("lastUpdated${devId}Dt" as String) } } else { if(atomicState?."lastUpdated${devId}Dt" == null) { @@ -4274,15 +4346,16 @@ def updateChildData(force = false) { LogAction("NST CAMERA DEVICE UPDATE REQUIRED: Camera ${devId} (v${sData?.camDevVer}) | REQUIRED: (v${minVersions()?.camera?.desc}) | Update the Device code to the latest software in the IDE", "error", true) appUpdateNotify() } - it?.generateEvent(camData) } + it?.generateEvent(camData) } return true } else if(devId && atomicState?.presDevice && devId == getNestPresId()) { + //devCodeIds["presence"] = it?.getDevTypeId() def pData = ["debug":dbg, "logPrefix":logNamePrefix, "tz":nestTz, "mt":useMt, "pres":locPresence, "apiIssues":api, "allowDbException":allowDbException, "latestVer":latestPresVer()?.ver?.toString(), "clientBl":clientBl, "hcTimeout":hcLongTimeout, "mobileClientType":mobClientType, "hcRepairEnabled":hcRepairEnabled, - "enRemDiagLogging":remDiag, "healthNotify":nPrefs?.dev?.devHealth?.healthMsg, "lastStrucDataUpd": atomicState?.lastStrucDataUpd, "isBeta":isBeta ] + "enRemDiagLogging":remDiag, "healthNotify":nPrefs?.dev?.devHealth, "lastStrDataUpd": getTimestampVal("lastStrDataUpd"), "isBeta":isBeta ] def oldPresData = atomicState?."oldPresData${devId}" def pDataChecksum = generateMD5_A(pData.toString()) atomicState."oldPresData${devId}" = pDataChecksum @@ -4294,8 +4367,7 @@ def updateChildData(force = false) { sData["presDevVer"] = t1 ?: "" atomicState?.swVer = sData if(sData?.presDevVer != "" && (versionStr2Int(sData?.presDevVer) >= minVersions()?.presence?.val)) { - LogTrace("UpdateChildData >> Presence id: ${devId} | oldPresData: ${oldPresData} pDataChecksum: ${pDataChecksum} force: $force nforce: $nforce") - it?.generateEvent(pData) + LogTrace("UpdateChildData >> Presence id: ${devId} | oldPresData: ${oldPresData} pDataChecksum: ${pDataChecksum} force: $force nforce: $nforce") if(atomicState?."lastUpdated${devId}Dt" != null) { state.remove("lastUpdated${devId}Dt" as String) } } else { if(atomicState?."lastUpdated${devId}Dt" == null) { @@ -4304,17 +4376,18 @@ def updateChildData(force = false) { LogAction("NST PRESENCE DEVICE UPDATE REQUIRED: Presence ${devId} (v${sData?.presDevVer}) | REQUIRED: (v${minVersions()?.presence?.desc}) | Update the Device code to the latest software in the IDE", "error", true) appUpdateNotify() } - it?.generateEvent(pData) } + it?.generateEvent(pData) } return true } else if(devId && atomicState?.weatherDevice && devId == getNestWeatherId()) { - def wData1 = ["weatCond":getWData(), "weatForecast":getWForecastData(), "weatAstronomy":getWAstronomyData(), "weatAlerts":getWAlertsData()] - def wData = ["data":wData1, "tz":nestTz, "mt":useMt, "debug":dbg, "logPrefix":logNamePrefix, "apiIssues":api, "htmlInfo":htmlInfo, + //devCodeIds["weather"] = it?.getDevTypeId() + def wData1 = ["weatCond":getWeatherData("curWeather"), "weatForecast":getWeatherData("curForecast"), /* "weatAstronomy":getWeatherData("curAstronomy"),*/ "weatAlerts":getWeatherData("curAlerts"), weatLocation:getWeatherData("curLocation")] + def wData = ["data":wData1, "tz":nestTz, "mt":useMt, "debug":dbg, "logPrefix":logNamePrefix, "apiIssues":api, "allowDbException":allowDbException, "weathAlertNotif":settings?.weathAlertNotif, "latestVer":latestWeathVer()?.ver?.toString(), "clientBl":clientBl, "hcTimeout":hcLongTimeout, "mobileClientType":mobClientType, "enRemDiagLogging":remDiag, "hcRepairEnabled":hcRepairEnabled, - "healthNotify":nPrefs?.dev?.devHealth?.healthMsg, "showGraphs":showGraphs, "devBannerData":devBannerData, "isBeta":isBeta ] + "healthNotify":nPrefs?.dev?.devHealth, "showGraphs":showGraphs, "devBannerData":devBannerData, "isBeta":isBeta ] def oldWeatherData = atomicState?."oldWeatherData${devId}" def wDataChecksum = generateMD5_A(wData.toString()) def showWGraphs = settings?.weatherShowGraph == false ? false : true @@ -4327,8 +4400,7 @@ def updateChildData(force = false) { sData["weatDevVer"] = t1 ?: "" atomicState?.swVer = sData if(sData?.weatDevVer != "" && (versionStr2Int(sData?.weatDevVer) >= minVersions()?.weather?.val)) { - LogTrace("UpdateChildData >> Weather id: ${devId} oldWeatherData: ${oldWeatherData} wDataChecksum: ${wDataChecksum} force: $force nforce: $nforce") - it?.generateEvent(wData) + LogTrace("UpdateChildData >> Weather id: ${devId} oldWeatherData: ${oldWeatherData} wDataChecksum: ${wDataChecksum} force: $force nforce: $nforce") if(atomicState?."lastUpdated${devId}Dt" != null) { state.remove("lastUpdated${devId}Dt" as String) } } else { if(atomicState?."lastUpdated${devId}Dt" == null) { @@ -4337,17 +4409,16 @@ def updateChildData(force = false) { LogAction("NST WEATHER DEVICE UPDATE REQUIRED: Weather ${devId} (v${sData?.weatDevVer}) | REQUIRED: (v${minVersions()?.weather?.desc}) | Update the Device code to the latest software in the IDE", "error", true) appUpdateNotify() } - it?.generateEvent(wData) } + it?.generateEvent(wData) } return true } - else if(devId && atomicState?.vThermostats && atomicState?."vThermostat${devId}") { def physdevId = atomicState?."vThermostatMirrorId${devId}" - if(physdevId && atomicState?.thermostats && atomicState?.deviceData?.thermostats && atomicState?.deviceData?.thermostats[physdevId]) { - def data = atomicState?.deviceData?.thermostats[physdevId] + def tmp_data = atomicState?.deviceData?.thermostats[physdevId] + def data = tmp_data def defmin = fixTempSetting(atomicState?."${physdevId}_safety_temp_min" ?: null) def defmax = fixTempSetting(atomicState?."${physdevId}_safety_temp_max" ?: null) def safetyTemps = [ "min":defmin, "max":defmax ] @@ -4358,14 +4429,16 @@ def updateChildData(force = false) { def comfortHumidity = settings?."${physdevId}_comfort_humidity_max" ?: 80 def automationChildApp = getChildApps().find{ it.id == atomicState?."vThermostatChildAppId${devId}" } if(automationChildApp != null && !automationChildApp.getIsAutomationDisabled()) { + //data = new JsonSlurper().parseText(JsonOutput.toJson(tmp_data)) // This is a deep clone as object is same reference + data = [:] + tmp_data def tempC = 0.0 - def tempF = 0 + def tempF = 0.0 if(getTemperatureScale() == "C") { tempC = automationChildApp.getRemoteSenTemp() - tempF = (tempC * (9 / 5) + 32) as Integer // + tempF = (tempC * (9 / 5) + 32.0) } else { tempF = automationChildApp.getRemoteSenTemp() - tempC = (tempF - 32) * (5 / 9) as Double // + tempC = (tempF - 32.0) * (5 / 9) as Double } data?.ambient_temperature_c = tempC data?.ambient_temperature_f = tempF @@ -4374,20 +4447,20 @@ def updateChildData(force = false) { def ctempF = 0 if(getTemperatureScale() == "C") { ctempC = automationChildApp.getRemSenCoolSetTemp() - ctempF = ctempC != null ? (ctempC * (9 / 5) + 32.0) as Integer : null // + ctempF = ctempC != null ? (ctempC * (9 / 5) + 32.0) as Integer : null } else { ctempF = automationChildApp.getRemSenCoolSetTemp() - ctempC = ctempF != null ? (ctempF - 32.0) * (5 / 9) as Double : null // + ctempC = ctempF != null ? (ctempF - 32.0) * (5 / 9) as Double : null } def htempC = 0.0 def htempF = 0 if(getTemperatureScale() == "C") { htempC = automationChildApp.getRemSenHeatSetTemp() - htempF = htempC != null ? (htempC * (9 / 5) + 32.0) as Integer : null // + htempF = htempC != null ? (htempC * (9 / 5) + 32.0) as Integer : null } else { htempF = automationChildApp.getRemSenHeatSetTemp() - htempC = htempF != null ? (htempF - 32.0) * (5 / 9) as Double : null // + htempC = htempF != null ? (htempF - 32.0) * (5 / 9) as Double : null } if(data?.hvac_mode.toString() == "heat-cool") { @@ -4404,11 +4477,20 @@ def updateChildData(force = false) { } } - def autoSchedData = reqSchedInfoRprt(it, false) as Map - def tData = ["data":data, "mt":useMt, "debug":dbg, "tz":nestTz, "apiIssues":api, "safetyTemps":safetyTemps, "comfortHumidity":comfortHumidity, "hcRepairEnabled":hcRepairEnabled, - "comfortDewpoint":comfortDewpoint, "pres":locPresence, "childWaitVal":getChildWaitVal().toInteger(), "htmlInfo":htmlInfo, "allowDbException":allowDbException, + if(nforce) { + atomicState?."oldvTstatSchedData${devId}" = null + } + def oldTstatSchedData = atomicState?."oldvTstatSchedData${devId}" + if(oldTstatSchedData == null) { + oldTstatSchedData = reqSchedInfoRprt(it, false) as Map + atomicState?."oldvTstatSchedData${devId}" = oldTstatSchedData + } + def autoSchedData = oldTstatSchedData as Map + def tData = ["data":data, "mt":useMt, "debug":dbg, "tz":nestTz, "apiIssues":api, "safetyTemps":safetyTemps, "comfortHumidity":comfortHumidity, + "comfortDewpoint":comfortDewpoint, "pres":locPresence, "childWaitVal":getChildWaitVal().toInteger(), "allowDbException":allowDbException, "latestVer":latestvStatVer()?.ver?.toString(), "vReportPrefs":vRprtPrefs, "clientBl":clientBl, "curWeatherData":curWeatherData, "logPrefix":logNamePrefix, "hcTimeout":hcTstatTimeout, - "mobileClientType":mobClientType, "enRemDiagLogging":remDiag, "autoSchedData":autoSchedData, "healthNotify":nPrefs?.dev?.devHealth?.healthMsg, "showGraphs":showGraphs, "devBannerData":devBannerData, "isBeta":isBeta] + "mobileClientType":mobClientType, "enRemDiagLogging":remDiag, "autoSchedData":autoSchedData, "healthNotify":nPrefs?.dev?.devHealth, "showGraphs":showGraphs, + "devBannerData":devBannerData, "restStreaming":streamingActive, "isBeta":isBeta, "hcRepairEnabled":hcRepairEnabled, "etaBegin":locEtaBegin ] def oldTstatData = atomicState?."oldvStatData${devId}" def tDataChecksum = generateMD5_A(tData.toString()) @@ -4421,8 +4503,7 @@ def updateChildData(force = false) { sData["vtDevVer"] = t1 ?: "" atomicState?.swVer = sData if(sData?.vtDevVer != "" && (versionStr2Int(sData?.vtDevVer) >= minVersions()?.thermostat?.val)) { - LogTrace("UpdateChildData >> vThermostat id: ${devId} | oldvStatData: ${oldvStatData} tDataChecksum: ${tDataChecksum} force: $force nforce: $nforce") - it?.generateEvent(tData) + LogTrace("UpdateChildData >> vThermostat id: ${devId} | oldvStatData: ${oldvStatData} tDataChecksum: ${tDataChecksum} force: $force nforce: $nforce") if(atomicState?."lastUpdated${devId}Dt" != null) { state.remove("lastUpdated${devId}Dt" as String) } } else { if(atomicState?."lastUpdated${devId}Dt" == null) { @@ -4430,8 +4511,8 @@ def updateChildData(force = false) { } else { LogAction("NST THERMOSTAT DEVICE UPDATE REQUIRED: Thermostat ${devId} (v${sData?.vtDevVer}) | REQUIRED: (v${minVersions()?.thermostat?.desc}) | Update the Device code to the latest software in the IDE", "error", true) } - it?.generateEvent(tData) } + it?.generateEvent(tData) } return true } @@ -4454,11 +4535,13 @@ def updateChildData(force = false) { return true } } + //atomicState?.devCodeIdData = devCodeIds } catch (ex) { log.error "updateChildData Exception:", ex sendExceptionData(ex, "updateChildData") - atomicState?.lastChildUpdDt = null + updTimestampMap("lastChildUpdDt", null) + updTimestampMap("lastChildForceUpdDt", null) return } if(atomicState?.pollBlocked) { return } @@ -4471,7 +4554,7 @@ def setNeedChildUpdate() { } def tUnitStr() { - return "°${getTemperatureScale()}" + return "\u00b0${getTemperatureScale()}" } def setDeviceLabel(devId, labelStr) { @@ -4492,7 +4575,7 @@ void physDevLblHandler(devType, devId, devLbl, devStateName, apiName, abrevStr, def curlbl = devLbl?.toString() if(deflbl && deflbl == curlbl) { nameIsDefault = true } def newlbl = "getNest${abrevStr.capitalize()}Label"(apiName, devId) - LogTrace("physDevLblHandler | deflbl: ${deflbl} | curlbl: ${curlbl} | newlbl: ${newlbl} | deflblval: ${deflblval} || devId: ${devId}") + //LogTrace("physDevLblHandler | deflbl: ${deflbl} | curlbl: ${curlbl} | newlbl: ${newlbl} | deflblval: ${deflblval} || devId: ${devId}") if(ovrRideNames || (nameIsDefault && curlbl != newlbl)) { // label change from nest if(curlbl != newlbl) { LogAction("Changing name from ${curlbl} to ${newlbl}", "info", true) @@ -4506,14 +4589,14 @@ void physDevLblHandler(devType, devId, devLbl, devStateName, apiName, abrevStr, if(atomicState?.custLabelUsed && settings?."${abrevStr}_${devId}_lbl" != curlbl) { settingUpdate("${abrevStr}_${devId}_lbl", curlbl?.toString()) } - if(!atomicState?.custLabelUsed && settings?."${abrevStr}_${devId}_lbl") { settingUpdate("${abrevStr}_${devId}_lbl", "") } - if(settings?."${abrevStr}_${deflblval}_lbl") { settingUpdate("${abrevStr}_${deflblval}_lbl", "") } // clean up old stuff + if(!atomicState?.custLabelUsed && settings?."${abrevStr}_${devId}_lbl") { settingRemove("${abrevStr}_${devId}_lbl") } + if(settings?."${abrevStr}_${deflblval}_lbl") { settingRemove("${abrevStr}_${deflblval}_lbl") } // clean up old stuff } void virtDevLblHandler(devId, devLbl, devMethAbrev, abrevStr, ovrRideNames) { def curlbl = devLbl?.toString() def newlbl = "getNest${devMethAbrev.capitalize()}Label"() - LogTrace("virtDevLblHandler | curlbl: ${curlbl} | newlbl: ${newlbl} || devId: ${devId}") + //LogTrace("virtDevLblHandler | curlbl: ${curlbl} | newlbl: ${newlbl} || devId: ${devId}") if(ovrRideNames && curlbl != newlbl) { LogAction("Changing name from ${curlbl} to ${newlbl}", "info", true) setDeviceLabel(devId, newlbl?.toString()) @@ -4522,28 +4605,30 @@ void virtDevLblHandler(devId, devLbl, devMethAbrev, abrevStr, ovrRideNames) { if(atomicState?.custLabelUsed && settings?."${abrevStr}Dev_lbl" != curlbl) { settingUpdate("${abrevStr}Dev_lbl", curlbl?.toString()) } - if(!atomicState?.custLabelUsed && settings?."${abrevStr}Dev_lbl") { settingUpdate("${abrevStr}Dev_lbl", "") } + if(!atomicState?.custLabelUsed && settings?."${abrevStr}Dev_lbl") { settingRemove("${abrevStr}Dev_lbl") } } def apiIssues() { def t0 = atomicState?.apiIssuesList ?: [false, false, false, false, false, false, false] - def result = t0[3..-1].every { it == true } ? true : false - def dt = atomicState?.apiIssueDt + atomicState?.apiIssuesList = t0 + def result = t0[5..-1].every { it == true } ? true : false + def dt = getTimestampVal("apiIssueDt") if(result) { - LogAction("Nest API Issues ${dt ? "may still be occurring. Status will clear when last updates are good (Last Updates: ${t0}) | Issues began at ($dt) " : "Detected (${getDtNow()})"}", "warn", true) + def str = dt ? "may still be occurring. Status will clear when last updates are good (Last Updates: ${t0}) | Issues began at ($dt) " : "Detected (${getDtNow()})" + LogAction("Nest API Issues ${str}", "warn", true) } - apiIssueType() - atomicState?.apiIssueDt = (result ? (dt ?: getDtNow()) : null) return result } def apiIssueType() { - def res = "none" + def res = "Good" //this looks at the last 3 items added and determines whether issue is sporadic or outage - def t0 = atomicState?.apiIssuesList ?: [false, false, false, false, false, false, false] + def t0 = [] + t0 = atomicState?.apiIssuesList ?: [false, false, false, false, false, false, false] + atomicState?.apiIssuesList = t0 def items = t0[3..-1].findAll { it == true } - if(items?.size() >= 1 && items?.size() <= 2) { res = "sporadic" } - else if(items?.size() >= 3) { res = "outage" } + if(items?.size() >= 1 && items?.size() <= 2) { res = "Sporadic" } + else if(items?.size() >= 3) { res = "Outage" } //log.debug "apiIssueType: $res" return res } @@ -4567,54 +4652,96 @@ def apiIssueEvent(issue, cmd = null) { nList?.push(issue) list = nList } - if(list) { atomicState?.apiIssuesList = list } + atomicState?.apiIssuesList = list + if(issue) { + if(!getTimestampVal("apiIssueDt")) { + updTimestampMap("apiIssueDt", getDtNow()) + } + } else { + def result = list[3..-1].every { it == false } + def rateLimit = (atomicState?.apiRateLimited) ? true : false + if(rateLimit) { + def t0 = atomicState?.apiCmdFailData?.dt ? GetTimeDiffSeconds(atomicState?.apiCmdFailData?.dt, null, "apiIssueEvent").toInteger() : 200 + if((t0 > 120 && result) || t0 > 300) { + atomicState?.apiRateLimited = false + rateLimit = false + LogAction("Clearing rate Limit", "info", true) + } + } + } } def ok2PollMetaData() { +/* if(!atomicState?.authToken) { return false } + if(!atomicState.metaData) { return true } if(atomicState?.pollBlocked) { return false } if(atomicState?.needMetaPoll) { return true } def pollTime = !settings?.pollMetaValue ? (3600 * 4) : settings?.pollMetaValue.toInteger() - def val = pollTime / 3 // + def val = pollTime / 3 if(val > 60) { val = 50 } return ( ((getLastMetaPollSec() + val) > pollTime) ? true : false ) +*/ + def pollTime = !settings?.pollMetaValue ? (3600 * 4) : settings?.pollMetaValue.toInteger() + return (pollOk("Meta", pollTime, "metaData")) ? true : false } def ok2PollDevice() { +/* if(!atomicState?.authToken) { return false } + if(!atomicState?.deviceData) { return true } if(atomicState?.pollBlocked) { return false } if(atomicState?.needDevPoll) { return true } def pollTime = !settings?.pollValue ? 180 : settings?.pollValue.toInteger() - def val = pollTime / 3 // + def val = pollTime / 3 val = Math.max(Math.min(val.toInteger(), 50),25) //if(val > 60) { val = 50 } - return ( ((getLastDevicePollSec() + val) > pollTime) ? true : false ) + return ( ((getLastDevPollSec() + val) > pollTime) ? true : false ) +*/ + def pollTime = !settings?.pollValue ? 180 : settings?.pollValue.toInteger() + return (pollOk("Dev", pollTime, "deviceData")) ? true : false } def ok2PollStruct() { +/* if(!atomicState?.authToken) { return false } + if(!atomicState?.structData) { return true } if(atomicState?.pollBlocked) { return false } if(atomicState?.needStrPoll) { return true } def pollStrTime = !settings?.pollStrValue ? 180 : settings?.pollStrValue.toInteger() - def val = pollStrTime / 3 // + def val = pollStrTime / 3 val = Math.max(Math.min(val.toInteger(), 50),25) //if(val > 60) { val = 50 } - return ( ((getLastStructPollSec() + val) > pollStrTime || !atomicState?.structData) ? true : false ) + return ( ((getLastStrPollSec() + val) > pollStrTime) ? true : false ) +*/ + def pollStrTime = !settings?.pollStrValue ? 180 : settings?.pollStrValue.toInteger() + return (pollOk("Str", pollStrTime, "structData")) ? true : false } +def pollOk(typ, pTime, stVar) { + if(!atomicState?.authToken) { return false } + if(!atomicState?."${stVar}") { return true } + if(atomicState?.pollBlocked) { return false } + if(atomicState?."need${typ}Poll") { return true } + def pollTime = pTime as Integer + def val = pollTime / 3 + val = Math.max(Math.min(val.toInteger(), 50),25) + return ( (("getLast${typ}PollSec"() + val) > pollTime) ? true : false ) +} def isPollAllowed() { return (atomicState?.pollingOn && atomicState?.authToken && - !atomicState?.clientBlacklisted && + !atomicState?.cltBlacklisted && (atomicState?.thermostats || atomicState?.protects || atomicState?.weatherDevice || atomicState?.cameras)) ? true : false } -def getLastMetaPollSec() { return !atomicState?.lastMetaDataUpd ? 100000 : GetTimeDiffSeconds(atomicState?.lastMetaDataUpd, null, "getLastMetaPollSec").toInteger() } -def getLastDevicePollSec() { return !atomicState?.lastDevDataUpd ? 840 : GetTimeDiffSeconds(atomicState?.lastDevDataUpd, null, "getLastDevicePollSec").toInteger() } -def getLastStructPollSec() { return !atomicState?.lastStrucDataUpd ? 1000 : GetTimeDiffSeconds(atomicState?.lastStrucDataUpd, null, "getLastStructPollSec").toInteger() } -def getLastForcedPollSec() { return !atomicState?.lastForcePoll ? 1000 : GetTimeDiffSeconds(atomicState?.lastForcePoll, null, "getLastForcedPollSec").toInteger() } -def getLastChildUpdSec() { return !atomicState?.lastChildUpdDt ? 100000 : GetTimeDiffSeconds(atomicState?.lastChildUpdDt, null, "getLastChildUpdSec").toInteger() } -def getLastHeardFromNestSec() { return !atomicState?.lastHeardFromNestDt ? 100000 : GetTimeDiffSeconds(atomicState?.lastHeardFromNestDt, null, "getLastHeardFromNestSec").toInteger() } +def getLastMetaPollSec() { return getTimeSeconds("lastMetaDataUpd", 100000, "getLastMetaPollSec").toInteger() } +def getLastDevPollSec() { return getTimeSeconds("lastDevDataUpd", 840, "getLastDevPollSec").toInteger() } +def getLastStrPollSec() { return getTimeSeconds("lastStrDataUpd", 1000, "getLastStrPollSec").toInteger() } +def getLastForcedPollSec() { return getTimeSeconds("lastForcePoll", 1000, "getLastForcedPollSec").toInteger() } +def getLastChildUpdSec() { return getTimeSeconds("lastChildUpdDt", 100000, "getLastChildUpdSec").toInteger() } +def getLastChildForceUpdSec() { return getTimeSeconds("lastChildForceUpdDt", 100000, "getLastChildForceUpdSec").toInteger() } +def getLastHeardFromNestSec() { return getTimeSeconds("lastHeardFromNestDt", 100000, "getLastHeardFromNestSec").toInteger() } /************************************************************************************************ | Nest API Commands | @@ -4622,7 +4749,7 @@ def getLastHeardFromNestSec() { return !atomicState?.lastHeardFromNestDt ? 10000 private cmdProcState(Boolean value) { atomicState?.cmdIsProc = value } private cmdIsProc() { return (!atomicState?.cmdIsProc) ? false : true } -private getLastProcSeconds() { return atomicState?.cmdLastProcDt ? GetTimeDiffSeconds(atomicState?.cmdLastProcDt, null, "getLastProcSeconds") : 0 } +private getLastProcSeconds() { return getTimeSeconds("cmdLastProcDt", 0, "getLastProcSeconds") } def apiVar() { def api = [ @@ -4633,12 +4760,88 @@ def apiVar() { targetF:"target_temperature_f", targetC:"target_temperature_c", targetLowF:"target_temperature_low_f", setLabel:"label", targetLowC:"target_temperature_low_c", targetHighF:"target_temperature_high_f", targetHighC:"target_temperature_high_c", fanActive:"fan_timer_active", fanTimer:"fan_timer_timeout", fanDuration:"fan_timer_duration", hvacMode:"hvac_mode", - away:"away", streaming:"is_streaming", setTscale:"temperature_scale" + away:"away", streaming:"is_streaming", setTscale:"temperature_scale", eta:"eta" ] ] return api } +// There are 3 different return values +def getPdevId(Boolean virt, devId) { + def pChild + if(virt && atomicState?.vThermostats && devId) { + if(atomicState?."vThermostat${devId}") { + def pdevId = atomicState?."vThermostatMirrorId${devId}" + if(pdevId) { pChild = getChildDevice(pdevId) } + if(pChild) { return pChild } + else { return "00000" } + } + } + return pChild +} + +def setEtaState(child, etaData, virtual=false) { + def devId = !child?.device?.deviceNetworkId ? child?.toString() : child?.device?.deviceNetworkId.toString() + + def str1 = "setEtaState | " + def strAction = "BAD data" + def strArgs = " ${virtual ? "Virtual " : ""}Thermostat (${child?.device?.displayName} - ${devId}) | Trip_Id: ${etaData?.trip_id} | Begin: ${etaData?.estimated_arrival_window_begin} | End: ${etaData?.estimated_arrival_window_end}" + + if(etaData?.trip_id && etaData?.estimated_arrival_window_begin && etaData?.estimated_arrival_window_end) { + def etaObj = [ "trip_id":"${etaData.trip_id}", "estimated_arrival_window_begin":"${etaData.estimated_arrival_window_begin}", "estimated_arrival_window_end":"${etaData.estimated_arrival_window_end}" ] + // "trip_id":"sample-trip-id","estimated_arrival_window_begin":"2014-10-31T22:42:00.000Z","estimated_arrival_window_end":"2014-10-31T23:59:59.000Z" + // new Date().format("yyyy-MM-dd'T'HH:mm:ss'Z'", TimeZone.getTimeZone("UTC")) + + strAction = "Setting Eta" + def pChild = getPdevId(virtual.toBoolean(), devId) + if(pChild == null) { + LogAction(str1+strAction+strArgs, "debug", true) + return sendNestApiCmd(atomicState?.structures, apiVar().rootTypes.struct, apiVar().cmdObjs.eta, etaObj, devId) + } else { + if(pChild != "00000") { + LogAction(str1+strAction+strArgs, "debug", true) + pChild.setNestEta(etaData?.trip_id, etaData?.estimated_arrival_window_begin, etaData.estimated_arrival_window_end) { + } + return + } else { + strAction = "CANNOT Set Eta" + } + } + } + LogAction(str1+strAction+strArgs, "warn", true) +} + +def cancelEtaState(child, trip_id, virtual=false) { + def devId = !child?.device?.deviceNetworkId ? child?.toString() : child?.device?.deviceNetworkId.toString() + + def str1 = "cancelEtaState | " + def strAction = "BAD data" + def strArgs = " ${virtual ? "Virtual " : ""}Thermostat (${child?.device?.displayName} - ${devId}) | Trip_Id: ${trip_id}" + + if(trip_id) { + def etaObj = [ "trip_id":"${trip_id}", "estimated_arrival_window_begin":0, "estimated_arrival_window_end":0 ] + // "trip_id":"sample-trip-id","estimated_arrival_window_begin":"2014-10-31T22:42:00.000Z","estimated_arrival_window_end":"2014-10-31T23:59:59.000Z" + // new Date().format("yyyy-MM-dd'T'HH:mm:ss'Z'", TimeZone.getTimeZone("UTC")) + + strAction = "Cancel Eta" + def pChild = getPdevId(virtual.toBoolean(), devId) + if(pChild == null) { + LogAction(str1+strAction+strArgs, "debug", true) + return sendNestApiCmd(atomicState?.structures, apiVar().rootTypes.struct, apiVar().cmdObjs.eta, etaObj, devId) + } else { + if(pChild != "00000") { + LogAction(str1+strAction+strArgs, "debug", true) + pChild.cancelNestEta(trip_id) { + } + return + } else { + strAction = "CANNOT Cancel Eta" + } + } + } + LogAction(str1+strAction+strArgs, "warn", true) +} + def setCamStreaming(child, streamOn) { def devId = !child?.device?.deviceNetworkId ? child?.toString() : child?.device?.deviceNetworkId.toString() def val = streamOn.toBoolean() ? true : false @@ -4646,20 +4849,18 @@ def setCamStreaming(child, streamOn) { return sendNestApiCmd(devId, apiVar().rootTypes.cam, apiVar().cmdObjs.streaming, val, devId) } -def setCamLabel(child, label, virtual=false) { +def setCamLabel(child, label) { def devId = !child?.device?.deviceNetworkId ? null : child?.device?.deviceNetworkId.toString() def val = label - def virt = virtual.toBoolean() -// This is not used anywhere. A command to set label is not available in the dth for a callback +// This is not used anywhere. A command to set label is not available in the dth for a callback LogAction("setCamLabel | Setting Camera (${child?.device?.displayName} - ${devId}) Label to (${val})", "debug", true) return sendNestApiCmd(devId, apiVar().rootTypes.cam, apiVar().cmdObjs.setLabel, val, devId) } -def setProtLabel(child, label, virtual=false) { +def setProtLabel(child, label) { def devId = !child?.device?.deviceNetworkId ? null : child?.device?.deviceNetworkId.toString() def val = label - def virt = virtual.toBoolean() -// This is not used anywhere. A command to set label is not available in the dth for a callback +// This is not used anywhere. A command to set label is not available in the dth for a callback LogAction("setProtLabel | Setting Protect (${child?.device?.displayName} - ${devId}) Label to (${val})", "debug", true) return sendNestApiCmd(devId, apiVar().rootTypes.cos, apiVar().cmdObjs.setLabel, val, devId) } @@ -4667,24 +4868,15 @@ def setProtLabel(child, label, virtual=false) { def setStructureAway(child, value, virtual=false) { def devId = !child?.device?.deviceNetworkId ? null : child?.device?.deviceNetworkId.toString() def val = value?.toBoolean() - def virt = virtual.toBoolean() - if(virt && atomicState?.vThermostats && devId) { - if(atomicState?."vThermostat${devId}") { - def pdevId = atomicState?."vThermostatMirrorId${devId}" - def pChild - if(pdevId) { pChild = getChildDevice(pdevId) } + def str1 = "setStructureAway | " + def strAction = "" + strAction = "Setting Nest Location:" + def strArgs = " (${child?.device?.displayName} ${!devId ? "" : "- ${devId}"} to (${val ? "Away" : "Home"})" - if(pChild) { - if(val) { - pChild.away() - } else { - pChild.present() - } - } else { LogAction("setStructureAway - CANNOT Set Thermostat${pdevId} Presence: (${val}) child ${pChild}", "warn", true) } - } - } else { - LogAction("setStructureAway - Setting Nest Location: (${child?.device?.displayName})${!devId ? "" : " ${devId}"} to (${val ? "Away" : "Home"})", "debug", true) + def pChild = getPdevId(virtual.toBoolean(), devId) + if(pChild == null) { + LogAction(str1+strAction+strArgs, "debug", true) if(val) { def ret = sendNestApiCmd(atomicState?.structures, apiVar().rootTypes.struct, apiVar().cmdObjs.away, "away", devId) // Below is to ensure automations read updated value even if queued @@ -4706,15 +4898,27 @@ def setStructureAway(child, value, virtual=false) { } return ret } + } else { + if(pChild != "00000") { + LogAction(str1+strAction+strArgs, "debug", true) + if(val) { + pChild.away() + } else { + pChild.present() + } + return + } else { + strAction = "CANNOT Set Location" + } } + LogAction(str1+strAction+strArgs, "warn", true) } def setTstatTempScale(child, tScale, virtual=false) { def devId = !child?.device?.deviceNetworkId ? null : child?.device?.deviceNetworkId.toString() def tempScale = tScale.toString() - def virt = virtual.toBoolean() -// INCOMPLETE: This is not used anywhere. A command to set Temp Scale is not available in the dth for a callback +// INCOMPLETE: This is not used anywhere. A command to set Temp Scale is not available in the dth for a callback LogAction("setTstatTempScale: INCOMPLETE Thermostat${!devId ? "" : " ${devId}"} tempScale: (${tempScale})", "debug", true) return sendNestApiCmd(devId, apiVar().rootTypes.tstat, apiVar().cmdObjs.setTscale, tempScale, devId) @@ -4723,9 +4927,8 @@ def setTstatTempScale(child, tScale, virtual=false) { def setTstatLabel(child, label, virtual=false) { def devId = !child?.device?.deviceNetworkId ? null : child?.device?.deviceNetworkId.toString() def val = label - def virt = virtual.toBoolean() -// INCOMPLETE: This is not used anywhere. A command to set label is not available in the dth for a callback +// INCOMPLETE: This is not used anywhere. A command to set label is not available in the dth for a callback LogAction("setTstatLabel: INCOMPLETE Thermostat${!devId ? "" : " ${devId}"} Label: (${val})", "debug", true) return sendNestApiCmd(devId, apiVar().rootTypes.tstat, apiVar().cmdObjs.setLabel, val, devId) @@ -4734,171 +4937,194 @@ def setTstatLabel(child, label, virtual=false) { def setFanMode(child, fanOn, virtual=false) { def devId = !child?.device?.deviceNetworkId ? null : child?.device?.deviceNetworkId.toString() def val = fanOn.toBoolean() - def virt = virtual.toBoolean() - if(virt && atomicState?.vThermostats && devId) { - if(atomicState?."vThermostat${devId}") { - def pdevId = atomicState?."vThermostatMirrorId${devId}" - def pChild - if(pdevId) { pChild = getChildDevice(pdevId) } + def str1 = "setFanMode | " + def strAction = "" + strAction = "Setting" + def strArgs = " ${virtual ? "Virtual " : ""}Thermostat (${child?.device?.displayName} - ${devId}) Fan Mode to (${val ? "On" : "Auto"})" - if(pChild) { - if(val) { - pChild.fanOn() - } else { - pChild.fanAuto() - } - } else { LogAction("setFanMode - CANNOT Set Thermostat${pdevId} FanMode: (${fanOn}) child ${pChild}", "warn", true) } - } - } else { - LogAction("setFanMode | Setting ${virtual ? "Virtual " : ""}Thermostat (${child?.device?.displayName} - ${devId}) Fan Mode to (${val ? "On" : "Auto"})", "debug", true) + def pChild = getPdevId(virtual.toBoolean(), devId) + if(pChild == null) { + LogAction(str1+strAction+strArgs, "debug", true) return sendNestApiCmd(devId, apiVar().rootTypes.tstat, apiVar().cmdObjs.fanActive, val, devId) + } else { + if(pChild != "00000") { + LogAction(str1+strAction+strArgs, "debug", true) + if(val) { + pChild.fanOn() + } else { + pChild.fanAuto() + } + return + } else { + strAction = "CANNOT Set" + } } + LogAction(str1+strAction+strArgs, "warn", true) } def setHvacMode(child, mode, virtual=false) { def devId = !child?.device?.deviceNetworkId ? null : child?.device?.deviceNetworkId.toString() - def virt = virtual.toBoolean() - if(virt && atomicState?.vThermostats && devId) { - if(atomicState?."vThermostat${devId}") { - def pdevId = atomicState?."vThermostatMirrorId${devId}" - def pChild - if(pdevId) { pChild = getChildDevice(pdevId) } + def str1 = "setHvacMode | " + def strAction = "" + strAction = "Setting" + def strArgs = " ${virtual ? "Virtual " : ""}Thermostat (${child?.device?.displayName} - ${devId}) HVAC Mode to (${mode})" - if(pChild) { - switch (mode) { - case "heat-cool": - pChild.auto() - break - case "heat": - pChild.heat() - break - case "cool": - pChild.cool() - break - case "eco": - pChild.eco() - break - case "off": - pChild.off() - break - case "emergency heat": - pChild.emergencyHeat() - break - default: - LogAction("setHvacMode: Invalid Request: ${mode}", "warn", true) - break - } - } else { LogAction("setHvacMode - CANNOT Set Thermostat${pdevId} Mode: (${mode}) child ${pChild}", "warn", true) } - } - } else { - LogAction("setHvacMode | Setting ${virtual ? "Virtual " : ""}Thermostat (${child?.device?.displayName} - ${devId}) HVAC Mode to (${mode})", "debug", true) + def pChild = getPdevId(virtual.toBoolean(), devId) + if(pChild == null) { + LogAction(str1+strAction+strArgs, "debug", true) return sendNestApiCmd(devId, apiVar().rootTypes.tstat, apiVar().cmdObjs.hvacMode, mode.toString(), devId) + } else { + if(pChild != "00000") { + LogAction(str1+strAction+strArgs, "debug", true) + switch (mode) { + case "heat-cool": + pChild.auto() + break + case "heat": + pChild.heat() + break + case "cool": + pChild.cool() + break + case "eco": + pChild.eco() + break + case "off": + pChild.off() + break + case "emergency heat": + pChild.emergencyHeat() + break + default: + LogAction("setHvacMode: Invalid Request: ${mode}", "warn", true) + break + } + return + } else { + strAction = "CANNOT Set " + } } + + LogAction(str1+strAction+strArgs, "warn", true) } def setTargetTemp(child, unit, temp, mode, virtual=false) { def devId = !child?.device?.deviceNetworkId ? null : child?.device?.deviceNetworkId.toString() - def virt = virtual.toBoolean() - if(virt && atomicState?.vThermostats && devId) { - if(atomicState?."vThermostat${devId}") { - def pdevId = atomicState?."vThermostatMirrorId${devId}" - def pChild - if(pdevId) { pChild = getChildDevice(pdevId) } - def appId = atomicState?."vThermostatChildAppId${devId}" - def automationChildApp - if(appId) { automationChildApp = getChildApps().find{ it.id == appId } } - if(automationChildApp) { - def res = automationChildApp.remSenTempUpdate(temp,mode) - if(res) { return } - } - if(pChild) { - if(mode == 'cool') { - pChild.setCoolingSetpoint(temp) - } else if(mode == 'heat') { - pChild.setHeatingSetpoint(temp) - } else { LogAction("setTargetTemp - UNKNOWN MODE (${mode}) child ${pChild}", "warn", true) } - } else { LogAction("setTargetTemp - CANNOT Set Thermostat${pdevId} Temp: (${temp}${tUnitStr()} | Mode: (${mode}) | child ${pChild}", "warn", true) } - } - } else { - LogAction("setTargetTemp | Setting ${virtual ? "Virtual " : ""}Thermostat (${child?.device?.displayName} - ${devId}) Target Temp to (${temp}${tUnitStr()})", "debug", true) + def str1 = "setTargetTemp | " + def strAction = "" + strAction = "Setting" + def strArgs = " ${virtual ? "Virtual " : ""}Thermostat (${child?.device?.displayName} - ${devId}) Target Temp to (${temp}${tUnitStr()})" + + def pChild = getPdevId(virtual.toBoolean(), devId) + if(pChild == null) { + LogAction(str1+strAction+strArgs, "debug", true) if(unit == "C") { return sendNestApiCmd(devId, apiVar().rootTypes.tstat, apiVar().cmdObjs.targetC, temp, devId) } else { return sendNestApiCmd(devId, apiVar().rootTypes.tstat, apiVar().cmdObjs.targetF, temp, devId) } + } else { + LogAction(str1+strAction+strArgs, "debug", true) + def appId = atomicState?."vThermostatChildAppId${devId}" + def automationChildApp + if(appId) { automationChildApp = getChildApps().find{ it?.id == appId } } + if(automationChildApp) { + def res = automationChildApp.remSenTempUpdate(temp,mode) + if(res) { return } + } + if(pChild != "00000") { + if(mode == 'cool') { + pChild.setCoolingSetpoint(temp) + } else if(mode == 'heat') { + pChild.setHeatingSetpoint(temp) + } else { LogAction("setTargetTemp - UNKNOWN MODE (${mode}) child ${pChild}", "warn", true) } + return + } else { + strAction = "CANNOT Set" + } } + + LogAction(str1+strAction+strArgs, "warn", true) } def setTargetTempLow(child, unit, temp, virtual=false) { def devId = !child?.device?.deviceNetworkId ? null : child?.device?.deviceNetworkId.toString() - def virt = virtual.toBoolean() - - if(virt && atomicState?.vThermostats && devId) { - if(atomicState?."vThermostat${devId}") { - def pdevId = atomicState?."vThermostatMirrorId${devId}" - def pChild - if(pdevId) { pChild = getChildDevice(pdevId) } - def appId = atomicState?."vThermostatChildAppId${devId}" - def automationChildApp - if(appId) { automationChildApp = getChildApps().find{ it.id == appId } } + def str1 = "setTargetTempLow | " + def strAction = "" + strAction = "Setting" + def strArgs = " ${virtual ? "Virtual " : ""}Thermostat (${child?.device?.displayName} - ${devId}) Target Temp Low to (${temp}${tUnitStr()})" - if(automationChildApp) { - def res = automationChildApp.remSenTempUpdate(temp,"heat") - if(res) { return } - } - - if(pChild) { - pChild.setHeatingSetpoint(temp) - } else { LogAction("setTargetTemp - CANNOT Set Thermostat${pdevId} HEAT: (${temp})${unit} child ${pChild}", "warn", true) } - } - } else { - LogAction("setTargetTempLow | Setting ${virtual ? "Virtual " : ""}Thermostat (${child?.device?.displayName} - ${devId}) Target Temp Low to (${temp}${tUnitStr()})", "debug", true) + def pChild = getPdevId(virtual.toBoolean(), devId) + if(pChild == null) { + LogAction(str1+strAction+strArgs, "debug", true) if(unit == "C") { return sendNestApiCmd(devId, apiVar().rootTypes.tstat, apiVar().cmdObjs.targetLowC, temp, devId) } else { return sendNestApiCmd(devId, apiVar().rootTypes.tstat, apiVar().cmdObjs.targetLowF, temp, devId) } + } else { + LogAction(str1+strAction+strArgs, "debug", true) + def appId = atomicState?."vThermostatChildAppId${devId}" + def automationChildApp + if(appId) { automationChildApp = getChildApps().find{ it?.id == appId } } + + if(automationChildApp) { + def res = automationChildApp.remSenTempUpdate(temp,"heat") + if(res) { return } + } + if(pChild != "00000") { + pChild.setHeatingSetpoint(temp) + return + } else { + strAction = "CANNOT Set" + } } + + LogAction(str1+strAction+strArgs, "warn", true) } def setTargetTempHigh(child, unit, temp, virtual=false) { def devId = !child?.device?.deviceNetworkId ? null : child?.device?.deviceNetworkId.toString() - def virt = virtual.toBoolean() - - if(virt && atomicState?.vThermostats && devId) { - if(atomicState?."vThermostat${devId}") { - def pdevId = atomicState?."vThermostatMirrorId${devId}" - def pChild - if(pdevId) { pChild = getChildDevice(pdevId) } - def appId = atomicState?."vThermostatChildAppId${devId}" - def automationChildApp - if(appId) { automationChildApp = getChildApps().find{ it.id == appId } } + def str1 = "setTargetTempHigh | " + def strAction = "" + strAction = "Setting" + def strArgs = " ${virtual ? "Virtual " : ""}Thermostat (${child?.device?.displayName} - ${devId}) Target Temp High to (${temp}${tUnitStr()})" - if(automationChildApp) { - def res = automationChildApp.remSenTempUpdate(temp,"cool") - if(res) { return } - } - - if(pChild) { - pChild.setCoolingSetpoint(temp) - } else { LogAction("setTargetTemp - CANNOT Set Thermostat${pdevId} COOL: (${temp})${unit} child ${pChild}", "warn", true) } - } - } else { - LogAction("setTargetTempHigh | Setting ${virtual ? "Virtual " : ""}Thermostat (${child?.device?.displayName} - ${devId}) Target Temp High to (${temp}${tUnitStr()})", "debug", true) + def pChild = getPdevId(virtual.toBoolean(), devId) + if(pChild == null) { + LogAction(str1+strAction+strArgs, "debug", true) if(unit == "C") { return sendNestApiCmd(devId, apiVar().rootTypes.tstat, apiVar().cmdObjs.targetHighC, temp, devId) } else { return sendNestApiCmd(devId, apiVar().rootTypes.tstat, apiVar().cmdObjs.targetHighF, temp, devId) } + } else { + LogAction(str1+strAction+strArgs, "debug", true) + def appId = atomicState?."vThermostatChildAppId${devId}" + def automationChildApp + if(appId) { automationChildApp = getChildApps().find{ it?.id == appId } } + + if(automationChildApp) { + def res = automationChildApp.remSenTempUpdate(temp,"cool") + if(res) { return } + } + if(pChild != "00000") { + pChild.setCoolingSetpoint(temp) + return + } else { + strAction = "CANNOT Set" + } } + + LogAction(str1+strAction+strArgs, "warn", true) } def sendNestApiCmd(cmdTypeId, cmdType, cmdObj, cmdObjVal, childId) { @@ -4910,7 +5136,7 @@ def sendNestApiCmd(cmdTypeId, cmdType, cmdObj, cmdObjVal, childId) { try { if(cmdTypeId) { - def qnum = getQueueNumber(cmdTypeId, childId) + def qnum = getQueueNumber(cmdTypeId) if(qnum == -1 ) { return false } atomicState?.pollBlocked = true @@ -4938,7 +5164,7 @@ def sendNestApiCmd(cmdTypeId, cmdType, cmdObj, cmdObjVal, childId) { skipped = true tempQueue << newCmd } else if(newCmd[1] == cmdType?.toString() && newCmd[2] == cmdObj?.toString() && - newCmd[2] != apiVar().cmdObjs.away && newCmd[2] != apiVar().cmdObjs.fanActive && newCmd[2] != apiVar().cmdObjs.fanTimer) { + newCmd[2] != apiVar().cmdObjs.away && newCmd[2] != apiVar().cmdObjs.fanActive && newCmd[2] != apiVar().cmdObjs.fanTimer && newCmd[2] != apiVar().cmdObjs.eta) { // if we are changing the same setting again use latest - this is Temp settings, hvac replaced = true tempQueue << cmdData @@ -4961,7 +5187,7 @@ def sendNestApiCmd(cmdTypeId, cmdType, cmdObj, cmdObjVal, childId) { LogAction("${str} Cmd to Queue ${qnum} (qsize: ${tempQueue?.size()}): $cmdTypeId, $cmdType, $cmdObj, $cmdObjVal, $childId", "info", true) atomicState?.lastQcmd = cmdData - schedNextWorkQ(childId) + schedNextWorkQ() return true } else { @@ -4976,7 +5202,13 @@ def sendNestApiCmd(cmdTypeId, cmdType, cmdObj, cmdObjVal, childId) { } } -private getQueueNumber(cmdTypeId, childId) { +/* + * Each nest device has its own queue (as does the nest structure itself) + * Queues are "assigned" dynamically as they are needed + * Each queue has it own "free" command counts, then commands are limited to 1 per minute. + */ + +private getQueueNumber(cmdTypeId) { if(!atomicState?.cmdQlist) { atomicState.cmdQlist = [] } def cmdQueueList = atomicState?.cmdQlist def qnum = cmdQueueList.indexOf(cmdTypeId) @@ -4987,13 +5219,21 @@ private getQueueNumber(cmdTypeId, childId) { qnum = cmdQueueList.indexOf(cmdTypeId) atomicState?."cmdQ${qnum}" = null setLastCmdSentSeconds(qnum, null) - setRecentSendCmd(qnum, null) + //setRecentSendCmd(qnum, null) } qnum = cmdQueueList.indexOf(cmdTypeId) - if(qnum == -1 ) { LogAction("getQueueNumber: NOT FOUND", "warn", true ) } + if(qnum == -1 || qnum == null) { LogAction("getQueueNumber: NOT FOUND", "warn", true ) } + else { + if(getLastCmdSentSeconds(qnum) > 3600) { setRecentSendCmd(qnum, cmdMaxVal()) } // if nothing sent in last hour, reset command limit + } return qnum } +/* + * Queues are processed in the order in which commands were sent (across all queues) + * This maintains proper state ordering for changes, as commands can have dependencies in order + */ + def getQueueToWork() { def qnum def savedtim @@ -5011,40 +5251,59 @@ def getQueueToWork() { } } LogTrace("getQueueToWork queue: ${qnum}") + if(qnum != -1 && qnum != null) { + if(getLastCmdSentSeconds(qnum) > 3600) { setRecentSendCmd(qnum, cmdMaxVal()) } // if nothing sent in last hour, reset command limit + } return qnum } -void schedNextWorkQ(childId, useShort=false) { - def cmdDelay = getChildWaitVal() - - def allowAsync = false - if(atomicState?.appData && atomicState?.appData?.pollMethod?.allowAsync) { - allowAsync = true - } +private cmdMaxVal() { return 2 } - if(useShort && allowAsync) { cmdDelay = 0 } +void schedNextWorkQ(useShort=false) { + def cmdDelay = getChildWaitVal() + if(useShort) { cmdDelay = 0 } // // This is throttling the rate of commands to the Nest service for this access token. // If too many commands are sent Nest throttling could shut all write commands down for 1 hour to the device or structure - // This allows up to 3 commands if none sent in the last hour, then only 1 per 60 seconds. Nest could still + // This allows up to 3 commands if none sent in the last hour, then only 1 per 60 seconds. Nest could still // throttle this if the battery state on device is low. // https://nestdevelopers.io/t/user-receiving-exceeded-rate-limit-on-requests-please-try-again-later/354 // def qnum = getQueueToWork() def timeVal = cmdDelay + def str = "" + def queueItemsAvail + def lastCommandSent if(qnum != null) { - if( !(getRecentSendCmd(qnum) > 0 || getLastCmdSentSeconds(qnum) > 60) ) { - timeVal = (60 - getLastCmdSentSeconds(qnum) + getChildWaitVal()) - } - def str = timeVal > cmdDelay ? "*RATE LIMITING ON* " : "" - LogAction("schedNextWorkQ │ ${str}queue: ${qnum} │ schedTime: ${timeVal} │ recentSendCmd: ${getRecentSendCmd(qnum)} │ last seconds: ${getLastCmdSentSeconds(qnum)} │ cmdDelay: ${cmdDelay} │ allowAsync: ${allowAsync}", "info", true) - } - if(timeVal != 0) { - runIn(timeVal, "workQueue", [overwrite: true]) + queueItemsAvail = getRecentSendCmd(qnum) + lastCommandSent = getLastCmdSentSeconds(qnum) + if( (queueItemsAvailable == 0 && lastCommandSent > 60) ) { queueItemsAvail = 1 } + if( queueItemsAvail <= 0 || atomicState?.apiRateLimited) { + timeVal = 60 + cmdDelay + //atomicState?.workQrunInActive = false + } else if(lastCommandSent < 60) { + timeVal = (60 - lastCommandSent + cmdDelay) + if(queueItemsAvail > 0) { timeVal = 0 } + } + str = timeVal > cmdDelay || atomicState?.apiRateLimited ? "*RATE LIMITING ON* " : "" + //LogAction("schedNextWorkQ │ ${str}queue: ${qnum} │ schedTime: ${timeVal} │ recentSendCmd: ${queueItemsAvail} │ last seconds: ${lastCommandSent} │ cmdDelay: ${cmdDelay} | runInActive: ${atomicState?.workQrunInActive} | Api Limited: ${atomicState?.apiRateLimited}", "info", true) } else { - workQueue() + timeVal = 0 + } + def actStr = "ALREADY PENDING " + if(cmdIsProc()) { actStr = "COMMAND RUNNING " } + if(!atomicState?.workQrunInActive && !cmdIsProc() ) { + atomicState?.workQrunInActive = true + if(timeVal != 0) { + actStr = "RUNIN " + runIn(timeVal, "workQueue", [overwrite: true]) + } else { + actStr = "DIRECT CALL " + workQueue() + } } + LogAction("schedNextWorkQ ${actStr} │ ${str}queue: ${qnum} │ schedTime: ${timeVal} │ recentSendCmd: ${queueItemsAvail} │ last seconds: ${lastCommandSent} │ cmdDelay: ${cmdDelay} | runInActive: ${atomicState?.workQrunInActive} | command proc: ${cmdIsProc()} | Api Limited: ${atomicState?.apiRateLimited}", "info", true) } private getRecentSendCmd(qnum) { @@ -5052,7 +5311,11 @@ private getRecentSendCmd(qnum) { } private setRecentSendCmd(qnum, val) { - atomicState."recentSendCmd${qnum}" = val + if(qnum != null) { + atomicState."recentSendCmd${qnum}" = val + } else { + LogAction("setRecentSendCmd qnum $qnum is null", "error", true) + } return } @@ -5062,11 +5325,12 @@ def sendEcoActionDescToDevice(dev, desc) { } } -private getLastCmdSentSeconds(qnum) { return atomicState?."lastCmdSentDt${qnum}" ? GetTimeDiffSeconds(atomicState?."lastCmdSentDt${qnum}", null, "getLastCmdSentSeconds") : 3601 } +private getLastAnyCmdSentSeconds() { return getTimeSeconds("lastCmdSentDt", 3601, "getLastAnyCmdSentSeconds") } +private getLastCmdSentSeconds(qnum) { return getTimeSeconds("lastCmdSentDt${qnum}", 3601, "getLastCmdSentSeconds") } private setLastCmdSentSeconds(qnum, val) { - atomicState."lastCmdSentDt${qnum}" = val - atomicState.lastCmdSentDt = val + updTimestampMap("lastCmdSentDt${qnum}", val) + if(val != null) { updTimestampMap("lastCmdSentDt", val) } } def storeLastCmdData(cmd, qnum) { @@ -5074,7 +5338,7 @@ def storeLastCmdData(cmd, qnum) { def newVal = ["qnum":qnum, "obj":cmd[2], "value":cmd[3], "date":getDtNow()] def list = atomicState?.cmdDetailHistory ?: [] - def listSize = 30 + def listSize = 20 if(list?.size() < listSize) { list.push(newVal) } @@ -5095,26 +5359,22 @@ def storeLastCmdData(cmd, qnum) { void workQueue() { LogTrace("workQueue") + atomicState?.workQrunInActive = false //def cmdDelay = getChildWaitVal() if(!atomicState?.cmdQlist) { atomicState?.cmdQlist = [] } def cmdQueueList = atomicState?.cmdQlist def qnum = getQueueToWork() if(qnum == null) { qnum = 0 } + if(!atomicState?."cmdQ${qnum}") { atomicState."cmdQ${qnum}" = [] } - def allowAsync = false - def metstr = "sync" - if(atomicState?.appData && atomicState?.appData?.pollMethod?.allowAsync) { - allowAsync = true - metstr = "async" - } + def metstr = "async" - if(!atomicState?."cmdQ${qnum}") { atomicState."cmdQ${qnum}" = [] } def cmdQueue = atomicState?."cmdQ${qnum}" try { if(cmdQueue?.size() > 0) { LogAction("workQueue │ Run Queue: ${qnum} | ($metstr)", "trace", true) - runIn(60, "workQueue", [overwrite: true]) // lost schedule catchall + runIn(90, "workQueue", [overwrite: true]) // lost schedule catchall if(!cmdIsProc()) { cmdProcState(true) atomicState?.pollBlocked = true @@ -5127,7 +5387,7 @@ void workQueue() { atomicState?."cmdQ${qnum}" = cmdQueue def cmdres - if(getLastCmdSentSeconds(qnum) > 3600) { setRecentSendCmd(qnum, 3) } // if nothing sent in last hour, reset 3 command limit + if(getLastCmdSentSeconds(qnum) > 3600) { setRecentSendCmd(qnum, cmdMaxVal()) } // if nothing sent in last hour, reset command limit storeLastCmdData(cmd, qnum) @@ -5137,12 +5397,8 @@ void workQueue() { atomicState.forceChildUpd = true cmdres = true } else { - if(allowAsync) { - cmdres = queueProcNestApiCmd(getNestApiUrl(), cmd[0], cmd[1], cmd[2], cmd[3], qnum, cmd) - return - } else { - cmdres = procNestApiCmd(getNestApiUrl(), cmd[0], cmd[1], cmd[2], cmd[3], qnum) - } + cmdres = queueProcNestApiCmd(getNestApiUrl(), cmd[0], cmd[1], cmd[2], cmd[3], qnum, cmd) + return } finishWorkQ(cmd, cmdres) } else { LogAction("workQueue: busy processing command", "warn", true) } @@ -5157,6 +5413,7 @@ void workQueue() { atomicState.forceChildUpd = true atomicState?.pollBlocked = false atomicState?.pollBlockedReason = null + atomicState?.workQrunInActive = true runIn(60, "workQueue", [overwrite: true]) runIn((60 + 4), "postCmd", [overwrite: true]) return @@ -5164,7 +5421,7 @@ void workQueue() { } def finishWorkQ(cmd, result) { - LogTrace("finishWorkQ cmd: $cmd result: $result") + LogTrace("finishWorkQ cmd: $cmd result: $result") def cmdDelay = getChildWaitVal() if( !result ) { @@ -5180,13 +5437,13 @@ def finishWorkQ(cmd, result) { atomicState.forceChildUpd = true } - atomicState?.cmdLastProcDt = getDtNow() + updTimestampMap("cmdLastProcDt", getDtNow()) cmdProcState(false) def qnum = getQueueToWork() if(qnum == null) { qnum = 0 } + if(!atomicState?."cmdQ${qnum}") { atomicState."cmdQ${qnum}" = [] } - if(!atomicState?."cmdQ${qnum}") { atomicState?."cmdQ${qnum}" = [] } def cmdQueue = atomicState?."cmdQ${qnum}" if(cmdQueue?.size() == 0) { atomicState.pollBlocked = false @@ -5194,7 +5451,7 @@ def finishWorkQ(cmd, result) { atomicState.needChildUpd = true runIn(cmdDelay, "postCmd", [overwrite: true]) } - else { schedNextWorkQ(null, true) } + else { schedNextWorkQ(true) } if(cmdQueue?.size() > 10) { sendMsg("Warning", "There is now ${cmdQueue?.size()} events in the Command Queue. Something must be wrong", true) @@ -5204,7 +5461,8 @@ def finishWorkQ(cmd, result) { } def queueProcNestApiCmd(uri, typeId, type, obj, objVal, qnum, cmd, redir = false) { - LogTrace("queueProcNestApiCmd: typeId: ${typeId}, type: ${type}, obj: ${obj}, objVal: ${objVal}, qnum: ${qnum}, isRedirUri: ${redir}") + def myStr = "queueProcNestApiCmd" + LogTrace("${myStr}: typeId: ${typeId}, type: ${type}, obj: ${obj}, objVal: ${objVal}, qnum: ${qnum}, isRedirUri: ${redir}") def result = false if(!atomicState?.authToken) { return result } @@ -5218,18 +5476,11 @@ def queueProcNestApiCmd(uri, typeId, type, obj, objVal, qnum, cmd, redir = false headers: ["Content-Type": "application/json", "Authorization": "Bearer ${atomicState?.authToken}"], body: data.toString() ] - LogTrace("queueProcNestApiCmd Url: $uri | params: ${params}") + LogTrace("${myStr} Url: $uri | params: ${params}") LogAction("Processing Queued Cmd: [ObjId: ${typeId} | ObjType: ${type} | ObjKey: ${obj} | ObjVal: ${objVal} | QueueNum: ${qnum} | Redirect: ${redir}]", "trace", true) atomicState?.lastCmdSent = "$type: (${obj}: ${objVal})" - if(!redir && (getRecentSendCmd(qnum) > 0) && (getLastCmdSentSeconds(qnum) < 60)) { - def val = getRecentSendCmd(qnum) - val -= 1 - setRecentSendCmd(qnum, val) - } - setLastCmdSentSeconds(qnum, getDtNow()) - - LogTrace("queueProcNestApiCmd time update recentSendCmd: ${getRecentSendCmd(qnum)} last seconds:${getLastCmdSentSeconds(qnum)} queue: ${qnum}") + adjThrottle(qnum, redir, myStr) def asyncargs = [ typeId: typeId, @@ -5242,9 +5493,29 @@ def queueProcNestApiCmd(uri, typeId, type, obj, objVal, qnum, cmd, redir = false asynchttp_v1.put(nestCmdResponse, params, asyncargs) } catch(ex) { - log.error "queueProcNestApiCmd (command: $cmd) Exception:", ex - sendExceptionData(ex, "queueProcNestApiCmd") + log.error "${myStr} (command: $cmd) Exception:", ex + sendExceptionData(ex, myStr) + } +} + +def adjThrottle(qnum, redir, callerStr) { + if(!redir) { + def t0 = getRecentSendCmd(qnum) + def val = t0 + if(t0 > 0 /* && (getLastCmdSentSeconds(qnum) < 60) */ ) { + val -= 1 + } + def t1 = getLastCmdSentSeconds(qnum) + if(t1 > 120 && t1 < 60*45 && val < (cmdMaxVal() - 1) ) { + val += 1 + } + if(t1 > 60*30 && t1 < 60*45 && val < cmdMaxVal() ) { + val += 1 + } + LogTrace("${callerStr} adjThrottle orig recentSendCmd: ${t0} | new: ${val} | last seconds: ${t1} queue: ${qnum}") + setRecentSendCmd(qnum, val) } + setLastCmdSentSeconds(qnum, getDtNow()) } def nestCmdResponse(resp, data) { @@ -5269,34 +5540,56 @@ def nestCmdResponse(resp, data) { if(resp?.status == 200) { LogAction("nestCmdResponse | Processed Queue: ${qnum} | Obj: ($type{$obj:$objVal}) SUCCESSFULLY!", "info", true) apiIssueEvent(false) - incCmdCnt() + incrementCntByKey("apiCommandCnt") atomicState?.lastCmdSentStatus = "ok" - atomicState?.apiRateLimited = false - atomicState?.apiCmdFailData = null + //atomicState?.apiRateLimited = false + //atomicState?.apiCmdFailData = null result = true - } else { - apiIssueEvent(true) + } +/* + if(resp?.status == 429) { + // requeue command + def newCmd = [command[0], command[1], command[2], command[3], command[4]] + def tempQueue = [] + tempQueue << newCmd + if(!atomicState?."cmdQ${qnum}" ) { atomicState."cmdQ${qnum}" = [] } + def cmdQueue = atomicState?."cmdQ${qnum}" + cmdQueue.each { cmd -> + newCmd = [cmd[0], cmd[1], cmd[2], cmd[3], cmd[4]] + tempQueue << newCmd + } + atomicState."cmdQ${qnum}" = tempQueue + } +*/ + if(resp?.status != 200) { atomicState?.lastCmdSentStatus = "failed" if(resp?.hasError()) { apiRespHandler((resp?.getStatus() ?: null), (resp?.getErrorJson() ?: null), "nestCmdResponse", "nestCmdResponse ${qnum} ($type{$obj:$objVal})", true) } + apiIssueEvent(true) + } +/* + if(resp?.status == 429) { + result = true // we requeued the command } +*/ finishWorkQ(command, result) } catch (ex) { - log.error "nestCmdResponse (command: $command) Exception:", ex - sendExceptionData(ex, "nestCmdResponse") - apiIssueEvent(true) atomicState?.lastCmdSentStatus = "failed" + cmdProcState(false) if(resp?.hasError()) { apiRespHandler((resp?.getStatus() ?: null), (resp?.getErrorJson() ?: null), "nestCmdResponse", "nestCmdResponse ${qnum} ($type{$obj:$objVal})", true) } - cmdProcState(false) + apiIssueEvent(true) + log.error "nestCmdResponse (command: $command) Exception:", ex + sendExceptionData(ex, "nestCmdResponse") } } -def procNestApiCmd(uri, typeId, type, obj, objVal, qnum, redir = false) { - LogTrace("procNestApiCmd: typeId: ${typeId}, type: ${type}, obj: ${obj}, objVal: ${objVal}, qnum: ${qnum}, isRedirUri: ${redir}") +def procNestApiCmd(uri, typeId, type, obj, objVal, qnum, origcmd, redir = false) { + def myStr = "procNestApiCmd" + LogTrace("${myStr}: typeId: ${typeId}, type: ${type}, obj: ${obj}, objVal: ${objVal}, qnum: ${qnum}, isRedirUri: ${redir}") def result = false if(!atomicState?.authToken) { return result } @@ -5310,45 +5603,57 @@ def procNestApiCmd(uri, typeId, type, obj, objVal, qnum, redir = false) { query: [ "auth": atomicState?.authToken ], body: data.toString() ] - LogAction("procNestApiCmd Url: $uri | params: ${params}", "trace", true) + LogAction("${myStr} Url: $uri | params: ${params}", "trace", true) atomicState?.lastCmdSent = "$type: (${obj}: ${objVal})" - if(!redir && (getRecentSendCmd(qnum) > 0) && (getLastCmdSentSeconds(qnum) < 60)) { - def val = getRecentSendCmd(qnum) - val -= 1 - setRecentSendCmd(qnum, val) - } - setLastCmdSentSeconds(qnum, getDtNow()) - - LogTrace("procNestApiCmd time update recentSendCmd: ${getRecentSendCmd(qnum)} last seconds:${getLastCmdSentSeconds(qnum)} queue: ${qnum}") + adjThrottle(qnum, redir, myStr) httpPutJson(params) { resp -> def rCode = resp?.status ?: null if(resp?.status == 307) { def newUrl = resp?.headers?.location?.split("\\?") LogTrace("NewUrl: ${newUrl[0]}") - if( procNestApiCmd(newUrl[0], typeId, type, obj, objVal, qnum, true) ) { + if( procNestApiCmd(newUrl[0], typeId, type, obj, objVal, qnum, origcmd, true) ) { result = true } + return result } else if(resp?.status == 200) { - LogAction("procNestApiCmd Processed queue: ${qnum} ($type{$obj:$objVal}) SUCCESSFULLY!", "info", true) + LogAction("${myStr} Processed queue: ${qnum} ($type{$obj:$objVal}) SUCCESSFULLY!", "info", true) apiIssueEvent(false) - incCmdCnt() + incrementCntByKey("apiCommandCnt") atomicState?.lastCmdSentStatus = "ok" - atomicState?.apiRateLimited = false - atomicState?.apiCmdFailData = null + //atomicState?.apiRateLimited = false + //atomicState?.apiCmdFailData = null result = true + return result } - else { - apiIssueEvent(true) - atomicState?.lastCmdSentStatus = "failed" - result = false - apiRespHandler(resp?.status, resp?.data, "procNestApiCmd", "procNestApiCmd ${qnum} ($type{$obj:$objVal})", true) +/* + if(resp?.status == 429) { + // requeue command + def newCmd = [origcmd[0], origcmd[1], origcmd[2], origcmd[3], origcmd[4]] + def tempQueue = [] + tempQueue << newCmd + if(!atomicState?."cmdQ${qnum}" ) { atomicState."cmdQ${qnum}" = [] } + def cmdQueue = atomicState?."cmdQ${qnum}" + cmdQueue.each { cmd -> + newCmd = [cmd[0], cmd[1], cmd[2], cmd[3], cmd[4]] + tempQueue << newCmd + } + atomicState."cmdQ${qnum}" = tempQueue + } +*/ + atomicState?.lastCmdSentStatus = "failed" + result = false + apiRespHandler(resp?.status, resp?.data, myStr, "${myStr} ${qnum} ($type{$obj:$objVal})", true) + apiIssueEvent(true) +/* + if(resp?.status == 429) { + result = true // we requeued the command } +*/ } } catch (ex) { - apiIssueEvent(true) atomicState?.lastCmdSentStatus = "failed" cmdProcState(false) if (ex instanceof groovyx.net.http.HttpResponseException && ex?.response) { @@ -5356,6 +5661,7 @@ def procNestApiCmd(uri, typeId, type, obj, objVal, qnum, redir = false) { } else { sendExceptionData(ex, "procNestApiCmd") } + apiIssueEvent(true) log.error "procNestApiCmd Exception: ($type | $obj:$objVal)", ex } return result @@ -5372,31 +5678,31 @@ def apiRespHandler(code, errJson, methodName, tstr=null, isCmd=false) { result = !errMsg ? "A Bad Request was made to the API..." : errMsg break case 401: - result = !errMsg ? "Authentication ERROR, Please try refreshing your login under Authentication settings..." : errMsg + result = !errMsg ? "Authentication ERROR, Please try refreshing your login under Authentication settings..." : errMsg revokeNestToken() break case 403: - result = !errMsg ? "Forbidden: Your Login Credentials are Invalid..." : errMsg + result = !errMsg ? "Forbidden: Your Login Credentials are Invalid..." : errMsg revokeNestToken() break case 429: - result = !errMsg ? "Requests are currently being blocked because of API Rate Limiting..." : errMsg + result = !errMsg ? "Requests are currently being blocked because of API Rate Limiting..." : errMsg atomicState?.apiRateLimited = true break case 500: - result = !errMsg ? "Internal Nest Error:" : errMsg + result = !errMsg ? "Internal Nest Error:" : errMsg notif = false break case 503: - result = !errMsg ? "There is currently a Nest Service Issue..." : errMsg + result = !errMsg ? "There is currently a Nest Service Issue..." : errMsg notif = false break default: - result = !errMsg ? "Received Response..." : errMsg + result = !errMsg ? "Received Response..." : errMsg notif = false break } - def failData = ["code":code, "msg":result, "method":methodName, "dt":getDtNow()] + def failData = ["code":code, "msg":result, "method":methodName, "dt":getDtNow(), isCmd: isCmd] atomicState?.apiCmdFailData = failData if(notif || isCmd) { failedCmdNotify(failData, tstr) @@ -5405,64 +5711,47 @@ def apiRespHandler(code, errJson, methodName, tstr=null, isCmd=false) { } } -def incApiStrReqCnt() { - long reqCnt = atomicState?.apiStrReqCnt ?: 0 - reqCnt = reqCnt?.toLong()+1 - LogTrace("ApiStrReqCnt: $reqCnt") - atomicState?.apiStrReqCnt = reqCnt?.toLong() -} - -def incApiDevReqCnt() { - long reqCnt = atomicState?.apiDevReqCnt ?: 0 - reqCnt = reqCnt?.toLong()+1 - LogTrace("ApiDevReqCnt: $reqCnt") - atomicState?.apiDevReqCnt = reqCnt?.toLong() -} - -def incApiMetaReqCnt() { - long reqCnt = atomicState?.apiMetaReqCnt ?: 0 - reqCnt = reqCnt?.toLong()+1 - LogTrace("ApiMetaReqCnt: $reqCnt") - atomicState?.apiMetaReqCnt = reqCnt?.toLong() -} - -def incCmdCnt() { - long cmdCnt = atomicState?.apiCommandCnt ?: 0 - cmdCnt = cmdCnt?.toLong()+1 - LogTrace("Api CmdCnt: $cmdCnt") - atomicState?.apiCommandCnt = cmdCnt?.toLong() -} - -def incRestStrEvtCnt() { - long evtCnt = atomicState?.apiRestStrEvtCnt ?: 0 - evtCnt = evtCnt?.toLong()+1 - LogTrace("ApiRestStrEvtCnt: $evtCnt") - atomicState?.apiRestStrEvtCnt = evtCnt?.toLong() -} - -def incAppNotifSentCnt() { - long notCnt = atomicState?.appNotifSentCnt ?: 0 - notCnt = notCnt?.toLong()+1 - LogTrace("AppNotifSentCnt: $notCnt") - atomicState?.appNotifSentCnt = notCnt?.toLong() +private incrementCntByKey(String key) { + long evtCnt = atomicState?."${key}" ?: 0 + // evtCnt = evtCnt?.toLong()+1 + evtCnt++ + LogTrace("${key?.toString()?.capitalize()}: $evtCnt") + atomicState?."${key}" = evtCnt?.toLong() } /************************************************************************************************ | Push Notification Functions | *************************************************************************************************/ -def pushStatus() { return (settings?.recipients || settings?.phone || settings?.usePush) ? (settings?.usePush ? "Push Enabled" : "Enabled") : null } +def pushStatus() { return (settings?.phone || settings?.usePush || settings?.pushoverEnabled) ? ((settings?.usePush || (settings?.pushoverEnabled && settings?.pushoverDevices)) ? "Push Enabled" : "Enabled") : null } //def getLastMsgSec() { return !atomicState?.lastMsgDt ? 100000 : GetTimeDiffSeconds(atomicState?.lastMsgDt, null, "getLastMsgSec").toInteger() } -def getLastUpdMsgSec() { return !atomicState?.lastUpdMsgDt ? 100000 : GetTimeDiffSeconds(atomicState?.lastUpdMsgDt, null, "getLastUpdMsgSec").toInteger() } -def getLastMissPollMsgSec() { return !atomicState?.lastMisPollMsgDt ? 100000 : GetTimeDiffSeconds(atomicState?.lastMisPollMsgDt, null, "getLastMissPollMsgSec").toInteger() } -def getLastApiIssueMsgSec() { return !atomicState?.lastApiIssueMsgDt ? 100000 : GetTimeDiffSeconds(atomicState?.lastApiIssueMsgDt, null, "getLastApiIssueMsgSec").toInteger() } -def getLastLogRemindMsgSec() { return !atomicState?.lastLogRemindMsgDt ? 100000 : GetTimeDiffSeconds(atomicState?.lastLogRemindMsgDt, null, "getLastLogRemindMsgSec").toInteger() } -def getLastFailedCmdMsgSec() { return !atomicState?.lastFailedCmdMsgDt ? 100000 : GetTimeDiffSeconds(atomicState?.lastFailedCmdMsgDt, null, "getLastFailedCmdMsgSec").toInteger() } -def getLastDevHealthMsgSec() { return !atomicState?.lastDevHealthMsgData?.dt ? 100000 : GetTimeDiffSeconds(atomicState?.lastDevHealthMsgData?.dt, null, "getLastDevHealthMsgSec").toInteger() } -def getDebugLogsOnSec() { return !atomicState?.debugEnableDt ? 0 : GetTimeDiffSeconds(atomicState?.debugEnableDt, null, "getDebugLogsOnSec").toInteger() } -def getRecipientsSize() { return !settings.recipients ? 0 : settings?.recipients?.size() } +def getLastUpdMsgSec() { return getTimeSeconds("lastUpdMsgDt", 100000, "getLastUpdMsgSec").toInteger() } +def getLastMissPollMsgSec() { return getTimeSeconds("lastMisPollMsgDt", 100000, "getLastMissPollMsgSec").toInteger() } +def getLastApiIssueMsgSec() { return getTimeSeconds("lastApiIssueMsgDt", 100000, "getLastApiIssueMsgSec").toInteger() } +def getLastLogRemindMsgSec() { return getTimeSeconds("lastLogRemindMsgDt", 100000, "getLastLogRemindMsgSec").toInteger() } +def getLastFailedCmdMsgSec() { return getTimeSeconds("lastFailedCmdMsgDt", 100000, "getLastFailedCmdMsgSec").toInteger() } +def getDebugLogsOnSec() { return getTimeSeconds("debugEnableDt", 0, "getDebugLogsOnSec").toInteger() } + +//PushOver-Manager Input Generation Functions +private getPushoverSounds(){return (Map) atomicState?.pushoverManager?.sounds?:[:]} +private getPushoverDevices(){List opts=[];Map pmd=atomicState?.pushoverManager?:[:];pmd?.apps?.each{k,v->if(v&&v?.devices&&v?.appId){Map dm=[:];v?.devices?.sort{}?.each{i->dm["${i}_${v?.appId}"]=i};addInputGrp(opts,v?.appName,dm);}};return opts;} +private inputOptGrp(List groups,String title){def group=[values:[],order:groups?.size()];group?.title=title?:"";groups<r[v]=v;return r;}} +private addInputGrp(List groups,String title,values){if(values instanceof List){values=listToMap(values)};values.inject(inputOptGrp(groups,title)){r,k,v->return addInputValues(r,k,v)};return groups;} +private addInputGrp(values){addInputGrp([],null,values)} +//PushOver-Manager Location Event Subscription Events, Polling, and Handlers +public pushover_init(){subscribe(location,"pushoverManager",pushover_handler);pushover_poll()} +public pushover_cleanup(){state?.remove("pushoverManager");unsubscribe("pushoverManager");} +public pushover_poll(){sendLocationEvent(name:"pushoverManagerCmd",value:"poll",data:[empty:true],isStateChange:true,descriptionText:"Sending Poll Event to Pushover-Manager")} +public pushover_msg(List devs,Map data){if(devs&&data){sendLocationEvent(name:"pushoverManagerMsg",value:"sendMsg",data:data,isStateChange:true,descriptionText:"Sending Message to Pushover Devices: ${devs}");}} +public pushover_handler(evt){Map pmd=atomicState?.pushoverManager?:[:];switch(evt?.value){case"refresh":def ed = evt?.jsonData;String id = ed?.appId;Map pA = pmd?.apps?.size() ? pmd?.apps : [:];if(id){pA[id]=pA?."${id}"instanceof Map?pA[id]:[:];pA[id]?.devices=ed?.devices?:[];pA[id]?.appName=ed?.appName;pA[id]?.appId=id;pmd?.apps = pA;};pmd?.sounds=ed?.sounds;break;case "reset":pmd=[:];break;};atomicState?.pushoverManager=pmd;} +//Builds Map Message object to send to Pushover Manager +private buildPushMessage(List devices,Map msgData,timeStamp=false){if(!devices||!msgData){return};Map data=[:];data?.appId=app?.getId();data.devices=devices;data?.msgData=msgData;if(timeStamp){data?.msgData?.timeStamp=new Date().getTime()};pushover_msg(devices,data);} def notificationCheck() { + LogTrace("notificationCheck") + if(atomicState?.notificationPrefs == null) { atomicState?.notificationPrefs = buildNotifPrefMap() } def nPrefs = atomicState?.notificationPrefs if(!getOk2Notify()) { return } apiIssueNotify(nPrefs?.app?.api?.issueMsg, nPrefs?.app?.api?.rateLimitMsg, nPrefs?.app?.api?.issueMsgWait) @@ -5472,28 +5761,65 @@ def notificationCheck() { } def cameraStreamNotify(child, Boolean streaming) { + if(atomicState?.notificationPrefs == null) { atomicState?.notificationPrefs = buildNotifPrefMap() } if(streaming == null || atomicState?.notificationPrefs?.dev?.camera?.streamMsg != true) { return } sendMsg("${child?.device?.displayName} Info", "Streaming is now '${streaming ? "ON" : "OFF"}'", false) } +def getLastDevHealthMsgSec(timeVal) { return !timeVal ? 100000 : GetTimeDiffSeconds(timeVal, null, "getLastDevHealthMsgSec").toInteger() } + def deviceHealthNotify(child, Boolean isHealthy) { // log.trace "deviceHealthNotify(${child?.device?.displayName}, $isHealthy)" + if(atomicState?.notificationPrefs == null) { atomicState?.notificationPrefs = buildNotifPrefMap() } def nPrefs = atomicState?.notificationPrefs?.dev?.devHealth + if(isHealthy == true || nPrefs?.healthMsg != true) { + return + } def devLbl = child?.device?.displayName - def sameAsLastDev = (atomicState?.lastDevHealthMsgData?.device == devLbl) - if(isHealthy == true || nPrefs?.healthMsg != true || (getLastDevHealthMsgSec() <= nPrefs?.healthMsgWait.toInteger() && sameAsLastDev) ) { return } - sendMsg("$devLbl Health Warning", "\nDevice is currently OFFLINE. Please check your logs for possible issues.") - atomicState?.lastDevHealthMsgData = ["device":"$devLbl", "dt":getDtNow()] + def devId = !child?.device?.deviceNetworkId ? child?.toString() : child?.device?.deviceNetworkId.toString() + def t0 = atomicState?.lastDevHealthMsgMap ?: [:] + def lastTime = t0 && devId && t0?."${devId}" ? t0["${devId}"].dt : null + if(!devId || getLastDevHealthMsgSec(lastTime) <= nPrefs?.healthMsgWait?.toInteger() ) { + return + } + sendMsg("$devLbl Health Warning", "\nDevice is OFFLINE. Please check your logs for possible issues.") + t0["${devId}"] = ["device":"$devLbl", "dt":getDtNow()] + atomicState.lastDevHealthMsgMap = t0 +} + +def getNestZipCode() { + def tt = getStrucVal("postal_code") + return tt ?: "" +} + +def getNestTimeZone() { + return getStrucVal("time_zone") +} + +def getEtaBegin() { + return getStrucVal("eta_begin") +} + +def getStrucVal(svariable) { + def sData = atomicState?.structData + def sKey = atomicState?.structures + def asStruc = sData && sKey && sData[sKey] ? sData[sKey] : null + def retVal = asStruc ? asStruc[svariable] ?: null : null + return (retVal != null) ? retVal as String : null +} + +def getSecurityState() { + return getStrucVal("wwn_security_state") } def getLocationPresence() { - def away = atomicState?.structData && atomicState?.structures && atomicState?.structData[atomicState?.structures] && atomicState?.structData[atomicState?.structures]?.away ? atomicState?.structData[atomicState?.structures]?.away : null - return (away != null) ? away as String : null + return getStrucVal("away") } def locationPresNotify(pres) { log.trace "locationPresNotify($pres)" if(pres == null) { return } + if(atomicState?.notificationPrefs == null) { atomicState?.notificationPrefs = buildNotifPrefMap() } if(atomicState?.notificationPrefs?.locationChg == true) { def lastStatus = atomicState?.curNestLocStatus if(lastStatus != null && lastStatus?.toString() != pres?.toString()) { @@ -5503,62 +5829,80 @@ def locationPresNotify(pres) { atomicState?.curNestLocStatus = pres } +def getApiIssueSec() { return getTimeSeconds("apiIssueDt", 100000, "getApiIssueSec").toInteger() } + def apiIssueNotify(msgOn, rateOn, wait) { + if( (getApiIssueSec() > 600) && (getLastAnyCmdSentSeconds() > 600)) { + updTimestampMap("apiIssueDt", null) + atomicState.apiIssuesList = [] + if(atomicState?.apiRateLimited) { + atomicState.apiRateLimited = false + LogAction("Clearing rate Limit", "info", true) + } + } if(!msgOn || !wait || !(getLastApiIssueMsgSec() > wait.toInteger())) { return } def apiIssue = apiIssues() ? true : false def rateLimit = (rateOn && atomicState?.apiRateLimited) ? true : false - if((apiIssue && !atomicState?.apiIssueDt) || rateLimit) { + if(apiIssue || rateLimit) { def msg = "" - msg += !rateLimit && apiIssue ? "\nThe Nest API appears to be having issues. This will effect the updating of device and location data.\nThe issues started at (${atomicState?.apiIssueDt})" : "" + msg += apiIssue ? "\nThe Nest API appears to be having issues. This will effect the updating of device and location data.\nThe issues started at (${getTimestampVal("apiIssueDt")})" : "" msg += rateLimit ? "${apiIssue ? "\n\n" : "\n"}Your API connection is currently being Rate-limited for excessive commands." : "" - if(sendMsg("${app?.name} API Issue Warning", msg, true)) { - atomicState?.lastApiIssueMsgDt = getDtNow() + if(sendMsg("${app?.label} API Issue Warning", msg, true)) { + updTimestampMap("lastApiIssueMsgDt", getDtNow()) } } } def failedCmdNotify(failData, tstr) { if(!(getLastFailedCmdMsgSec() > 300)) { return } + if(atomicState?.notificationPrefs == null) { atomicState?.notificationPrefs = buildNotifPrefMap() } def nPrefs = atomicState?.notificationPrefs def cmdFail = (nPrefs?.app?.api?.cmdFailMsg && failData?.msg != null) ? true : false + def cmdstr = tstr ?: atomicState?.lastCmdSent + def msg = "\nThe (${cmdstr}) CMD sent to the API has failed.\nStatus Code: ${failData?.code}\nErrorMsg: ${failData?.msg}\nDT: ${failData?.dt}" if(cmdFail) { - def cmdstr = tstr ?: atomicState?.lastCmdSent - def msg = "\nThe (${cmdstr}) CMD sent to the API has failed.\nStatus Code: ${failData?.code}\nErrorMsg: ${failData?.msg}\nDT: ${failData?.dt}" - if(sendMsg("${app?.name} API CMD Failed", msg)) { - atomicState?.lastFailedCmdMsgDt = getDtNow() + if(sendMsg("${app?.label} API CMD Failed", msg)) { + updTimestampMap("lastFailedCmdMsgDt", getDtNow()) } } LogAction(msg, (cmdFail ? "error" : "warn"), true) } def loggingRemindNotify(msgOn) { - if( !(settings?.appDebug || settings?.childDebug) || !msgOn || !(getLastLogRemindMsgSec() > 86400)) { return } - if(atomicState?.debugEnableDt == null) { atomicState?.debugEnableDt = getDtNow() } + if( !(settings?.appDebug || settings?.childDebug) || !msgOn || !(getLastLogRemindMsgSec() > 86400)) { return } + if(getTimestampVal("debugEnableDt") == null) { updTimestampMap("debugEnableDt", getDtNow()) } def dbgAlert = (getDebugLogsOnSec() > 86400) if(dbgAlert) { def msg = "Your debug logging has remained enabled for more than 24 hours please disable them to reduce resource usage on ST platform." - if(sendMsg(("${app?.name} Debug Logging Reminder"), msg, true)) { - atomicState?.lastLogRemindMsgDt = getDtNow() + if(sendMsg(("${app?.label} Debug Logging Reminder"), msg, true)) { + updTimestampMap("lastLogRemindMsgDt", getDtNow()) } } } def missPollNotify(on) { def theWait = settings?.misPollNotifyWaitVal ?: 1800 - if(getLastDevicePollSec() < theWait.toInteger()) { - if(!atomicState?.lastDevDataUpd) { + if(getLastDevPollSec() < theWait.toInteger()) { + if(!getTimestampVal("lastDevDataUpd")) { def now = new Date() def val = new Date(now.time - ( (theWait.toInteger()+1) * 60 * 1000) ) // if uninitialized, set 31 mins in past - atomicState?.lastDevDataUpd = formatDt(val) + updTimestampMap("lastDevDataUpd", formatDt(val)) } return } else { - def msg = "\nThe app has not refreshed data in the last (${getLastDevicePollSec()}) seconds.\nPlease try refreshing data using device refresh button." + def msg = "\nThe app has not refreshed data in the last (${getLastDevPollSec()}) seconds.\nPlease try refreshing data using device refresh button." LogAction(msg, "error", true) - def msgWait = atomicState?.notificationPrefs?.msgDefaultWait ?: 900 +/* poll handles this + if(settings?.restStreaming && atomicState?.restStreamingOn) { + restStreamHandler(true) // close the stream if we have not heard from it in a while + //atomicState?.restStreamingOn = false + } +*/ + if(atomicState?.notificationPrefs == null) { atomicState?.notificationPrefs = buildNotifPrefMap() } + def msgWait = atomicState?.notificationPrefs?.msgDefaultWait ?: 3600 if(on && getLastMissPollMsgSec() > msgWait.toInteger()) { - if(sendMsg("${app.name} Nest Data update Issue", msg)) { - atomicState?.lastMisPollMsgDt = getDtNow() + if(sendMsg("${app.label} Nest Data update Issue", msg)) { + updTimestampMap("lastMisPollMsgDt", getDtNow()) } } } @@ -5575,10 +5919,11 @@ def minVersionsOk() { return true } -def appUpdateNotify(badAuto=false) { +def appUpdateNotify(badFile=false, badType=null) { + if(atomicState?.notificationPrefs == null) { atomicState?.notificationPrefs = buildNotifPrefMap() } def on = atomicState?.notificationPrefs?.app?.updates?.updMsg def wait = atomicState?.notificationPrefs?.app?.updates?.updMsgWait - if(!badAuto && (!on || !wait || !minVersionsOk())) { return } + if(!badFile && (!on || !wait || !minVersionsOk())) { return } if(getLastUpdMsgSec() > wait.toInteger()) { def appUpd = isAppUpdateAvail() == true ? true : false def autoappUpd = isAutoAppUpdateAvail() == true ? true : false @@ -5588,24 +5933,26 @@ def appUpdateNotify(badAuto=false) { def weatherUpd = atomicState?.weatherDevice ? isWeatherUpdateAvail() : false def camUpd = atomicState?.cameras ? isCamUpdateAvail() : false def streamUpd = atomicState?.restStreamingOn ? isStreamUpdateAvail() : false - def blackListed = (atomicState?.appData && !appDevType() && atomicState?.clientBlacklisted) ? true : false - //log.debug "appUpd: $appUpd || protUpd: $protUpd || presUpd: $presUpd || tstatUpd: $tstatUpd || weatherUpd: $weatherUpd || camUpd: $camUpd || blackListed: $blackListed || badAuto: $badAuto" - if(appUpd || autoappUpd || protUpd || presUpd || tstatUpd || weatherUpd || camUpd || streamUpd || blackListed || badAuto) { + def blackListed = (atomicState?.appData && !appDevType() && atomicState?.cltBlacklisted) ? true : false + //log.debug "appUpd: $appUpd || protUpd: $protUpd || presUpd: $presUpd || tstatUpd: $tstatUpd || weatherUpd: $weatherUpd || camUpd: $camUpd || blackListed: $blackListed || badFile: $badFile" + if(appUpd || autoappUpd || protUpd || presUpd || tstatUpd || weatherUpd || camUpd || streamUpd || blackListed || badFile) { def str = "" str += !blackListed ? "" : "\nBlack Listed, please ensure software is up to date then contact developer" - str += !badAuto ? "" : "\nInvalid or Missing Automation File, please Reinstall the correct automation file" + if(badFile && badType) { + str += !badType ? "" : "\nInvalid or Missing ${badType} Code, please Reinstall the correct ${badType} SmartApp Code" + } str += !appUpd ? "" : "\nManager App: v${atomicState?.appData?.updater?.versions?.app?.ver?.toString()}${betaMarker() ? " Beta" : ""}" - str += (!autoappUpd && !badAuto) ? "" : "\nAutomation App: v${atomicState?.appData?.updater?.versions?.autoapp?.ver?.toString()}${betaMarker() ? " Beta" : ""}" + str += (!autoappUpd && !badFile) ? "" : "\nAutomation App: v${atomicState?.appData?.updater?.versions?.autoapp?.ver?.toString()}${betaMarker() ? " Beta" : ""}" str += !protUpd ? "" : "\nProtect: v${atomicState?.appData?.updater?.versions?.protect?.ver?.toString()}" str += !camUpd ? "" : "\nCamera: v${atomicState?.appData?.updater?.versions?.camera?.ver?.toString()}" str += !presUpd ? "" : "\nPresence: v${atomicState?.appData?.updater?.versions?.presence?.ver?.toString()}" str += !tstatUpd ? "" : "\nThermostat: v${atomicState?.appData?.updater?.versions?.thermostat?.ver?.toString()}" // str += !vtstatUpd ? "" : "\nVirtual Thermostat: v${atomicState?.appData?.updater?.versions?.thermostat?.ver?.toString()}" str += !weatherUpd ? "" : "\nWeather App: v${atomicState?.appData?.updater?.versions?.weather?.ver?.toString()}" - str += !streamUpd ? "" : "\nStream Service: v${atomicState?.appData?.eventStreaming?.minVersion?.toString()}" - def t0 = badAuto ? "Warn" : "Info" + str += !streamUpd ? "" : "\nStream Service: v${atomicState?.appData?.updater?.versions?.stream?.ver?.toString()}" + def t0 = badFile ? "Warn" : "Info" if(sendMsg(t0, "${appName()} Update(s) are Available:${str} \n\nPlease visit the IDE to Update code", true)) { - atomicState?.lastUpdMsgDt = getDtNow() + updTimestampMap("lastUpdMsgDt", getDtNow()) } } } @@ -5614,15 +5961,17 @@ def appUpdateNotify(badAuto=false) { def updateHandler() { LogTrace("updateHandler") if(atomicState?.isInstalled) { - if(atomicState?.appData?.updater?.updateType.toString() == "critical" && atomicState?.lastCritUpdateInfo?.ver.toInteger() != atomicState?.appData?.updater?.updateVer.toInteger()) { + if(atomicState?.appData?.updater?.updateType.toString() == "critical" && atomicState?.lastCritUpdateInfo?.ver?.toInteger() != atomicState?.appData?.updater?.updateVer?.toInteger()) { sendMsg("Critical", "There are Critical Updates available for ${appName()}! Please visit the IDE and make sure to update the App and Devices Code") atomicState?.lastCritUpdateInfo = ["dt":getDtNow(), "ver":atomicState?.appData?.updater?.updateVer?.toInteger()] } - if(atomicState?.appData?.updater?.updateMsg != null && atomicState?.appData?.updater?.updateMsg != atomicState?.lastUpdateMsg) { + def t0 = atomicState?.appData?.updater?.updateMsg + // LogAction("updateHandler: t0 is ${t0}", "info", true) + if(t0 != null && t0 != "" && t0 != atomicState?.lastUpdateMsg) { if(getLastUpdateMsgSec() > 86400) { - if(sendMsg("Info", "${atomicState?.updater?.updateMsg}")) { - atomicState.lastUpdateMsgDt = getDtNow() - atomicState.lastUpdateMsg = atomicState?.appData?.updater?.updateMsg + if(sendMsg("Info", "${t0}")) { + updTimestampMap("lastUpdateMsgDt", getDtNow()) + atomicState.lastUpdateMsg = t0 } } } @@ -5631,7 +5980,8 @@ def updateHandler() { def getOk2Notify() { return (daysOk(settings?.quietDays) && notificationTimeOk() && modesOk(settings?.quietModes)) } -def sendMsg(msgType, msg, showEvt=true, people = null, sms = null, push = null, brdcast = null) { +def sendMsg(String msgType, String msg, Boolean showEvt=true, Map pushoverMap=null, sms=null, push=null, brdcast=null) { + //LogAction("sendMsg: msgType: ${msgType}, msg: ${msg}, showEvt: ${showEvt}", "warn", true) LogTrace("sendMsg") def sentstr = "Push" def sent = false @@ -5639,41 +5989,48 @@ def sendMsg(msgType, msg, showEvt=true, people = null, sms = null, push = null, def newMsg = "${msgType}: ${msg}" as String def flatMsg = newMsg.toString().replaceAll("\n", " ") if(!getOk2Notify()) { - LogAction("sendMsg: Skipping Due to Quiet Time ($flatMsg)", "info", true) + LogAction("sendMsg: Message Skipped During Quiet Time ($flatMsg)", "info", true) + if(showEvt) { sendNotificationEvent(newMsg) } } else { if(!brdcast) { - def who = people ? people : settings?.recipients - if(location.contactBookEnabled) { - if(who) { - sentstr = "Pushing to Contacts $who" - sendNotificationToContacts(newMsg, who, [event: showEvt]) - sent = true - } - } else { - LogAction("ContactBook is NOT Enabled on your SmartThings Account", "warn", false) - if(push || settings?.usePush) { - sentstr = "Push Message" + if(push || settings?.usePush) { + sentstr = "Push Message" + if(showEvt) { sendPush(newMsg) // sends push and notification feed - sent = true + } else { + sendPushMessage(newMsg) // sends push } - def thephone = sms ? sms.toString() : settings?.phone ? settings?.phone?.toString() : "" - if(thephone) { - sentstr = "Text Message to Phone $thephone" - def t0 = newMsg.take(140) + sent = true + } + if(settings?.pushoverEnabled && settings?.pushoverDevices) { + sentstr = "Pushover Message" + Map msgObj = [:] + msgObj = pushoverMap ?: [title: msgType, message: msg, priority: (settings?.pushoverPriority?:0)] + if(settings?.pushoverSound) { msgObj?.sound = settings?.pushoverSound } + buildPushMessage(settings?.pushoverDevices, msgObj, true) + sent = true + } + def thephone = sms ? sms.toString() : settings?.phone ? settings?.phone?.toString() : "" + if(thephone) { + sentstr = "Text Message to Phone [${thephone}]" + def t0 = newMsg.take(140) + if(showEvt) { sendSms(thephone as String, t0 as String) // send SMS and notification feed - sent = true + } else { + sendSmsMessage(thephone as String, t0 as String) // send SMS } + sent = true } } else { - sentstr = "Broadcast" - sendPush(newMsg) // sends push and notification feed was sendPushMessage(newMsg) // push but no notification feed + sentstr = "Broadcast Message" + sendPush(newMsg) // sends push and notification feed was sendPushMessage(newMsg) // push but no notification feed sent = true } if(sent) { //atomicState?.lastMsg = flatMsg //atomicState?.lastMsgDt = getDtNow() - LogAction("sendMsg: Sent ${sentstr} Message Sent: ${flatMsg}", "debug", true) - incAppNotifSentCnt() + LogAction("sendMsg: Sent ${sentstr} (${flatMsg})", "debug", true) + incrementCntByKey("appNotifSentCnt") } } } catch (ex) { @@ -5683,28 +6040,19 @@ def sendMsg(msgType, msg, showEvt=true, people = null, sms = null, push = null, return sent } -def getLastWebUpdSec() { return !atomicState?.lastWebUpdDt ? 100000 : GetTimeDiffSeconds(atomicState?.lastWebUpdDt, null, "getLastWebUpdSec").toInteger() } -def getLastWeatherUpdSec() { return !atomicState?.lastWeatherUpdDt ? 100000 : GetTimeDiffSeconds(atomicState?.lastWeatherUpdDt, null, "getLastWeatherUpdSec").toInteger() } -def getLastForecastUpdSec() { return !atomicState?.lastForecastUpdDt ? 100000 : GetTimeDiffSeconds(atomicState?.lastForecastUpdDt, null, "getLastForecastUpdSec").toInteger() } -def getLastAnalyticUpdSec() { return !atomicState?.lastAnalyticUpdDt ? 100000 : GetTimeDiffSeconds(atomicState?.lastAnalyticUpdDt, null, "getLastAnalyticUpdSec").toInteger() } -def getLastUpdateMsgSec() { return !atomicState?.lastUpdateMsgDt ? 100000 : GetTimeDiffSeconds(atomicState?.lastUpdateMsgDt, null, "getLastUpdateMsgSec").toInteger() } +def getLastWebUpdSec() { return getTimeSeconds("lastWebUpdDt", 100000, "getLastWebUpdSec").toInteger() } +def getLastWeatherUpdSec() { return getTimeSeconds("lastWeatherUpdDt", 100000, "getLastWeatherUpdSec").toInteger() } +def getLastForecastUpdSec() { return getTimeSeconds("lastForecastUpdDt", 100000, "getLastForecastUpdSec").toInteger() } +def getLastAnalyticUpdSec() { return getTimeSeconds("lastAnalyticUpdDt", 100000, "getLastAnalyticUpdSec").toInteger() } +def getLastUpdateMsgSec() { return getTimeSeconds("lastUpdateMsgDt", 100000, "getLastUpdateMsgSec").toInteger() } def getStZipCode() { return location?.zipCode?.toString() } -def getNestZipCode() { - if(atomicState?.structures && atomicState?.structData) { - return atomicState?.structData[atomicState?.structures]?.postal_code ? atomicState?.structData[atomicState?.structures]?.postal_code.toString() : "" - } else { return "" } -} -def getNestTimeZone() { - if(atomicState?.structures && atomicState?.structData) { - return atomicState?.structData[atomicState?.structures]?.time_zone ?: null - } else { return null } -} -def updateWebStuff(now = false) { - LogTrace("updateWebStuff") +def updateWebStuff(now=false) { + //LogTrace("updateWebStuff $now") def nnow = now if(!atomicState?.appData) { nnow = true } + LogTrace("updateWebStuff $now $nnow") if(nnow || (getLastWebUpdSec() > (3600*4))) { if(nnow) { getWebFileData() @@ -5715,62 +6063,109 @@ def updateWebStuff(now = false) { if(now) { getWeatherConditions(now) } else { - if(canSchedule()) { runIn(20, "getWeatherConditions", [overwrite: true]) } + runIn(20, "getWeatherConditions", [overwrite: true]) } } if(atomicState?.isInstalled) { - if(getLastAnalyticUpdSec() > (3600*24) && canSchedule()) { runIn(105, "sendInstallData", [overwrite: true]) } + if(getLastAnalyticUpdSec() > (3600*24)) { runIn(105, "sendInstallData", [overwrite: true]) } } if(atomicState?.feedbackPending) { sendFeedbackData() } } def getWeatherConditions(force = false) { - LogTrace("getWeatherConditions") + LogTrace("getWeatherConditions $force") if(atomicState?.weatherDevice) { + def storageApp = getStorageApp() try { LogAction("Retrieving Local Weather Conditions", "info", false) def loc = "" def curWeather = "" def curForecast = "" - def curAstronomy = "" + def curLocation = "" def curAlerts = "" + def curAlertdetail = "" def err = false - def custLoc = getCustWeatherLoc() + def chgd = false + def custLoc = getCustWeatherLoc().toString() + if(custLoc) { - loc = custLoc - curWeather = getWeatherFeature("conditions", loc) - curAlerts = getWeatherFeature("alerts", loc) + loc = custLoc.toString() + curWeather = getTwcConditions(/*loc*/) //getWeatherFeature("conditions", loc) // getTwcConditions(loc) + curLocation = getTwcLocation(/*loc*/) } else { - curWeather = getWeatherFeature("conditions") - curAlerts = getWeatherFeature("alerts") - } - if(getLastForecastUpdSec() > (1800)) { + curWeather = getTwcConditions() //getWeatherFeature("conditions") //getTwcConditions() + curLocation = getTwcLocation() + } + String myLoc = curLocation?.location?.latitude.toString() + "," + curLocation?.location?.longitude.toString() + curAlerts = getTwcAlerts(myLoc) // does not support loc //getWeatherFeature("alerts", loc) // getTwcAlerts(loc) + // atomicState?.curWeather = curWeather + // atomicState?.curLocation = curLocation + // atomicState?.curAlerts = curAlerts + if( getLastForecastUpdSec() > (1800) || + (storageApp && (!getStorageVal("curForecast") /* || !getStorageVal("curAstronomy") */ )) || + (!storageApp && (!atomicState?.curForecast /* || !atomicState?.curAstronomy */ ))) { if(custLoc) { - loc = custLoc - curForecast = getWeatherFeature("forecast", loc) - curAstronomy = getWeatherFeature("astronomy", loc) + loc = custLoc.toString() + curForecast = getTwcForecast(/*loc*/) //getWeatherFeature("forecast", loc) // getTwcForecast(loc) + //curAstronomy = getWeatherFeature("astronomy", loc) // getTwcForecast(loc) } else { - curForecast = getWeatherFeature("forecast") - curAstronomy = getWeatherFeature("astronomy") + curForecast = getTwcForecast() //getWeatherFeature("forecast") // getTwcForecast() + //curAstronomy = getWeatherFeature("astronomy") // getTwcForecast() } - if(curForecast && curAstronomy) { - atomicState?.curForecast = curForecast - atomicState?.curAstronomy = curAstronomy - atomicState?.lastForecastUpdDt = getDtNow() + if(curForecast /*&& curAstronomy*/) { + if(storageApp) { + updStorageVal("curForecast", curForecast) + //updStorageVal("curAstronomy", curAstronomy) + } else { + atomicState?.curForecast = curForecast + //atomicState?.curAstronomy = curAstronomy + } + chgd = true + updTimestampMap("lastForecastUpdDt", getDtNow()) } else { - LogAction("Could Not Retrieve Local Forecast or astronomy Conditions", "warn", true) + LogAction("Could Not Retrieve Local Forecast or astronomy Conditions... This issue is likely caused by Weather Underground API issues...", "warn", true) + atomicState.forceChildUpd = true err = true } } - if(curWeather && curAlerts) { - atomicState?.curWeather = curWeather - atomicState?.curAlerts = curAlerts - if(!err) { atomicState?.lastWeatherUpdDt = getDtNow() } + //if(curWeather && curAlerts) { + if(curWeather) { + if(storageApp) { + updStorageVal("curWeather", curWeather) + updStorageVal("curLocation", curLocation) + } else { + atomicState?.curWeather = curWeather + atomicState?.curLocation = curLocation + } + chgd = true +/* + Try to reduce size of alerts if they are big to save state space +*/ +/* + def alrt = curAlerts?.alerts + def cntr = 0 + alrt.each { al -> + if(al?.message) { + curAlerts.alerts[cntr].message = al.message.take(800) + } + cntr++ + } +ERS todo curAlertdetail = "" + curAlertdetail = getTwcAlertDetail(alertId) +*/ + if(storageApp) { + updStorageVal("curAlerts", curAlerts) + } else { + atomicState?.curAlerts = curAlerts + } + + if(!err) { updTimestampMap("lastWeatherUpdDt", getDtNow()) } } else { - LogAction("Could Not Retrieve Local Weather Conditions or alerts", "warn", true) + LogAction("Could Not Retrieve Local Weather Conditions or alerts... This issue is likely caused by Weather Underground API issues...", "warn", true) + atomicState.forceChildUpd = true return false } - if(curWeather || curAstronomy || curForecast || curAlerts) { + if(chgd) { atomicState.needChildUpd = true if(!force) { runIn(21, "finishPoll", [overwrite: true]) } return true @@ -5784,48 +6179,56 @@ def getWeatherConditions(force = false) { } else { return false } } -def getWData() { - if(atomicState?.curWeather) { - return atomicState?.curWeather +def getWeatherData(dataName) { + def storageApp = getStorageApp(false) + def stateSz = getStateSizePerc() + def t1 = isAppLiteMode() + if(storageApp && (stateSz < 33 || t1)) { + initStorageApp() // should delete storageapp + storageApp = null + } + //storageApp = getStorageApp() + if(storageApp && !t1) { + def t0 = findStateStorageVal(dataName) + if(t0) { + return t0 + } else { if(getWeatherConditions(true)) { return getStorageVal(dataName) } } } else { - if(getWeatherConditions(true)) { - return atomicState?.curWeather + if(stateSz > 62) { + LogAction("storageApp not found getWeatherData ${stateSz}%", "warn", true) + } + if(!t1) { + if(stateSz > 62) { + initStorageApp() // should create storage App + } } + if(atomicState?."$dataName") { + return atomicState?."$dataName" + } else { if(getWeatherConditions(true)) { return atomicState?."$dataName" } } } return null } +def getWLocation() { + return getWeatherData("curLocation") // getTwcConditions() +} + +def getWData() { + return getWeatherData("curWeather") // getTwcConditions() +} + def getWForecastData() { - if(atomicState?.curForecast) { - return atomicState?.curForecast - } else { - if(getWeatherConditions(true)) { - return atomicState?.curForecast - } - } - return null + return getWeatherData("curForecast") // getTwcForecast() } +/* def getWAstronomyData() { - if(atomicState?.curAstronomy) { - return atomicState?.curAstronomy - } else { - if(getWeatherConditions(true)) { - return atomicState?.curAstronomy - } - } - return null + return getWeatherData("curAstronomy") } +*/ def getWAlertsData() { - if(atomicState?.curAlerts) { - return atomicState?.curAlerts - } else { - if(getWeatherConditions(true)) { - return atomicState?.curAlerts - } - } - return null + return getWeatherData("curAlerts") // getTwcAlerts } def getWeatherDeviceInst() { @@ -5833,18 +6236,18 @@ def getWeatherDeviceInst() { } def getWebFileData(now = true) { - //LogTrace("getWebFileData") - def params = [ uri: "https://raw.githubusercontent.com/${gitPath()}/Data/appData.json", contentType: 'application/json' ] + LogTrace("getWebFileData $now") + def params = [ uri: getAppSettingsUrl(), contentType: 'application/json' ] def result = false try { def allowAsync = false def metstr = "sync" - if(!now && atomicState?.appData && atomicState?.appData?.pollMethod?.allowAsync) { + if(!now) { allowAsync = true metstr = "async" } - LogTrace("getWebFileData: Getting appData.json File(${metstr})") + LogTrace("getWebFileData: Getting appConfig.json File(${metstr})") if(now || !allowAsync) { httpGet(params) { resp -> @@ -5856,7 +6259,7 @@ def getWebFileData(now = true) { } catch (ex) { if(ex instanceof groovyx.net.http.HttpResponseException) { - LogAction("appData.json file not found", "warn", true) + LogAction("appConfig.json file not found", "warn", true) } else { log.error "getWebFileData Exception:", ex } @@ -5877,34 +6280,35 @@ def webResponse(resp, data) { //LogTrace("webResponse Resp: ${newdata}") LogTrace("webResponse appData: ${t0}") if(newdata && t0 != newdata) { - LogAction("appData.json File HAS Changed", "info", true) + LogAction("appConfig.json File HAS Changed", "info", true) atomicState?.appData = newdata clientBlacklisted() + clientMetricBlacklisted() + clientExceptionsBlacklisted() updateHandler() - helpHandler() setStateVar(true) - } else { LogAction("appData.json did not change", "info", false) } - if(atomicState?.appData && !appDevType() && atomicState?.clientBlacklisted) { + } else { LogAction("appConfig.json did not change", "info", false) } + if(atomicState?.appData && !appDevType() && atomicState?.cltBlacklisted) { appUpdateNotify() } - if(atomicState?.appData?.appSettings?.pullFromFB == true) { + if(atomicState?.appData?.settings?.database?.pullSettingsFromFB == true) { getFbAppSettings(data?.type == "async" ? false : true ) } - atomicState?.lastWebUpdDt = getDtNow() + updTimestampMap("lastWebUpdDt", getDtNow()) result = true } else { - LogAction("Get failed appData.json status: ${resp?.status}", "warn", true) + LogAction("Get failed appConfig.json status: ${resp?.status}", "warn", true) } return result } def getFbAppSettings(now = true) { - def params = [ uri: "https://st-nest-manager.firebaseio.com/appSettings.json", contentType: 'application/json' ] + def params = [ uri: getAppSettingsFBUrl(), contentType: 'application/json' ] def result = false try { def allowAsync = false def metstr = "sync" - if(!now && atomicState?.appData && atomicState?.appData?.pollMethod?.allowAsync) { + if(!now) { allowAsync = true metstr = "async" } @@ -5920,7 +6324,7 @@ def getFbAppSettings(now = true) { } catch (ex) { if(ex instanceof groovyx.net.http.HttpResponseException) { - //log.warn "clientData.json file not found..." + //log.warn "clientData.json file not found..." } else { LogAction("getFbAppSettings Exception: ${ex}", "error", true) } @@ -5968,30 +6372,44 @@ def getWebData(params, desc, text=true) { } } -def clientBlacklisted() { - if(atomicState?.clientBlacklisted == null) { atomicState?.clientBlacklisted == false } - def curBlState = atomicState?.clientBlacklisted - if(atomicState?.isInstalled && atomicState?.appData?.clientBL) { - def clientList = atomicState?.appData?.clientBL?.clients - if(clientList != null || clientList != []) { - def isBL = (atomicState?.installationId in clientList) ? true : false - if(curBlState != isBL) { - atomicState?.clientBlacklisted = isBL - } - } else { atomicState?.clientBlacklisted = false } - } else { atomicState?.clientBlacklisted = false } +private clientBlacklisted() { + Boolean isBl = false + List clList = atomicState?.appData?.blacklists?.clients ?: [] + if(atomicState?.isInstalled && atomicState?.installationId && clList?.size()) { + isBl = (atomicState?.installationId in clList) + } + atomicState?.cltBlacklisted = isBl +} + +private clientMetricBlacklisted() { + Boolean isBl = false + List clList = atomicState?.appData?.blacklists?.metrics ?: [] + if(atomicState?.isInstalled && clList?.size()) { + isBl = (atomicState?.installationId in clList) + } + atomicState?.cltMetBlacklisted = isBl +} + +private clientExceptionsBlacklisted() { + Boolean isBl = false + List clList = atomicState?.appData?.blacklists?.exceptions ?: [] + if(atomicState?.isInstalled && clList?.size()) { + isBl = (atomicState?.installationId in clList) + } + atomicState?.cltExcBlacklisted = isBl } -def broadcastCheck() { - def bCastData = atomicState?.appData?.broadcast +private broadcastCheck() { + LogTrace("broadcastCheck") + Map bCastData = atomicState?.appData?.broadcast if(atomicState?.isInstalled && bCastData) { - if(bCastData?.msgId != null && atomicState?.lastBroadcastId != bCastData?.msgId) { + if(bCastData?.msgId != "" && bCastData?.message != "" && atomicState?.lastBroadcastId && atomicState?.lastBroadcastId != bCastData?.msgId && (bCastData?.minVer == "" || bCastData?.minVer != appVersion())) { if(sendMsg(strCapitalize(bCastData?.type), bCastData?.message.toString(), true, null, null, null, true)) { atomicState?.lastBroadcastId = bCastData?.msgId } } if(bCastData?.devBannerMsg != null && atomicState?.devBannerData?.msgId != bCastData?.devBannerMsg?.msgId) { - if(bCastData?.devBannerMsg?.msgId && bCastData?.devBannerMsg?.message && bCastData?.devBannerMsg?.type && bCastData?.devBannerMsg?.expireDt) { + if(bCastData?.devBannerMsg?.msgId && bCastData?.devBannerMsg?.message && bCastData?.devBannerMsg?.type && bCastData?.devBannerMsg?.expireDt && (bCastData?.devBannerMsg?.minVer == "" || bCastData?.devBannerMsg?.minVer != appVersion())) { def curDt = Date.parse("E MMM dd HH:mm:ss z yyyy", getDtNow()) def expDt = Date.parse("E MMM dd HH:mm:ss z yyyy", bCastData?.devBannerMsg?.expireDt.toString()) //log.debug "curDt: $curDt | expDt: $expDt | isExpired: ${(curDt > expDt)}" @@ -6003,30 +6421,9 @@ def broadcastCheck() { } } -def helpHandler() { - if(atomicState?.appData?.help) { - atomicState.showHelp = (atomicState?.appData?.help?.showHelp == false) ? false : true - } -} - -def getHtmlInfo() { - if(atomicState?.appData?.html?.cssUrl && atomicState?.appData?.html?.cssVer && atomicState?.appData?.html?.chartJsUrl && atomicState?.appData?.html?.chartJsVer ) { - return ["cssUrl":atomicState?.appData?.html?.cssUrl, "cssVer":atomicState?.appData?.html?.cssVer, "chartJsUrl":atomicState?.appData?.html?.chartJsUrl, "chartJsVer":atomicState?.appData?.html?.chartJsVer] - } else { - if(getWebFileData()) { - return ["cssUrl":atomicState?.appData?.html?.cssUrl, "cssVer":atomicState?.appData?.html?.cssVer, "chartJsUrl":atomicState?.appData?.html?.chartJsUrl, "chartJsVer":atomicState?.appData?.html?.chartJsVer] - } - } -} - def allowDbException() { - if(atomicState?.appData?.database?.disableExceptions != null) { - return atomicState?.appData?.database?.disableExceptions == true ? false : true - } else { - if(getWebFileData()) { - return atomicState?.appData?.database?.disableExceptions == true ? false : true - } - } + if(atomicState?.appData?.settings?.database?.sendExceptions == null) { getWebFileData() } + return (atomicState?.appData?.settings?.database?.sendExceptions == true) } def ver2IntArray(val) { @@ -6034,18 +6431,18 @@ def ver2IntArray(val) { return [maj:"${ver[0]?.toInteger()}",min:"${ver[1]?.toInteger()}",rev:"${ver[2]?.toInteger()}"] } -def versionStr2Int(str) { return str ? str.toString().replaceAll("\\.", "").toInteger() : null } +Integer versionStr2Int(str) { return str ? str.toString()?.replaceAll("\\.", "")?.toInteger() : null } -def getChildWaitVal() { return settings?.tempChgWaitVal ? settings?.tempChgWaitVal.toInteger() : 4 } +Integer getChildWaitVal() { return settings?.tempChgWaitVal ? settings?.tempChgWaitVal.toInteger() : 4 } def getAskAlexaMQEn() { - if(atomicState?.appData?.aaPrefs?.enAaMsgQueue == true) { + if(atomicState?.appData?.settings?.askAlexa?.enAaMsgQueue == true) { return settings?.allowAskAlexaMQ == null ? true : setting?.allowAskAlexaMQ } else { return false } } def getAskAlexaMultiQueueEn() { - return atomicState?.appData?.aaPrefs?.enMultiQueue == true ? true : false + return atomicState?.appData?.settings?.askAlexa?.enMultiQueue == true ? true : false } def initAppMetricStore() { @@ -6083,7 +6480,7 @@ def isCodeUpdateAvailable(newVer, curVer, type) { result = (latestVer == newVer) ? true : false } } - LogTrace("isCodeUpdateAvailable: type: $type | newVer: $newVer | curVer: $curVer | newestVersion: ${latestVer} | result: $result") + //LogTrace("isCodeUpdateAvailable: type: $type | newVer: $newVer | curVer: $curVer | newestVersion: ${latestVer} | result: $result") return result } @@ -6124,20 +6521,19 @@ def isWeatherUpdateAvail() { } def isStreamUpdateAvail() { - if(isCodeUpdateAvailable(atomicState?.appData?.eventStreaming?.minVersion, atomicState?.swVer?.streamDevVer, "stream")) { return true } + if(isCodeUpdateAvailable(atomicState?.appData?.updater?.versions?.stream?.ver, atomicState?.swVer?.streamDevVer, "stream")) { return true } return false } def reqSchedInfoRprt(child, report=true) { - LogTrace("reqSchedInfoRprt: (${child.device.label})") + LogTrace("reqSchedInfoRprt: (${child.device.label}, $report)") def result = null - if(!atomicState?.installData?.usingNewAutoFile) { return result } def tstat = getChildDevice(child.device.deviceNetworkId) if (tstat) { def str = "" def tstatAutoApp = getChildApps()?.find { - (it.getAutomationType() == "schMot" && it?.getTstatAutoDevId() == tstat?.deviceNetworkId) + (it?.getAutomationType() == "schMot" && it?.getTstatAutoDevId() == tstat?.deviceNetworkId) } //LogTrace("tstatAutoApp: ${tstatAutoApp}") def actSchedNum @@ -6161,14 +6557,16 @@ def reqSchedInfoRprt(child, report=true) { if(!report) { def useMot = (schedMotionActive && (schedData?.mctemp || schedData?.mhtemp)) ? true : false tempSrcStr = useMot ? "Schedule Motion Trigger" : tempSrcStr + return ["scdNum":actSchedNum, "schedName":schedData?.lbl, "reqSenHeatSetPoint":reqSenHeatSetPoint, "reqSenCoolSetPoint":reqSenCoolSetPoint, "curZoneTemp":curZoneTemp, "tempSrc":tempSrc, "tempSrcDesc":tempSrcStr] + } else { def tempScaleStr = " degrees" - def canHeat = tstat?.currentCanHeat.toString() == "true" ? true : false - def canCool = tstat?.currentCanCool.toString() == "true" ? true : false - def curMode = tstat?.currentnestThermostatMode.toString() - def curOper = tstat?.currentThermostatOperatingState.toString() - def curHum = tstat?.currentHumidity.toString() + def canHeat = tstat?.currentCanHeat?.toString() == "true" ? true : false + def canCool = tstat?.currentCanCool?.toString() == "true" ? true : false + def curMode = tstat?.currentnestThermostatMode?.toString() + def curOper = tstat?.currentThermostatOperatingState?.toString() + def curHum = tstat?.currentHumidity?.toString() def schedDesc = schedVoiceDesc(actSchedNum, schedData, schedMotionActive) str += schedDesc ?: " There are No Schedules currently Active. " @@ -6186,7 +6584,7 @@ def reqSchedInfoRprt(child, report=true) { else if(zTmp < adj_temp(60.0)) { str += "a freezing " } str += "${curZoneTemp}${tempScaleStr}" str += curHum ? " with a humidity of ${curHum}%. " : ". " - if(zTmp < adj_temp(60.0)) { str += " (Please remember to dress warmly). " } + if(zTmp < adj_temp(60.0)) { str += " (Please remember to dress warmly)." } } } @@ -6210,10 +6608,11 @@ def reqSchedInfoRprt(child, report=true) { } } } else { - //LogAction ("reqSchedInfoRprt: No Automation Schedules were found for ${tstat} device", "warn", false) + LogTrace("reqSchedInfoRprt: No Automation Schedules were found for ${tstat} device") if(report) { result = "No Thermostat Automation Schedules were found for ${tstat} device" } + result = [:] } } else { LogAction("reqSchedInfoRprt: Thermostat device not found", "error", true) @@ -6240,7 +6639,7 @@ def getVoiceRprtCnt() { def schedVoiceDesc(num, data, motion) { def str = "" - str += data?.lbl ? " The automation schedule slot ${num} labeled ${data?.lbl} is currently active. " : "" + str += data?.lbl ? " The automation schedule slot ${num} labeled ${data?.lbl} is currently active. " : "" str += (!motion && (data?.ctemp || data?.htemp)) ? "The schedules desired temps" : "" str += (motion && (data?.mctemp || data?.mhtemp)) ? "The schedules desired motion triggered temps" : "" str += ((motion && data?.mhtemp) || (!motion && data?.htemp)) ? " are set to a heat temp of ${!motion ? fixTempSetting(data?.htemp) : fixTempSetting(data?.mhtemp)} degrees" : "" @@ -6254,12 +6653,12 @@ def schedVoiceDesc(num, data, motion) { | It also Adds Removes Devices from ST | *************************************************************************************************/ -def getNestStructures() { +def getNestStructures(force = false) { LogTrace("Getting Nest Structures") def struct = [:] def thisstruct = [:] try { - if(ok2PollStruct()) { getApiData("str") } + if(ok2PollStruct() || force) { getApiData("str") } if(atomicState?.structData) { def structs = atomicState?.structData structs?.eachWithIndex { struc, index -> @@ -6286,8 +6685,8 @@ def getNestStructures() { if(atomicState?.thermostats || atomicState?.protects || atomicState?.cameras || atomicState?.vThermostats || atomicState?.presDevice || atomicState?.weatherDevice || isAutoAppInst() ) { // if devices are configured, you cannot change the structure until they are removed struct = thisstruct } - if(ok2PollDevice()) { getApiData("dev") } - } else { LogAction("Missing: structData ${atomicState?.structData}", "warn", true) } + if(ok2PollDevice() || force) { getApiData("dev") } + } else { LogAction("Missing: structData ${atomicState?.structData}", "warn", true) } } catch (ex) { log.error "getNestStructures Exception:", ex @@ -6393,14 +6792,20 @@ def camState(val) { def getThermostatDisplayName(stat) { if(stat?.name) { return stat.name.toString() } + else if(stat?.name_long) { return stat?.name_long.toString() } + else { return "Thermostatnamenotfound" } } def getProtectDisplayName(prot) { if(prot?.name) { return prot.name.toString() } + else if(prot?.name_long) { return prot?.name_long.toString() } + else { return "Protectnamenotfound" } } def getCameraDisplayName(cam) { if(cam?.name) { return cam.name.toString() } + else if(cam?.name_long) { return cam?.name_long.toString() } + else { return "Cameranamenotfound" } } def getNestDeviceDni(dni, type) { @@ -6413,7 +6818,7 @@ def getNestDeviceDni(dni, type) { def t0 = "Nest${type}-${dni?.value.toString()}${appDevName()} | ${dni?.key.toString()}" d1 = getChildDevice(t0) if(d1) { retVal = t0.toString() } - retVal = dni?.key.toString() + retVal = dni?.key.toString() } //LogAction("getNestDeviceDni ($type) Issue", "warn", true) //LogAction("getNestDeviceDni: retVal: $retVal", "trace", true) @@ -6439,7 +6844,7 @@ def getNestPresId() { if(d3) { return dni } } def retVal = "" - def devt = appDevName() + def devt = appDevName() if(atomicState?.structures) { retVal = "NestPres${devt} | ${atomicState?.structures}" } else if(settings?.structures) { retVal = "NestPres${devt} | ${settings?.structures}" } else { @@ -6566,7 +6971,7 @@ def getNestWeatherLabel() { def getChildDeviceLabel(dni) { if(!dni) { return null } - return getChildDevice(dni.toString()).getLabel() ?: null + return getChildDevice(dni.toString())?.getLabel() ?: null } def getTstats() { @@ -6614,6 +7019,10 @@ def getLocHub() { def addRemoveDevices(uninst = null) { LogTrace("addRemoveDevices") def retVal = false + if( /* atomicState?.resetAllData ||*/ settings?.resetAllData) { + LogAction("addRemoveDevices: found fixState in progress", "debug", true) + return true + } try { def devsInUse = [] def tstats @@ -6688,8 +7097,8 @@ def addRemoveDevices(uninst = null) { def d4Label = getNestWeatherLabel() d4 = addChildDevice(app.namespace, getWeatherChildName(), dni, null, [label: "${d4Label}"]) //d4.take() - atomicState?.lastWeatherUpdDt = null - atomicState?.lastForecastUpdDt = null + updTimestampMap("lastWeatherUpdDt", null) + updTimestampMap("lastForecastUpdDt", null) devsCrt = devsCrt + 1 LogAction("Created: ${d4.displayName} with (Id: ${dni})", "debug", true) } else { @@ -6719,7 +7128,7 @@ def addRemoveDevices(uninst = null) { } if(atomicState?.vThermostats) { nVstats = atomicState?.vThermostats.collect { dni -> - LogAction("atomicState.vThermostats: ${atomicState.vThermostats} dni: ${dni} dni.key: ${dni.key.toString()} dni.value: ${dni.value.toString()}", "debug", true) + LogAction("atomicState.vThermostats: ${atomicState.vThermostats} dni: ${dni} dni.key: ${dni.key.toString()} dni.value: ${dni.value.toString()}", "debug", true) def d6 = getChildDevice(getNestvStatDni(dni).toString()) if(!d6) { def d6Label = getNestVtstatLabel("${dni.value}", "${dni.key}") @@ -6742,7 +7151,8 @@ def addRemoveDevices(uninst = null) { if(atomicState?.weatherDevice) { weathCnt = 1 } if(devsCrt > 0) { noCreates = false - LogAction("Created Devices; Current Devices: (${tstats?.size()}) Thermostat(s), (${nVstats?.size() ?: 0}) Virtual Thermostat(s), (${nProtects?.size() ?: 0}) Protect(s), (${nCameras?.size() ?: 0}) Cameras(s), ${presCnt} Presence Device and ${weathCnt} Weather Device", "debug", true) + LogAction("Created Devices; Current Devices: (${tstats?.size()}) Thermostat(s), (${nVstats?.size() ?: 0}) Virtual Thermostat(s), (${nProtects?.size() ?: 0}) Protect(s), (${nCameras?.size() ?: 0}) Cameras(s), ${presCnt} Presence Device and ${weathCnt} Weather Device", "debug", true) + updTimestampMap("lastAnalyticUpdDt", null) } } @@ -6756,9 +7166,10 @@ def addRemoveDevices(uninst = null) { } if(!atomicState?.weatherDevice) { + runIn(5, "cleanStorage", [overwrite: true]) // calling the child truncates logs atomicState?.curWeather = null atomicState?.curForecast = null - atomicState?.curAstronomy = null + //atomicState?.curAstronomy = null atomicState?.curAlerts = null } @@ -6770,21 +7181,22 @@ def addRemoveDevices(uninst = null) { if(delete?.size() > 0) { noDeletes = false noDeleteErr = false + updTimestampMap("lastAnalyticUpdDt", null) LogAction("Removing ${delete.size()} devices: ${delete}", "debug", true) - delete.each { deleteChildDevice(it.deviceNetworkId) } + delete.each { deleteChildDevice(it.deviceNetworkId, true) } noDeleteErr = true } - retVal = ((unist && noDeleteErr) || (!uninst && (noCreates && noDeletes))) ? true : false // it worked = no delete errors on uninstall; or no creates or deletes done + retVal = ((uninst && noDeleteErr) || (!uninst && (noCreates && noDeletes))) ? true : false // it worked = no delete errors on uninstall; or no creates or deletes done //retVal = true //currentDevMap(true) } catch (ex) { if(ex instanceof physicalgraph.exception.ConflictException) { - def msg = "Error: Can't Remove Device. One or more of them are still in use by other SmartApps or Routines. Please remove them and try again!" + def msg = "Error: Can't Remove Device. One or more of them are still in use by other SmartApps or Routines. Please remove them and try again!" sendPush(msg) LogAction("addRemoveDevices Exception | $msg", "warn", true) } else if(ex instanceof physicalgraph.app.exception.UnknownDeviceTypeException) { - def msg = "Error: Device Handlers are Missing or Not Published. Please verify all device handlers are present before continuing." + def msg = "Error: Device Handlers are Missing or Not Published. Please verify all device handlers are present before continuing." appUpdateNotify() sendPush(msg) LogAction("addRemoveDevices Exception | $msg", "warn", true) @@ -6798,23 +7210,9 @@ def addRemoveDevices(uninst = null) { return retVal } -/* -def setMyLockId(val) { - if(atomicState?.myID == null && parent && val) { - atomicState.myID = val - } -} -*/ - -def getMyLockId() { - if(parent) { return atomicState?.myID } else { return null } -} - - - def addRemoveVthermostat(tstatdni, tval, myID) { def odevId = tstatdni - LogAction("addRemoveVthermostat() tstat: ${tstatdni} devid: ${odevId} tval: ${tval} myID: ${myID} vThermostats: ${atomicState?.vThermostats} ", "trace", true) + LogAction("addRemoveVthermostat() tstat: ${tstatdni} devid: ${odevId} tval: ${tval} myID: ${myID} vThermostats: ${atomicState?.vThermostats} ", "trace", true) if(parent || !myID || tval == null) { LogAction("got called BADLY ${parent} ${myID} ${tval}", "warn", true) @@ -6835,9 +7233,10 @@ def addRemoveVthermostat(tstatdni, tval, myID) { def devId = "v${odevId}" - def migrate = migrationInProgress() + // def migrate = migrationInProgress() - if(!migrate && atomicState?."vThermostat${devId}" && myID != atomicState?."vThermostatChildAppId${devId}") { + // if(!migrate && atomicState?."vThermostat${devId}" && myID != atomicState?."vThermostatChildAppId${devId}") { + if(atomicState?."vThermostat${devId}" && myID != atomicState?."vThermostatChildAppId${devId}") { LogAction("addRemoveVthermostat() not ours ${myID} ${atomicState?."vThermostat${devId}"} ${atomicState?."vThermostatChildAppId${devId}"}", "trace", true) //atomicState?."vThermostat${devId}" = false //atomicState?."vThermostatChildAppId${devId}" = null @@ -6862,7 +7261,7 @@ def addRemoveVthermostat(tstatdni, tval, myID) { def vtlist = atomicState?.vThermostats ?: [:] vtlist[devId] = "${tstat.label.toString()}" atomicState.vThermostats = vtlist - if(!migrate) { runIn(10, "updated", [overwrite: true]) } // create what is needed + if(!settings?.resetAllData) { runIn(120, "updated", [overwrite: true]) } // create what is needed } else if(!tval && atomicState?."vThermostatChildAppId${devId}") { LogAction("addRemoveVthermostat() marking for remove virtual thermostat tracking ${tstat}", "trace", true) @@ -6886,7 +7285,7 @@ def addRemoveVthermostat(tstatdni, tval, myID) { } vtlist = newlist atomicState.vThermostats = vtlist - if(!migrate) { runIn(10, "updated", [overwrite: true]) } // create what is needed + if(!settings?.resetAllData) { runIn(120, "updated", [overwrite: true]) } // create what is needed } else { LogAction("addRemoveVthermostat() unexpected operation state ${myID} ${atomicState?."vThermostat${devId}"} ${atomicState?."vThermostatChildAppId${devId}"}", "warn", true) return false @@ -6908,7 +7307,7 @@ def deviceHandlerTest() { def preReqCheck() { //LogTrace("preReqCheckTest()") - if(!atomicState?.installData) { atomicState?.installData = ["initVer":appVersion(), "dt":getDtNow().toString(), "updatedDt":"Not Set", "freshInstall":true, "shownDonation":false, "shownFeedback":false, "shownChgLog":true, "usingNewAutoFile":true] } + if(!atomicState?.installData) { atomicState?.installData = ["initVer":appVersion(), "dt":getDtNow().toString(), "updatedDt":"Not Set", "freshInstall":true, "shownDonation":false, "shownFeedback":false, "shownChgLog":true, "usingNewAutoFile":true, "liteAppMode":isAppLiteMode()] } if(!location?.timeZone || !location?.zipCode) { atomicState.preReqTested = false LogAction("SmartThings Location not returning (TimeZone: ${location?.timeZone}) or (ZipCode: ${location?.zipCode}) Please edit these settings under the IDE", "warn", true) @@ -6944,21 +7343,27 @@ def getAccessToken() { else { return true } } catch (ex) { - def msg = "Error: OAuth is not Enabled for ${appName()}!. Please click remove and Enable Oauth under the SmartApp App Settings in the IDE" + def msg = "Error: OAuth is not Enabled for ${appName()}!. Please click remove and Enable Oauth under the SmartApp App Settings in the IDE" sendPush(msg) log.error "getAccessToken Exception", ex LogAction("getAccessToken Exception | $msg", "warn", true) - sendExceptionData(ex, "getAccessToken") + //sendExceptionData(ex, "getAccessToken") return false } } -void resetSTAccessToken() { +void resetSTAccessToken(reset) { + if(reset != true) { return } LogAction("Resetting SmartApp Access Token....", "info", true) - restStreamHandler(true) - atomicState?.restStreamingOn = false + atomicState?.pollBlocked = true + atomicState?.pollBlockedReason = "reseting Access Token" + restStreamHandler(true, false) + //atomicState?.restStreamingOn = false revokeAccessToken() atomicState?.accessToken = null + atomicState?.pollBlocked = false + atomicState?.pollBlockedReason = "" + if(getAccessToken()) { LogAction("Reset SmartApp Access Token... Successful", "info", true) settingUpdate("resetSTAccessToken", "false", "bool") @@ -7006,7 +7411,7 @@ def callback() { httpPost(uri: tokenUrl) { resp -> atomicState.authToken = resp?.data.access_token if(atomicState?.authToken) { - atomicState?.authTokenCreatedDt = getDtNow() + updTimestampMap("authTokenCreatedDt", getDtNow()) atomicState.authTokenExpires = resp?.data.expires_in // atomicState.authTokenNum = clientToken() atomicState.oauthInitState = UUID?.randomUUID().toString() @@ -7019,7 +7424,6 @@ def callback() { atomicState?.needDevPoll = true atomicState?.needMetaPoll = true runIn(5, "finishRemap", [overwrite: true]) - success() } else { @@ -7034,26 +7438,27 @@ def callback() { } } -// ERSERS check remapping def finishRemap() { - checkRemapping() - atomicState.needToFinalize = true - runIn(21, "finalizeRemap", [overwrite: true]) + LogTrace("finishRemap (${atomicState?.pollBlocked}) (${atomicState?.pollBlockedReason})") + checkRemapping() + atomicState.needToFinalize = true + runIn(21, "finalizeRemap", [overwrite: true]) } def finalizeRemap() { - fixDevAS() - sendInstallSlackNotif(false) - atomicState.needToFinalize = false - initManagerApp() - state.remove("needToFinalize") + LogTrace("finalizeRemap (${atomicState?.pollBlocked}) (${atomicState?.pollBlockedReason})") + fixDevAS() + //sendInstallSlackNotif(false) + atomicState.needToFinalize = false + initManagerApp() + state.remove("needToFinalize") } def revokeNestToken() { if(atomicState?.authToken) { LogAction("revokeNestToken()", "info", true) - restStreamHandler(true) - atomicState?.restStreamingOn = false + restStreamHandler(true, false) + //atomicState?.restStreamingOn = false def params = [ uri: "https://api.home.nest.com", path: "/oauth2/access_tokens/${atomicState?.authToken}", @@ -7085,16 +7490,18 @@ def revokeNestToken() { def revokeCleanState() { unschedule() atomicState.authToken = null - atomicState.authTokenCreatedDt = null - atomicState.authTokenExpires = getDtNow() + updTimestampMap("authTokenCreatedDt", null) + atomicState.authTokenExpires = null atomicState.structData = null atomicState.deviceData = null atomicState.metaData = null - atomicState?.lastStrucDataUpd = null - atomicState?.lastDevDataUpd = null - atomicState?.lastMetaDataUpd = null + updTimestampMap("lastStrDataUpd", null) + updTimestampMap("lastDevDataUpd", null) + updTimestampMap("lastMetaDataUpd", null) atomicState?.pollingOn = false + atomicState.streamPolling = false atomicState?.pollBlocked = false + atomicState?.workQrunInActive = false atomicState?.pollBlockedReason = "No Auth Token" } @@ -7102,7 +7509,7 @@ def revokeCleanState() { def success() { def message = """

Your SmartThings Account is now connected to Nest!

-

Click 'Done' to finish setup.

+

Click Done or Next to proceed with the rest of the setup.

""" connectionStatus(message) } @@ -7110,7 +7517,7 @@ def success() { def fail() { def message = """

The connection could not be established!

-

Click 'Done' to return to the menu.

+

Click Done or Next to return to the menu.

""" connectionStatus(message) } @@ -7118,67 +7525,19 @@ def fail() { def connectionStatus(message, redirectUrl = null) { def redirectHtml = "" if(redirectUrl) { redirectHtml = """""" } - def html = """ - - SmartThings & Nest connection - + + SmartThings & Nest connection + -
- - connected device icon - +
+

+

+ ${message}
@@ -7196,25 +7555,46 @@ def toQueryString(Map m) { return m.collect { k, v -> "${k}=${URLEncoder.encode(v.toString())}" }.sort().join("&") } -def clientId() { - if(appSettings?.clientId) { - return appSettings?.clientId +Map devClientData() { + if(!atomicState?.appData?.other) { updateWebStuff(true) } + Map m = atomicState?.appData?.other ?: [:] + // log.debug "m: ${m}" + def clt = m?.active ?: 0 + def id = m?.items[clt]?.id?.decodeBase64() + def secret = m?.items[clt]?.secret?.decodeBase64() + return [id: new String(id), secret: new String(secret)] +} + +//These are the Nest OAUTH Methods to aquire the auth code and then Access Token. +String clientId() { + if(appSettings?.clientId && appSettings?.clientId != "blank") { + return appSettings?.clientId?.toString().trim() } else { - LogAction("clientId is missing and is required to generate your Nest Auth token. Please verify you are running the latest software version", "error", true) + if(devClientData()) { + return devClientData()?.id ?: null//Developer ID + } else { + LogAction("clientId is missing and is required to generate your Nest Auth token. Please verify you are running the latest software version", "error", true) + } return null } } -def clientSecret() { - if(appSettings?.clientSecret) { - return appSettings?.clientSecret +String clientSecret() { + if(appSettings?.clientSecret && appSettings?.clientSecret != "blank") { + return appSettings?.clientSecret?.toString().trim() } else { - LogAction("clientSecret is missing and is required to generate your Nest Auth token. Please verify you are running the latest software version", "error", true) + if(devClientData()) { + return devClientData()?.secret ?: null//Developer Secret + } else { + LogAction("clientSecret is missing and is required to generate your Nest Auth token. Please verify you are running the latest software version", "error", true) + } return null } } def nestDevAccountCheckOk() { + // log.debug "clientId: ${clientId()}" + // log.debug "clientSecret: ${clientSecret()}" if(atomicState?.authToken == null && (clientId() == null || clientSecret() == null) ) { return false } else { return true } } @@ -7223,7 +7603,7 @@ def nestDevAccountCheckOk() { | LOGGING AND Diagnostic | *************************************************************************************************/ def LogTrace(msg, logSrc=null) { - def trOn = (appDebug && advAppDebug) ? true : false + def trOn = (settings?.appDebug && settings?.advAppDebug && !settings?.enRemDiagLogging) ? true : false if(trOn) { def logOn = (settings?.enRemDiagLogging && atomicState?.enRemDiagLogging) ? true : false def theLogSrc = (logSrc == null) ? (parent ? "Automation" : "Manager") : logSrc @@ -7232,7 +7612,7 @@ def LogTrace(msg, logSrc=null) { } def LogAction(msg, type="debug", showAlways=false, logSrc=null) { - def isDbg = appDebug ? true : false + def isDbg = (settings?.appDebug && !settings?.enRemDiagLogging) ? true : false def theLogSrc = (logSrc == null) ? (parent ? "Automation" : "Manager") : logSrc if(showAlways) { Logger(msg, type, theLogSrc) } else if(isDbg && !showAlways) { Logger(msg, type, theLogSrc) } @@ -7248,12 +7628,19 @@ def tokenStrScrubber(str) { } def Logger(msg, type, logSrc=null, noSTlogger=false) { + def labelstr = "" + def logOut = true + if(settings?.debugAppendAppName != false) { labelstr = "${app.label} (v${appVersion()}) | " } if(msg && type) { - def labelstr = "" - if(settings?.debugAppendAppName || settings?.debugAppendAppName == null) { labelstr = "${app.label} | " } def themsg = tokenStrScrubber("${labelstr}${msg}") - if(!noSTlogger) { + if(atomicState?.enRemDiagLogging && settings?.enRemDiagLogging && atomicState?.remDiagAppAvailable == true) { + if(saveLogtoRemDiagStore(themsg, type, logSrc) == true) { + logOut = false + } + } + // log.debug "logOut: $logOut | noSTlogger: $noSTlogger" + if(logOut == true && noSTlogger == false) { switch(type) { case "debug": log.debug "${themsg}" @@ -7276,13 +7663,39 @@ def Logger(msg, type, logSrc=null, noSTlogger=false) { } } //log.debug "Logger remDiagTest: $msg | $type | $logSrc" - saveLogtoRemDiagStore(themsg, type, logSrc) } else { log.error "${labelstr}Logger Error - type: ${type} | msg: ${msg} | logSrc: ${logSrc}" } } +def getDiagLogTimeRemaining() { + return sec2PrettyTime((3600*48) - Math.abs((getRemDiagActSec() ?: 0))) +} + +String sec2PrettyTime(Integer timeSec) { + Integer years = Math.floor(timeSec / 31536000); timeSec -= years * 31536000; + Integer months = Math.floor(timeSec / 31536000); timeSec -= months * 2592000; + Integer days = Math.floor(timeSec / 86400); timeSec -= days * 86400; + Integer hours = Math.floor(timeSec / 3600); timeSec -= hours * 3600; + Integer minutes = Math.floor(timeSec / 60); timeSec -= minutes * 60; + Integer seconds = Integer.parseInt((timeSec % 60) as String, 10); + Map dt = [y: years, mn: months, d: days, h: hours, m: minutes, s: seconds] + String dtStr = "" + // dtStr += dt?.y ? "${dt?.y}yr${dt?.y>1?"s":""}, " : "" + // dtStr += dt?.mn ? "${dt?.mn}mon${dt?.mn>1?"s":""}, " : "" + // dtStr += dt?.d ? "${dt?.d}day${dt?.d>1?"s":""}, " : "" + // dtStr += dt?.h ? "${dt?.h}hr${dt?.h>1?"s":""} " : "" + // dtStr += dt?.m ? "${dt?.m}min${dt?.m>1?"s":""} " : "" + // dtStr += dt?.s ? "${dt?.s}sec" : "" + dtStr += dt?.d ? "${dt?.d}d " : "" + dtStr += dt?.h ? "${dt?.h}h " : "" + dtStr += dt?.m ? "${dt?.m}m " : "" + dtStr += dt?.s ? "${dt?.s}s" : "" + return dtStr +} + def saveLogtoRemDiagStore(String msg, String type, String logSrcType=null, frc=false) { - //log.trace "saveLogtoRemDiagStore($msg, $type, $logSrcType)" + def retVal = false + // log.trace "saveLogtoRemDiagStore($msg, $type, $logSrcType)" if(atomicState?.enRemDiagLogging && settings?.enRemDiagLogging) { def turnOff = false def reasonStr = "" @@ -7291,51 +7704,58 @@ def saveLogtoRemDiagStore(String msg, String type, String logSrcType=null, frc=f turnOff = true reasonStr += "was active for last 48 hours " } - if(!atomicState?.appData?.database?.allowRemoteDiag) { - turnOff = true - reasonStr += "appData does not allow" - } - def remDiagApp = getRemDiagApp() } if(turnOff) { saveLogtoRemDiagStore("Diagnostics disabled due to ${reasonStr}", "info", "Manager", true) diagLogProcChange(false) - LogAction("Remote Diagnostics disabled ${reasonStr}", "info", true) + log.info "Remote Diagnostics disabled ${reasonStr}" } else { if(getStateSizePerc() >= 65) { log.warn "saveLogtoRemDiagStore: remoteDiag log storage suspended state size is ${getStateSizePerc()}%" } else { if(msg) { def data = atomicState?.remDiagLogDataStore ?: [] - def item = ["dt":new Date().getTime(), "type":type, "src":(logSrcType ?: "Not Set"), "msg":msg] + def dt = new Date().getTime() + def item = ["dt":dt, "type":type, "src":(logSrcType ?: "Not Set"), "msg":msg] data << item atomicState?.remDiagLogDataStore = data + retVal = true } } def data = atomicState?.remDiagLogDataStore ?: [] def t0 = data?.size() if(t0 && (t0 > 30 || frc || getLastRemDiagSentSec() > 120 || getStateSizePerc() >= 65)) { + def remDiagApp = getRemDiagApp() if(remDiagApp) { remDiagApp?.savetoRemDiagChild(data) - atomicState?.remDiagDataSentDt = getDtNow() + updTimestampMap("remDiagDataSentDt", getDtNow()) + //atomicState?.remDiagDataSentDt = getDtNow() } else { - //diagLogProcChange(false) log.warn "Remote Diagnostics Child app not found" + if(getRemDiagActSec() > 20) { // avoid race that child did not start yet + diagLogProcChange(false) + } + retVal = false } atomicState?.remDiagLogDataStore = [] } } } + return retVal } def fixState() { def result = false - LogAction("fixState", "info", false) + LogTrace("fixState (${atomicState?.pollBlocked}) (${atomicState?.pollBlockedReason})") def before = getStateSizePerc() if(!parent) { if(!atomicState?.resetAllData && resetAllData) { - def data = getState()?.findAll { !(it?.key in ["accessToken", "authToken", "authTokenExpires", "authTokenCreatedDt", "authTokenNum", "enRemDiagLogging", "installationId", "remDiagLogActivatedDt", "installData", "remDiagLogDataStore", "remDiagDataSentDt", "resetAllData", "pollingOn", "apiCommandCnt", "autoMigrationComplete" ]) } + def data = getState()?.findAll { !(it?.key in ["accessToken", "authToken", "authTokenExpires", "timestampDtMap", "authTokenNum", "enRemDiagLogging", + "installationId", "installData", "remDiagLogDataStore", "remDiagDataSentDt", "resetAllData", "pollingOn", "pollBlocked", "ssdpOn", + "pollBLockedReason", "resetAllData", "autoMigrationComplete", "tsMigration", "savedNestSettings", + "apiCommandCnt", "apiStrReqCnt", "apiDevReqCnt", "apiMetaReqCnt", "apiRestStrEvtCnt", "appNotifSentCnt", "structData", "deviceData", + "disableAllAutomations", "automationNestModeEnabled", "automationNestModeEcoActive" ]) } data.each { item -> state.remove(item?.key.toString()) } @@ -7345,6 +7765,9 @@ def fixState() { atomicState.pollingOn = false atomicState?.pollBlocked = true atomicState?.pollBlockedReason = "Repairing State" + toggleAllAutomations() + updTimestampMap("lastChildUpdDt", getDtNow()) // make sure we don't try to force child update too soon + updTimestampMap("lastDevDataUpd", getDtNow()) result = true } else if(atomicState?.resetAllData && !resetAllData) { LogAction("fixState: resetting ALL toggle", "info", true) @@ -7355,19 +7778,23 @@ def fixState() { if(result) { atomicState.resetAllData = true LogAction("fixState: State Data: before: $before after: ${getStateSizePerc()}", "info", true) - runIn(20, "finishFixState", [overwrite: true]) + runIn(22, "finishFixState", [overwrite: true]) } return result } void finishFixState() { - LogAction("finishFixState", "info", false) + LogTrace("finishFixState (${atomicState?.pollBlocked}) (${atomicState?.pollBlockedReason})") + atomicState?.pollBlockedReason = "finishFixState" if(!parent) { if(atomicState?.resetAllData) { + if(atomicState?.notificationPrefs == null) { atomicState?.notificationPrefs = buildNotifPrefMap() } atomicState.devNameOverride = settings?.devNameOverride ? true : false atomicState.useAltNames = settings?.useAltNames ? true : false atomicState.custLabelUsed = settings?.useCustDevNames ? true : false - if(!atomicState?.installData) { atomicState?.installData = ["initVer":appVersion(), "dt":getDtNow().toString(), "updatedDt":"Not Set", "freshInstall":true, "shownDonation":false, "shownFeedback":false, "shownChgLog":true, "usingNewAutoFile":true] } + if(!atomicState?.installData) { + atomicState?.installData = ["initVer":appVersion(), "dt":getDtNow().toString(), "updatedDt":"Not Set", "freshInstall":true, "shownDonation":false, "shownFeedback":false, "shownChgLog":true, "usingNewAutoFile":true, "liteAppMode":isAppLiteMode()] + } getWebFileData() // get the appData and calls setStateVar @@ -7377,20 +7804,8 @@ void finishFixState() { atomicState.structures = settings?.structures ?: null - def structs = getNestStructures() - -/* initManagerApp will do this - if(settings?.structures && atomicState?.structures && !atomicState.structName) { - if(structs && structs?."${atomicState?.structures}") { - atomicState.structName = "${structs[atomicState?.structures]}" - } - } - //def str = getApiData("str") - //def dev = getApiData("dev") - //def meta = getApiData("meta") -*/ + def structs = getNestStructures(true) -// TODO ERS fixDevAS() if(settings?.thermostats || settings?.protects || settings?.cameras || settings?.presDevice || settings?.weatherDevice) { @@ -7399,16 +7814,8 @@ void finishFixState() { atomicState?.setupVersion = atomicState?.appData?.updater?.setupVersion?.toInteger() ?: 0 } else { atomicState.isInstalled = false } - initManagerApp() - -/* initManagerApp does this - def cApps = getChildApps() - if(cApps) { - cApps?.sort()?.each { chld -> - chld?.update() - } - } -*/ + runIn(21, "initManagerApp", [overwrite: true]) // need to give time for watchdog updates before we try to delete devices. + //initManagerApp() } } else { LogAction("finishFixState called as CHILD", "error", true) @@ -7416,6 +7823,7 @@ void finishFixState() { } def fixDevAS() { + LogTrace("fixDevAS") if(settings?.thermostats && !atomicState?.thermostats) { atomicState.thermostats = settings?.thermostats ? statState(settings?.thermostats) : null } if(settings?.protects && !atomicState?.protects) { atomicState.protects = settings?.protects ? coState(settings?.protects) : null } if(settings?.cameras && !atomicState?.cameras) { atomicState.cameras = settings?.cameras ? camState(settings?.cameras) : null } @@ -7425,18 +7833,21 @@ def fixDevAS() { void settingUpdate(name, value, type=null) { LogAction("settingUpdate($name, $value, $type)...", "trace", false) -// try { - //if(name && value && type) { - if(name && type) { - app?.updateSetting("$name", [type: "$type", value: value]) + if(name) { + if(value == "" || value == null || value == []) { + settingRemove(name) + return } - //else if (name && value && type == null){ app?.updateSetting(name.toString(), value) } - else if (name && type == null){ app?.updateSetting(name.toString(), value) } -/* - } catch(e) { - log.error "settingUpdate Exception:", ex } -*/ + if(name && type) { + app?.updateSetting("$name", [type: "$type", value: value]) + } + else if (name && type == null){ app?.updateSetting(name.toString(), value) } +} + +void settingRemove(name) { + LogAction("settingRemove($name)...", "trace", false) + if(name) { app?.deleteSetting("$name") } } def stateUpdate(key, value) { @@ -7450,15 +7861,27 @@ def setStateVar(frc = false) { //the app to create any new state values that might not exist or reset those that do to prevent errors def stateVer = 3 def stateVar = !atomicState?.stateVarVer ? 0 : atomicState?.stateVarVer.toInteger() - if(!atomicState?.stateVarUpd || frc || (stateVer < atomicState?.appData.state.stateVarVer.toInteger())) { + if(!atomicState?.stateVarUpd || frc || (stateVer < atomicState?.appData?.settings?.maintenance?.stateVer?.toInteger())) { if(!atomicState?.newSetupComplete) { atomicState.newSetupComplete = false } if(!atomicState?.setupVersion) { atomicState?.setupVersion = 0 } if(!atomicState?.custLabelUsed) { atomicState?.custLabelUsed = false } if(!atomicState?.useAltNames) { atomicState.useAltNames = false } if(!atomicState?.apiCommandCnt) { atomicState?.apiCommandCnt = 0L } atomicState?.stateVarUpd = true - atomicState?.stateVarVer = atomicState?.appData?.state?.stateVarVer ? atomicState?.appData?.state?.stateVarVer?.toInteger() : 0 + atomicState?.stateVarVer = atomicState?.appData?.settings?.maintenance?.stateVer ? atomicState?.appData?.settings?.maintenance?.stateVer?.toInteger() : 0 + } +} + +def timestampMigration() { + def items = ["apiIssueDt","authTokenCreatedDt", "cmdLastProcDt", "debugEnableDt", "lastApiIssueMsgDt", "lastChildUpdDt", "lastDevDataUpd", "lastFailedCmdMsgDt", "lastForcePoll", "lastForecastUpdDt", + "lastHeardFromNestDt", "lastMetaDataUpd", "lastMisPollMsgDt", "lastStrDataUpd", "lastUpdMsgDt", "lastUpdateMsgDt", "lastWeatherUpdDt", "lastWebUpdDt", "remDiagLogActivatedDt" + ] + def sData = atomicState?.timestampDtMap ?: [:] + items?.each { item-> + if(sData[item] == null) { sData[item] = state[item] } + state.remove(item) } + atomicState?.tsMigration = true } //Things that need to clear up on updates go here @@ -7467,53 +7890,65 @@ def stateCleanup() { def data = [ "exLogs", "pollValue", "pollStrValue", "pollWaitVal", "tempChgWaitVal", "cmdDelayVal", "testedDhInst", "missedPollNotif", "updateMsgNotif", "updChildOnNewOnly", "disAppIcons", "showProtAlarmStateEvts", "showAwayAsAuto", "cmdQlist", "cmdQ", "recentSendCmd", "cmdIsProc", "currentWeather", "altNames", "locstr", "custLocStr", "autoAppInstalled", "nestStructures", "lastSentExceptionDataDt", - "swVersion", "dashSetup", "dashboardUrl", "apiIssues", "stateSize", "haveRun", "lastStMode", "lastPresSenAway", + "swVersion", "dashSetup", "dashboardUrl", "apiIssues", "stateSize", "haveRun", "lastStMode", "lastPresSenAway", "devCodeIdData", "appCodeIdData", "clientBlacklisted", "automationsActive", "temperatures", "powers", "energies", "use24Time", "useMilitaryTime", "advAppDebug", "appDebug", "awayModes", "homeModes", "childDebug", "updNotifyWaitVal", - "appApiIssuesWaitVal", "misPollNotifyWaitVal", "misPollNotifyMsgWaitVal", "devHealthMsgWaitVal", "nestLocAway", "heardFromRestDt", "autoSaVer", "lastAnalyticUpdDt", "lastHeardFromRestDt", - "remDiagApp", "remDiagClientId", "restorationInProgress", "diagManagAppStateFilters", "diagChildAppStateFilters", "lastFinishedPoll", - "curAlerts", "curAstronomy", "curForecast", "curWeather", "detailEventHistory", "detailExecutionHistory", "evalExecutionHistory", "lastForecastUpdDt", "lastWeatherUpdDt", - "lastMsg", "lastMsgDt", "qFirebaseRequested", "qmetaRequested", "debugAppendAppName" + "appApiIssuesWaitVal", "misPollNotifyWaitVal", "misPollNotifyMsgWaitVal", "devHealthMsgWaitVal", "nestLocAway", "heardFromRestDt", "autoSaVer", "lastHeardFromRestDt", + "remDiagApp", "remDiagClientId", "restorationInProgress", "diagManagAppStateFilters", "diagChildAppStateFilters", "lastFinishedPoll","tDevVer", "pDevVer", "camDevVer", "presDevVer", "weatDevVer", "vtDevVer", "streamDevVer", + /* "curAlerts", */ "curAstronomy", /* "curForecast", "curWeather", */ "detailEventHistory", "detailExecutionHistory", "evalExecutionHistory", "lastForecastUpdDt", "lastWeatherUpdDt", + "lastMsg", "lastMsgDt", "qFirebaseRequested", "qmetaRequested", "debugAppendAppName", "ReallyChanged", "tsMigrationDone", "pushTested", "lastDevHealthMsgData" ] - data.each { item -> - state.remove(item?.toString()) - } - data = [ "tDevVer", "pDevVer", "camDevVer", "presDevVer", "weatDevVer", "vtDevVer", "streamDevVer" ] - def sData = atomicState?.swVer ?: [:] - data.each { item -> + ["oldTstat", "oldvTstat", "oldvStat", "oldCamData", "oldProt", "oldPres", "oldWeather", "lastCmdSentDt", "recentSendCmd" ]?.each { oi-> + def oiRem = state?.findAll { it?.key?.toString().startsWith(oi) }.collect { it?.key } + data = data+oiRem + } + data?.each { item -> + //if(state?.containsKey(item)) { state.remove(item?.toString()) } state.remove(item?.toString()) - sData["${item}"] = null } + atomicState.authTokenExpires = atomicState?.tokenExpires ?: atomicState?.authTokenExpires state.remove("tokenExpires") - atomicState.authTokenCreatedDt = atomicState?.tokenCreatedDt ?: atomicState?.authTokenCreatedDt + updTimestampMap("authTokenCreatedDt", (atomicState?.tokenCreatedDt ?: getTimestampVal("authTokenCreatedDt"))) state.remove("tokenCreatedDt") - atomicState?.swVer = sData - if(!atomicState?.cmdQlist) { - data = [ "cmdQ2", "cmdQ3", "cmdQ4", "cmdQ5", "cmdQ6", "cmdQ7", "cmdQ8", "cmdQ9", "cmdQ10", "cmdQ11", "cmdQ12", "cmdQ13", "cmdQ14", "cmdQ15", "lastCmdSentDt2", "lastCmdSentDt3", - "lastCmdSentDt4", "lastCmdSentDt5", "lastCmdSentDt6", "lastCmdSentDt7", "lastCmdSentDt8", "lastCmdSentDt9", "lastCmdSentDt10", "lastCmdSentDt11", "lastCmdSentDt12", "lastCmdSentDt13", - "lastCmdSentDt14", "lastCmdSentDt15", "recentSendCmd2", "recentSendCmd3", "recentSendCmd4", "recentSendCmd5", "recentSendCmd6", "recentSendCmd7", "recentSendCmd8", "recentSendCmd9", - "recentSendCmd10", "recentSendCmd11", "recentSendCmd12", "recentSendCmd13", "recentSendCmd14", "recentSendCmd15" - ] + data = [ "cmdQ0", "cmdQ1", "cmdQ2", "cmdQ3", "cmdQ4", "cmdQ5", "cmdQ6", "cmdQ7", "cmdQ8", "cmdQ9", "cmdQ10", "cmdQ11", "cmdQ12", "cmdQ13", "cmdQ14", "cmdQ15" ] data.each { item -> + //if(state?.containsKey(item)) { state.remove(item?.toString()) } state.remove(item?.toString()) } } + atomicState?.workQrunInActive = false atomicState.forceChildUpd = true - def sdata = [ "showAwayAsAuto", "temperatures", "powers", "energies", "childDevDataPageDev", "childDevPageRfsh", "childDevDataRfshVal", "childDevDataStateFilter", "childDevPageShowAttr", "childDevPageShowCapab", "childDevPageShowCmds", "childDevPageShowState", - "managAppPageRfsh", "managAppPageShowMeta", "managAppPageShowSet", "managAppPageShowState", "updChildOnNewOnly" + def remSettings = [ "showAwayAsAuto", "temperatures", "powers", "energies", "childDevDataPageDev", "childDevPageRfsh", "childDevDataRfshVal", "childDevDataStateFilter", "childDevPageShowAttr", + "childDevPageShowCapab", "childDevPageShowCmds", "childDevPageShowState", "managAppPageRfsh", "managAppPageShowMeta", "managAppPageShowSet", "managAppPageShowState", "updChildOnNewOnly", + "locDesiredButton", "locDesiredTempScale", "recipients", "enableDashboard" ] - sdata.each { item -> - if(settings?."${item}" != null) { - settingUpdate("${item.toString()}", "") // clear settings + List camMotionSets = settings?.keySet()?.findAll { it?.toString()?.startsWith("camera_") && it?.toString()?.endsWith("_zones") }?.collect { it as String } + if(camMotionSets?.size()) { + if(settings?.camEnMotionZoneFltr) { + atomicState?.cameras?.keySet()?.each { cam-> if(camMotionSets?.find {"camera_${cam}_zones"}) { camMotionSets = camMotionSets - "camera_${cam}_zones" } } } + remSettings = remSettings+camMotionSets + } + remSettings.each { item -> + //if(settings?.containsKey(item)) { + settingRemove(item.toString()) // removes settings + //} } + runIn(25, "cleanStorage", [overwrite: true]) // calling the child truncates logs +} + +def cleanStorage() { + remStorageVal("curForecast") + remStorageVal("curAstronomy") + remStorageVal("curWeather") + remStorageVal("curAlerts") } /****************************************************************************** -* STATIC METHODS * +* STATIC METHODS * *******************************************************************************/ def getThermostatChildName() { return getChildName("Nest Thermostat") } def getProtectChildName() { return getChildName("Nest Protect") } @@ -7522,8 +7957,9 @@ def getWeatherChildName() { return getChildName("Nest Weather") } def getCameraChildName() { return getChildName("Nest Camera") } def getAutoAppChildName() { return getChildName(autoAppName()) } -def getWatDogAppChildName() { return getChildName("Nest Location ${location.name} Watchdog") } -def getRemDiagAppChildName() { return getChildName("NST Diagnostics") } +def getWatDogAppChildLabel() { return getChildName("Nest Location ${location.name} Watchdog") } +def getRemDiagAppChildLabel() { return getChildName("NST Location ${location.name} Diagnostics") } +def getStorageAppChildLabel() { return getChildName("NST Location ${location.name} Storage") } def getChildName(str) { return "${str}${appDevName()}" } @@ -7538,7 +7974,11 @@ def getIssuePageUrl() { return "https://github.com/tonesto7/nest-manager/issues def slackMsgWebHookUrl() { return "https://hooks.slack.com/services/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" } def getAutoHelpPageUrl() { return "http://thingsthataresmart.wiki/index.php?title=NST_Manager#Nest_Automations" } def weatherApiKey() { return "b82aba1bb9a9d7f1" } -def getFirebaseAppUrl() { return "https://st-nest-manager.firebaseio.com" } +def getFbLegacyAppUrl() { return "https://st-nest-manager.firebaseio.com" } +def getFbMetricsUrl() { return atomicState?.appData?.settings?.database?.metricsUrl ?: "https://nst-manager-metrics.firebaseio.com" } +def getFbExceptionsUrl() { return atomicState?.appData?.settings?.database?.exceptionUrl ?: "https://nst-manager-exceptions.firebaseio.com" } +def getAppSettingsUrl() { return "https://raw.githubusercontent.com/${gitPath()}/Data/appConfig.json" } +def getAppSettingsFBUrl() { return "https://st-nest-manager.firebaseio.com/appSettings.json" } def getAppImg(imgName, on = null) { return (!disAppIcons || on) ? "https://raw.githubusercontent.com/tonesto7/nest-manager/${gitBranch()}/Images/App/$imgName" : "" } def getDevImg(imgName, on = null) { return (!disAppIcons || on) ? "https://raw.githubusercontent.com/tonesto7/nest-manager/${gitBranch()}/Images/Devices/$imgName" : "" } private Integer convertHexToInt(hex) { Integer.parseInt(hex,16) } @@ -7559,12 +7999,12 @@ def getStateSize() { return resultJson?.toString().length() //return state?.toString().length() } -def getStateSizePerc() { return (int) ((stateSize / 100000)*100).toDouble().round(0) } // +def getStateSizePerc() { return (int) ((stateSize / 100000)*100).toDouble().round(0) } -def debugStatus() { return !appDebug ? "Off" : "On" } -def deviceDebugStatus() { return !childDebug ? "Off" : "On" } -def isAppDebug() { return !appDebug ? false : true } -def isChildDebug() { return !childDebug ? false : true } +def debugStatus() { return !settings?.appDebug ? "Off" : "On" } +def deviceDebugStatus() { return !settings?.childDebug ? "Off" : "On" } +def isAppDebug() { return !settings?.appDebug ? false : true } +def isChildDebug() { return !settings?.childDebug ? false : true } def getLocationModes() { def result = [] @@ -7634,7 +8074,7 @@ def getObjType(obj, retType=false) { else { return "unknown"} } -def getShowHelp() { return atomicState?.showHelp == false ? false : true } +def getShowHelp() { return true } def getTimeZone() { def tz = null @@ -7653,19 +8093,35 @@ def formatDt(dt) { return tf.format(dt) } -def formatDt2(tm) { - def formatVal = settings?.useMilitaryTime ? "MMM d, yyyy - HH:mm:ss" : "MMM d, yyyy - h:mm:ss a" +def formatDt2(tm, fmt=null) { + def formatVal = fmt == null ? (settings?.useMilitaryTime ? "MMM d, yyyy - HH:mm:ss" : "MMM d, yyyy - h:mm:ss a") : fmt def tf = new SimpleDateFormat(formatVal) if(getTimeZone()) { tf.setTimeZone(getTimeZone()) } return tf.format(Date.parse("E MMM dd HH:mm:ss z yyyy", tm.toString())) } +private getTimeSeconds(timeKey, defVal, meth) { + def t0 = getTimestampVal(timeKey) + return !t0 ? defVal : GetTimeDiffSeconds(t0, null, meth).toInteger() +} + +void updTimestampMap(keyName, dt=null) { + def data = atomicState?.timestampDtMap ?: [:] + if(keyName) { data[keyName] = dt } + atomicState?.timestampDtMap = data +} + +def getTimestampVal(val) { + def tsData = atomicState?.timestampDtMap + if(val && tsData && tsData[val]) { return tsData[val] } + return null +} + def GetTimeDiffSeconds(strtDate, stpDate=null, methName=null) { //LogTrace("[GetTimeDiffSeconds] StartDate: $strtDate | StopDate: ${stpDate ?: "Not Sent"} | MethodName: ${methName ?: "Not Sent"})") if((strtDate && !stpDate) || (strtDate && stpDate)) { //if(strtDate?.contains("dtNow")) { return 10000 } - def now = new Date() - def stopVal = stpDate ? stpDate.toString() : formatDt(now) + def stopVal = stpDate ? stpDate.toString() : getDtNow() //formatDt(now) /* def startDt = Date.parse("E MMM dd HH:mm:ss z yyyy", strtDate) def stopDt = Date.parse("E MMM dd HH:mm:ss z yyyy", stopVal) @@ -7673,7 +8129,7 @@ def GetTimeDiffSeconds(strtDate, stpDate=null, methName=null) { */ def start = Date.parse("E MMM dd HH:mm:ss z yyyy", strtDate).getTime() def stop = Date.parse("E MMM dd HH:mm:ss z yyyy", stopVal).getTime() - def diff = (int) (long) (stop - start) / 1000 // + def diff = (int) (long) (stop - start) / 1000 LogTrace("[GetTimeDiffSeconds] Results for '$methName': ($diff seconds)") return diff } else { return null } @@ -7689,29 +8145,22 @@ def daysOk(days) { // parent only Method def notificationTimeOk() { -// try { - def strtTime = null - def stopTime = null - def now = new Date() - def sun = getSunriseAndSunset() // current based on geofence, previously was: def sun = getSunriseAndSunset(zipCode: zipCode) - if(settings?.qStartTime && settings?.qStopTime) { - if(settings?.qStartInput == "sunset") { strtTime = sun.sunset } - else if(settings?.qStartInput == "sunrise") { strtTime = sun.sunrise } - else if(settings?.qStartInput == "A specific time" && settings?.qStartTime) { strtTime = settings?.qStartTime } - - if(settings?.qStopInput == "sunset") { stopTime = sun.sunset } - else if(settings?.qStopInput == "sunrise") { stopTime = sun.sunrise } - else if(settings?.qStopInput == "A specific time" && settings?.qStopTime) { stopTime = settings?.qStopTime } - } else { return true } - if(strtTime && stopTime) { - return timeOfDayIsBetween(strtTime, stopTime, new Date(), getTimeZone()) ? false : true - } else { return true } -/* - } catch (ex) { - log.error "notificationTimeOk Exception:", ex - sendExceptionData(ex, "notificationTimeOk") - } -*/ + def strtTime = null + def stopTime = null + def now = new Date() + def sun = getSunriseAndSunset() // current based on geofence, previously was: def sun = getSunriseAndSunset(zipCode: zipCode) + if(settings?.qStartTime && settings?.qStopTime) { + if(settings?.qStartInput == "sunset") { strtTime = sun.sunset } + else if(settings?.qStartInput == "sunrise") { strtTime = sun.sunrise } + else if(settings?.qStartInput == "A specific time" && settings?.qStartTime) { strtTime = settings?.qStartTime } + + if(settings?.qStopInput == "sunset") { stopTime = sun.sunset } + else if(settings?.qStopInput == "sunrise") { stopTime = sun.sunrise } + else if(settings?.qStopInput == "A specific time" && settings?.qStopTime) { stopTime = settings?.qStopTime } + } else { return true } + if(strtTime && stopTime) { + return timeOfDayIsBetween(strtTime, stopTime, new Date(), getTimeZone()) ? false : true + } else { return true } } def time2Str(time) { @@ -7725,7 +8174,7 @@ def time2Str(time) { def epochToTime(tm) { def tf = new SimpleDateFormat("h:mm a") - tf?.setTimeZone(getTimeZone()) + tf.setTimeZone(getTimeZone()) return tf.format(tm) } @@ -7763,7 +8212,7 @@ def notifValEnum(allowCust = false) { def pollValEnum(device=false) { def vals = [:] - if(device && inReview()) { vals = [ 30:"30 Seconds" ] } + // if(device && inReview()) { vals = [ 30:"30 Seconds" ] } vals << [ 60:"1 Minute", 120:"2 Minutes", 180:"3 Minutes", 240:"4 Minutes", 300:"5 Minutes", 600:"10 Minutes", 900:"15 Minutes", 1200:"20 Minutes", 1500:"25 Minutes", @@ -7797,7 +8246,7 @@ def strCapitalize(str) { def getInputEnumLabel(inputName, enumName) { def result = "Not Set" - if(input && enumName) { + if(inputName && enumName) { enumName.each { item -> if(item?.key.toString() == inputName?.toString()) { result = item?.value @@ -7822,28 +8271,15 @@ def minDevVer2Str(val) { } } -/* -def b64Action(String str, dec=false) { - if (str) { - if(dec) { - return (String) str?.bytes?.decodeBase64() - } else { - return (String) str?.bytes?.encodeBase64(true) - } - } -} -*/ - /****************************************************************************** -* DIAGNOSTIC & NEST API INFO PAGES * +* DIAGNOSTIC & NEST API INFO PAGES * *******************************************************************************/ -def alarmTestPage () { +def alarmTestPage() { def execTime = now() dynamicPage(name: "alarmTestPage", install: false, uninstall: false) { if(atomicState?.protects) { section("Select Carbon/Smoke Device to Test:") { - input(name: "alarmCoTestDevice", title:"Select the Protect to Test", type: "enum", required: false, multiple: false, submitOnChange: true, - metadata: [values:atomicState?.protects], image: getAppImg("protect_icon.png")) + input name: "alarmCoTestDevice", title:"Select the Protect to Test", type: "enum", required: false, multiple: false, submitOnChange: true, metadata: [values:atomicState?.protects], image: getAppImg("protect_icon.png") } if(settings?.alarmCoTestDevice) { section("Select the Event to Generate:") { @@ -7882,16 +8318,16 @@ def alarmTestPage () { } } } + devPageFooter("protTestLoadCnt", execTime) } - devPageFooter("protTestLoadCnt", execTime) } void resetAlarmTest() { LogAction("Resetting Protect Alarm Test back to the default.", "info", true) - settingUpdate("alarmCoTestDevice", "") - settingUpdate("alarmCoTestDeviceSimSmoke", "false") - settingUpdate("alarmCoTestDeviceSimCo", "false") - settingUpdate("alarmCoTestDeviceSimLowBatt", "false") + settingRemove("alarmCoTestDevice") + settingRemove("alarmCoTestDeviceSimSmoke") + settingRemove("alarmCoTestDeviceSimCo") + settingRemove("alarmCoTestDeviceSimLowBatt") atomicState?.isAlarmCoTestActive = false atomicState?.curProtTestPageData = null } @@ -8044,52 +8480,66 @@ def sendFeedbackPage() { } } -def createManagerBackupDataJson() { - def noShow = ["authToken", "accessToken", "curAlerts", "curAstronomy", "curForecast", "curWeather"] - def sData = getSettings()?.sort()?.findAll { !(it.key in noShow) } - def setData = [:] - sData?.sort().each { item -> - setData[item?.key] = item?.value - } - def stData = getState()?.sort()?.findAll { !(it.key in noShow) } - def stateData = [:] - stData?.sort().each { item -> - stateData[item?.key] = item?.value +def procDiagCmd() { + def status = [:] + def rData = request?.JSON + // log.trace "procDiagCmd($rData)" + if(rData) { + status["code"] = 200 + if(rData?.cmd) { + switch(rData?.cmd) { + case "stateCleanup": + LogAction("Web Diagnostic Command (${rData?.cmd} received... Running stateCleanup() in 3 seconds", "debug", true) + runIn(3, "stateCleanup", [overwrite: true]) + break + case "runUpdated": + LogAction("Web Diagnostic Command (${rData?.cmd} received... Running update() Method in 3 seconds", "debug", true) + runIn(3, "updated", [overwrite: true]) + break + case "sendFirebaseData": + LogAction("Web Diagnostic Command (${rData?.cmd} received... Running sendInstallData() Method in 3 seconds", "debug", true) + runIn(3, "sendInstallData", [overwrite: true]) + break + } + } } - def result = ["settingsData":setData, "stateData":stateData, "backupDt":getDtNow().toString()] - def resultJson = new groovy.json.JsonOutput().toJson(result) - return resultJson + return [contentType: 'application/json', gotData: (rData != null), status: status?.code] } def getDeviceMetricCnts() { def data = [:] def devs = app.getChildDevices(true) if(devs?.size() >= 1) { - devs?.each { dev -> - def mData = dev?.getMetricCntData() - if(mData != null) { - //log.debug "mData: ${mData}" - mData?.each { md -> - def objKey = md?.key.toString() - def objVal = md?.value?.toInteger() ?: 0 - if(data?.containsKey("${objKey}")) { - def newVal = 0 - def prevVal = data?.get("${objKey}") ?: 0 - newVal = prevVal?.toInteger()+objVal - //log.debug "$objKey Data: [prevVal: $prevVal | objVal: $objVal | newVal: $newVal]" - data << ["${objKey}":newVal] - } else { - data << ["${objKey}":objVal] + try { + devs?.each { dev -> + def mData = dev?.getMetricCntData() + if(mData != null) { + //log.debug "mData: ${mData}" + mData?.each { md -> + def objKey = md?.key.toString() + def objVal = md?.value?.toInteger() ?: 0 + if(data?.containsKey("${objKey}")) { + def newVal = 0 + def prevVal = data?.get("${objKey}") ?: 0 + newVal = prevVal?.toInteger()+objVal + //log.debug "$objKey Data: [prevVal: $prevVal | objVal: $objVal | newVal: $newVal]" + data << ["${objKey}":newVal] + } else { + data << ["${objKey}":objVal] + } } } } + } catch (ex) { + log.error "getDeviceMetricCnts", ex + sendExceptionData(ex, "getDeviceMetricCnts") } } //log.debug "data: ${data}" return data } /****************************************************************************** -* Firebase Analytics Functions * +* Firebase Analytics Functions * *******************************************************************************/ def createInstallDataJson(returnMap=false) { try { @@ -8132,15 +8582,15 @@ def createInstallDataJson(returnMap=false) { if(settings?.optInAppAnalytics || settings?.optInAppAnalytics == null) { data = [ "guid":atomicState?.installationId, "beta":betaMarker(), "versions":versions, "thermostats":tstatCnt, "protects":protCnt, "vthermostats":vstatCnt, "cameras":camCnt, "appErrorCnt":appErrCnt, "devErrorCnt":devErrCnt, - "installDt": atomicState?.installData?.dt, "updatedDt": atomicState?.installData?.updatedDt, "automations":automations, "timeZone":tz, "apiCmdCnt":apiCmdCnt, "apiStrReqCnt":apiStrReqCnt, - "apiDevReqCnt":apiDevReqCnt, "apiMetaReqCnt":apiMetaReqCnt, "appNotifSentCnt":appNotifSentCnt, "apiRestStrEvtCnt":apiRestStrEvtCnt, "appUseMetCnt":appUseMetCnt, "devUseMetCnt":devUseMetCnt, - "stateUsage":"${getStateSizePerc()}%", "mobileClient":cltType, "datetime":getDtNow()?.toString(), "optOut":false + "installDt": atomicState?.installData?.dt, "updatedDt": atomicState?.installData?.updatedDt, "automations":automations, "timeZone":tz, "apiCmdCnt":apiCmdCnt, "apiStrReqCnt":apiStrReqCnt, "apiDevReqCnt":apiDevReqCnt, + "apiMetaReqCnt":apiMetaReqCnt, "appNotifSentCnt":appNotifSentCnt, "apiRestStrEvtCnt":apiRestStrEvtCnt, "appUseMetCnt":appUseMetCnt, "devUseMetCnt":devUseMetCnt,"stateUsage":"${getStateSizePerc()}%", "mobileClient":cltType, + "liteAppMode": isAppLiteMode(), "datetime":getDtNow()?.toString(), "optOut":false ] } else { data = [ "guid":atomicState?.installationId, "beta":betaMarker(), "versions":versions, "thermostats":tstatCnt, "protects":protCnt, "vthermostats":vstatCnt, "cameras":camCnt, "appErrorCnt":appErrCnt, "devErrorCnt":devErrCnt, - "apiStrReqCnt":apiStrReqCnt, "apiDevReqCnt":apiDevReqCnt, "apiMetaReqCnt":apiMetaReqCnt, "installDt": atomicState?.installData?.dt, "updatedDt": atomicState?.installData?.updatedDt, - "automations":automations, "timeZone":tz, "apiCmdCnt":apiCmdCnt, "apiRestStrEvtCnt":apiRestStrEvtCnt, "stateUsage":"${getStateSizePerc()}%", "datetime":getDtNow()?.toString(), "optOut":true + "apiStrReqCnt":apiStrReqCnt, "apiDevReqCnt":apiDevReqCnt, "apiMetaReqCnt":apiMetaReqCnt, "installDt": atomicState?.installData?.dt, "updatedDt": atomicState?.installData?.updatedDt,"automations":automations, + "liteAppMode": isAppLiteMode(), "timeZone":tz, "apiCmdCnt":apiCmdCnt, "apiRestStrEvtCnt":apiRestStrEvtCnt, "stateUsage":"${getStateSizePerc()}%", "datetime":getDtNow()?.toString(), "optOut":true ] } if(returnMap == true) { @@ -8207,13 +8657,52 @@ def getStateData() { def lastCmdDesc() { def cmdDesc = "" def map = [:] - map["DateTime"] = atomicState?.lastCmdSentDt ?: "Nothing found" + map["DateTime"] = getTimestampVal("lastCmdSentDt") ?: "Nothing found" map["Cmd Sent"] = atomicState?.lastCmdSent ?: "Nothing found" map["Cmd Result"] = atomicState?.lastCmdSentStatus ? "(${atomicState?.lastCmdSentStatus})" : "(Nothing found)" cmdDesc += getMapDescStr(map) return cmdDesc } +def getWebHeaderHtml(title, clipboard=true, vex=false, swiper=false, charts=false) { + def html = """ + + + + + + + + + + NST Diagnostics (${atomicState?.structName}) - ${title} + + + + + + + + + + + + """ + html += clipboard ? """""" : "" + html += vex ? """""" : "" + html += swiper ? """""" : "" + html += vex ? """""" : "" + html += vex ? """""" : "" + html += swiper ? """""" : "" + html += charts ? """""" : "" + html += vex ? """""" : "" + + return html +} + def renderDiagHome() { try { def remDiagUrl = getAppEndpointUrl("diagHome") @@ -8223,6 +8712,11 @@ def renderDiagHome() { def deviceUrl = getAppEndpointUrl("getDeviceData") def appDataUrl = getAppEndpointUrl("getAppData") def instDataUrl = getAppEndpointUrl("getInstData") + def devTilesUrl = getAppEndpointUrl("deviceTiles") + def tstatTilesUrl = getAppEndpointUrl("tstatTiles") + def protTilesUrl = getAppEndpointUrl("protectTiles") + def camTilesUrl = getAppEndpointUrl("cameraTiles") + def weatherTilesUrl = getAppEndpointUrl("weatherTile") def sPerc = getStateSizePerc() ?: 0 def instData = atomicState?.installData def cmdDesc = lastCmdDesc().toString().replaceAll("\n", "
") @@ -8230,31 +8724,15 @@ def renderDiagHome() { //log.debug "newHtml: $newHtml" def html = """ - - - - - - NST Diagnostics ${atomicState?.structName} - - - - - - - - - - + ${getWebHeaderHtml("Location")} - - + - +
@@ -8263,7 +8741,7 @@ def renderDiagHome() {
-

Diagnostics Home (${atomicState?.structName})

+

Diagnostics Home

@@ -8275,9 +8753,8 @@ def renderDiagHome() {
- - -
+ +
@@ -8285,7 +8762,7 @@ def renderDiagHome() {

Install Details:

-
+
@@ -8303,12 +8780,7 @@ def renderDiagHome() {
Install ID:
${atomicState?.installationId}
-
- Token Num:
${atomicState?.authTokenNum ?: "Not Found"}
-
-
- API Token Ver:
${atomicState?.metaData?.client_version}
-
+
Install Date:
${instData?.dt}
@@ -8336,7 +8808,7 @@ def renderDiagHome() {
-
+

Last Command Info:

@@ -8352,11 +8824,11 @@ def renderDiagHome() {
-
-
+
+

Shortcuts

-
-
+
+

View Logs

Manager Data

@@ -8368,20 +8840,51 @@ def renderDiagHome() {

AppData File

-
+
+ +
+
+

Diagnostic Commands

+
+ +
+ +
+
+

Device Tiles

+
+
+
+

All Devices

+ ${atomicState?.thermostats ? """

Thermostat Devices

""" : ""} + ${atomicState?.protects ? """

Protect Devices

""" : ""} +
+
+ ${atomicState?.cameras ? """

Camera Devices

""" : ""} + ${atomicState?.weatherDevice ? """

Weather Device

""" : ""} +
+
+
-
+
External Access URL:
-
+
-
- +
+ """ +/* """ */ render contentType: "text/html", data: html } catch (ex) { log.error "renderDiagUrl Exception:", ex } } @@ -8502,36 +9005,31 @@ def renderManagerData() { def metaDesc = getMapDescStr(getMetadata()) def html = """ - - - - - - - - - - NST Diagnostics ${atomicState?.structName} - Manager Data - - - - - - - - - - - - - - - + ${getWebHeaderHtml("Manager Data")} + - +
-

Manager Data ${atomicState?.structName}

+

Manager Data

-
+
-
+
@@ -8586,48 +9084,58 @@ def renderManagerData() {
-
- -
-
+
+
+

Setting Data:

-
-
+
+
${setDesc.toString().replaceAll("\n", "
")}
-
-
+
+
-
-
+
+

State Data:

-
-
+
+
${stateDesc.toString().replaceAll("\n", "
")}
-
-
+
+
-
-
+
+

Meta Data:

-
-
+
+
${metaDesc.toString().replaceAll("\n", "
")}
-
-
- +
+
-
+
-
-
+
+
- - + + """ @@ -8653,76 +9161,52 @@ def renderAutomationData() { def metaDesc = getMapDescStr(cApp?.getMetadata()) appHtml += """
-
+

${cApp?.getLabel()}:

-
-
+
+
-
-
+
+

Setting Data:

-
-
+
+
${setDesc.toString().replaceAll("\n", "
")}
-
+
-
-
+
+

State Data:

-
-
+
+
${stateDesc.toString().replaceAll("\n", "
")}
-
-
+
+
-
-
+
+

Meta Data:

-
-
+
+
${metaDesc.toString().replaceAll("\n", "
")}
-
-
+
+
-
+
""" appNum = appNum+1 } def html = """ - - - - - - - - - - NST Diagnostics ${atomicState?.structName} - Automation Data - - - - - - - - - - - - - - - + ${getWebHeaderHtml("Automation Data")} + - +
-

Automation Data ${atomicState?.structName}

+

Automation Data

@@ -8761,21 +9245,34 @@ def renderAutomationData() {
-
+
${appHtml}
-
- - + + """ + /* """ */ render contentType: "text/html", data: html } catch (ex) { log.error "renderAutomationData Exception:", ex } } @@ -8844,58 +9341,57 @@ def renderDeviceData() { commDesc += "${cnt>1 ? "\n\n" : "\n"} • ${cmd.name}(${!cmd?.arguments ? "" : cmd?.arguments.toString().toLowerCase().replaceAll("\\[|\\]", "")})" cnt = cnt+1 } - def data = dev?.capabilities?.sort()?.collect {it as String} def t0 = [ "capabilities":data ] def capDesc = getMapDescStr(t0) devHtml += """
-

${dev?.getLabel()}:

+

${dev?.getLabel()}:

-
-
+
+

Setting Data:

-
-
+
+
${setDesc.toString().replaceAll("\n", "
")}
-
-
-
-
+
+
+
+

State Data:

-
-
+
+
${stateDesc.toString().replaceAll("\n", "
")}
-
-
-
-
+
+
+
+

Attribute Data:

-
-
+
+
${attrDesc.toString().replaceAll("\n", "
")}
-
-
-
-
-

Command Data:

+
+
+
+
+

Command Data:

-
${commDesc.toString().replaceAll("\n", "
")}
+
${commDesc.toString().replaceAll("\n", "
")}
-
+
-

Capability Data:

+

Capability Data:

-
${capDesc.toString().replaceAll("\n", "
")}
+
${capDesc.toString().replaceAll("\n", "
")}
-
+
""" @@ -8903,37 +9399,17 @@ def renderDeviceData() { } def html = """ - - - - - - - - - - NST Diagnostics ${atomicState?.structName} - Automation Data - - - - - - - - - - - - - - - + ${getWebHeaderHtml("Device Data", true, true, true, true)} + - +
-

Device Data ${atomicState?.structName}

+

Device Data

@@ -8972,21 +9448,165 @@ def renderDeviceData() {
-
+
${devHtml}
- - + + + + """ + /* """ */ + log.debug apiServerUrl("/api/rooms") + render contentType: "text/html", data: html + } catch (ex) { log.error "renderDeviceData Exception:", ex } +} + +def getTstatTiles() { + return renderDeviceTiles("Nest Thermostat") +} + +def getProtectTiles() { + return renderDeviceTiles("Nest Protect") +} + +def getCamTiles() { + return renderDeviceTiles("Nest Camera") +} + +def getWeatherTile() { + return renderDeviceTiles("Nest Weather") +} + +def renderDeviceTiles(type=null) { + try { + def devHtml = "" + def navHtml = "" + def scrStr = "" + def devices = app.getChildDevices(true) + def devNum = 1 + devices?.sort {it?.getLabel()}.each { dev -> + def navMap = [:] + def hasHtml = (dev?.hasHtml() == true) + if((hasHtml && !type) || (hasHtml && type && dev?.name == type)) { + navMap = ["key":dev?.getLabel(), "items":[]] + def navItems = navHtmlBuilder(navMap, devNum) + if(navItems?.html) { navHtml += navItems?.html } + if(navItems?.js) { scrStr += navItems?.js } + devHtml += """ +
+
+

${dev?.getLabel()}: (v${dev?.devVer()})

+
+
+
+
${dev?.getDeviceTile(devNum)}
+
+
+
+ """ + } + devNum = devNum+1 + } + + def html = """ + + ${getWebHeaderHtml(type, true, true, true, true)} + + + + + + + +
+ + +
+ + +
+
+
+ ${devHtml} +
+
+
+
+ + + + \$("#goHomeBtn").click(function() { + closeNavMenu(); + toggleMenuBtn(); + window.location.replace('${getAppEndpointUrl("diagHome")}'); + }); + """ +/* """ */ render contentType: "text/html", data: html } catch (ex) { log.error "renderDeviceData Exception:", ex } } @@ -9004,31 +9624,8 @@ def renderHtmlMapDesc(title, heading, datamap) { def navHtml = "" def html = """ - - - - - - - - - - NST Diagnostics ${atomicState?.structName} - ${title} - - - - - - - - - - - - - - - + ${getWebHeaderHtml(title)} + @@ -9062,7 +9659,7 @@ def renderHtmlMapDesc(title, heading, datamap) {