plugins
Differences
This shows you the differences between two versions of the page.
Next revision | Previous revisionLast revisionBoth sides next revision | ||
plugins [2017/06/10 16:09] – external edit 127.0.0.1 | plugins [2018/08/11 16:02] – James Sentman | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | =====The XTension Plugin API===== | + | =====The XTension Plugin API v2===== |
- | Download sample | + | **NOTE:** This documentation is in a transitional phase of updating from v1 to v2 of the plugin |
\\ | \\ | ||
- | |||
- | Introduced in XTension version 9.3 you can now create new interfaces for otherwise unsupported devices using the Python language. For most types of communications via TCP sockets or Serial Ports the communication can be completely handled by the host application allowing you to concentrate on handling the actual logic of talking to the device. For simpler protocols that have an end of line at the end of each packet the host can do the parsing for you sending your script individual packets. In the case of more complex protocols the parsing of the data will be up to your script. \\ | ||
\\ | \\ | ||
- | Complex dynamic interfaces can be defined in 4 different places. Firstly on the interface level you can create a custom interface for interface level controls. These are things for the device itself and not the individual units associated with it. Here is the custom interface associated with the XTension 6 Channel PWM dimmer kit: | ||
- | {{ : | ||
- | For Unit level configuration you can embed configuration for individual controls on the first tab of the [[xtension_manual: | ||
- | {{ : | ||
- | Lastly there are 2 hooks for creating custom control interfaces. Every unit line in XTension can bring up a HUD style control window. There are 2 different HUD windows, for simple control as well as “advanced” control. A plugin can define separate interfaces for both the Simple and Advanced windows. In this example you’re seeing the RGB color looping controls which are similar on both windows but can be completely different or even absent on one or the other window.\\ | ||
- | {{: | ||
- | \\ | ||
- | For less used control options your plugin may also define contextual menus for each unit type that will call back into the plugin script. In this case I’ve defined 2 contextual menu options for Start Color Loop and Stop Color Loop. They are available when control or right clicking on a unit in any unit list and also from the gear icon in both HUD control displays.\\ | ||
- | {{: | ||
- | Lastly you can also define methods of your Python script to expose to the in application AppleScript system. At a point in the future when we expand the in system scripting to include python or other options those same methods will be available to them as well. Currently you can execute any defined Python function from AppleScript in 2 places. At the Interface level and at the Unit level. For an interface wide function use an applescript tell block to talk directly to the xInterface object:\\ | ||
- | < | + | Introduced in XTension version 9.3 you can now create new plugins for otherwise unsupported devices using Python. The plugins run as separate processes and communicate to XTension through a TCP socket. All direct communications and parsing |
- | tell xInterface “name | + | |
- | </ | + | |
- | If your Python | + | ====Language Support==== |
- | \\ | + | At this moment I have plugin connectors for Python and for [[http:// |
- | The unit level access | + | |
+ | |||
+ | ====Plugin Custom Interfaces==== | ||
+ | |||
+ | You can create plugin interfaces in the Edit Interface dialog for individual interface level settings. You can add controls to the Edit Unit dialog for unit level interfaces and you can also add controls to the advanced and simple unit control popups for actually sending commands to a unit. All controls are defined in the info.json file that must accompany the application. You can create them by hand or better yet using the interface builder app linked to in that section of the wiki. On my todo list are other places that interfaces can be inserted and popped up in response to other actions. If anything like that would be helpful please let me know and I can bump them up the priorities | ||
+ | |||
+ | While there is no current interface to creating plugin specific menu items beyond the contextual ones mentioned below, you can create a submenu in the Global Scripts menu and add items to that if you wish. This is the mechanism used in the Database Sharing when a global script is shared to a receiving XTension implementation. Your script can add items to this menu though the interface might be slightly confusing depending on what the script will be doing. Adding a plugin menu that you can add submenus to is also on my list, if that is something you need sooner please let me know. | ||
+ | |||
+ | ====Plugin Units vs Database Sharing==== | ||
+ | There are 2 modes that a plugin can operate in. The regular mode is for providing an interface to some physical device. This lets you create units in XTension that are linked to a specific plugin instance. You do not have access | ||
+ | |||
+ | You can add the Database Sharing option to your info.json file and in that case the user will be presented with options for choosing what units will be sent to your interface instance. This is for plugins that might wish to provide a bridge to some other functionality like sharing units to an Alexa or HomeKit or just creating a PubSub or MMQT interface to portions of the database. As of V2.0 of the API you can ask for Units and Global Scripts to be shared. The user will be able to select either to share the entire database or to select from lists of Units and select individual Global Script. This is the interface that is used for the built in [[supported_hardware: | ||
+ | |||
+ | ====Sharing well known ports or UDP sockets with other plugins==== | ||
+ | This is particularly a problem with programs that want to respond to or listen for things like UPNP packets. Only one program on a machine can be listening the specific UDP socket that UPNP happens over. XTension gets around | ||
+ | |||
+ | ====Contextual Menu Handlers==== | ||
+ | You can add contextual menu handlers to any unit through your plugin. You can define these in the info.json handler for the specific unit type. When the user selects them an execute handler command will be sent to your plugin | ||
+ | |||
+ | ====Adding Script Commands==== | ||
+ | While Python is used for plugin development, internal to XTension AppleScript is used as the scripting language. XTension supports the AppleScript Object Model and any unit may be wrapped in a tell block. There are many commands and settings that can be sent to a unit this way. Any commands received through such a script that are not one of the reserved commands or well known handlers that are built into XTension | ||
< | < | ||
- | | + | tell xUnit “name of a plugin unit” to doSomethingPluginSpecific( withSomeData) |
+ | |||
+ | tell xInterface “name of the plugin instance” to doAPluginTask( withSomeData) | ||
</ | </ | ||
- | \\ | + | |
- | This should provide | + | ====Installing and Un-Installing Plugins==== |
- | \\ | + | XTension provides a mechanism to install |
+ | |||
+ | The XTension | ||
+ | |||
+ | ====Blocking and Non-Blocking Functions==== | ||
+ | Since the plugin runs as a separate process from XTension you can use any combination of blocking or threaded operations without worrying about blocking the host app. If you perform a blocking action in response to a received command from XTension that should be bumped out to a separate thread to await it’s return. XTension will regularly send a ping to your interface that needs to be returned or it will recycle your interface thinking it had hung up. You should not block in any event received from XTension. | ||
+ | |||
NEXT: [[plugins: | NEXT: [[plugins: |
plugins.txt · Last modified: 2023/02/13 14:52 by 127.0.0.1