SmartThings


  • Project Sponsor Module Developer

    @buzzkc I know how that feels!! I don’t even think I can look at ST until almost winter in reality. Currently I’m working on a job that should take 4 months…they gave me 2 LOL After that the list is longggggggggggggggggg still… so I’m really busy.

    IF you need anyone to test or help let me know!


  • Project Sponsor Module Developer

    @johnnyboy trying… trying LOL Great to see you!!!



  • @cowboysdude said in SmartThings:

    @johnnyboy trying… trying LOL Great to see you!!!

    As @buzzkc has stated about Device Handlers, and Im sure you have (Must have?) already done this… these can be found in the IDE, which are C&P from github.
    There is a constantly updated list of DH’s on the ST Forum, so worth checking that out to compare with the devices you have, and wish to manipulate.

    Me personaly, I use WebCoRE to do my manipulation… and If I need to add anything that is not the “Norm” then I would simply create a Virtual switch on the IDE, and then point towards that, with my chosen manipulation… and if you have used WebCoRE before, then you know it has limitless possibilities. Bad comparason, but I look at WebCoRE as IFTTT on Steroids 🙂

    Some things I do, requires using several items… like my door sensor for example - It opens (Trigger ) and it then informs ST… which then informs WebCoRE, whitch then informs EchoSpeaks to then go through Amazon, to speak my chosen text, on my chosen Amazon devices - “Warning, Side door has been opened… Alarm sequence will initiate in T-Minus 20 seconds”
    I also added in another “Then” which will turn my chosen lights on @ 100%, until door is closed… and also to turn on my smart plug, which has a Siren attached, to activate after the 20 second time, also to start recording on CCTV in that location.

    The lag on this is about 2 seconds… so not a real concern given the hoops it has to jump through beforehand.

    I have only ever needed to slightly alter a DH once, for a Hive Sensor… but that was to simply change a 6second delay to a 12 second delay… purely because the original usage would be going through 1 loop, and I was going through 4, so need to extend the timeout.
    I also have my Hive Heating controllable through ST of sorts, using ActionTiles and placing Hive on the screen there.

    IF my MM was Touchscreen, and I had the time to work it out, I would have loved to be able to place several icons/Tiles (Virtual Switches) onto it, and control numerous ST devices from there… But I found it far far quicker, and easier, to simply use a Tablet… with the benefit that I can add several other tablets throughout the house, each with either control of that zone only, or the ability to swipe to another zone from the same screen… by creating a Link tile in every window to go to a chosen zone.

    You could also create Media Tiles… showing a constant stream of several cameras… and make that Tile as small or as big as you like… I have Netflix/Amazon/Kodi/IPTV as tiles too, so one click, and it pops up for me.

    And, as mentioned, it will aslo link to any app you have on the device you are using, by creating a link tile to it… which will open up for you directly in that screen/tile… and I find this usefull when playing music through my Sonos system, and can bring up the full library to choose from, and be able to control the speakers too.

    I’m not sure by your OP that you are wanting to manipulate the data to then create something to use on the MM framework, or whether you simply want to manipulate the data just to alter things to your own suiting?
    But if you have read anything above that you need any more info on, then ask away…



  • I’m finally starting to make some progress on this. I’ve been doing development in a docker instance and found editing files while the container is running corrupts files. 🙂

    So I have it connecting and bringing back device information at this point. I still need to parse that info. I’m working through the steps get all the info in the correct order to model it (get device ids>>get device components>>get device capabilities>>statuses etc.)

    I do have two hubs and found that it brings back devices for all hubs, so I’ll need to get the hub info too.


  • Project Sponsor Module Developer

    This is something that I want to seriously look at this winter. Time right now is very hard for me to do anything…but I am keeping an eye on this and I appreciate ALL the input!!!

    I am trying first to get my thermostat to work via the mirror… module form. I can do it other ways but I want to learn how to use this IDE. But it gets to be too much… but you both have excellent ideas that I will be picking your brains soon!!! 🙂

    Keep posting please!!



  • I’ve made a little more progress on this, but nothing to display the device info yet. I found the node-smarthings library uses promises to return results, which I’ve not worked with specifically, so been struggling with tying the device information to the device capability status results. I think I’ve finally worked passed it, but still have some testing to do.

    I’ve been trying to pass the device object from the first call to the call back function for the capability status, but not figured out how to do that. All of the status results were tied to the last device processed from the device callback. I did finally move the looping of devices to where only one device was sent to the socket notification that calls the capability status and seems to be working that way.



  • @buzzkc so, with promises, you have a ‘then’, with a ‘resolve’ and an ‘error’ callback, and the resolve and reject methods of the promise can provide data to the resolve and error routines…

    just a reminder, the return new Promise() returns IMMEDIATELY… the function inside the promise is called async sometime (milliseconds) later

       function_name: function(parm1_in, parm2_in) {
         return new Promise( function (resolve,reject){
                 if( all_good) {
                     resolve(data_item)
                 }
                else {
                    reject(error_data) 
                }
         }
         )
    
    

    then the method CALLING this function

        function_name(parm1, parm2).then( 
                 resolve_func(data_item){ },
                 error_func(error_data){}
        )
    

    a working example , using the arrow function (parm) => {
    the arrow function insures that the data context of the outside caller is maintained,
    where as function(parm) { does not (u had to use the ‘self =this’ thing

    let promise = new Promise(function(resolve, reject) {
     if(!setTimeout(() => resolve("done!"), 1000)){
         reject("settimeout_failed")
     }
    });
    
    // resolve runs the first function in .then, reject runs the second function
    promise.then(     // this will block until the function inside the promise call resolve or reject
      result => alert(result), // shows "done!" after 1 second
      error => alert(error) // doesn't run .. this will never occurr as settimeout never fails. 
    );
    


  • Thanks Sam, That does help explain things. The grandkids are visiting, so will be a day or so before I get back to this, unless I just can’t sleep tonight. 😉



  • @buzzkc no problem… i’ll be around

    also, the function in the promise can also be arrow

    return new Promise(  (resolve,reject) =>{
                if( all_good) {
                     resolve(data_item)
                 }
                else {
                    reject(error_data) 
                }
             })
    


  • and you can nest calls to functions that return Promises.

       call_function_a(parm1, parm2).then( resolve_function(resolve_parm){ 
                     ... processing
                      call function_b(resolve_parm).then(resolve_function(some_otherdata){
                      ....     processing
                      })
       })
    
    

    the 1st call_function_a routine will return a Promise object immediately
    and when the function inside the promise resolves, then ‘.then (resolve’ function will be called.

    the ‘.then’ waits

    you can also split it up and wait later

      var p =   call_function_a(parm1, parm2)
         processing
         processing
      Promise(p).then (... etc)
    

    i have a piece of code that loads a list of images from multiple difference sources, and knowing these take a ‘long time’ I wrapped them in promises… and start multiple at the same time…

    now I have a list (array) of promises… but need to wait for all of them to complete (to have the complete list of images)

    Promise.all(list).then(() => { sort full list of images, note that resolve() can't send back the list as its not complete }
    

    you can also wait for one

    Promise.race(list).then( ... etc)
    

Locked