sstratoti / actionable-notifications-subflow-for-ios

Actionable Notifications Node-Red Subflow for Home Assistant Companion - iOS
34 stars 5 forks source link

"Call-service error. extra keys not allowed @ data['entity_id']" #4

Open sorted01 opened 1 year ago

sorted01 commented 1 year ago

Hey Guys,

i really love this subflow. But i don't get it to work. Once I trigger it I get the following notification in the debug node:

"Call-service error. extra keys not allowed @ data['entity_id']"

Am I doing something wrong?

iPhone 14 Pro Max (iOS 16.3)

Home Assistant 2023.2.2 Supervisor 2023.01.1 Frontend 20230202.0 - latest

Node-RED Current version: 14.0.2

sstratoti commented 1 year ago

Are you passing in any camera entities to the node?

sorted01 commented 1 year ago

Nope. Just a binary sensor :/

sstratoti commented 1 year ago

Oh! That field should only accept a camera entity. Can you post a screenshot of your config screen?

sstratoti commented 1 year ago

It's also possible that the entity that triggers the notification node is passing an entity through...I'll have to check for this later tonight. What's the node preceding this? Is it a change node?

sstratoti commented 1 year ago

I've added a new "Debug Mode?" Boolean to the flow. It's all the way at the bottom of the config for the node. Can you switch that to "checked" / true, and then open your debug window in node red?

It should output several Debug messages when calling the iOS node (if set to true).

There will be up to 4 of them, depending if you click an action / clear the message. They should all start with "iOS Notify".

Example:

image

Can you copy those values (like in the screenshot above) and add them to this issue? It'll help me debug what is wrong in the service call JSON.

Thank you!

sorted01 commented 1 year ago

Thank you for looking into this. I will check it this evening and give you feedback 👍🏻

sorted01 commented 1 year ago

It keeps "flooding" the debug area with the message from the picture below: TypeError: Cannot read properties of undefined (reading 'tag')

image

sstratoti commented 1 year ago

When you open up the sub flow, do you see red triangles at the top right of all of the Home Assistant nodes? (Blue ones)

sorted01 commented 1 year ago

After importing the subflow they have been there. I opened and closed everyone to remove it as described in your wiki. Maybe you could export an existing flow which should work? Just to ensure that the issue is not caused by myself 🫥

sstratoti commented 1 year ago

try this

