[unsupported] custom DTH and webCoRE pistons for grouping like sensors and giving 1 aggregated status for the group

Edit 8/2020:
This is now unsupported as I have moved to hubitat and have no interest in updating my custom dth for the new smartthings app.

I will keep my github files available for anyone who wants them.

===

edit to put install instructions at the top:

Install Steps:

  1. Install (and publish) Master and Child DTH from github repo
    1.5. Github : michaelbarone
    name: smartThings
    Branch: master
  2. Create new Device in smartthings ide, assign one of the Master DTH depending on use (contact/temperature)
  3. the most recent import code for webcore is in the top header section of the DTH. import/create the webCoRE pistons, and update the variables for the new custom device created in step 2 above and all the physical sensors for each group as needed in the pistons
  4. use the refresh button in the new device created in step 2 to run the piston and auto create the child devices.

I have pulled this together using examples from the smartthings forum, webCoRE forum and other places. I wanted to get this posted and will be adding attribution at a later time, but a general thanks for all who share code/expertise and help us progress.

Utilizing webCoRE (pistons posted below), these DTH and child DTH (in github posted below) allow the grouping of similar sensors, like contact and temperature sensors, to show you an aggregated summary of the group through 1 simulated device like the “All Exterior Doors” and “Ave [group] Temp” things in my favorites below:

Grouped contact sensors:

Grouped temperature sensors:

===============================

There is an option below all of the child devices, to “REMOVE CHILDREN”. You can use this to remove all child devices, this can be useful instead of removing the device to force deleting all children. Saves time when adding/removing devices from groups and child devices persist for devices no longer in the group.

NOTE: when clicking on the “REMOVE CHILDREN” button, you will notice the status text (next to the refresh button) change to reflect the command has been issued. It can take a little while for the child devices to be removed from view. You might need to go to the main screen and back into the parent item for the children to be gone.

When first loading the parent (master) devices or after the “REMOVE CHILDREN” command has been used, you can re-populate the child devices by clicking the refresh button. This refresh button also manually forces an update to the group in daily use. The child devices will also be create automatically the next time the webCoRE piston runs.

As with the “REMOVE CHILDREN” function, it can take a little while for the children to appear when they get created as well, so give it a little time to refresh on its own, or go back to the main screen and navigate back to this item to try and force it.

=========================================

Install Steps:

  1. Install Master and Child DTH from github repo
  2. Create new Device in smartthings ide, assign one of the Master DTH depending on use (contact/temperature)
  3. import/create the webCoRE pistons, and update the variables for the new devices created in 2 above and all the physical items for each group as needed in the pistons
  4. use the refresh button in one of the new devices created in 2 to run the piston and create the child devices.

let me know what you think, or if you need additional help getting it setup. I will update the install steps as needed.

Here is a link to my github with the DTH files in it:

All WebCoRE import codes for each device handler are in the device handler header section (top part of DTH). Look there for the updated import codes.

8 Likes

This looks great! 
 Thanks @mbarone!

ActionTiles Customers frequently are looking for a way to create “consolidated sensor” Tile(s), and we prefer to recommend starting at the SmartThings side with either a SmartApp or webCoRE, that way we don’t create a partial solution that is only usable within ActionTiles.

Average Temperature from this Piston can be used as a Thermostat trigger and stuff like that, whereas if it was just done in the front-end, that ability would be lost.

(Tagging @625alex, so he’s aware of this utility.)

3 Likes

Got around to trying this out. I’m having an issue with installing the Master DTH for temperature. I’m getting this error when creating the DTH

