diff --git a/Example Action API.indigoPlugin/Contents/Server Plugin/plugin.py b/Example Action API.indigoPlugin/Contents/Server Plugin/plugin.py index 8cf082a..5a29f1a 100644 --- a/Example Action API.indigoPlugin/Contents/Server Plugin/plugin.py +++ b/Example Action API.indigoPlugin/Contents/Server Plugin/plugin.py @@ -1,5 +1,5 @@ #################### -# Copyright (c) 2024, Indigo Domotics. All rights reserved. +# Copyright (c) 2026, Indigo Domotics. All rights reserved. # https://www.indigodomo.com try: # This is primarily for IDEs - the indigo package is always included when a plugin is started. diff --git a/Example Custom Broadcaster.indigoPlugin/Contents/Server Plugin/plugin.py b/Example Custom Broadcaster.indigoPlugin/Contents/Server Plugin/plugin.py index 97230c7..4133a23 100644 --- a/Example Custom Broadcaster.indigoPlugin/Contents/Server Plugin/plugin.py +++ b/Example Custom Broadcaster.indigoPlugin/Contents/Server Plugin/plugin.py @@ -1,5 +1,5 @@ #################### -# Copyright (c) 2024, Indigo Domotics. All rights reserved. +# Copyright (c) 2026, Indigo Domotics. All rights reserved. # https://www.indigodomo.com try: # This is primarily for IDEs - the indigo package is always included when a plugin is started. diff --git a/Example Custom Subscriber.indigoPlugin/Contents/Server Plugin/plugin.py b/Example Custom Subscriber.indigoPlugin/Contents/Server Plugin/plugin.py index 62dae96..8d4951c 100644 --- a/Example Custom Subscriber.indigoPlugin/Contents/Server Plugin/plugin.py +++ b/Example Custom Subscriber.indigoPlugin/Contents/Server Plugin/plugin.py @@ -1,5 +1,5 @@ #################### -# Copyright (c) 2024, Indigo Domotics. All rights reserved. +# Copyright (c) 2026, Indigo Domotics. All rights reserved. # https://www.indigodomo.com try: # This is primarily for IDEs - the indigo package is always included when a plugin is started. diff --git a/Example Database Traverse.indigoPlugin/Contents/Server Plugin/plugin.py b/Example Database Traverse.indigoPlugin/Contents/Server Plugin/plugin.py index be96ed0..7a48195 100644 --- a/Example Database Traverse.indigoPlugin/Contents/Server Plugin/plugin.py +++ b/Example Database Traverse.indigoPlugin/Contents/Server Plugin/plugin.py @@ -1,5 +1,5 @@ #################### -# Copyright (c) 2024, Indigo Domotics. All rights reserved. +# Copyright (c) 2026, Indigo Domotics. All rights reserved. # https://www.indigodomo.com try: # This is primarily for IDEs - the indigo package is always included when a plugin is started. diff --git a/Example Device - Custom.indigoPlugin/Contents/Server Plugin/plugin.py b/Example Device - Custom.indigoPlugin/Contents/Server Plugin/plugin.py index ea1adf9..68e4556 100644 --- a/Example Device - Custom.indigoPlugin/Contents/Server Plugin/plugin.py +++ b/Example Device - Custom.indigoPlugin/Contents/Server Plugin/plugin.py @@ -1,5 +1,5 @@ #################### -# Copyright (c) 2024, Indigo Domotics. All rights reserved. +# Copyright (c) 2026, Indigo Domotics. All rights reserved. # https://www.indigodomo.com try: # This is primarily for IDEs - the indigo package is always included when a plugin is started. diff --git a/Example Device - Energy Meter.indigoPlugin/Contents/Info.plist b/Example Device - Energy Meter.indigoPlugin/Contents/Info.plist index 55f3603..764a367 100644 --- a/Example Device - Energy Meter.indigoPlugin/Contents/Info.plist +++ b/Example Device - Energy Meter.indigoPlugin/Contents/Info.plist @@ -3,7 +3,7 @@ PluginVersion - 2024.2.0 + 2025.2.0 ServerApiVersion 3.6 CFBundleDisplayName diff --git a/Example Device - Energy Meter.indigoPlugin/Contents/Server Plugin/MenuItems.xml b/Example Device - Energy Meter.indigoPlugin/Contents/Server Plugin/MenuItems.xml new file mode 100644 index 0000000..06dfc9c --- /dev/null +++ b/Example Device - Energy Meter.indigoPlugin/Contents/Server Plugin/MenuItems.xml @@ -0,0 +1,13 @@ + + + + + Toggle Automatic State Updates + toggle_automatic_updates + + diff --git a/Example Device - Energy Meter.indigoPlugin/Contents/Server Plugin/plugin.py b/Example Device - Energy Meter.indigoPlugin/Contents/Server Plugin/plugin.py index 8061416..726f693 100644 --- a/Example Device - Energy Meter.indigoPlugin/Contents/Server Plugin/plugin.py +++ b/Example Device - Energy Meter.indigoPlugin/Contents/Server Plugin/plugin.py @@ -1,7 +1,7 @@ #! /usr/bin/env python # -*- coding: utf-8 -*- #################### -# Copyright (c) 2024, Perceptive Automation, LLC. All rights reserved. +# Copyright (c) 2026, Perceptive Automation, LLC. All rights reserved. # https://www.indigodomo.com import random @@ -25,6 +25,7 @@ def __init__( ) -> None: super().__init__(plugin_id, plugin_display_name, plugin_version, plugin_prefs) self.debug: bool = True + self.automatic_updates = True # Enable/disable automatic device updates ######################################## def startup(self: indigo.PluginBase) -> None: @@ -72,13 +73,14 @@ def _refresh_states_from_hardware( def runConcurrentThread(self: indigo.PluginBase): try: while True: - for dev in indigo.devices.iter("self"): - if not dev.enabled or not dev.configured: - continue - # Plugins that need to poll out the status from the meter - # could do so here, then broadcast back the new values to the - # Indigo Server. - self._refresh_states_from_hardware(dev, False) + if self.automatic_updates: + for dev in indigo.devices.iter("self"): + if not dev.enabled or not dev.configured: + continue + # Plugins that need to poll out the status from the meter + # could do so here, then broadcast back the new values to the + # Indigo Server. + self._refresh_states_from_hardware(dev, False) self.sleep(2) except self.StopThread: pass # Optionally catch the StopThread exception and do any needed cleanup. @@ -180,3 +182,10 @@ def set_backlight_brightness(self: indigo.PluginBase, plugin_action, dev): else: # Else log failure but do NOT update state on Indigo Server. self.logger.error(f"send \"{dev.name}\" set backlight brightness to {new_brightness} failed") + + ######################################## + # Menu items + ###################### + def toggle_automatic_updates(self): + # toggles a global variable to enable/disable continuous state updates for all devices. + self.automatic_updates = not self.automatic_updates diff --git a/Example Device - Factory.indigoPlugin/Contents/Server Plugin/plugin.py b/Example Device - Factory.indigoPlugin/Contents/Server Plugin/plugin.py index 7877ff8..52156ba 100644 --- a/Example Device - Factory.indigoPlugin/Contents/Server Plugin/plugin.py +++ b/Example Device - Factory.indigoPlugin/Contents/Server Plugin/plugin.py @@ -1,5 +1,5 @@ #################### -# Copyright (c) 2024, Indigo Domotics. All rights reserved. +# Copyright (c) 2026, Indigo Domotics. All rights reserved. # https://www.indigodomo.com try: # This is primarily for IDEs - the indigo package is always included when a plugin is started. diff --git a/Example Device - Relay and Dimmer.indigoPlugin/Contents/Info.plist b/Example Device - Relay and Dimmer.indigoPlugin/Contents/Info.plist deleted file mode 100644 index 867d903..0000000 --- a/Example Device - Relay and Dimmer.indigoPlugin/Contents/Info.plist +++ /dev/null @@ -1,23 +0,0 @@ - - - - - PluginVersion - 2024.2.0 - ServerApiVersion - 3.6 - CFBundleDisplayName - Example Device - Relay/Dimmer - CFBundleIdentifier - com.example.indigoplugin.example-device-relay1 - CFBundleVersion - 1.0.0 - CFBundleURLTypes - - - CFBundleURLName - https://wiki.indigodomo.com/doku.php?id=plugins:example_dev_relay_1 - - - - diff --git a/Example Device - Relay and Dimmer.indigoPlugin/Contents/Server Plugin/Actions.xml b/Example Device - Relay and Dimmer.indigoPlugin/Contents/Server Plugin/Actions.xml deleted file mode 100644 index 098ebf7..0000000 --- a/Example Device - Relay and Dimmer.indigoPlugin/Contents/Server Plugin/Actions.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - Set Backlight Brightness - set_backlight_brightness - - - - - - - - diff --git a/Example Device - Relay and Dimmer.indigoPlugin/Contents/Server Plugin/Devices.xml b/Example Device - Relay and Dimmer.indigoPlugin/Contents/Server Plugin/Devices.xml deleted file mode 100644 index 262e570..0000000 --- a/Example Device - Relay and Dimmer.indigoPlugin/Contents/Server Plugin/Devices.xml +++ /dev/null @@ -1,203 +0,0 @@ - - - - - - - Example Relay Module - - - - - - - - - - Integer - Backlight Brightness - Backlight Brightness - - - - - - - Example Dimmer Module - - - - - - - - - - Integer - Backlight Brightness - Backlight Brightness - - - - - - - Example Color Module - - - - - - - - - - - Shows RGB control and level fields in UI - - - - - Shows White level fields in UI - - - - Shows Two White level fields in UI - - - - - - - Shows White Temperature field in UI - - - - Minimum White Temperature used on UI controls - - - - Maximum White Temperature used on UI controls - - - - - - - - Example Lock Module - - - - - - - - - - Integer - Backlight Brightness - Backlight Brightness - - - - diff --git a/Example Device - Relay and Dimmer.indigoPlugin/Contents/Server Plugin/plugin.py b/Example Device - Relay and Dimmer.indigoPlugin/Contents/Server Plugin/plugin.py deleted file mode 100644 index 444d482..0000000 --- a/Example Device - Relay and Dimmer.indigoPlugin/Contents/Server Plugin/plugin.py +++ /dev/null @@ -1,328 +0,0 @@ -#! /usr/bin/env python -# -*- coding: utf-8 -*- -#################### -# Copyright (c) 2024, Perceptive Automation, LLC. All rights reserved. -# https://www.indigodomo.com - -try: - # This is primarily for IDEs - the indigo package is always included when a plugin is started. - import indigo -except ImportError: - pass - -import os -import sys -import time - -# Note the "indigo" module is automatically imported and made available inside -# our global name space by the host process. - -################################################################################ -class Plugin(indigo.PluginBase): - ######################################## - def __init__(self, plugin_id, plugin_display_name, plugin_version, plugin_prefs): - super().__init__(plugin_id, plugin_display_name, plugin_version, plugin_prefs) - self.debug: bool = True - - ######################################## - def startup(self): - self.logger.debug("startup called") - - def shutdown(self): - self.logger.debug("shutdown called") - - ######################################## - # deviceStartComm() is called on application launch for all of our plugin defined - # devices, and it is called when a new device is created immediately after its - # UI settings dialog has been validated. This is a good place to force any properties - # we need the device to have, and to clean up old properties. - def deviceStartComm(self, dev): - # self.logger.debug(f"deviceStartComm: {dev.name}") - - props = dev.pluginProps - if dev.deviceTypeId == 'myColorType': - # Set SupportsColor property so Indigo knows device accepts color actions and should use color UI. - props["SupportsColor"] = True - - # Cleanup properties used by other device types. These can exist if user switches the device type. - if "IsLockSubType" in props: - del props["IsLockSubType"] - - dev.replacePluginPropsOnServer(props) - elif dev.deviceTypeId == 'myLockType': - # Set IsLockSubType property so Indigo knows device accepts lock actions and should use lock UI. - props["IsLockSubType"] = True - - # Cleanup properties used by other device types. These can exist if user switches the device type. - if "SupportsColor" in props: - del props["SupportsColor"] - - dev.replacePluginPropsOnServer(props) - - ######################################## - def validateDeviceConfigUi(self, values_dict, type_id, dev_id): - return (True, values_dict) - - ######################################## - # Relay / Dimmer Action callback - ###################### - def actionControlDevice(self, action, dev): - ###### TURN ON ###### - if action.deviceAction == indigo.kDeviceAction.TurnOn: - # Command hardware module (dev) to turn ON here: - # ** IMPLEMENT ME ** - send_success = True # Set to False if it failed. - - if send_success: - # If success then log that the command was successfully sent. - self.logger.info(f"sent \"{dev.name}\" on") - - # And then tell the Indigo Server to update the state. - dev.updateStateOnServer("onOffState", True) - else: - # Else log failure but do NOT update state on Indigo Server. - self.logger.error(f"send \"{dev.name}\" on failed") - - ###### TURN OFF ###### - elif action.deviceAction == indigo.kDeviceAction.TurnOff: - # Command hardware module (dev) to turn OFF here: - # ** IMPLEMENT ME ** - send_success = True # Set to False if it failed. - - if send_success: - # If success then log that the command was successfully sent. - self.logger.info(f"sent \"{dev.name}\" off") - - # And then tell the Indigo Server to update the state: - dev.updateStateOnServer("onOffState", False) - else: - # Else log failure but do NOT update state on Indigo Server. - self.logger.error(f"send \"{dev.name}\" off failed") - - ###### LOCK ###### - if action.deviceAction == indigo.kDeviceAction.Lock: - # Command hardware module (dev) to LOCK here: - # ** IMPLEMENT ME ** - send_success = True # Set to False if it failed. - - if send_success: - # If success then log that the command was successfully sent. - self.logger.info(f"sent \"{dev.name}\" lock") - - # And then tell the Indigo Server to update the state. - dev.updateStateOnServer("onOffState", True) - else: - # Else log failure but do NOT update state on Indigo Server. - self.logger.error(f"send \"{dev.name}\" lock failed") - - ###### UNLOCK ###### - elif action.deviceAction == indigo.kDeviceAction.Unlock: - # Command hardware module (dev) to turn UNLOCK here: - # ** IMPLEMENT ME ** - send_success = True # Set to False if it failed. - - if send_success: - # If success then log that the command was successfully sent. - self.logger.info(f"sent \"{dev.name}\" unlock") - - # And then tell the Indigo Server to update the state: - dev.updateStateOnServer("onOffState", False) - else: - # Else log failure but do NOT update state on Indigo Server. - self.logger.error(f"send \"{dev.name}\" unlock failed") - - ###### TOGGLE ###### - elif action.deviceAction == indigo.kDeviceAction.Toggle: - # Command hardware module (dev) to toggle here: - # ** IMPLEMENT ME ** - new_on_state = not dev.onState - send_success = True # Set to False if it failed. - - if send_success: - # If success then log that the command was successfully sent. - self.logger.info(f"sent \"{dev.name}\" toggle") - - # And then tell the Indigo Server to update the state: - dev.updateStateOnServer("onOffState", new_on_state) - else: - # Else log failure but do NOT update state on Indigo Server. - self.logger.error(f"send \"{dev.name}\" toggle failed") - - ###### SET BRIGHTNESS ###### - elif action.deviceAction == indigo.kDeviceAction.SetBrightness: - # Command hardware module (dev) to set brightness here: - # ** IMPLEMENT ME ** - new_brightness = action.actionValue - send_success = True # Set to False if it failed. - - if send_success: - # If success then log that the command was successfully sent. - self.logger.info(f"sent \"{dev.name}\" set brightness to {new_brightness}") - - # And then tell the Indigo Server to update the state: - dev.updateStateOnServer("brightnessLevel", new_brightness) - else: - # Else log failure but do NOT update state on Indigo Server. - self.logger.error(f"send \"{dev.name}\" set brightness to {new_brightness} failed") - - ###### BRIGHTEN BY ###### - elif action.deviceAction == indigo.kDeviceAction.BrightenBy: - # Command hardware module (dev) to do a relative brighten here: - # ** IMPLEMENT ME ** - new_brightness = min(dev.brightness + action.actionValue, 100) - send_success = True # Set to False if it failed. - - if send_success: - # If success then log that the command was successfully sent. - self.logger.info(f"sent \"{dev.name}\" brighten to {new_brightness}") - - # And then tell the Indigo Server to update the state: - dev.updateStateOnServer("brightnessLevel", new_brightness) - else: - # Else log failure but do NOT update state on Indigo Server. - self.logger.error(f"send \"{dev.name}\" brighten to {new_brightness} failed") - - ###### DIM BY ###### - elif action.deviceAction == indigo.kDeviceAction.DimBy: - # Command hardware module (dev) to do a relative dim here: - # ** IMPLEMENT ME ** - new_brightness = max(dev.brightness - action.actionValue, 0) - send_success = True # Set to False if it failed. - - if send_success: - # If success then log that the command was successfully sent. - self.logger.info(f"sent \"{dev.name}\" dim to {new_brightness}") - - # And then tell the Indigo Server to update the state: - dev.updateStateOnServer("brightnessLevel", new_brightness) - else: - # Else log failure but do NOT update state on Indigo Server. - self.logger.error(f"send \"{dev.name}\" dim to {new_brightness} failed") - - ###### SET COLOR LEVELS ###### - elif action.deviceAction == indigo.kDeviceAction.SetColorLevels: - # action.actionValue is a dict containing the color channel key/value - # pairs. All color channel keys (redLevel, greenLevel, etc.) are optional - # so plugin should handle cases where some color values are not specified - # in the action. - action_color_vals = action.actionValue - - # Construct a list of channel keys that are possible for what this device - # supports. It may not support RGB or may not support white levels, for - # example, depending on how the device's properties (SupportsColor, SupportsRGB, - # SupportsWhite, SupportsTwoWhiteLevels, SupportsWhiteTemperature) have - # been specified. - channel_keys = [] - using_white_channels = False - if dev.supportsRGB: - channel_keys.extend(['redLevel', 'greenLevel', 'blueLevel']) - if dev.supportsWhite: - channel_keys.extend(['whiteLevel']) - using_white_channels = True - if dev.supportsTwoWhiteLevels: - channel_keys.extend(['whiteLevel2']) - elif dev.supportsWhiteTemperature: - channel_keys.extend(['whiteTemperature']) - # Note having 2 white levels (cold and warm) takes precedence over - # the use of a white temperature value. You cannot have both, although - # you can have a single white level and a white temperature value. - - # Next enumerate through the possible color channels and extract that - # value from the actionValue (action_color_vals). - kv_list = [] - result_vals = [] - for channel in channel_keys: - if channel in action_color_vals: - brightness = float(action_color_vals[channel]) - brightness_byte = int(round(255.0 * (brightness / 100.0))) - - # Command hardware module (dev) to change its color level here: - # ** IMPLEMENT ME ** - - if channel in dev.states: - kv_list.append({'key':channel, 'value':brightness}) - result = str(int(round(brightness))) - elif channel in dev.states: - # If the action doesn't specify a level that is needed (say the - # hardware API requires a full RGB triplet to be specified, but - # the action only contains green level), then the plugin could - # extract the currently cached red and blue values from the - # dev.states[] dictionary: - cached_brightness = float(dev.states[channel]) - cached_brightness_byte = int(round(255.0 * (cached_brightness / 100.0))) - # Could show in the Event Log '--' to indicate this level wasn't - # passed in by the action: - result = '--' - # Or could show the current device state's cached level: - # result = str(int(round(cached_brightness))) - - # Add a comma to separate the RGB values from the white values for logging. - if channel == 'blueLevel' and using_white_channels: - result += "," - elif channel == 'whiteTemperature' and result != '--': - result += " K" - result_vals.append(result) - # Set to False if it failed. - send_success = True - - result_vals_str = ' '.join(result_vals) - if send_success: - # If success then log that the command was successfully sent. - self.logger.info(f"sent \"{dev.name}\" set color to {result_vals_str}") - - # And then tell the Indigo Server to update the color level states: - if len(kv_list) > 0: - dev.updateStatesOnServer(kv_list) - else: - # Else log failure but do NOT update state on Indigo Server. - self.logger.error(f"send \"{dev.name}\" set color to {result_vals_str} failed") - - ######################################## - # General Action callback - ###################### - def actionControlUniversal(self, action, dev): - ###### BEEP ###### - if action.deviceAction == indigo.kUniversalAction.Beep: - # Beep the hardware module (dev) here: - # ** IMPLEMENT ME ** - self.logger.info(f"sent \"{dev.name}\" beep request") - - ###### ENERGY UPDATE ###### - elif action.deviceAction == indigo.kUniversalAction.EnergyUpdate: - # Request hardware module (dev) for its most recent meter data here: - # ** IMPLEMENT ME ** - self.logger.info(f"sent \"{dev.name}\" energy update request") - - ###### ENERGY RESET ###### - elif action.deviceAction == indigo.kUniversalAction.EnergyReset: - # Request that the hardware module (dev) reset its accumulative energy usage data here: - # ** IMPLEMENT ME ** - self.logger.info(f"sent \"{dev.name}\" energy reset request") - - ###### STATUS REQUEST ###### - elif action.deviceAction == indigo.kUniversalAction.RequestStatus: - # Query hardware module (dev) for its current status here: - # ** IMPLEMENT ME ** - self.logger.info(f"sent \"{dev.name}\" status request") - - ######################################## - # Custom Plugin Action callbacks (defined in Actions.xml) - ###################### - def set_backlight_brightness(self, plugin_action, dev): - try: - new_brightness = int(plugin_action.props.get("brightness", 100)) - except ValueError: - # The int() cast above might fail if the user didn't enter a number: - self.logger.error(f"set backlight brightness action to device \"{dev.name}\" -- invalid brightness value") - return - # Command hardware module (dev) to set backlight brightness here: - # FIXME: add implementation here - send_success = True # Set to False if it failed. - if send_success: - # If success then log that the command was successfully sent. - self.logger.info(f"sent \"{dev.name}\" set backlight brightness to {new_brightness}") - # And then tell the Indigo Server to update the state: - dev.updateStateOnServer("backlightBrightness", new_brightness) - else: - # Else log failure but do NOT update state on Indigo Server. - self.logger.error(f"send \"{dev.name}\" set backlight brightness to {new_brightness} failed") diff --git a/Example Device - Sensor.indigoPlugin/Contents/Server Plugin/plugin.py b/Example Device - Sensor.indigoPlugin/Contents/Server Plugin/plugin.py index 5fc3ace..3f6d336 100644 --- a/Example Device - Sensor.indigoPlugin/Contents/Server Plugin/plugin.py +++ b/Example Device - Sensor.indigoPlugin/Contents/Server Plugin/plugin.py @@ -1,7 +1,7 @@ #! /usr/bin/env python # -*- coding: utf-8 -*- #################### -# Copyright (c) 2024, Perceptive Automation, LLC. All rights reserved. +# Copyright (c) 2026, Perceptive Automation, LLC. All rights reserved. # https://www.indigodomo.com try: diff --git a/Example Device - Speed Control.indigoPlugin/Contents/Server Plugin/plugin.py b/Example Device - Speed Control.indigoPlugin/Contents/Server Plugin/plugin.py index f71333f..62784a1 100644 --- a/Example Device - Speed Control.indigoPlugin/Contents/Server Plugin/plugin.py +++ b/Example Device - Speed Control.indigoPlugin/Contents/Server Plugin/plugin.py @@ -1,7 +1,7 @@ #! /usr/bin/env python # -*- coding: utf-8 -*- #################### -# Copyright (c) 2024, Perceptive Automation, LLC. All rights reserved. +# Copyright (c) 2026, Perceptive Automation, LLC. All rights reserved. # https://www.indigodomo.com try: diff --git a/Example Device - Sprinkler.indigoPlugin/Contents/Server Plugin/plugin.py b/Example Device - Sprinkler.indigoPlugin/Contents/Server Plugin/plugin.py index 4325345..aef4c15 100644 --- a/Example Device - Sprinkler.indigoPlugin/Contents/Server Plugin/plugin.py +++ b/Example Device - Sprinkler.indigoPlugin/Contents/Server Plugin/plugin.py @@ -1,7 +1,7 @@ #! /usr/bin/env python # -*- coding: utf-8 -*- #################### -# Copyright (c) 2024, Perceptive Automation, LLC. All rights reserved. +# Copyright (c) 2026, Perceptive Automation, LLC. All rights reserved. # https://www.indigodomo.com try: diff --git a/Example Device - Thermostat.indigoPlugin/Contents/Info.plist b/Example Device - Thermostat.indigoPlugin/Contents/Info.plist index f309333..9968cbf 100644 --- a/Example Device - Thermostat.indigoPlugin/Contents/Info.plist +++ b/Example Device - Thermostat.indigoPlugin/Contents/Info.plist @@ -3,7 +3,7 @@ PluginVersion - 2024.2.0 + 2025.2.0 ServerApiVersion 3.6 CFBundleDisplayName diff --git a/Example Device - Thermostat.indigoPlugin/Contents/Server Plugin/MenuItems.xml b/Example Device - Thermostat.indigoPlugin/Contents/Server Plugin/MenuItems.xml index 3132c73..f3aea65 100644 --- a/Example Device - Thermostat.indigoPlugin/Contents/Server Plugin/MenuItems.xml +++ b/Example Device - Thermostat.indigoPlugin/Contents/Server Plugin/MenuItems.xml @@ -1,5 +1,5 @@ -