[{"id":"ffcc5b03.763568","type":"subflow","name":"Clear Notifications","info":"","category":"","in":[{"x":80,"y":120,"wires":[{"id":"6ea41ddf.c62214"}]}],"out":[{"x":380,"y":120,"wires":[{"id":"6ea41ddf.c62214","port":0}]}],"env":[],"meta":{},"color":"#C7E9C0","icon":"font-awesome/fa-remove"},{"id":"6ea41ddf.c62214","type":"change","z":"ffcc5b03.763568","name":"Set Overrides","rules":[{"t":"set","p":"notificationOverride.clear","pt":"msg","to":"true","tot":"bool"},{"t":"set","p":"payload","pt":"msg","to":"","tot":"str"},{"t":"set","p":"notificationOverride.services","pt":"msg","to":"mobile_app_steve_stratotis_iphone2,mobile_app_stephen_stratotis_ipad,mobile_app_arielle_s_iphone_3","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":220,"y":120,"wires":[[]]},{"id":"6dc0247c.d7210c","type":"subflow","name":"iOS Actionable Notification","info":"[Click here for latest Documentation](https://github.com/sstratoti/actionable-notifications-subflow-for-ios)\n","category":"home_assistant","in":[{"x":100,"y":80,"wires":[{"id":"6b940f2bfba5188c"},{"id":"a380385926a54b87"}]}],"out":[{"x":1500,"y":380,"wires":[{"id":"90ab222038404541","port":0}]},{"x":1500,"y":440,"wires":[{"id":"90ab222038404541","port":1}]},{"x":1500,"y":500,"wires":[{"id":"90ab222038404541","port":2}]},{"x":1500,"y":560,"wires":[{"id":"90ab222038404541","port":3}]}],"env":[{"name":"group","type":"str","value":"None","ui":{"label":{"en-US":"Group Name"}}},{"name":"tag","type":"str","value":"","ui":{"label":{"en-US":"Tag (for replacing messages - optional)"}}},{"name":"service","type":"str","value":"","ui":{"label":{"en-US":"Notify Service"},"type":"input","opts":{"types":["str","env"]}}},{"name":"title","type":"str","value":"","ui":{"label":{"en-US":"Title"},"type":"input","opts":{"types":["str","env"]}}},{"name":"subtitle","type":"str","value":"","ui":{"label":{"en-US":"Subtitle (optional)"},"type":"input","opts":{"types":["str","env"]}}},{"name":"message","type":"str","value":"","ui":{"label":{"en-US":"Message"},"type":"input","opts":{"types":["str","env"]}}},{"name":"notificationUrl","type":"str","value":"","ui":{"label":{"en-US":"Notification URL (optional)"},"type":"input","opts":{"types":["str","env"]}}},{"name":"customSoundPreInstalled","type":"str","value":"default","ui":{"label":{"en-US":"Pre-installed Custom Sound"},"type":"select","opts":{"opts":[{"l":{"en-US":"default"},"v":"default"},{"l":{"en-US":"No Sound"},"v":"none"},{"l":{"en-US":"US-EN-Alexa-Back-Door-Opened.wav"},"v":"US-EN-Alexa-Back-Door-Opened.wav"},{"l":{"en-US":"US-EN-Alexa-Back-Door-Unlocked.wav"},"v":"US-EN-Alexa-Back-Door-Unlocked.wav"},{"l":{"en-US":"US-EN-Alexa-Basement-Door-Opened.wav"},"v":"US-EN-Alexa-Basement-Door-Opened.wav"},{"l":{"en-US":"US-EN-Alexa-Basement-Door-Unlocked.wav"},"v":"US-EN-Alexa-Basement-Door-Unlocked.wav"},{"l":{"en-US":"US-EN-Alexa-Boyfriend-Is-Arriving.wav"},"v":"US-EN-Alexa-Boyfriend-Is-Arriving.wav"},{"l":{"en-US":"US-EN-Alexa-Daughter-Is-Arriving.wav"},"v":"US-EN-Alexa-Daughter-Is-Arriving.wav"},{"l":{"en-US":"US-EN-Alexa-Front-Door-Opened.wav"},"v":"US-EN-Alexa-Front-Door-Opened.wav"},{"l":{"en-US":"US-EN-Alexa-Front-Door-Unlocked.wav"},"v":"US-EN-Alexa-Front-Door-Unlocked.wav"},{"l":{"en-US":"US-EN-Alexa-Garage-Door-Opened.wav"},"v":"US-EN-Alexa-Garage-Door-Opened.wav"},{"l":{"en-US":"US-EN-Alexa-Girlfriend-Is-Arriving.wav"},"v":"US-EN-Alexa-Girlfriend-Is-Arriving.wav"},{"l":{"en-US":"US-EN-Alexa-Good-Morning.wav"},"v":"US-EN-Alexa-Good-Morning.wav"},{"l":{"en-US":"US-EN-Alexa-Good-Night.wav"},"v":"US-EN-Alexa-Good-Night.wav"},{"l":{"en-US":"US-EN-Alexa-Husband-Is-Arriving.wav"},"v":"US-EN-Alexa-Husband-Is-Arriving.wav"},{"l":{"en-US":"US-EN-Alexa-Mail-Has-Arrived.wav"},"v":"US-EN-Alexa-Mail-Has-Arrived.wav"},{"l":{"en-US":"US-EN-Alexa-Motion-At-Back-Door.wav"},"v":"US-EN-Alexa-Motion-At-Back-Door.wav"},{"l":{"en-US":"US-EN-Alexa-Motion-At-Front-Door.wav"},"v":"US-EN-Alexa-Motion-At-Front-Door.wav"},{"l":{"en-US":"US-EN-Alexa-Motion-Detected-Generic.wav"},"v":"US-EN-Alexa-Motion-Detected-Generic.wav"},{"l":{"en-US":"US-EN-Alexa-Motion-In-Back-Yard.wav"},"v":"US-EN-Alexa-Motion-In-Back-Yard.wav"},{"l":{"en-US":"US-EN-Alexa-Motion-In-Basement.wav"},"v":"US-EN-Alexa-Motion-In-Basement.wav"},{"l":{"en-US":"US-EN-Alexa-Motion-In-Front-Yard.wav"},"v":"US-EN-Alexa-Motion-In-Front-Yard.wav"},{"l":{"en-US":"US-EN-Alexa-Motion-In-Garage.wav"},"v":"US-EN-Alexa-Motion-In-Garage.wav"},{"l":{"en-US":"US-EN-Alexa-Patio-Door-Opened.wav"},"v":"US-EN-Alexa-Patio-Door-Opened.wav"},{"l":{"en-US":"US-EN-Alexa-Patio-Door-Unlocked.wav"},"v":"US-EN-Alexa-Patio-Door-Unlocked.wav"},{"l":{"en-US":"US-EN-Alexa-Smoke-Detected-Generic.wav"},"v":"US-EN-Alexa-Smoke-Detected-Generic.wav"},{"l":{"en-US":"US-EN-Alexa-Smoke-Detected-In-Basement.wav"},"v":"US-EN-Alexa-Smoke-Detected-In-Basement.wav"},{"l":{"en-US":"US-EN-Alexa-Smoke-Detected-In-Garage.wav"},"v":"US-EN-Alexa-Smoke-Detected-In-Garage.wav"},{"l":{"en-US":"US-EN-Alexa-Smoke-Detected-In-Kitchen.wav"},"v":"US-EN-Alexa-Smoke-Detected-In-Kitchen.wav"},{"l":{"en-US":"US-EN-Alexa-Son-Is-Arriving.wav"},"v":"US-EN-Alexa-Son-Is-Arriving.wav"},{"l":{"en-US":"US-EN-Alexa-Water-Detected-Generic.wav"},"v":"US-EN-Alexa-Water-Detected-Generic.wav"},{"l":{"en-US":"US-EN-Alexa-Water-Detected-In-Basement.wav"},"v":"US-EN-Alexa-Water-Detected-In-Basement.wav"},{"l":{"en-US":"US-EN-Alexa-Water-Detected-In-Garage.wav"},"v":"US-EN-Alexa-Water-Detected-In-Garage.wav"},{"l":{"en-US":"US-EN-Alexa-Water-Detected-In-Kitchen.wav"},"v":"US-EN-Alexa-Water-Detected-In-Kitchen.wav"},{"l":{"en-US":"US-EN-Alexa-Welcome-Home.wav"},"v":"US-EN-Alexa-Welcome-Home.wav"},{"l":{"en-US":"US-EN-Alexa-Wife-Is-Arriving.wav"},"v":"US-EN-Alexa-Wife-Is-Arriving.wav"},{"l":{"en-US":"US-EN-Daisy-Back-Door-Motion.wav"},"v":"US-EN-Daisy-Back-Door-Motion.wav"},{"l":{"en-US":"US-EN-Daisy-Back-Door-Open.wav"},"v":"US-EN-Daisy-Back-Door-Open.wav"},{"l":{"en-US":"US-EN-Daisy-Front-Door-Motion.wav"},"v":"US-EN-Daisy-Front-Door-Motion.wav"},{"l":{"en-US":"US-EN-Daisy-Front-Door-Open.wav"},"v":"US-EN-Daisy-Front-Door-Open.wav"},{"l":{"en-US":"US-EN-Daisy-Front-Window-Open.wav"},"v":"US-EN-Daisy-Front-Window-Open.wav"},{"l":{"en-US":"US-EN-Daisy-Garage-Door-Open.wav"},"v":"US-EN-Daisy-Garage-Door-Open.wav"},{"l":{"en-US":"US-EN-Daisy-Guest-Bath-Leak.wav"},"v":"US-EN-Daisy-Guest-Bath-Leak.wav"},{"l":{"en-US":"US-EN-Daisy-Kitchen-Sink-Leak.wav"},"v":"US-EN-Daisy-Kitchen-Sink-Leak.wav"},{"l":{"en-US":"US-EN-Daisy-Kitchen-Window-Open.wav"},"v":"US-EN-Daisy-Kitchen-Window-Open.wav"},{"l":{"en-US":"US-EN-Daisy-Laundry-Room-Leak.wav"},"v":"US-EN-Daisy-Laundry-Room-Leak.wav"},{"l":{"en-US":"US-EN-Daisy-Master-Bath-Leak.wav"},"v":"US-EN-Daisy-Master-Bath-Leak.wav"},{"l":{"en-US":"US-EN-Daisy-Master-Bedroom-Window-Open.wav"},"v":"US-EN-Daisy-Master-Bedroom-Window-Open.wav"},{"l":{"en-US":"US-EN-Daisy-Office-Window-Open.wav"},"v":"US-EN-Daisy-Office-Window-Open.wav"},{"l":{"en-US":"US-EN-Daisy-Refrigerator-Leak.wav"},"v":"US-EN-Daisy-Refrigerator-Leak.wav"},{"l":{"en-US":"US-EN-Daisy-Water-Heater-Leak.wav"},"v":"US-EN-Daisy-Water-Heater-Leak.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Back-Door-Closed.wav"},"v":"US-EN-Morgan-Freeman-Back-Door-Closed.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Back-Door-Locked.wav"},"v":"US-EN-Morgan-Freeman-Back-Door-Locked.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Back-Door-Opened.wav"},"v":"US-EN-Morgan-Freeman-Back-Door-Opened.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Back-Door-Unlocked.wav"},"v":"US-EN-Morgan-Freeman-Back-Door-Unlocked.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Basement-Door-Closed.wav"},"v":"US-EN-Morgan-Freeman-Basement-Door-Closed.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Basement-Door-Locked.wav"},"v":"US-EN-Morgan-Freeman-Basement-Door-Locked.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Basement-Door-Opened.wav"},"v":"US-EN-Morgan-Freeman-Basement-Door-Opened.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Basement-Door-Unlocked.wav"},"v":"US-EN-Morgan-Freeman-Basement-Door-Unlocked.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Boss-Is-Arriving.wav"},"v":"US-EN-Morgan-Freeman-Boss-Is-Arriving.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Boyfriend-Is-Arriving.wav"},"v":"US-EN-Morgan-Freeman-Boyfriend-Is-Arriving.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Cleaning-Supplies-Closet-Opened.wav"},"v":"US-EN-Morgan-Freeman-Cleaning-Supplies-Closet-Opened.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Coworker-Is-Arriving.wav"},"v":"US-EN-Morgan-Freeman-Coworker-Is-Arriving.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Daughter-Is-Arriving.wav"},"v":"US-EN-Morgan-Freeman-Daughter-Is-Arriving.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Friend-Is-Arriving.wav"},"v":"US-EN-Morgan-Freeman-Friend-Is-Arriving.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Front-Door-Closed.wav"},"v":"US-EN-Morgan-Freeman-Front-Door-Closed.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Front-Door-Locked.wav"},"v":"US-EN-Morgan-Freeman-Front-Door-Locked.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Front-Door-Opened.wav"},"v":"US-EN-Morgan-Freeman-Front-Door-Opened.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Front-Door-Unlocked.wav"},"v":"US-EN-Morgan-Freeman-Front-Door-Unlocked.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Garage-Door-Closed.wav"},"v":"US-EN-Morgan-Freeman-Garage-Door-Closed.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Garage-Door-Opened.wav"},"v":"US-EN-Morgan-Freeman-Garage-Door-Opened.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Girlfriend-Is-Arriving.wav"},"v":"US-EN-Morgan-Freeman-Girlfriend-Is-Arriving.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Good-Morning.wav"},"v":"US-EN-Morgan-Freeman-Good-Morning.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Good-Night.wav"},"v":"US-EN-Morgan-Freeman-Good-Night.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Liquor-Cabinet-Opened.wav"},"v":"US-EN-Morgan-Freeman-Liquor-Cabinet-Opened.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Motion-Detected.wav"},"v":"US-EN-Morgan-Freeman-Motion-Detected.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Motion-In-Basement.wav"},"v":"US-EN-Morgan-Freeman-Motion-In-Basement.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Motion-In-Bedroom.wav"},"v":"US-EN-Morgan-Freeman-Motion-In-Bedroom.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Motion-In-Game-Room.wav"},"v":"US-EN-Morgan-Freeman-Motion-In-Game-Room.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Motion-In-Garage.wav"},"v":"US-EN-Morgan-Freeman-Motion-In-Garage.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Motion-In-Kitchen.wav"},"v":"US-EN-Morgan-Freeman-Motion-In-Kitchen.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Motion-In-Living-Room.wav"},"v":"US-EN-Morgan-Freeman-Motion-In-Living-Room.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Motion-In-Theater.wav"},"v":"US-EN-Morgan-Freeman-Motion-In-Theater.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Motion-In-Wine-Cellar.wav"},"v":"US-EN-Morgan-Freeman-Motion-In-Wine-Cellar.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Patio-Door-Closed.wav"},"v":"US-EN-Morgan-Freeman-Patio-Door-Closed.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Patio-Door-Locked.wav"},"v":"US-EN-Morgan-Freeman-Patio-Door-Locked.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Patio-Door-Opened.wav"},"v":"US-EN-Morgan-Freeman-Patio-Door-Opened.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Patio-Door-Unlocked.wav"},"v":"US-EN-Morgan-Freeman-Patio-Door-Unlocked.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Roommate-Is-Arriving.wav"},"v":"US-EN-Morgan-Freeman-Roommate-Is-Arriving.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Searching-For-Car-Keys.wav"},"v":"US-EN-Morgan-Freeman-Searching-For-Car-Keys.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Setting-The-Mood.wav"},"v":"US-EN-Morgan-Freeman-Setting-The-Mood.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Smartthings-Detected-A-Flood.wav"},"v":"US-EN-Morgan-Freeman-Smartthings-Detected-A-Flood.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Smartthings-Detected-Carbon-Monoxide.wav"},"v":"US-EN-Morgan-Freeman-Smartthings-Detected-Carbon-Monoxide.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Smartthings-Detected-Smoke.wav"},"v":"US-EN-Morgan-Freeman-Smartthings-Detected-Smoke.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Smoke-Detected-In-Basement.wav"},"v":"US-EN-Morgan-Freeman-Smoke-Detected-In-Basement.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Smoke-Detected-In-Garage.wav"},"v":"US-EN-Morgan-Freeman-Smoke-Detected-In-Garage.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Smoke-Detected-In-Kitchen.wav"},"v":"US-EN-Morgan-Freeman-Smoke-Detected-In-Kitchen.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Someone-Is-Arriving.wav"},"v":"US-EN-Morgan-Freeman-Someone-Is-Arriving.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Son-Is-Arriving.wav"},"v":"US-EN-Morgan-Freeman-Son-Is-Arriving.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Starting-Movie-Mode.wav"},"v":"US-EN-Morgan-Freeman-Starting-Movie-Mode.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Starting-Party-Mode.wav"},"v":"US-EN-Morgan-Freeman-Starting-Party-Mode.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Starting-Romance-Mode.wav"},"v":"US-EN-Morgan-Freeman-Starting-Romance-Mode.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Turning-Off-All-The-Lights.wav"},"v":"US-EN-Morgan-Freeman-Turning-Off-All-The-Lights.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Turning-Off-The-Air-Conditioner.wav"},"v":"US-EN-Morgan-Freeman-Turning-Off-The-Air-Conditioner.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Turning-Off-The-Bar-Lights.wav"},"v":"US-EN-Morgan-Freeman-Turning-Off-The-Bar-Lights.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Turning-Off-The-Chandelier.wav"},"v":"US-EN-Morgan-Freeman-Turning-Off-The-Chandelier.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Turning-Off-The-Family-Room-Lights.wav"},"v":"US-EN-Morgan-Freeman-Turning-Off-The-Family-Room-Lights.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Turning-Off-The-Hallway-Lights.wav"},"v":"US-EN-Morgan-Freeman-Turning-Off-The-Hallway-Lights.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Turning-Off-The-Kitchen-Light.wav"},"v":"US-EN-Morgan-Freeman-Turning-Off-The-Kitchen-Light.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Turning-Off-The-Light.wav"},"v":"US-EN-Morgan-Freeman-Turning-Off-The-Light.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Turning-Off-The-Lights.wav"},"v":"US-EN-Morgan-Freeman-Turning-Off-The-Lights.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Turning-Off-The-Mood-Lights.wav"},"v":"US-EN-Morgan-Freeman-Turning-Off-The-Mood-Lights.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Turning-Off-The-TV.wav"},"v":"US-EN-Morgan-Freeman-Turning-Off-The-TV.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Turning-On-The-Air-Conditioner.wav"},"v":"US-EN-Morgan-Freeman-Turning-On-The-Air-Conditioner.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Turning-On-The-Bar-Lights.wav"},"v":"US-EN-Morgan-Freeman-Turning-On-The-Bar-Lights.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Turning-On-The-Chandelier.wav"},"v":"US-EN-Morgan-Freeman-Turning-On-The-Chandelier.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Turning-On-The-Family-Room-Lights.wav"},"v":"US-EN-Morgan-Freeman-Turning-On-The-Family-Room-Lights.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Turning-On-The-Hallway-Lights.wav"},"v":"US-EN-Morgan-Freeman-Turning-On-The-Hallway-Lights.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Turning-On-The-Kitchen-Light.wav"},"v":"US-EN-Morgan-Freeman-Turning-On-The-Kitchen-Light.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Turning-On-The-Light.wav"},"v":"US-EN-Morgan-Freeman-Turning-On-The-Light.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Turning-On-The-Lights.wav"},"v":"US-EN-Morgan-Freeman-Turning-On-The-Lights.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Turning-On-The-Mood-Lights.wav"},"v":"US-EN-Morgan-Freeman-Turning-On-The-Mood-Lights.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Turning-On-The-TV.wav"},"v":"US-EN-Morgan-Freeman-Turning-On-The-TV.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Vacate-The-Premises.wav"},"v":"US-EN-Morgan-Freeman-Vacate-The-Premises.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Water-Detected-In-Basement.wav"},"v":"US-EN-Morgan-Freeman-Water-Detected-In-Basement.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Water-Detected-In-Garage.wav"},"v":"US-EN-Morgan-Freeman-Water-Detected-In-Garage.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Water-Detected-In-Kitchen.wav"},"v":"US-EN-Morgan-Freeman-Water-Detected-In-Kitchen.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Welcome-Home.wav"},"v":"US-EN-Morgan-Freeman-Welcome-Home.wav"},{"l":{"en-US":"US-EN-Morgan-Freeman-Wife-Is-Arriving.wav"},"v":"US-EN-Morgan-Freeman-Wife-Is-Arriving.wav"}]}}},{"name":"customSound","type":"str","value":"","ui":{"label":{"en-US":"Custom Sound (Optional - will override pre-installed selection)"},"type":"input","opts":{"types":["str","env"]}}},{"name":"isCriticalNotification","type":"bool","value":"false","ui":{"label":{"en-US":"Critical Notification?"},"type":"input","opts":{"types":["bool"]}}},{"name":"interruptionLevel","type":"str","value":"active","ui":{"label":{"en-US":"Interruption Level"},"type":"select","opts":{"opts":[{"l":{"en-US":"Passive (iOS 15+)"},"v":"passive"},{"l":{"en-US":"Active (Default)"},"v":"active"},{"l":{"en-US":"Time Sensitive (iOS 15+)"},"v":"time-sensitive"},{"l":{"en-US":"Critical"},"v":"critical"}]}}},{"name":"userInfo","type":"bool","value":"false","ui":{"label":{"en-US":"Populate User Information"},"type":"checkbox"}},{"name":"isClearNotificationsOnAction","type":"bool","value":"false","ui":{"label":{"en-US":"Clear notifications on Action Received?"},"type":"checkbox"}},{"name":"action1Title","type":"str","value":"","ui":{"label":{"en-US":"Action 1 Title"},"type":"input","opts":{"types":["str"]}}},{"name":"action1Uri","type":"str","value":"","ui":{"label":{"en-US":"Action 1 URL (optional)"},"type":"input","opts":{"types":["str"]}}},{"name":"action1ActivationMode","type":"str","value":"background","ui":{"label":{"en-US":"Action 1 Activation Mode"},"type":"select","opts":{"opts":[{"l":{"en-US":"Background"},"v":"background"},{"l":{"en-US":"Foreground"},"v":"foreground"}]}}},{"name":"action1AuthenticationRequired","type":"bool","value":"false","ui":{"label":{"en-US":"Action 1 App Authentication Required?"},"type":"checkbox"}},{"name":"action1Destructive","type":"bool","value":"false","ui":{"label":{"en-US":"Action 1 Destructive?"},"type":"checkbox"}},{"name":"action1Behavior","type":"str","value":"default","ui":{"label":{"en-US":"Action 1 Behavior"},"type":"select","opts":{"opts":[{"l":{"en-US":"Default"},"v":"default"},{"l":{"en-US":"Text Input"},"v":"textInput"}]}}},{"name":"action1TextInputButtonTitle","type":"str","value":"","ui":{"label":{"en-US":"Action 1 Text Input Button Title (Required if behavior is Text Input)"},"type":"input","opts":{"types":["str","env"]}}},{"name":"action1TextInputPlaceHolder","type":"str","value":"","ui":{"label":{"en-US":"Action 1 Text Input Placeholder (Optional - only if behavior is Text Input)"},"type":"input","opts":{"types":["str","env"]}}},{"name":"action1Icon","type":"str","value":"","ui":{"label":{"en-US":"Action 1 Icon (Optional)"},"type":"input","opts":{"types":["str","env"]}}},{"name":"action2Title","type":"str","value":"","ui":{"label":{"en-US":"Action 2 Title"},"type":"input","opts":{"types":["str"]}}},{"name":"action2Uri","type":"str","value":"","ui":{"label":{"en-US":"Action 2 URL (optional)"},"type":"input","opts":{"types":["str"]}}},{"name":"action2ActivationMode","type":"str","value":"background","ui":{"label":{"en-US":"Action 2 Activation Mode"},"type":"select","opts":{"opts":[{"l":{"en-US":"Background"},"v":"background"},{"l":{"en-US":"Foreground"},"v":"foreground"}]}}},{"name":"action2AuthenticationRequired","type":"bool","value":"false","ui":{"label":{"en-US":"Action 2 App Authentication Required?"},"type":"checkbox"}},{"name":"action2Destructive","type":"bool","value":"false","ui":{"label":{"en-US":"Action 2 Destructive?"},"type":"checkbox"}},{"name":"action2Behavior","type":"str","value":"default","ui":{"label":{"en-US":"Action 2 Behavior"},"type":"select","opts":{"opts":[{"l":{"en-US":"Default"},"v":"default"},{"l":{"en-US":"Text Input"},"v":"textInput"}]}}},{"name":"action2TextInputButtonTitle","type":"str","value":"","ui":{"label":{"en-US":"Action 2 Text Input Button Title (Required if behavior is Text Input)"},"type":"input","opts":{"types":["str","env"]}}},{"name":"action2TextInputPlaceHolder","type":"str","value":"","ui":{"label":{"en-US":"Action 2 Text Input Placeholder (Optional - only if behavior is Text Input)"},"type":"input","opts":{"types":["str","env"]}}},{"name":"action2Icon","type":"str","value":"","ui":{"label":{"en-US":"Action 2 Icon (Optional)"},"type":"input","opts":{"types":["str","env"]}}},{"name":"action3Title","type":"str","value":"","ui":{"label":{"en-US":"Action 3 Title"},"type":"input","opts":{"types":["str"]}}},{"name":"action3Uri","type":"str","value":"","ui":{"label":{"en-US":"Action 3 URL (optional)"},"type":"input","opts":{"types":["str"]}}},{"name":"action3ActivationMode","type":"str","value":"background","ui":{"label":{"en-US":"Action 3 Activation Mode"},"type":"select","opts":{"opts":[{"l":{"en-US":"Background"},"v":"background"},{"l":{"en-US":"Foreground"},"v":"foreground"}]}}},{"name":"action3AuthenticationRequired","type":"bool","value":"false","ui":{"label":{"en-US":"Action 3 App Authentication Required?"},"type":"checkbox"}},{"name":"action3Destructive","type":"bool","value":"false","ui":{"label":{"en-US":"Action 3 Destructive?"},"type":"checkbox"}},{"name":"action3Behavior","type":"str","value":"default","ui":{"label":{"en-US":"Action 3 Behavior"},"type":"select","opts":{"opts":[{"l":{"en-US":"Default"},"v":"default"},{"l":{"en-US":"Text Input"},"v":"textInput"}]}}},{"name":"action3TextInputButtonTitle","type":"str","value":"","ui":{"label":{"en-US":"Action 3 Text Input Button Title (Required if behavior is Text Input)"},"type":"input","opts":{"types":["str","env"]}}},{"name":"action3TextInputPlaceHolder","type":"str","value":"","ui":{"label":{"en-US":"Action 3 Text Input Placeholder (Optional - only if behavior is Text Input)"},"type":"input","opts":{"types":["str","env"]}}},{"name":"action3Icon","type":"str","value":"","ui":{"label":{"en-US":"Action 3 Icon (Optional)"},"type":"input","opts":{"types":["str","env"]}}},{"name":"action4Title","type":"str","value":"","ui":{"label":{"en-US":"Action 4 Title"},"type":"input","opts":{"types":["str"]}}},{"name":"action4Uri","type":"str","value":"","ui":{"label":{"en-US":"Action 4 URL (optional)"},"type":"input","opts":{"types":["str"]}}},{"name":"action4ActivationMode","type":"str","value":"background","ui":{"label":{"en-US":"Action 4 Activation Mode"},"type":"select","opts":{"opts":[{"l":{"en-US":"Background"},"v":"background"},{"l":{"en-US":"Foreground"},"v":"foreground"}]}}},{"name":"action4AuthenticationRequired","type":"bool","value":"false","ui":{"label":{"en-US":"Action 4 App Authentication Required?"},"type":"checkbox"}},{"name":"action4Destructive","type":"bool","value":"false","ui":{"label":{"en-US":"Action 4 Destructive?"},"type":"checkbox"}},{"name":"action4Behavior","type":"str","value":"default","ui":{"label":{"en-US":"Action 4 Behavior"},"type":"select","opts":{"opts":[{"l":{"en-US":"Default"},"v":"default"},{"l":{"en-US":"Text Input"},"v":"textInput"}]}}},{"name":"action4TextInputButtonTitle","type":"str","value":"","ui":{"label":{"en-US":"Action 4 Text Input Button Title (Required if behavior is Text Input)"},"type":"input","opts":{"types":["str","env"]}}},{"name":"action4TextInputPlaceHolder","type":"str","value":"","ui":{"label":{"en-US":"Action 4 Text Input Placeholder (Optional - only if behavior is Text Input)"},"type":"input","opts":{"types":["str","env"]}}},{"name":"action4Icon","type":"str","value":"","ui":{"label":{"en-US":"Action 4 Icon (Optional)"},"type":"input","opts":{"types":["str","env"]}}},{"name":"latitudeFirst","type":"num","value":"","ui":{"label":{"en-US":"Latitude for Pin 1"},"type":"input","opts":{"types":["num","env"]}}},{"name":"longitudeFirst","type":"num","value":"","ui":{"label":{"en-US":"Longitude for Pin 1"},"type":"input","opts":{"types":["num","env"]}}},{"name":"latitudeSecond","type":"num","value":"","ui":{"label":{"en-US":"Latitude for Pin 2"},"type":"input","opts":{"types":["num","env"]}}},{"name":"longitudeSecond","type":"num","value":"","ui":{"label":{"en-US":"Longitude for Pin 2"},"type":"input","opts":{"types":["num","env"]}}},{"name":"showLineBetweenPoints","type":"bool","value":"false","ui":{"label":{"en-US":"Show a line between points?"},"type":"input","opts":{"types":["bool","env"]}}},{"name":"showCompass","type":"bool","value":"false","ui":{"label":{"en-US":"Show a compass on the map?"},"type":"input","opts":{"types":["bool","env"]}}},{"name":"showPointsOfInterest","type":"bool","value":"false","ui":{"label":{"en-US":"Show points of interest?"},"type":"input","opts":{"types":["bool","env"]}}},{"name":"showScale","type":"bool","value":"false","ui":{"label":{"en-US":"Show scale information on the map?"},"type":"input","opts":{"types":["bool","env"]}}},{"name":"showTraffic","type":"bool","value":"false","ui":{"label":{"en-US":"Show Traffic?"},"type":"input","opts":{"types":["bool","env"]}}},{"name":"showUserLocation","type":"bool","value":"false","ui":{"label":{"en-US":"Show User Location?"},"type":"input","opts":{"types":["bool","env"]}}},{"name":"cameraEntity","type":"str","value":"","ui":{"label":{"en-US":"Camera Entity"},"type":"input","opts":{"types":["str","env"]}}},{"name":"imagePath","type":"str","value":"","ui":{"label":{"en-US":"Image Path (10MB limit)"},"type":"input","opts":{"types":["str","env"]}}},{"name":"videoPath","type":"str","value":"","ui":{"label":{"en-US":"Video Path (50MB limit)"},"type":"input","opts":{"types":["str","env"]}}},{"name":"audioPath","type":"str","value":"","ui":{"label":{"en-US":"Audio Path (5MB limit)"},"type":"input","opts":{"types":["str","env"]}}},{"name":"contentUrl","type":"str","value":"","ui":{"label":{"en-US":"Content URL (overrides image/video/audio)"},"type":"input","opts":{"types":["str","env"]}}},{"name":"lazyLoading","type":"bool","value":"false","ui":{"label":{"en-US":"Load Media in Notification Lazily?"},"type":"input","opts":{"types":["bool","env"]}}},{"name":"hideThumbnail","type":"bool","value":"false","ui":{"label":{"en-US":"Hide thumbnail?"},"type":"input","opts":{"types":["bool","env"]}}},{"name":"debugMode","type":"bool","value":"false","ui":{"label":{"en-US":"Debug Mode?"},"type":"checkbox"}}],"meta":{},"color":"#C7E9C0","outputLabels":["Action 1","Action 2","Action 3","Cleared"],"icon":"font-awesome/fa-mobile-phone","status":{"x":220,"y":320,"wires":[{"id":"f3d74762ed30ae54","port":0}]}},{"id":"3586791854cfef41","type":"function","z":"6dc0247c.d7210c","name":"create service call","func":"msg._originalPayload = msg.payload;\nlet flow_msg_variables = {\n  tag: '',\n  service: '',\n  message: msg,\n  date_created: Date.now()\n}\n\nvar xTitle = \"\";\nvar xSubtitle = \"\";\nvar xMessage = \"\";\nvar xServices = \"\";\nvar xTag = \"\";\nvar xUrl = \"\";\nvar xCameraEntity = \"\";\nvar xInterruptionLevel = \"\";\n\n// overrides\nif (typeof msg.notificationOverride !== 'undefined' && msg.notificationOverride !== null) {\n    if (typeof msg.notificationOverride.title !== 'undefined' && msg.notificationOverride.title !=='' && msg.notificationOverride.title !== null){\n        xTitle = msg.notificationOverride.title;\n    } else {\n        xTitle = env.get('title');\n    }\n    if (typeof msg.notificationOverride.subtitle !== 'undefined' && msg.notificationOverride.subtitle !==''  && msg.notificationOverride.subtitle !== null){\n        xSubtitle = msg.notificationOverride.subtitle;\n    } else {\n        xSubtitle = env.get('subtitle');\n    }\n    if (typeof msg.notificationOverride.message !== 'undefined' && msg.notificationOverride.message !=='' &&  msg.notificationOverride.message !== null){\n        xMessage = msg.notificationOverride.message;\n    } else {\n        xMessage = env.get('message');\n    }\n    if (typeof msg.notificationOverride.url !== 'undefined' && msg.notificationOverride.url !=='' &&  msg.notificationOverride.url !== null){\n        xUrl = msg.notificationOverride.url;\n    } else {\n        xUrl = env.get('notificationUrl');\n    }\n    if (typeof msg.notificationOverride.services !== 'undefined' && msg.notificationOverride.services !=='' && msg.notificationOverride.services !== null){\n        xServices = msg.notificationOverride.services;\n    } else {\n        xServices = env.get('service');\n    }\n    if (typeof msg.notificationOverride.cameraEntity !== 'undefined' && msg.notificationOverride.cameraEntity !=='' && msg.notificationOverride.cameraEntity !== null){\n        xCameraEntity = msg.notificationOverride.cameraEntity;\n    } else {\n        xCameraEntity = env.get('cameraEntity');\n    }\n    \n    if (typeof msg.notificationOverride.interruptionLevel !== 'undefined' && msg.notificationOverride.interruptionLevel !=='' && msg.notificationOverride.interruptionLevel !== null){\n        xInterruptionLevel = msg.notificationOverride.interruptionLevel;\n    } else {\n        xInterruptionLevel = env.get('interruptionLevel');\n    }\n    \n    flow_msg_variables.service=xServices;\n    if (typeof msg.notificationOverride.tag !== 'undefined' && msg.notificationOverride.tag !=='' && msg.notificationOverride.tag !== null){\n        xTag = msg.notificationOverride.tag.replace(/[^\\w\\s]/gi, '').replace(/\\s+/g,'_').toUpperCase();\n    } else {\n        if (env.get('tag') !== '') {\n            xTag = `${env.get('tag').replace(/[^\\w\\s]/gi, '').replace(/\\s+/g,'_').toUpperCase()}`;\n        } else {\n            // need to still set this to something in case clear_notification is sent.\n            xTag = `${env.get('title').replace(/[^\\w\\s]/gi, '').replace(/\\s+/g,'_').toUpperCase()}_${flow.get('random')}`;\n        } \n    }\n//support multiple tags per flow\n  flow_msg_variables.tag=xTag;\n} else {\n    // If no override is sent in...\n    if (env.get('tag') !== '') {\n        xTag = `${env.get('tag').replace(/[^\\w\\s]/gi, '').replace(/\\s+/g,'_').toUpperCase()}`;\n    } else {\n        // need to still set this to something in case clear_notification is sent.\n        xTag = `${env.get('title').replace(/[^\\w\\s]/gi, '').replace(/\\s+/g,'_').toUpperCase()}_${flow.get('random')}`;\n    } \n    //support multiple tags per flow\n    //  flow.set('tag',xTag);\n    flow_msg_variables.tag=xTag;\n    \n    xServices = env.get('service');\n    flow_msg_variables.service=xServices;\n\n    xTitle = env.get('title');\n    xSubtitle = env.get('subtitle');\n    xMessage = env.get('message');\n    xUrl = env.get('notificationUrl');\n    xCameraEntity = env.get('cameraEntity');\n    xInterruptionLevel = env.get('interruptionLevel');\n}\n\nlet all_flow_messages= flow.get('flow_messages');\nif (!all_flow_messages){\n  all_flow_messages=[];\n}\nlet new_flow_messages=[];\nfor(var i=0;i<all_flow_messages.length;i++){//copy (and reset) the messages array\n  if ((all_flow_messages[i].tag==flow_msg_variables.tag)&&(all_flow_messages[i].service==flow_msg_variables.service)){\n    continue;//don't copy this message\n  }else{\n    if (Date.now()-all_flow_messages[i].date_created<86400000){//only copy messages less than 24h old\n      new_flow_messages.push(all_flow_messages[i]);\n    }\n  }\n}\nnew_flow_messages.push(flow_msg_variables);\nflow.set('flow_messages',new_flow_messages);\n\nconst services = xServices;\nif(!services) {\n    node.status({\n        text: 'no services defined',\n        shape: 'ring',\n        fill: 'red'\n    });\n    return;    \n} else if (services == \"NOONE\"){\n    node.status({\n        text: 'No one to send to',\n        shape: 'ring',\n        fill: 'yellow'\n    });\n    return;\n}\n\n\n\n// create actions\nconst actions = [];\n[1,2,3,4].forEach(i => {\n    const name = `action${i}`\n    if (env.get(`${name}Title`) !== ''){\n        const action = env.get(`${name}Title`).replace(/[^\\w\\s]/gi, '').replace(/\\s+/g,'_').toUpperCase();\n        const title = env.get(`${name}Title`);\n        const activationMode = env.get(`${name}ActivationMode`);  \n        \n        const uri = env.get(`${name}Uri`);\n        const textInputButtonTitle = env.get(`${name}TextInputButtonTitle`);\n        const textInputPlaceholder = env.get(`${name}TextInputPlaceHolder`);\n        const authenticationRequired = env.get(`${name}AuthenticationRequired`);\n        const destructive = env.get(`${name}Destructive`);\n        const behavior = env.get(`${name}Behavior`);\n        const icon = env.get(`${name}Icon`);\n        \n        const actionObject = {};\n        actionObject.action = action;\n        if (msg.notificationOverride != null && msg.notificationOverride[`${name}Title`] != null && msg.notificationOverride[`${name}Title`] != '') {\n            actionObject.title = msg.notificationOverride[`${name}Title`];\n        } else {\n            actionObject.title = title;\n        }\n        actionObject.activationMode = activationMode;\n        \n        if (uri != \"\") actionObject.uri = uri;\n        if (textInputButtonTitle != \"\") actionObject.textInputButtonTitle = textInputButtonTitle;\n        if (textInputPlaceholder != \"\") actionObject.textInputPlaceholder = textInputPlaceholder;\n        if (authenticationRequired != \"\") actionObject.authenticationRequired = authenticationRequired;\n        if (destructive != \"\") actionObject.destructive = destructive;\n        if (behavior != \"\") actionObject.behavior = behavior;\n        if (icon != \"\") actionObject.icon = icon;\n        \n        actions.push(actionObject);\n    }\n});\n\n// create msg object\n\nmsg.payload = {\n        domain: 'notify',\n        data: {\n            title: xTitle,\n            message: xMessage,\n            data: {\n                push: {},\n                tag: xTag\n            }\n        }\n    };\n\nif (actions.length > 0) {\n    msg.payload.data.data.action_data = {tag: xTag};\n    msg.payload.data.data.actions = actions;\n    \n}\n\n\n// notification url\nif (xUrl !== \"\") {\n    msg.payload.data.data.url = {};\n    msg.payload.data.data.url = xUrl;\n}\n\n// subtitle\nif (xSubtitle !== '') {\n    msg.payload.data.data.subtitle = xSubtitle;\n}\n\n// sound information\nmsg.payload.data.data.push.sound = {};\nif (env.get('customSound').length > 0){\n    msg.payload.data.data.push.sound.name = env.get('customSound');\n} else if (env.get('customSoundPreInstalled').length > 0) {\n  if(env.get('customSoundPreInstalled')=='none'){\n    msg.payload.data.data.push.sound = 'none';\n  }else{\n    msg.payload.data.data.push.sound.name = env.get('customSoundPreInstalled');\n  }\n} else {\n    msg.payload.data.data.push.sound.name = 'default';\n}\n\nif (env.get('isCriticalNotification')) {\n    msg.payload.data.data.push.sound.critical = 1;\n    msg.payload.data.data.push.sound.volume = 1.0;\n    msg.payload.data.data.push[\"interruption-level\"] = 'critical';\n} else {\n    // interruption level\n    if (xInterruptionLevel !== '') {\n        msg.payload.data.data.push[\"interruption-level\"] = xInterruptionLevel;\n        if (xInterruptionLevel == 'critical'){\n            msg.payload.data.data.push.sound.critical = 1;\n            msg.payload.data.data.push.sound.volume = 1.0;\n        }\n    }\n}\n\n// group thread id\nif (env.get('group') !== '') {\n    msg.payload.data.data.group = env.get('group');\n}\n\n// Map Information\nif (env.get('latitudeFirst') != '0' && env.get('longitudeFirst') != '0'){\n    msg.payload.data.data.action_data.latitude = env.get('latitudeFirst');\n    msg.payload.data.data.action_data.longitude = env.get('longitudeFirst');\n    if (env.get('latitudeSecond') != '0' && env.get('longitudeSecond') != '0'){\n        msg.payload.data.data.action_data.second_latitude = env.get('latitudeSecond');\n        msg.payload.data.data.action_data.second_longitude = env.get('longitudeSecond');\n        // add in all the extras, which default to false.\n        msg.payload.data.data.action_data.shows_line_between_points = env.get('showLineBetweenPoints');\n        msg.payload.data.data.action_data.shows_compass = env.get('showCompass');\n        msg.payload.data.data.action_data.shows_points_of_interest = env.get('showPointsOfInterest');\n        msg.payload.data.data.action_data.shows_scale = env.get('showScale');\n        msg.payload.data.data.action_data.shows_traffic = env.get('showTraffic');\n        msg.payload.data.data.action_data.shows_user_location = env.get('showUserLocation');\n    }\n} \n// camera information\nif (xCameraEntity !== '') {\n    msg.payload.data.data.entity_id = xCameraEntity;\n}\n// media information\nif (env.get('contentUrl') !== '') {\n\n} else {\n    if (env.get('imagePath') !== '') {\n        msg.payload.data.data.image = env.get('imagePath');\n    }\n    if (env.get('videoPath') !== '') {\n        msg.payload.data.data.video = env.get('videoPath');\n    }\n    if (env.get('audioPath') !== '') {\n        msg.payload.data.data.audio = env.get('audioPath');\n    }\n}\nif (env.get('contentUrl') !== '' || env.get('imagePath') !== '' || env.get('videoPath') !== '' || env.get('audioPath') !== '') {\n    if (env.get('lazyLoading')) {\n        msg.payload.data.data.lazy = env.get('lazyLoading');\n    }\n    if (env.get('hideThumbnail')) {\n        msg.payload.data.data.attachment = {};\n        msg.payload.data.data.attachment['hide-thumbnail'] = env.get('hideThumbnail');\n    }\n}\n\nservices.trim().split(/,\\s*/).forEach(service => {\n    if(!service) return;\n    msg.payload.service = service;\n    node.send(msg);\n});\n\nnode.done();","outputs":1,"noerr":0,"initialize":"flow.set('random',Math.random().toString(36).replace(/[^a-z]+/g, '').slice(0, 5).toUpperCase());","finalize":"","libs":[],"x":430,"y":80,"wires":[["84115d3979a0b0b6","f557e978ced0e50b"]]},{"id":"90ab222038404541","type":"switch","z":"6dc0247c.d7210c","name":"which action?","property":"responseIndex","propertyType":"flow","rules":[{"t":"eq","v":"1","vt":"num"},{"t":"eq","v":"2","vt":"num"},{"t":"eq","v":"3","vt":"num"},{"t":"eq","v":"4","vt":"num"}],"checkall":"true","repair":false,"outputs":4,"x":1280,"y":480,"wires":[[],[],[],[]]},{"id":"f3d74762ed30ae54","type":"status","z":"6dc0247c.d7210c","name":"","scope":["3586791854cfef41","b1e2e20511543565","fcf9f9c27469a607","6fdf5748e207aa7e"],"x":100,"y":320,"wires":[[]]},{"id":"b1e2e20511543565","type":"function","z":"6dc0247c.d7210c","name":"build message","func":"const latestMessage = flow.get('latestMessage');\nconst event = msg.payload.event;\n\nlatestMessage.payload = latestMessage._originalPayload;\nlatestMessage.eventData = msg.payload;\ndelete latestMessage._originalPayload;\n\nif(env.get('userInfo')) {\n    const userData = msg.userData.find(u => u.id === msg.payload.context.user_id);\n    latestMessage.userData = userData;\n}\n\nconst index = [1,2,3,4].find(i => env.get(`action${i}Title`).replace(/[^\\w\\s]/gi, '').replace(/\\s+/g,'_').toUpperCase() === event.actionName);\nflow.set(\"responseIndex\",index);\nnode.status({\n    text: `${env.get(`action${index}Title`).replace(/[^\\w\\s]/gi, '').replace(/\\s+/g,'_').toUpperCase()} at: ${getPrettyDate()}`,\n    shape: 'dot',\n    fill: 'green'\n});\n\nreturn latestMessage;\n\n\nfunction getPrettyDate() {\n    return new Date().toLocaleDateString('en-US', {\n        month: 'short',\n        day: 'numeric',\n        hour12: false,\n        hour: 'numeric',\n        minute: 'numeric',\n    });\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1080,"y":480,"wires":[["90ab222038404541","f2ef3c472aaf3250"]]},{"id":"7bc5c379b10a2fbf","type":"ha-api","z":"6dc0247c.d7210c","name":"get user info","server":"","version":1,"debugenabled":false,"protocol":"websocket","method":"get","path":"","data":"{\"type\": \"config/auth/list\"}","dataType":"json","responseType":"json","outputProperties":[{"property":"userData","propertyType":"msg","value":"","valueType":"results"}],"x":950,"y":420,"wires":[["b1e2e20511543565"]]},{"id":"c25a82298fbaad78","type":"switch","z":"6dc0247c.d7210c","name":"fetch user info?","property":"userInfo","propertyType":"env","rules":[{"t":"true"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":800,"y":480,"wires":[["7bc5c379b10a2fbf"],["b1e2e20511543565"]]},{"id":"b738bc2e474ec4a5","type":"server-events","z":"6dc0247c.d7210c","name":"ios.notification_action_fired","server":"","version":2,"eventType":"ios.notification_action_fired","exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"waitForRunning":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"$outputData(\"eventData\").event_type","valueType":"jsonata"},{"property":"event_type","propertyType":"msg","value":"$outputData(\"eventData\").event_type","valueType":"jsonata"}],"x":164,"y":256,"wires":[["86b12904f73a0329"]]},{"id":"fcf9f9c27469a607","type":"api-call-service","z":"6dc0247c.d7210c","name":"Send Notifications","server":"","version":5,"debugenabled":false,"domain":"notify","service":"","areaId":[],"deviceId":[],"entityId":[],"data":"","dataType":"json","mergeContext":"callServiceData","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":830,"y":80,"wires":[[]]},{"id":"6fdf5748e207aa7e","type":"function","z":"6dc0247c.d7210c","name":"create CLEAR service call","func":"msg._originalPayload = msg.payload;\nvar tag_to_clear = \"\";\nvar services = \"\";\nvar clearAll = false;\nif (typeof msg.notificationOverride !== 'undefined') {\n    if (typeof msg.notificationOverride.clear !== 'undefined' && msg.notificationOverride.clear !== null && msg.notificationOverride.clear) {\n        clearAll = true;\n    }\n    if (typeof msg.notificationOverride.services !== 'undefined' && msg.notificationOverride.services !== null && msg.notificationOverride.services){\n        services = msg.notificationOverride.services;\n    }\n    if (typeof msg.notificationOverride.tag !== 'undefined' && msg.notificationOverride.tag !== null && msg.notificationOverride.tag){\n        tag_to_clear = msg.notificationOverride.tag.replace(/[^\\w\\s]/gi, '').replace(/\\s+/g,'_').toUpperCase();//formatting tags as sent to the phone before\n    }\n}\n\nif (tag_to_clear==\"\"){//no specific tag sent, clear the last message.\n  var all_flow_messages= flow.get('flow_messages');\n  if(all_flow_messages) {\n    var last_message= all_flow_messages.pop();\n    if (last_message){//on nodeRED restart\n      tag_to_clear= last_message.tag;\n      services = last_message.service;//override service to the one used in last message sent\n      flow.set('flow_messages',all_flow_messages);//clear the message from memory\n    }\n  }\n}\n\nif(services==\"\") {\n    node.status({\n        text: 'no services defined',\n        shape: 'ring',\n        fill: 'red'\n    });\n    return;    \n}\n\nif(tag_to_clear==\"\") {\n  node.status({\n    text: 'no messages to delete',\n    shape: 'ring',\n    fill: 'red'\n  });\n  return;  \n}\n\n// create ios msg object\n\nmsg.payload = {\n        domain: 'notify',\n        data: {\n            message: \"clear_notification\",\n            data: {\n                tag: tag_to_clear\n            }\n        }\n    };\n\nfunction getPrettyDate() {\n    return new Date().toLocaleDateString('en-US', {\n        month: 'short',\n        day: 'numeric',\n        hour12: false,\n        hour: 'numeric',\n        minute: 'numeric',\n    });\n}\n\nif (clearAll){\n    delete msg.notificationOverride;\n}\n    \nvar xCountCleared = 0;\nservices.trim().split(/,\\s*/).forEach(service => {\n    if(!service) return;\n    // only clear on devices that didn't send the event.\n    if (clearAll){\n        msg.payload.service = service;\n        node.send(msg);\n        xCountCleared++;\n    } else if (!service.includes(msg._originalPayload.event.sourceDeviceID)){\n        msg.payload.service = service;\n        node.send(msg);\n        xCountCleared++;\n    }\n});\nif (xCountCleared > 0) {\n    node.status({\n        text: `${xCountCleared} messages cleared at: ${getPrettyDate()}`,\n        shape: 'dot',\n        fill: 'blue'\n    });\n} else {\n    node.status({\n        text: `No messages cleared: ${getPrettyDate()}`,\n        shape: 'dot',\n        fill: 'red'\n    });\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":730,"y":300,"wires":[["05b8370d35105d3c","a4feb0ee44ac319d"]]},{"id":"a69ed312811b3a6d","type":"switch","z":"6dc0247c.d7210c","name":"Clear Notification on Action?","property":"isClearNotificationsOnAction","propertyType":"env","rules":[{"t":"true"},{"t":"false"}],"checkall":"true","repair":false,"outputs":2,"x":460,"y":440,"wires":[["6fdf5748e207aa7e","227a6ab8de989095"],["c25a82298fbaad78"]]},{"id":"e229e2d8efb85d22","type":"api-call-service","z":"6dc0247c.d7210c","name":"Clear Notifications","server":"","version":5,"debugenabled":false,"domain":"notify","service":"","areaId":[],"deviceId":[],"entityId":[],"data":"","dataType":"json","mergeContext":"callServiceData","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1210,"y":240,"wires":[[]]},{"id":"227a6ab8de989095","type":"delay","z":"6dc0247c.d7210c","name":"","pauseType":"delay","timeout":"10","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":720,"y":420,"wires":[["c25a82298fbaad78"]]},{"id":"6b940f2bfba5188c","type":"switch","z":"6dc0247c.d7210c","name":"clear?","property":"notificationOverride.clear","propertyType":"msg","rules":[{"t":"istype","v":"undefined","vt":"undefined"},{"t":"null"},{"t":"false"},{"t":"true"}],"checkall":"false","repair":false,"outputs":4,"x":210,"y":80,"wires":[["3586791854cfef41"],["3586791854cfef41"],["3586791854cfef41"],["6fdf5748e207aa7e"]]},{"id":"05b8370d35105d3c","type":"delay","z":"6dc0247c.d7210c","name":"","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":990,"y":240,"wires":[["e229e2d8efb85d22"]]},{"id":"84115d3979a0b0b6","type":"delay","z":"6dc0247c.d7210c","name":"","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"outputs":1,"x":630,"y":80,"wires":[["fcf9f9c27469a607"]]},{"id":"86b12904f73a0329","type":"function","z":"6dc0247c.d7210c","name":"belongs here?","func":"let msg_tag=msg.payload.event.action_data.tag;\nlet all_flow_messages= flow.get('flow_messages');\nif(all_flow_messages){\n    for (var i=0;i<all_flow_messages.length;i++){\n        if (all_flow_messages[i].tag.trim()==msg_tag.trim()){\n            flow.set('latestMessage',all_flow_messages[i].message);\n            return [msg,null];\n        }\n    }\n}\nreturn [null,msg];\n","outputs":2,"noerr":0,"initialize":"","finalize":"","libs":[],"x":400,"y":260,"wires":[["a69ed312811b3a6d"],[]]},{"id":"65d1a4e5a4a92b66","type":"debug","z":"6dc0247c.d7210c","name":"iOS Notify Debug Input Message","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":200,"y":200,"wires":[]},{"id":"b340e7a2f7b93193","type":"debug","z":"6dc0247c.d7210c","name":"iOS Notify Debug Notify Service Call","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":870,"y":160,"wires":[]},{"id":"b6444c11b4074de0","type":"debug","z":"6dc0247c.d7210c","name":"iOS Notify Debug Clear Service Call","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1270,"y":300,"wires":[]},{"id":"63e91a53e0014900","type":"debug","z":"6dc0247c.d7210c","name":"iOS Notify Debug Output Message","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1120,"y":600,"wires":[]},{"id":"a380385926a54b87","type":"switch","z":"6dc0247c.d7210c","name":"Debug?","property":"debugMode","propertyType":"env","rules":[{"t":"true"}],"checkall":"true","repair":false,"outputs":1,"x":140,"y":140,"wires":[["65d1a4e5a4a92b66"]]},{"id":"f2ef3c472aaf3250","type":"switch","z":"6dc0247c.d7210c","name":"Debug?","property":"debugMode","propertyType":"env","rules":[{"t":"true"}],"checkall":"true","repair":false,"outputs":1,"x":1040,"y":540,"wires":[["63e91a53e0014900"]]},{"id":"a4feb0ee44ac319d","type":"switch","z":"6dc0247c.d7210c","name":"Debug?","property":"debugMode","propertyType":"env","rules":[{"t":"true"}],"checkall":"true","repair":false,"outputs":1,"x":980,"y":300,"wires":[["b6444c11b4074de0"]]},{"id":"f557e978ced0e50b","type":"switch","z":"6dc0247c.d7210c","name":"Debug?","property":"debugMode","propertyType":"env","rules":[{"t":"true"}],"checkall":"true","repair":false,"outputs":1,"x":620,"y":160,"wires":[["b340e7a2f7b93193"]]},{"id":"114685d.7c53afa","type":"subflow:6dc0247c.d7210c","z":"7012ab48.7807fc","name":"iOS Actionable Notification","env":[{"name":"group","value":"laundry_room","type":"str"},{"name":"tag","value":"test_tag","type":"str"},{"name":"service","value":"mobile_app_steve_stratotis_iphone2","type":"str"},{"name":"title","value":"Test Title","type":"str"},{"name":"subtitle","value":"Testing Subtitle","type":"str"},{"name":"message","value":"TEST MESSAGE!","type":"str"},{"name":"userInfo","type":"bool","value":"true"},{"name":"isClearNotificationsOnAction","type":"bool","value":"true"},{"name":"action1Title","value":"Actionable Option 1","type":"str"},{"name":"action1Destructive","type":"bool","value":"true"},{"name":"action1Icon","value":"sfsymbols:bell.slash","type":"str"},{"name":"action2Title","value":"Actionable Option Dos","type":"str"},{"name":"action2ActivationMode","value":"foreground","type":"str"},{"name":"action2AuthenticationRequired","type":"bool","value":"true"},{"name":"action3Title","value":"Actionable Option THREE","type":"str"},{"name":"action3Uri","value":"/lovelace-mushroom/nursery","type":"str"},{"name":"action3Icon","value":"sfsymbols:bell.slash","type":"str"},{"name":"action4Title","value":"Option fore","type":"str"},{"name":"action4Behavior","value":"textInput","type":"str"},{"name":"action4TextInputButtonTitle","value":"Gimmie Text","type":"str"},{"name":"action4TextInputPlaceHolder","value":"Put text here","type":"str"},{"name":"showLineBetweenPoints","value":"true","type":"bool"},{"name":"showScale","value":"true","type":"bool"},{"name":"showTraffic","value":"true","type":"bool"},{"name":"showUserLocation","value":"true","type":"bool"},{"name":"imagePath","value":"/local/Steve.jpg","type":"str"},{"name":"hideThumbnail","value":"true","type":"bool"},{"name":"debugMode","type":"bool","value":"true"},{"name":"categoryName","value":"test category","type":"str"}],"x":520,"y":140,"wires":[["84f6831c.f103d8"],["20cf6271.4ad336"],["4b78cb31.190c0c"],["622a3e68.c0e448"]]},{"id":"e50ae199.b563","type":"inject","z":"7012ab48.7807fc","name":"abc: default payload","props":[{"p":"notificationOverride.title","v":"test Title override","vt":"str"},{"p":"notificationOverride.message","v":"test MESSAGE override","vt":"str"},{"p":"notificationOverride.action2Title","v":"testing Title Override","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":"500","topic":"","x":210,"y":140,"wires":[["114685d.7c53afa"]]},{"id":"84f6831c.f103d8","type":"debug","z":"7012ab48.7807fc","name":"Debug Output Action 1","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":910,"y":60,"wires":[]},{"id":"20cf6271.4ad336","type":"debug","z":"7012ab48.7807fc","name":"Debug Output Action 2","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":910,"y":120,"wires":[]},{"id":"4b78cb31.190c0c","type":"debug","z":"7012ab48.7807fc","name":"Debug Output Action 3","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":910,"y":180,"wires":[]},{"id":"622a3e68.c0e448","type":"debug","z":"7012ab48.7807fc","name":"Debug Output Action 4","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":910,"y":240,"wires":[]},{"id":"e27fe47feedeeff7","type":"subflow:ffcc5b03.763568","z":"7012ab48.7807fc","name":"","env":[],"x":290,"y":220,"wires":[["114685d.7c53afa"]]},{"id":"2c7674ce84488143","type":"inject","z":"7012ab48.7807fc","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":120,"y":220,"wires":[["e27fe47feedeeff7"]]}]
sorted01 commented 1 year ago

Hey. Just wanted to let you know that I am currently on vacation with my family. Gonna test it next week and give you feedback. 🤗 I really appreciate your help!

sorted01 commented 1 year ago

image

still the same unfortunately... :/

sstratoti commented 1 year ago

OK - if you're using the "Clear Notifications" node, then you must have the Tag set for the "iOS Actionable Notification" node. Like this:

image

This helps it to identify which notification to "clear". Try setting that with a value?

sorted01 commented 1 year ago

I still didn't get it to run... I would love to use it... And i really appreciate your support. Could you create a working flow (example of your node red) which i can import (including the subflow)

Or basically: do I need to adapt anything in the subflow (expect fixing the red triangles)