Org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: script_dth_metadata_433d24a1_9ba9_48e7_a94d_780e2092712f: 48: expecting ')', found 'backgroundColors' @ line 48, column 6. backgroundColors:[ ^ 1 error

sorry about that, i got rid of a comma on the end of line 47 somehow when i was commenting out log lines before i created this thread. I didnt test this one after updating. it has been fixed in github.

let me know if there are any other issues or things that would be helpful to include.

1 Like

This looks great. I don’t know how to install it. Do I copy each groovy file as a Device handler?

Or ideally import from git repo? I tried this method
and I must be missing something.

Ya, for now, a manual copy/install is needed. I dont think I structured my github folders properly for it to work through linking my github to smartthings.

Ill be looking at fixing my github folders soon as I have been working on a few other dth like this I wanted to share.

I installed all the DTH’s. Which one need to be published? All?

Then what?

Install Steps:

  1. Install (and publish) Master and Child DTH from github repo
  2. Create new Device in smartthings ide, assign one of the Master DTH depending on use (contact/temperature)
  3. the most recent import code for webcore is in the top header section of the DTH. import/create the webCoRE pistons, and update the variables for the new custom device created in step 2 above and all the physical sensors for each group as needed in the pistons
  4. use the refresh button in the new device created in step 2 to run the piston and auto create the child devices.

I downloaded the device handlers and created one device for temperature but the device shows as a device but all it is doing is refreshing since I created the device. It has been at least 10 minutes
What needs to be done?

first, I havnt had time to get these fully functional with the new smartthings app. The child devices, refresh button, remove child device button and status text will not display until I create a custom vid handler for it, and custom capabilities was just released this week and will take some time to play around with it.

Currently in the new smartthings app, this device will only show the average temperature, or combined status of open/closed depending on which master dth you use. None of the child devices show like in the classic app. And the classic app must be used to remove child devices or force a refresh.

Did you get the webcore piston setup and update your variables after creating the master temperature virtual device? if you are only using the new app, the webcore piston refreshes every 20 minutes, so you wont get data before that unless you run the piston manually, or use the refresh button from the classic smartthings app.

Yes I got the webcore piston loaded and both device handlers. Then I added a device named downstairsGroup , and in Classic App it shows up, but when I press the refresh button it just sits on refreshing endlessly.
In case I want to start all over again, where is your original piston to use? I found it originally, but didn’t save it separately, only saved what I had done the first time. Thanks so much

The most recent piston import code is in the header of the master DTH (this may get updated as bugs are found so I would always import from the DTH code).
The current import code for the temperature dth is: hi0z7

I have not tested this without all 4 device groups having defined devices. You may need to enable piston logging and see if the piston is failing because some devices are not defined.

Is the piston state updating with a temperature for your group?

I just ran a test with a new import of the piston using a new virtual device with the DTH master as ‘upstairsDevice’ with 2 temperature sensors in ‘upstairsGroup’ with no other changes to the piston and it seems to function ok.

Edit: you do need to add the device to webcore’s available device list and set it in the piston.

Here you can see the ave temperature group master DTH is assigned to device “Zztesttempgroup” and I have 2 temperature sensors assigned to the group in the piston. the piston state is updated, but only includes temperature readout for the group with defined devices. I ran the piston both manually using the “Test” button in webcore, and using the refresh button in the classic app. The child devices populated in the classic app and there were no errors in the piston logging.

Yes I got it working. I had virtual devices and actual physical devices in the wrong order. Once I exchanged their placement all worked. Thanks so much

I’m not sure if you will see this @mbarone, but I am hoping you can possibly tell me where I screwed up. I have followed all of your instructions above and got everything working perfectly with the average temperatures.

What I am having an issue with is the contact sensors. I am not sure what I am doing wrong. When looking at the grouped sensors, they all register as “open” when in fact they are all closed.

Any guidance or assistance would be greatly appreciated.

Have you tried to open and close any of the sensors? I remember having an issue before where they sometimes need to be cycled (opened/closed) to display correctly.

Also, the state says refreshing and there is no last changed date in your screenshot. Is the piston executing fully?

I have opened and closed most if not all of them and nothing has changed.

As far as the piston executing fully, it appears to be from what I can see. I am by no means a webcore expert, I probably know just enough to be dangerous
haha.

Below is the last log and screen shot of the piston. I can provide any info that you might need to help me point out my mistake with this.

Thanks so much for your quick reply!

download|234x499

7/25/2020, 12:46:05 PM +373ms
+0ms ╔Received event [My home].test = 1595695565372 with a delay of 0ms
+129ms ║RunTime Analysis CS > 20ms > PS > 51ms > PE > 59ms > CE
+132ms ║Runtime (60719 bytes) successfully initialized in 51ms (v0.3.110.20191009) (131ms)
+134ms ║╔Execution stage started
+166ms ║║Cancelling statement #2’s schedules

+222ms ║║Executed virtual command setVariable (3ms)
+253ms ║║Executed virtual command setVariable (2ms)
+268ms ║║Executed virtual command setVariable (3ms)
+311ms ║║Executed virtual command setVariable (2ms)
+325ms ║║Calculating (string) U: + (string) 75.5 >> (string) U: 75.5
+330ms ║║Calculating (string) U: 75.5 + (string) F / D: >> (string) U: 75.5F / D:
+335ms ║║Calculating (string) U: 75.5F / D: + (string) 74 >> (string) U: 75.5F / D: 74
+339ms ║║Calculating (string) U: 75.5F / D: 74 + (string) F / G: >> (string) U: 75.5F / D: 74F / G:
+343ms ║║Calculating (string) U: 75.5F / D: 74F / G: + (string) 79.5 >> (string) U: 75.5F / D: 74F / G: 79.5
+347ms ║║Calculating (string) U: 75.5F / D: 74F / G: 79.5 + (string) F / O: >> (string) U: 75.5F / D: 74F / G: 79.5F / O:
+351ms ║║Calculating (string) U: 75.5F / D: 74F / G: 79.5F / O: + (string) 76.9 >> (string) U: 75.5F / D: 74F / G: 79.5F / O: 76.9
+354ms ║║Calculating (string) U: 75.5F / D: 74F / G: 79.5F / O: 76.9 + (string) F at >> (string) U: 75.5F / D: 74F / G: 79.5F / O: 76.9F at
+358ms ║║Calculating (string) U: 75.5F / D: 74F / G: 79.5F / O: 76.9F at + (string) Sat, Jul 25 2020 @ 12:46:05 PM EDT >> (string) U: 75.5F / D: 74F / G: 79.5F / O: 76.9F at Sat, Jul 25 2020 @ 12:46:05 PM EDT
+360ms ║║Calculating (string) U: 75.5F / D: 74F / G: 79.5F / O: 76.9F at Sat, Jul 25 2020 @ 12:46:05 PM EDT + (string) >> (string) U: 75.5F / D: 74F / G: 79.5F / O: 76.9F at Sat, Jul 25 2020 @ 12:46:05 PM EDT
+363ms ║║Executed virtual command setState (1ms)
+393ms ║║Condition #29 evaluated false (26ms)
+395ms ║║Condition group #26 evaluated false (state did not change) (27ms)
+407ms ║║Comparison (dynamic) 74.0 is_different_than (string) 74 = true (1ms)
+408ms ║║Condition #41 evaluated true (11ms)
+409ms ║║Condition group #37 evaluated true (state did not change) (12ms)
+420ms ║║Cancelling statement #39’s schedules

+671ms ║║Executed physical command [Downstairs Average Temperature].changeChildValue([Dining Room Window, 75]) (241ms)
+672ms ║║Executed [Downstairs Average Temperature].changeChildValue (243ms)
+683ms ║║Cancelling statement #39’s schedules

+734ms ║║Executed physical command [Downstairs Average Temperature].changeChildValue([Family Room Garage Door, 74]) (40ms)
+735ms ║║Executed [Downstairs Average Temperature].changeChildValue (43ms)
+745ms ║║Cancelling statement #39’s schedules

+794ms ║║Executed physical command [Downstairs Average Temperature].changeChildValue([Family Room Motion Sensor, 73]) (37ms)
+795ms ║║Executed [Downstairs Average Temperature].changeChildValue (39ms)
+805ms ║║Cancelling statement #39’s schedules

+853ms ║║Executed physical command [Downstairs Average Temperature].changeChildValue([Front Door, 74]) (38ms)
+854ms ║║Executed [Downstairs Average Temperature].changeChildValue (40ms)
+865ms ║║Cancelling statement #39’s schedules

+913ms ║║Executed physical command [Downstairs Average Temperature].changeChildValue([Kitchen Motion Sensor, 73]) (38ms)
+915ms ║║Executed [Downstairs Average Temperature].changeChildValue (40ms)
+925ms ║║Cancelling statement #39’s schedules

+971ms ║║Executed physical command [Downstairs Average Temperature].changeChildValue([Kitchen Sliding Door, 81]) (36ms)
+972ms ║║Executed [Downstairs Average Temperature].changeChildValue (39ms)
+982ms ║║Cancelling statement #39’s schedules

+1030ms ║║Executed physical command [Downstairs Average Temperature].changeChildValue([Kitchen Window, 79]) (38ms)
+1031ms ║║Executed [Downstairs Average Temperature].changeChildValue (40ms)
+1041ms ║║Cancelling statement #39’s schedules

+1090ms ║║Executed physical command [Downstairs Average Temperature].changeChildValue([Living Room Window (1), 74]) (38ms)
+1091ms ║║Executed [Downstairs Average Temperature].changeChildValue (41ms)
+1102ms ║║Cancelling statement #39’s schedules

+1148ms ║║Executed physical command [Downstairs Average Temperature].changeChildValue([Living Room Window (2), 74]) (35ms)
+1150ms ║║Executed [Downstairs Average Temperature].changeChildValue (37ms)
+1160ms ║║Cancelling statement #39’s schedules

+1205ms ║║Executed physical command [Downstairs Average Temperature].changeChildValue([Pantry Door, 73]) (34ms)
+1206ms ║║Executed [Downstairs Average Temperature].changeChildValue (37ms)
+1221ms ║║Cancelling statement #39’s schedules

+1266ms ║║Executed physical command [Downstairs Average Temperature].changeChildValue([Stairs Motion Sensor, 73]) (35ms)
+1268ms ║║Executed [Downstairs Average Temperature].changeChildValue (37ms)
+1271ms ║║Cancelling statement #42’s schedules

+1288ms ║║Calculating (string) Manual Update + (string) Sat, Jul 25 2020 @ 12:46:06 PM EDT >> (string) Manual Update Sat, Jul 25 2020 @ 12:46:06 PM EDT
+1292ms ║║Calculating (string) Manual Update Sat, Jul 25 2020 @ 12:46:06 PM EDT + (string) >> (string) Manual Update Sat, Jul 25 2020 @ 12:46:06 PM EDT
+1297ms ║║Calculating (string) Auto Update + (string) Sat, Jul 25 2020 @ 12:46:06 PM EDT >> (string) Auto Update Sat, Jul 25 2020 @ 12:46:06 PM EDT
+1301ms ║║Calculating (string) Auto Update Sat, Jul 25 2020 @ 12:46:06 PM EDT + (string) >> (string) Auto Update Sat, Jul 25 2020 @ 12:46:06 PM EDT
+1331ms ║║Executed physical command [Downstairs Average Temperature].changeMain([74, Auto Update Sat, Jul 25 2020 @ 12:46:06 PM EDT]) (26ms)
+1332ms ║║Executed [Downstairs Average Temperature].changeMain (29ms)
+1344ms ║║Comparison (dynamic) 0.0 is_different_than (string) 79.5 = true (1ms)
+1345ms ║║Condition #89 evaluated true (10ms)
+1347ms ║║Condition group #83 evaluated true (state did not change) (11ms)
+1353ms ║║Cancelling statement #85’s schedules

+1739ms ║║Executed physical command [Garage Door Sensors].changeChildValue([Garage Man Door Sensor, 78]) (375ms)
+1740ms ║║Executed [Garage Door Sensors].changeChildValue (377ms)
+1747ms ║║Cancelling statement #85’s schedules

+1792ms ║║Executed physical command [Garage Door Sensors].changeChildValue([Overhead Garage Door Sensor, 81]) (34ms)
+1794ms ║║Executed [Garage Door Sensors].changeChildValue (36ms)
+1797ms ║║Cancelling statement #87’s schedules

+1814ms ║║Calculating (string) Manual Update + (string) Sat, Jul 25 2020 @ 12:46:07 PM EDT >> (string) Manual Update Sat, Jul 25 2020 @ 12:46:07 PM EDT
+1818ms ║║Calculating (string) Manual Update Sat, Jul 25 2020 @ 12:46:07 PM EDT + (string) >> (string) Manual Update Sat, Jul 25 2020 @ 12:46:07 PM EDT
+1823ms ║║Calculating (string) Auto Update + (string) Sat, Jul 25 2020 @ 12:46:07 PM EDT >> (string) Auto Update Sat, Jul 25 2020 @ 12:46:07 PM EDT
+1827ms ║║Calculating (string) Auto Update Sat, Jul 25 2020 @ 12:46:07 PM EDT + (string) >> (string) Auto Update Sat, Jul 25 2020 @ 12:46:07 PM EDT
+1848ms ║║Executed physical command [Garage Door Sensors].changeMain([79.5, Auto Update Sat, Jul 25 2020 @ 12:46:07 PM EDT]) (17ms)
+1849ms ║║Executed [Garage Door Sensors].changeMain (19ms)
+2353ms ║║Comparison (dynamic) Empty device list is_different_than (string) 75.5 = true (2ms)
+2355ms ║║Condition #97 evaluated true (502ms)
+2361ms ║║Condition group #91 evaluated true (state did not change) (509ms)
+2370ms ║║Cancelling statement #93’s schedules

+2420ms ║║Executed physical command [Upstairs Average Temperature].changeChildValue([Cooper’s Room Motion Sensor, 75]) (38ms)
+2422ms ║║Executed [Upstairs Average Temperature].changeChildValue (42ms)
+2430ms ║║Cancelling statement #93’s schedules

+2478ms ║║Executed physical command [Upstairs Average Temperature].changeChildValue([Cooper’s Closet Motion Sensor, 74]) (36ms)
+2479ms ║║Executed [Upstairs Average Temperature].changeChildValue (39ms)
+2487ms ║║Cancelling statement #93’s schedules

+2535ms ║║Executed physical command [Upstairs Average Temperature].changeChildValue([Hallway Motion Sensor, 76]) (37ms)
+2536ms ║║Executed [Upstairs Average Temperature].changeChildValue (39ms)
+2544ms ║║Cancelling statement #93’s schedules

+2590ms ║║Executed physical command [Upstairs Average Temperature].changeChildValue([Master Bedroom Motion Sensor, 75]) (36ms)
+2591ms ║║Executed [Upstairs Average Temperature].changeChildValue (38ms)
+2599ms ║║Cancelling statement #93’s schedules

+2649ms ║║Executed physical command [Upstairs Average Temperature].changeChildValue([Master Closet Motion Sensor, 75]) (40ms)
+2651ms ║║Executed [Upstairs Average Temperature].changeChildValue (42ms)
+2659ms ║║Cancelling statement #93’s schedules

+2707ms ║║Executed physical command [Upstairs Average Temperature].changeChildValue([Owen’s Room Motion Sensor, 78]) (38ms)
+2709ms ║║Executed [Upstairs Average Temperature].changeChildValue (41ms)
+2712ms ║║Cancelling statement #95’s schedules

+2729ms ║║Calculating (string) Manual Update + (string) Sat, Jul 25 2020 @ 12:46:08 PM EDT >> (string) Manual Update Sat, Jul 25 2020 @ 12:46:08 PM EDT
+2733ms ║║Calculating (string) Manual Update Sat, Jul 25 2020 @ 12:46:08 PM EDT + (string) >> (string) Manual Update Sat, Jul 25 2020 @ 12:46:08 PM EDT
+2738ms ║║Calculating (string) Auto Update + (string) Sat, Jul 25 2020 @ 12:46:08 PM EDT >> (string) Auto Update Sat, Jul 25 2020 @ 12:46:08 PM EDT
+2742ms ║║Calculating (string) Auto Update Sat, Jul 25 2020 @ 12:46:08 PM EDT + (string) >> (string) Auto Update Sat, Jul 25 2020 @ 12:46:08 PM EDT
+2773ms ║║Executed physical command [Upstairs Average Temperature].changeMain([75.5, Auto Update Sat, Jul 25 2020 @ 12:46:08 PM EDT]) (27ms)
+2774ms ║║Executed [Upstairs Average Temperature].changeMain (29ms)
+2794ms ║║Comparison (dynamic) Empty device list is_different_than (string) 76.9 = true (1ms)
+2796ms ║║Condition #106 evaluated true (19ms)
+2797ms ║║Condition group #100 evaluated true (state did not change) (20ms)
+2807ms ║║Cancelling statement #102’s schedules

+2857ms ║║Executed physical command [All Exterior Doors and Windows].changeChildValue([Dining Room Window, 75]) (39ms)
+2858ms ║║Executed [All Exterior Doors and Windows].changeChildValue (41ms)
+2868ms ║║Cancelling statement #102’s schedules

+2917ms ║║Executed physical command [All Exterior Doors and Windows].changeChildValue([Family Room Garage Door, 74]) (38ms)
+2918ms ║║Executed [All Exterior Doors and Windows].changeChildValue (41ms)
+2928ms ║║Cancelling statement #102’s schedules

+2976ms ║║Executed physical command [All Exterior Doors and Windows].changeChildValue([Family Room Sliding Door, 79]) (37ms)
+2977ms ║║Executed [All Exterior Doors and Windows].changeChildValue (39ms)
+2987ms ║║Cancelling statement #102’s schedules

+3036ms ║║Executed physical command [All Exterior Doors and Windows].changeChildValue([Front Door, 74]) (38ms)
+3037ms ║║Executed [All Exterior Doors and Windows].changeChildValue (41ms)
+3047ms ║║Cancelling statement #102’s schedules

+3094ms ║║Executed physical command [All Exterior Doors and Windows].changeChildValue([Garage Man Door Sensor, 78]) (37ms)
+3095ms ║║Executed [All Exterior Doors and Windows].changeChildValue (39ms)
+3105ms ║║Cancelling statement #102’s schedules

+3153ms ║║Executed physical command [All Exterior Doors and Windows].changeChildValue([Kitchen Sliding Door, 81]) (37ms)
+3154ms ║║Executed [All Exterior Doors and Windows].changeChildValue (40ms)
+3164ms ║║Cancelling statement #102’s schedules

+3212ms ║║Executed physical command [All Exterior Doors and Windows].changeChildValue([Kitchen Window, 79]) (38ms)
+3213ms ║║Executed [All Exterior Doors and Windows].changeChildValue (40ms)
+3223ms ║║Cancelling statement #102’s schedules

+3353ms ║║Executed physical command [All Exterior Doors and Windows].changeChildValue([Living Room Window (1), 74]) (120ms)
+3355ms ║║Executed [All Exterior Doors and Windows].changeChildValue (122ms)
+3365ms ║║Cancelling statement #102’s schedules

+3413ms ║║Executed physical command [All Exterior Doors and Windows].changeChildValue([Living Room Window (2), 74]) (38ms)
+3414ms ║║Executed [All Exterior Doors and Windows].changeChildValue (40ms)
+3425ms ║║Cancelling statement #102’s schedules

+3472ms ║║Executed physical command [All Exterior Doors and Windows].changeChildValue([Overhead Garage Door Sensor, 81]) (37ms)
+3473ms ║║Executed [All Exterior Doors and Windows].changeChildValue (39ms)
+3477ms ║║Cancelling statement #104’s schedules

+3493ms ║║Calculating (string) Manual Update + (string) Sat, Jul 25 2020 @ 12:46:08 PM EDT >> (string) Manual Update Sat, Jul 25 2020 @ 12:46:08 PM EDT
+3498ms ║║Calculating (string) Manual Update Sat, Jul 25 2020 @ 12:46:08 PM EDT + (string) >> (string) Manual Update Sat, Jul 25 2020 @ 12:46:08 PM EDT
+3502ms ║║Calculating (string) Auto Update + (string) Sat, Jul 25 2020 @ 12:46:08 PM EDT >> (string) Auto Update Sat, Jul 25 2020 @ 12:46:08 PM EDT
+3506ms ║║Calculating (string) Auto Update Sat, Jul 25 2020 @ 12:46:08 PM EDT + (string) >> (string) Auto Update Sat, Jul 25 2020 @ 12:46:08 PM EDT
+3535ms ║║Executed physical command [All Exterior Doors and Windows].changeMain([76.9, Auto Update Sat, Jul 25 2020 @ 12:46:08 PM EDT]) (25ms)
+3536ms ║║Executed [All Exterior Doors and Windows].changeMain (27ms)
+3540ms ║║Cancelling statement #77’s schedules

+3544ms ║║Executed virtual command setVariable (1ms)
+3588ms ║╚Execution stage complete. (3455ms)
+3591ms ║Setting up scheduled job for Sat, Jul 25 2020 @ 1:03:52 PM EDT (in 1063.765s)
+3603ms ╚Event processed successfully (3602ms)

Jason, it looks like you are using the average temperature piston as there are temperature readings in the output log. The contact sensor groups have a different piston to monitor open/closed status. The import code should be in the header of the contact sensor master DTH.
Each contact sensor group will need its own contact sensor piston, unlike the temperature piston which can manage 4 groups.

Thanks so much! I knew I was doing something stupid.

This is what happens when you work 3rd shift M-F and can’t sleep like a normal person on the weekends. You mess around with your Smartthings and screw stuff up
LOL!

Thanks again!