How does an App get what a SendEvent sends in another App?

Could someone point me to an example of a sender and receiver App? Or provide me a snippet of what I do in each App?
Thanks

The reciever app would use the subscribe method to be informed of the event’s contents

subscribe(location, "cloudBackup", "cldBuHandler")
…
def cldBuHandler(evt){
    //log.debug evt.properties
    if(evt.value != “true”) {
        notifyDevice.each { 
            it.deviceNotification("Cloud Backup Failed on ${hub.location.name}")  
        }
    }
}

Subscribe is described here:

2 Likes

What would the sender App look like?

It’s just a simple sendEvent (also documented in the link above)

sendEvent(name:”app1Event”, value:”somethingImportant”)

Note that apps, while technically able to send events, rarely do so. There's usually a different way to get what you need--but it's certainly an option if not. You may want to describe what you're really trying to do, and someone can suggest a Hubitat-y way to do it if you aren't certain this is what you're looking for.

2 Likes

I developed some automations on my PC using Visual Studio/C++. I needed Notifications to drive my automations and I got those from Apps on my phone that I sent over to the PC. Ring Alarm Pro are the main Notifications I needed but of course I would have Notifications from all the app's I have on my phone. When I got the Hubitat a few weeks ago one of the first things I did was to send the generated Notifications from the PC to the Hub. This Hub App I want to view as a Notification Server and the Client Apps would subscribe to the Events called "Notification". I know I have other ways of getting the info in the Notifications but I would like to stay with what I have and be able to SendEvent these Notifications to Client Apps that have subscribed. I have read that people have been able to get SendEvent's from Apps to another App but they seem to have problems in doing that. The only thing I have heard that succeeded was in Smarthings by using:

sendLocationEvent(name:"switch", value:"on", data:["ItWorked"], descriptionText: "description you want", deviceId: :"the-128bit-device-identifier-here", source: "DEVICE", isStateChange:true)

So far I haven't got this to work or the suggestion from thebearmay.

Thanks

What are the "client apps"? If they are all child apps of your parent app, a common paradigm for a related set of apps, they can communicate with each other directly without needing to send events.

Mmmm... sounds interesting. I have a way out now.,. thks. If I did not make the Clients children do you know how I could make SendEvent or SendLocationEvent work. A snippet of both Server and Client or actual examples would be really appreciated. I have tried both and haven't succeeded yet. Thanks

@thebearmay gave you an example above. One app would send, the other subscribe (the subscription being to the location object, not a device as is often the case). If you go back to that approach, I'd suggest sharing a minimal non-working example so someone can see what you're trying.

But if the parent/child setup works for you, I'd say that's generally a better approach.

I got the following Server and Client App to work:

SERVER

definition(
name: "Notification Server",
namespace: "Example",
author: "Hubi",
description: "Impliment a server to send NOTIFICATION's",
category: "Convenience",
iconUrl: "",
iconX2Url: "")

preferences {
section("Logging") {
input name: "logEnable", type: "bool", title: "Enable logging?"
}
}

def installed() {
log.debug "installed()"
updated()
}

def uninstalled() {
log.debug "uninstalled()"
}

def updated() {
if (logEnable) log.debug "updated()"
sendLocationEvent(name:"NOTIFICATION", value:"Back Door Opened", data:["ItWorked"], descriptionText: "description you want", deviceId: "", source: "Ring", isStateChange: true)
}

CLIENT

definition(
name: "Notification Client",
namespace: "Example",
author: "Hubi",
description: "Impliment a client to receive NOTIFICATION's",
category: "Convenience",
iconUrl: "",
iconX2Url: "")

preferences {
section("Logging") {
input name: "logEnable", type: "bool", title: "Enable logging?"
}
}

def installed() {
log.debug "installed()"
updated()
}

def updated() {
if (logEnable) log.debug "updated()"
unsubscribe()
def MyLocation = getLocation()
log.debug "MyLocation = " + MyLocation
subscribe(MyLocation, "NOTIFICATION", Handler)
}

def uninstalled() {
log.debug "uninstalled()"
}

def Handler(evt) {
log.debug "*** Entered Notification Handler ***"

log.debug "evt = " + evt          
log.debug "evt.value = " + evt.value   
log.debug "evt.name = " + evt.name
log.debug "evt.date = " + evt.date
log.debug "evt.source = " + evt.source  

def Data = getData()
log.debug "getData() = " + Data

}

I am getting an error in the Client when executing "def Data = getData()"... anybody know why?

Thanks for the help.

Needs to be evt.getData()

1 Like

O’Boy! Programs are picky aren’t they…LOL Thanks