Latest commit

History

161 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Nuimo Python SDK

Nuimo is a universal smart device controller made by Senic.

The Nuimo Python SDK for Linux allows you to integrate your Nuimo(s) into any type of Linux application or script that can execute Python code.

Prerequisites

The Nuimo SDK requires Python 3.4+ and a recent installation of BlueZ. It is tested to work fine with BlueZ 5.44, slightly older versions should however work, too.

Installation

These instructions assume a Debian-based Linux.

On Linux the BlueZ library is necessary to access your built-in Bluetooth controller or Bluetooth USB dongle. Some Linux distributions provide a more up-to-date BlueZ package, some other distributions only install older versions that don't implement all Bluetooth features needed for this SDK. In those cases you want to either update BlueZ or build it from sources.

Updating/installing BlueZ via apt-get

  1. bluetoothd --version Obtains the version of the pre-installed BlueZ. bluetoothd daemon must run at startup to expose the Bluetooth API via D-Bus.
  2. sudo apt-get install --no-install-recommends bluetooth Installs BlueZ
  3. If the installed version is too old, proceed with next step: Installing BlueZ from sources

Installing BlueZ from sources

The bluetoothd daemon provides BlueZ's D-Bus interfaces that is accessed by the Nuimo SDK to communicate with Nuimo Bluetooth controllers. The following commands download BlueZ 5.44 sources, built them and replace any pre-installed bluetoothd daemon. It's not suggested to remove any pre-installed BlueZ package as its deinstallation might remove necessary Bluetooth drivers as well.

  1. sudo systemctl stop bluetooth
  2. sudo apt-get update
  3. sudo apt-get install libusb-dev libdbus-1-dev libglib2.0-dev libudev-dev libical-dev libreadline-dev libdbus-glib-1-dev unzip
  4. cd
  5. mkdir bluez
  6. cd bluez
  7. wget http://www.kernel.org/pub/linux/bluetooth/bluez-5.44.tar.xz
  8. tar xf bluez-5.44.tar.xz
  9. cd bluez-5.44
  10. ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --enable-library
  11. make
  12. sudo make install
  13. sudo ln -svf /usr/libexec/bluetooth/bluetoothd /usr/sbin/
  14. sudo install -v -dm755 /etc/bluetooth
  15. sudo install -v -m644 src/main.conf /etc/bluetooth/main.conf
  16. sudo systemctl daemon-reload
  17. sudo systemctl start bluetooth
  18. bluetoothd --version # should now print 5.44

Please note that some distributions might use a different directory for system deamons, apply step 13 only as needed.

Enabling your Bluetooth adapter

  1. echo "power on" | sudo bluetoothctl Enables your built-in Bluetooth adapter or external Bluetooth USB dongle

Using BlueZ commandline tools

BlueZ also provides an interactive commandline tool to interact with Bluetooth devices. You know that your BlueZ installation is working fine if it discovers any Bluetooth devices nearby.

sudo bluetoothctl Starts an interactive mode to talk to BlueZ

  • power on Enables the Bluetooth adapter
  • scan on Start Bluetooth device scanning and lists all found devices with MAC addresses
  • connect AA:BB:CC:DD:EE:FF Connects to a Nuimo controller with specified MAC address
  • exit Quits the interactive mode

Installing Nuimo Python SDK

To install Nuimo module and the Python3 D-Bus dependency globally, run:

sudo pip3 install nuimo
sudo apt-get install python3-dbus

Running the Nuimo control script

To test if your setup is working, run the following command. Note that it must be run as root because on Linux, Bluetooth discovery is a restricted operation.

sudo nuimoctl --discover
sudo nuimoctl --connect AA:BB:CC:DD:EE:FF # Replace the MAC address with your Nuimo's MAC address
sudo nuimoctl --help # To list all available commands

SDK Usage

Discovering nearby Nuimo controllers

The SDK entry point is the ControllerManager class. Check the following example to dicover any Nuimo controller nearby.

Please note that communication with your Bluetooth adapter happens over BlueZ's D-Bus API, hence an event loop needs to be run in order to receive all Bluetooth related events. You can start and stop the event loop via run() and stop() calls to your ControllerManager instance.

importnuimoclassControllerManagerPrintListener(nuimo.ControllerManagerListener):
defcontroller_discovered(self, controller):
print("Discovered Nuimo controller", controller.mac_address)
manager=nuimo.ControllerManager(adapter_name='hci0')
manager.listener=ControllerManagerPrintListener()
manager.start_discovery()
manager.run()

Connecting to a Nuimo controller and receiving user input events

Once ControllerManager has discovered a Nuimo controller you can use the controller object that you retrieved from ControllerManagerListener.controller_discovered() to connect to it. Alternatively you can create a new instance of Controller using the name of your Bluetooth adapter (typically hci0) and Nuimo's MAC address.

Make sure to assign a ControllerListener object to the listener attribute of your controller instance. It will notify you about all Nuimo controller related events such connection, disconnection and user input events.

The following example connects to a Nuimo controller and uses the predefined ControllerPrintListener class to print all controller events:

importnuimomanager=nuimo.ControllerManager(adapter_name='hci0')
controller=nuimo.Controller(mac_address='AA:BB:CC:DD:EE:FF', manager=manager)
controller.listener=nuimo.ControllerListener() # Use an instance of your own nuimo.ControllerListener subclasscontroller.connect()
manager.run()

As with Nuimo controller discovery, remember to start the Bluetooth event loop with ControllerManager.run().

Write to Nuimo's LED matrix

Once a Nuimo controller is connected you can send an LED matrix to its display. Therefor create an LedMatrix object by initializing it with a string. That string should contain 81 characters: each character, starting from top left corner, tells whether the corresponding LED should be on or off. ' ' and '0' signal LED off all other characters power the corresponding LED. The following example shows a cross:

matrix=nuimo.LedMatrix(
"* *"" * * "" * * "" * * "" * "" * * "" * * "" * * ""* *"
)
controller.display_matrix(matrix)

You can pass additional parameters to display_matrix() to control the following options:

  • interval: float # Display interval in seconds, default: 2.0 seconds
  • brightness: float # LED matrix brightness, default: 1.0 (100%)
  • fading: bool # Whether to fade the previous matrix into the next one, aka "onion skinning effect", default: False
  • ignore_duplicates: bool # Whether or not send an LED matrix to a Nuimo controller if it's already being displayed, default: False

Support

Please open an issue or drop us an email to developers@senic.com.

Contributing

Contributions are welcome via pull requests. Please open an issue first in case you want to discus your possible improvements to this SDK.

License

The Nuimo Python SDK is available under the MIT License.

About

Nuimo Python SDK for Linux to connect and communicate with Nuimo controllers made by Senic

Topics

Resources

Stars

55 stars

Watchers

12 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

161 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Nuimo Python SDK

Nuimo is a universal smart device controller made by Senic.

The Nuimo Python SDK for Linux allows you to integrate your Nuimo(s) into any type of Linux application or script that can execute Python code.

Prerequisites

The Nuimo SDK requires Python 3.4+ and a recent installation of BlueZ. It is tested to work fine with BlueZ 5.44, slightly older versions should however work, too.

Installation

These instructions assume a Debian-based Linux.

On Linux the BlueZ library is necessary to access your built-in Bluetooth controller or Bluetooth USB dongle. Some Linux distributions provide a more up-to-date BlueZ package, some other distributions only install older versions that don't implement all Bluetooth features needed for this SDK. In those cases you want to either update BlueZ or build it from sources.

Updating/installing BlueZ via apt-get

  1. bluetoothd --version Obtains the version of the pre-installed BlueZ. bluetoothd daemon must run at startup to expose the Bluetooth API via D-Bus.
  2. sudo apt-get install --no-install-recommends bluetooth Installs BlueZ
  3. If the installed version is too old, proceed with next step: Installing BlueZ from sources

Installing BlueZ from sources

The bluetoothd daemon provides BlueZ's D-Bus interfaces that is accessed by the Nuimo SDK to communicate with Nuimo Bluetooth controllers. The following commands download BlueZ 5.44 sources, built them and replace any pre-installed bluetoothd daemon. It's not suggested to remove any pre-installed BlueZ package as its deinstallation might remove necessary Bluetooth drivers as well.

  1. sudo systemctl stop bluetooth
  2. sudo apt-get update
  3. sudo apt-get install libusb-dev libdbus-1-dev libglib2.0-dev libudev-dev libical-dev libreadline-dev libdbus-glib-1-dev unzip
  4. cd
  5. mkdir bluez
  6. cd bluez
  7. wget http://www.kernel.org/pub/linux/bluetooth/bluez-5.44.tar.xz
  8. tar xf bluez-5.44.tar.xz
  9. cd bluez-5.44
  10. ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --enable-library
  11. make
  12. sudo make install
  13. sudo ln -svf /usr/libexec/bluetooth/bluetoothd /usr/sbin/
  14. sudo install -v -dm755 /etc/bluetooth
  15. sudo install -v -m644 src/main.conf /etc/bluetooth/main.conf
  16. sudo systemctl daemon-reload
  17. sudo systemctl start bluetooth
  18. bluetoothd --version # should now print 5.44

Please note that some distributions might use a different directory for system deamons, apply step 13 only as needed.

Enabling your Bluetooth adapter

  1. echo "power on" | sudo bluetoothctl Enables your built-in Bluetooth adapter or external Bluetooth USB dongle

Using BlueZ commandline tools

BlueZ also provides an interactive commandline tool to interact with Bluetooth devices. You know that your BlueZ installation is working fine if it discovers any Bluetooth devices nearby.

sudo bluetoothctl Starts an interactive mode to talk to BlueZ

  • power on Enables the Bluetooth adapter
  • scan on Start Bluetooth device scanning and lists all found devices with MAC addresses
  • connect AA:BB:CC:DD:EE:FF Connects to a Nuimo controller with specified MAC address
  • exit Quits the interactive mode

Installing Nuimo Python SDK

To install Nuimo module and the Python3 D-Bus dependency globally, run:

sudo pip3 install nuimo
sudo apt-get install python3-dbus

Running the Nuimo control script

To test if your setup is working, run the following command. Note that it must be run as root because on Linux, Bluetooth discovery is a restricted operation.

sudo nuimoctl --discover
sudo nuimoctl --connect AA:BB:CC:DD:EE:FF # Replace the MAC address with your Nuimo's MAC address
sudo nuimoctl --help # To list all available commands

SDK Usage

Discovering nearby Nuimo controllers

The SDK entry point is the ControllerManager class. Check the following example to dicover any Nuimo controller nearby.

Please note that communication with your Bluetooth adapter happens over BlueZ's D-Bus API, hence an event loop needs to be run in order to receive all Bluetooth related events. You can start and stop the event loop via run() and stop() calls to your ControllerManager instance.

importnuimoclassControllerManagerPrintListener(nuimo.ControllerManagerListener):
defcontroller_discovered(self, controller):
print("Discovered Nuimo controller", controller.mac_address)
manager=nuimo.ControllerManager(adapter_name='hci0')
manager.listener=ControllerManagerPrintListener()
manager.start_discovery()
manager.run()

Connecting to a Nuimo controller and receiving user input events

Once ControllerManager has discovered a Nuimo controller you can use the controller object that you retrieved from ControllerManagerListener.controller_discovered() to connect to it. Alternatively you can create a new instance of Controller using the name of your Bluetooth adapter (typically hci0) and Nuimo's MAC address.

Make sure to assign a ControllerListener object to the listener attribute of your controller instance. It will notify you about all Nuimo controller related events such connection, disconnection and user input events.

The following example connects to a Nuimo controller and uses the predefined ControllerPrintListener class to print all controller events:

importnuimomanager=nuimo.ControllerManager(adapter_name='hci0')
controller=nuimo.Controller(mac_address='AA:BB:CC:DD:EE:FF', manager=manager)
controller.listener=nuimo.ControllerListener() # Use an instance of your own nuimo.ControllerListener subclasscontroller.connect()
manager.run()

As with Nuimo controller discovery, remember to start the Bluetooth event loop with ControllerManager.run().

Write to Nuimo's LED matrix

Once a Nuimo controller is connected you can send an LED matrix to its display. Therefor create an LedMatrix object by initializing it with a string. That string should contain 81 characters: each character, starting from top left corner, tells whether the corresponding LED should be on or off. ' ' and '0' signal LED off all other characters power the corresponding LED. The following example shows a cross:

matrix=nuimo.LedMatrix(
"* *"" * * "" * * "" * * "" * "" * * "" * * "" * * ""* *"
)
controller.display_matrix(matrix)

You can pass additional parameters to display_matrix() to control the following options:

  • interval: float # Display interval in seconds, default: 2.0 seconds
  • brightness: float # LED matrix brightness, default: 1.0 (100%)
  • fading: bool # Whether to fade the previous matrix into the next one, aka "onion skinning effect", default: False
  • ignore_duplicates: bool # Whether or not send an LED matrix to a Nuimo controller if it's already being displayed, default: False

Support

Please open an issue or drop us an email to developers@senic.com.

Contributing

Contributions are welcome via pull requests. Please open an issue first in case you want to discus your possible improvements to this SDK.

License

The Nuimo Python SDK is available under the MIT License.

About

Nuimo Python SDK for Linux to connect and communicate with Nuimo controllers made by Senic

Topics

Resources

Stars

55 stars

Watchers

12 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

161 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Nuimo Python SDK

Nuimo is a universal smart device controller made by Senic.

The Nuimo Python SDK for Linux allows you to integrate your Nuimo(s) into any type of Linux application or script that can execute Python code.

Prerequisites

The Nuimo SDK requires Python 3.4+ and a recent installation of BlueZ. It is tested to work fine with BlueZ 5.44, slightly older versions should however work, too.

Installation

These instructions assume a Debian-based Linux.

On Linux the BlueZ library is necessary to access your built-in Bluetooth controller or Bluetooth USB dongle. Some Linux distributions provide a more up-to-date BlueZ package, some other distributions only install older versions that don't implement all Bluetooth features needed for this SDK. In those cases you want to either update BlueZ or build it from sources.

Updating/installing BlueZ via apt-get

  1. bluetoothd --version Obtains the version of the pre-installed BlueZ. bluetoothd daemon must run at startup to expose the Bluetooth API via D-Bus.
  2. sudo apt-get install --no-install-recommends bluetooth Installs BlueZ
  3. If the installed version is too old, proceed with next step: Installing BlueZ from sources

Installing BlueZ from sources

The bluetoothd daemon provides BlueZ's D-Bus interfaces that is accessed by the Nuimo SDK to communicate with Nuimo Bluetooth controllers. The following commands download BlueZ 5.44 sources, built them and replace any pre-installed bluetoothd daemon. It's not suggested to remove any pre-installed BlueZ package as its deinstallation might remove necessary Bluetooth drivers as well.

  1. sudo systemctl stop bluetooth
  2. sudo apt-get update
  3. sudo apt-get install libusb-dev libdbus-1-dev libglib2.0-dev libudev-dev libical-dev libreadline-dev libdbus-glib-1-dev unzip
  4. cd
  5. mkdir bluez
  6. cd bluez
  7. wget http://www.kernel.org/pub/linux/bluetooth/bluez-5.44.tar.xz
  8. tar xf bluez-5.44.tar.xz
  9. cd bluez-5.44
  10. ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --enable-library
  11. make
  12. sudo make install
  13. sudo ln -svf /usr/libexec/bluetooth/bluetoothd /usr/sbin/
  14. sudo install -v -dm755 /etc/bluetooth
  15. sudo install -v -m644 src/main.conf /etc/bluetooth/main.conf
  16. sudo systemctl daemon-reload
  17. sudo systemctl start bluetooth
  18. bluetoothd --version # should now print 5.44

Please note that some distributions might use a different directory for system deamons, apply step 13 only as needed.

Enabling your Bluetooth adapter

  1. echo "power on" | sudo bluetoothctl Enables your built-in Bluetooth adapter or external Bluetooth USB dongle

Using BlueZ commandline tools

BlueZ also provides an interactive commandline tool to interact with Bluetooth devices. You know that your BlueZ installation is working fine if it discovers any Bluetooth devices nearby.

sudo bluetoothctl Starts an interactive mode to talk to BlueZ

  • power on Enables the Bluetooth adapter
  • scan on Start Bluetooth device scanning and lists all found devices with MAC addresses
  • connect AA:BB:CC:DD:EE:FF Connects to a Nuimo controller with specified MAC address
  • exit Quits the interactive mode

Installing Nuimo Python SDK

To install Nuimo module and the Python3 D-Bus dependency globally, run:

sudo pip3 install nuimo
sudo apt-get install python3-dbus

Running the Nuimo control script

To test if your setup is working, run the following command. Note that it must be run as root because on Linux, Bluetooth discovery is a restricted operation.

sudo nuimoctl --discover
sudo nuimoctl --connect AA:BB:CC:DD:EE:FF # Replace the MAC address with your Nuimo's MAC address
sudo nuimoctl --help # To list all available commands

SDK Usage

Discovering nearby Nuimo controllers

The SDK entry point is the ControllerManager class. Check the following example to dicover any Nuimo controller nearby.

Please note that communication with your Bluetooth adapter happens over BlueZ's D-Bus API, hence an event loop needs to be run in order to receive all Bluetooth related events. You can start and stop the event loop via run() and stop() calls to your ControllerManager instance.

importnuimoclassControllerManagerPrintListener(nuimo.ControllerManagerListener):
defcontroller_discovered(self, controller):
print("Discovered Nuimo controller", controller.mac_address)
manager=nuimo.ControllerManager(adapter_name='hci0')
manager.listener=ControllerManagerPrintListener()
manager.start_discovery()
manager.run()

Connecting to a Nuimo controller and receiving user input events

Once ControllerManager has discovered a Nuimo controller you can use the controller object that you retrieved from ControllerManagerListener.controller_discovered() to connect to it. Alternatively you can create a new instance of Controller using the name of your Bluetooth adapter (typically hci0) and Nuimo's MAC address.

Make sure to assign a ControllerListener object to the listener attribute of your controller instance. It will notify you about all Nuimo controller related events such connection, disconnection and user input events.

The following example connects to a Nuimo controller and uses the predefined ControllerPrintListener class to print all controller events:

importnuimomanager=nuimo.ControllerManager(adapter_name='hci0')
controller=nuimo.Controller(mac_address='AA:BB:CC:DD:EE:FF', manager=manager)
controller.listener=nuimo.ControllerListener() # Use an instance of your own nuimo.ControllerListener subclasscontroller.connect()
manager.run()

As with Nuimo controller discovery, remember to start the Bluetooth event loop with ControllerManager.run().

Write to Nuimo's LED matrix

Once a Nuimo controller is connected you can send an LED matrix to its display. Therefor create an LedMatrix object by initializing it with a string. That string should contain 81 characters: each character, starting from top left corner, tells whether the corresponding LED should be on or off. ' ' and '0' signal LED off all other characters power the corresponding LED. The following example shows a cross:

matrix=nuimo.LedMatrix(
"* *"" * * "" * * "" * * "" * "" * * "" * * "" * * ""* *"
)
controller.display_matrix(matrix)

You can pass additional parameters to display_matrix() to control the following options:

  • interval: float # Display interval in seconds, default: 2.0 seconds
  • brightness: float # LED matrix brightness, default: 1.0 (100%)
  • fading: bool # Whether to fade the previous matrix into the next one, aka "onion skinning effect", default: False
  • ignore_duplicates: bool # Whether or not send an LED matrix to a Nuimo controller if it's already being displayed, default: False

Support

Please open an issue or drop us an email to developers@senic.com.

Contributing

Contributions are welcome via pull requests. Please open an issue first in case you want to discus your possible improvements to this SDK.

License

The Nuimo Python SDK is available under the MIT License.

About

Nuimo Python SDK for Linux to connect and communicate with Nuimo controllers made by Senic

Topics

Resources

Stars

55 stars

Watchers

12 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

161 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Nuimo Python SDK

Nuimo is a universal smart device controller made by Senic.

The Nuimo Python SDK for Linux allows you to integrate your Nuimo(s) into any type of Linux application or script that can execute Python code.

Prerequisites

The Nuimo SDK requires Python 3.4+ and a recent installation of BlueZ. It is tested to work fine with BlueZ 5.44, slightly older versions should however work, too.

Installation

These instructions assume a Debian-based Linux.

On Linux the BlueZ library is necessary to access your built-in Bluetooth controller or Bluetooth USB dongle. Some Linux distributions provide a more up-to-date BlueZ package, some other distributions only install older versions that don't implement all Bluetooth features needed for this SDK. In those cases you want to either update BlueZ or build it from sources.

Updating/installing BlueZ via apt-get

  1. bluetoothd --version Obtains the version of the pre-installed BlueZ. bluetoothd daemon must run at startup to expose the Bluetooth API via D-Bus.
  2. sudo apt-get install --no-install-recommends bluetooth Installs BlueZ
  3. If the installed version is too old, proceed with next step: Installing BlueZ from sources

Installing BlueZ from sources

The bluetoothd daemon provides BlueZ's D-Bus interfaces that is accessed by the Nuimo SDK to communicate with Nuimo Bluetooth controllers. The following commands download BlueZ 5.44 sources, built them and replace any pre-installed bluetoothd daemon. It's not suggested to remove any pre-installed BlueZ package as its deinstallation might remove necessary Bluetooth drivers as well.

  1. sudo systemctl stop bluetooth
  2. sudo apt-get update
  3. sudo apt-get install libusb-dev libdbus-1-dev libglib2.0-dev libudev-dev libical-dev libreadline-dev libdbus-glib-1-dev unzip
  4. cd
  5. mkdir bluez
  6. cd bluez
  7. wget http://www.kernel.org/pub/linux/bluetooth/bluez-5.44.tar.xz
  8. tar xf bluez-5.44.tar.xz
  9. cd bluez-5.44
  10. ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --enable-library
  11. make
  12. sudo make install
  13. sudo ln -svf /usr/libexec/bluetooth/bluetoothd /usr/sbin/
  14. sudo install -v -dm755 /etc/bluetooth
  15. sudo install -v -m644 src/main.conf /etc/bluetooth/main.conf
  16. sudo systemctl daemon-reload
  17. sudo systemctl start bluetooth
  18. bluetoothd --version # should now print 5.44

Please note that some distributions might use a different directory for system deamons, apply step 13 only as needed.

Enabling your Bluetooth adapter

  1. echo "power on" | sudo bluetoothctl Enables your built-in Bluetooth adapter or external Bluetooth USB dongle

Using BlueZ commandline tools

BlueZ also provides an interactive commandline tool to interact with Bluetooth devices. You know that your BlueZ installation is working fine if it discovers any Bluetooth devices nearby.

sudo bluetoothctl Starts an interactive mode to talk to BlueZ

  • power on Enables the Bluetooth adapter
  • scan on Start Bluetooth device scanning and lists all found devices with MAC addresses
  • connect AA:BB:CC:DD:EE:FF Connects to a Nuimo controller with specified MAC address
  • exit Quits the interactive mode

Installing Nuimo Python SDK

To install Nuimo module and the Python3 D-Bus dependency globally, run:

sudo pip3 install nuimo
sudo apt-get install python3-dbus

Running the Nuimo control script

To test if your setup is working, run the following command. Note that it must be run as root because on Linux, Bluetooth discovery is a restricted operation.

sudo nuimoctl --discover
sudo nuimoctl --connect AA:BB:CC:DD:EE:FF # Replace the MAC address with your Nuimo's MAC address
sudo nuimoctl --help # To list all available commands

SDK Usage

Discovering nearby Nuimo controllers

The SDK entry point is the ControllerManager class. Check the following example to dicover any Nuimo controller nearby.

Please note that communication with your Bluetooth adapter happens over BlueZ's D-Bus API, hence an event loop needs to be run in order to receive all Bluetooth related events. You can start and stop the event loop via run() and stop() calls to your ControllerManager instance.

importnuimoclassControllerManagerPrintListener(nuimo.ControllerManagerListener):
defcontroller_discovered(self, controller):
print("Discovered Nuimo controller", controller.mac_address)
manager=nuimo.ControllerManager(adapter_name='hci0')
manager.listener=ControllerManagerPrintListener()
manager.start_discovery()
manager.run()

Connecting to a Nuimo controller and receiving user input events

Once ControllerManager has discovered a Nuimo controller you can use the controller object that you retrieved from ControllerManagerListener.controller_discovered() to connect to it. Alternatively you can create a new instance of Controller using the name of your Bluetooth adapter (typically hci0) and Nuimo's MAC address.

Make sure to assign a ControllerListener object to the listener attribute of your controller instance. It will notify you about all Nuimo controller related events such connection, disconnection and user input events.

The following example connects to a Nuimo controller and uses the predefined ControllerPrintListener class to print all controller events:

importnuimomanager=nuimo.ControllerManager(adapter_name='hci0')
controller=nuimo.Controller(mac_address='AA:BB:CC:DD:EE:FF', manager=manager)
controller.listener=nuimo.ControllerListener() # Use an instance of your own nuimo.ControllerListener subclasscontroller.connect()
manager.run()

As with Nuimo controller discovery, remember to start the Bluetooth event loop with ControllerManager.run().

Write to Nuimo's LED matrix

Once a Nuimo controller is connected you can send an LED matrix to its display. Therefor create an LedMatrix object by initializing it with a string. That string should contain 81 characters: each character, starting from top left corner, tells whether the corresponding LED should be on or off. ' ' and '0' signal LED off all other characters power the corresponding LED. The following example shows a cross:

matrix=nuimo.LedMatrix(
"* *"" * * "" * * "" * * "" * "" * * "" * * "" * * ""* *"
)
controller.display_matrix(matrix)

You can pass additional parameters to display_matrix() to control the following options:

  • interval: float # Display interval in seconds, default: 2.0 seconds
  • brightness: float # LED matrix brightness, default: 1.0 (100%)
  • fading: bool # Whether to fade the previous matrix into the next one, aka "onion skinning effect", default: False
  • ignore_duplicates: bool # Whether or not send an LED matrix to a Nuimo controller if it's already being displayed, default: False

Support

Please open an issue or drop us an email to developers@senic.com.

Contributing

Contributions are welcome via pull requests. Please open an issue first in case you want to discus your possible improvements to this SDK.

License

The Nuimo Python SDK is available under the MIT License.

About

Nuimo Python SDK for Linux to connect and communicate with Nuimo controllers made by Senic

Topics

Resources

Stars

55 stars

Watchers

12 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

161 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Nuimo Python SDK

Nuimo is a universal smart device controller made by Senic.

The Nuimo Python SDK for Linux allows you to integrate your Nuimo(s) into any type of Linux application or script that can execute Python code.

Prerequisites

The Nuimo SDK requires Python 3.4+ and a recent installation of BlueZ. It is tested to work fine with BlueZ 5.44, slightly older versions should however work, too.

Installation

These instructions assume a Debian-based Linux.

On Linux the BlueZ library is necessary to access your built-in Bluetooth controller or Bluetooth USB dongle. Some Linux distributions provide a more up-to-date BlueZ package, some other distributions only install older versions that don't implement all Bluetooth features needed for this SDK. In those cases you want to either update BlueZ or build it from sources.

Updating/installing BlueZ via apt-get

  1. bluetoothd --version Obtains the version of the pre-installed BlueZ. bluetoothd daemon must run at startup to expose the Bluetooth API via D-Bus.
  2. sudo apt-get install --no-install-recommends bluetooth Installs BlueZ
  3. If the installed version is too old, proceed with next step: Installing BlueZ from sources

Installing BlueZ from sources

The bluetoothd daemon provides BlueZ's D-Bus interfaces that is accessed by the Nuimo SDK to communicate with Nuimo Bluetooth controllers. The following commands download BlueZ 5.44 sources, built them and replace any pre-installed bluetoothd daemon. It's not suggested to remove any pre-installed BlueZ package as its deinstallation might remove necessary Bluetooth drivers as well.

  1. sudo systemctl stop bluetooth
  2. sudo apt-get update
  3. sudo apt-get install libusb-dev libdbus-1-dev libglib2.0-dev libudev-dev libical-dev libreadline-dev libdbus-glib-1-dev unzip
  4. cd
  5. mkdir bluez
  6. cd bluez
  7. wget http://www.kernel.org/pub/linux/bluetooth/bluez-5.44.tar.xz
  8. tar xf bluez-5.44.tar.xz
  9. cd bluez-5.44
  10. ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --enable-library
  11. make
  12. sudo make install
  13. sudo ln -svf /usr/libexec/bluetooth/bluetoothd /usr/sbin/
  14. sudo install -v -dm755 /etc/bluetooth
  15. sudo install -v -m644 src/main.conf /etc/bluetooth/main.conf
  16. sudo systemctl daemon-reload
  17. sudo systemctl start bluetooth
  18. bluetoothd --version # should now print 5.44

Please note that some distributions might use a different directory for system deamons, apply step 13 only as needed.

Enabling your Bluetooth adapter

  1. echo "power on" | sudo bluetoothctl Enables your built-in Bluetooth adapter or external Bluetooth USB dongle

Using BlueZ commandline tools

BlueZ also provides an interactive commandline tool to interact with Bluetooth devices. You know that your BlueZ installation is working fine if it discovers any Bluetooth devices nearby.

sudo bluetoothctl Starts an interactive mode to talk to BlueZ

  • power on Enables the Bluetooth adapter
  • scan on Start Bluetooth device scanning and lists all found devices with MAC addresses
  • connect AA:BB:CC:DD:EE:FF Connects to a Nuimo controller with specified MAC address
  • exit Quits the interactive mode

Installing Nuimo Python SDK

To install Nuimo module and the Python3 D-Bus dependency globally, run:

sudo pip3 install nuimo
sudo apt-get install python3-dbus

Running the Nuimo control script

To test if your setup is working, run the following command. Note that it must be run as root because on Linux, Bluetooth discovery is a restricted operation.

sudo nuimoctl --discover
sudo nuimoctl --connect AA:BB:CC:DD:EE:FF # Replace the MAC address with your Nuimo's MAC address
sudo nuimoctl --help # To list all available commands

SDK Usage

Discovering nearby Nuimo controllers

The SDK entry point is the ControllerManager class. Check the following example to dicover any Nuimo controller nearby.

Please note that communication with your Bluetooth adapter happens over BlueZ's D-Bus API, hence an event loop needs to be run in order to receive all Bluetooth related events. You can start and stop the event loop via run() and stop() calls to your ControllerManager instance.

importnuimoclassControllerManagerPrintListener(nuimo.ControllerManagerListener):
defcontroller_discovered(self, controller):
print("Discovered Nuimo controller", controller.mac_address)
manager=nuimo.ControllerManager(adapter_name='hci0')
manager.listener=ControllerManagerPrintListener()
manager.start_discovery()
manager.run()

Connecting to a Nuimo controller and receiving user input events

Once ControllerManager has discovered a Nuimo controller you can use the controller object that you retrieved from ControllerManagerListener.controller_discovered() to connect to it. Alternatively you can create a new instance of Controller using the name of your Bluetooth adapter (typically hci0) and Nuimo's MAC address.

Make sure to assign a ControllerListener object to the listener attribute of your controller instance. It will notify you about all Nuimo controller related events such connection, disconnection and user input events.

The following example connects to a Nuimo controller and uses the predefined ControllerPrintListener class to print all controller events:

importnuimomanager=nuimo.ControllerManager(adapter_name='hci0')
controller=nuimo.Controller(mac_address='AA:BB:CC:DD:EE:FF', manager=manager)
controller.listener=nuimo.ControllerListener() # Use an instance of your own nuimo.ControllerListener subclasscontroller.connect()
manager.run()

As with Nuimo controller discovery, remember to start the Bluetooth event loop with ControllerManager.run().

Write to Nuimo's LED matrix

Once a Nuimo controller is connected you can send an LED matrix to its display. Therefor create an LedMatrix object by initializing it with a string. That string should contain 81 characters: each character, starting from top left corner, tells whether the corresponding LED should be on or off. ' ' and '0' signal LED off all other characters power the corresponding LED. The following example shows a cross:

matrix=nuimo.LedMatrix(
"* *"" * * "" * * "" * * "" * "" * * "" * * "" * * ""* *"
)
controller.display_matrix(matrix)

You can pass additional parameters to display_matrix() to control the following options:

  • interval: float # Display interval in seconds, default: 2.0 seconds
  • brightness: float # LED matrix brightness, default: 1.0 (100%)
  • fading: bool # Whether to fade the previous matrix into the next one, aka "onion skinning effect", default: False
  • ignore_duplicates: bool # Whether or not send an LED matrix to a Nuimo controller if it's already being displayed, default: False

Support

Please open an issue or drop us an email to developers@senic.com.

Contributing

Contributions are welcome via pull requests. Please open an issue first in case you want to discus your possible improvements to this SDK.

License

The Nuimo Python SDK is available under the MIT License.

About

Nuimo Python SDK for Linux to connect and communicate with Nuimo controllers made by Senic

Topics

Resources

Stars

55 stars

Watchers

12 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

161 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Nuimo Python SDK

Nuimo is a universal smart device controller made by Senic.

The Nuimo Python SDK for Linux allows you to integrate your Nuimo(s) into any type of Linux application or script that can execute Python code.

Prerequisites

The Nuimo SDK requires Python 3.4+ and a recent installation of BlueZ. It is tested to work fine with BlueZ 5.44, slightly older versions should however work, too.

Installation

These instructions assume a Debian-based Linux.

On Linux the BlueZ library is necessary to access your built-in Bluetooth controller or Bluetooth USB dongle. Some Linux distributions provide a more up-to-date BlueZ package, some other distributions only install older versions that don't implement all Bluetooth features needed for this SDK. In those cases you want to either update BlueZ or build it from sources.

Updating/installing BlueZ via apt-get

  1. bluetoothd --version Obtains the version of the pre-installed BlueZ. bluetoothd daemon must run at startup to expose the Bluetooth API via D-Bus.
  2. sudo apt-get install --no-install-recommends bluetooth Installs BlueZ
  3. If the installed version is too old, proceed with next step: Installing BlueZ from sources

Installing BlueZ from sources

The bluetoothd daemon provides BlueZ's D-Bus interfaces that is accessed by the Nuimo SDK to communicate with Nuimo Bluetooth controllers. The following commands download BlueZ 5.44 sources, built them and replace any pre-installed bluetoothd daemon. It's not suggested to remove any pre-installed BlueZ package as its deinstallation might remove necessary Bluetooth drivers as well.

  1. sudo systemctl stop bluetooth
  2. sudo apt-get update
  3. sudo apt-get install libusb-dev libdbus-1-dev libglib2.0-dev libudev-dev libical-dev libreadline-dev libdbus-glib-1-dev unzip
  4. cd
  5. mkdir bluez
  6. cd bluez
  7. wget http://www.kernel.org/pub/linux/bluetooth/bluez-5.44.tar.xz
  8. tar xf bluez-5.44.tar.xz
  9. cd bluez-5.44
  10. ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --enable-library
  11. make
  12. sudo make install
  13. sudo ln -svf /usr/libexec/bluetooth/bluetoothd /usr/sbin/
  14. sudo install -v -dm755 /etc/bluetooth
  15. sudo install -v -m644 src/main.conf /etc/bluetooth/main.conf
  16. sudo systemctl daemon-reload
  17. sudo systemctl start bluetooth
  18. bluetoothd --version # should now print 5.44

Please note that some distributions might use a different directory for system deamons, apply step 13 only as needed.

Enabling your Bluetooth adapter

  1. echo "power on" | sudo bluetoothctl Enables your built-in Bluetooth adapter or external Bluetooth USB dongle

Using BlueZ commandline tools

BlueZ also provides an interactive commandline tool to interact with Bluetooth devices. You know that your BlueZ installation is working fine if it discovers any Bluetooth devices nearby.

sudo bluetoothctl Starts an interactive mode to talk to BlueZ

  • power on Enables the Bluetooth adapter
  • scan on Start Bluetooth device scanning and lists all found devices with MAC addresses
  • connect AA:BB:CC:DD:EE:FF Connects to a Nuimo controller with specified MAC address
  • exit Quits the interactive mode

Installing Nuimo Python SDK

To install Nuimo module and the Python3 D-Bus dependency globally, run:

sudo pip3 install nuimo
sudo apt-get install python3-dbus

Running the Nuimo control script

To test if your setup is working, run the following command. Note that it must be run as root because on Linux, Bluetooth discovery is a restricted operation.

sudo nuimoctl --discover
sudo nuimoctl --connect AA:BB:CC:DD:EE:FF # Replace the MAC address with your Nuimo's MAC address
sudo nuimoctl --help # To list all available commands

SDK Usage

Discovering nearby Nuimo controllers

The SDK entry point is the ControllerManager class. Check the following example to dicover any Nuimo controller nearby.

Please note that communication with your Bluetooth adapter happens over BlueZ's D-Bus API, hence an event loop needs to be run in order to receive all Bluetooth related events. You can start and stop the event loop via run() and stop() calls to your ControllerManager instance.

importnuimoclassControllerManagerPrintListener(nuimo.ControllerManagerListener):
defcontroller_discovered(self, controller):
print("Discovered Nuimo controller", controller.mac_address)
manager=nuimo.ControllerManager(adapter_name='hci0')
manager.listener=ControllerManagerPrintListener()
manager.start_discovery()
manager.run()

Connecting to a Nuimo controller and receiving user input events

Once ControllerManager has discovered a Nuimo controller you can use the controller object that you retrieved from ControllerManagerListener.controller_discovered() to connect to it. Alternatively you can create a new instance of Controller using the name of your Bluetooth adapter (typically hci0) and Nuimo's MAC address.

Make sure to assign a ControllerListener object to the listener attribute of your controller instance. It will notify you about all Nuimo controller related events such connection, disconnection and user input events.

The following example connects to a Nuimo controller and uses the predefined ControllerPrintListener class to print all controller events:

importnuimomanager=nuimo.ControllerManager(adapter_name='hci0')
controller=nuimo.Controller(mac_address='AA:BB:CC:DD:EE:FF', manager=manager)
controller.listener=nuimo.ControllerListener() # Use an instance of your own nuimo.ControllerListener subclasscontroller.connect()
manager.run()

As with Nuimo controller discovery, remember to start the Bluetooth event loop with ControllerManager.run().

Write to Nuimo's LED matrix

Once a Nuimo controller is connected you can send an LED matrix to its display. Therefor create an LedMatrix object by initializing it with a string. That string should contain 81 characters: each character, starting from top left corner, tells whether the corresponding LED should be on or off. ' ' and '0' signal LED off all other characters power the corresponding LED. The following example shows a cross:

matrix=nuimo.LedMatrix(
"* *"" * * "" * * "" * * "" * "" * * "" * * "" * * ""* *"
)
controller.display_matrix(matrix)

You can pass additional parameters to display_matrix() to control the following options:

  • interval: float # Display interval in seconds, default: 2.0 seconds
  • brightness: float # LED matrix brightness, default: 1.0 (100%)
  • fading: bool # Whether to fade the previous matrix into the next one, aka "onion skinning effect", default: False
  • ignore_duplicates: bool # Whether or not send an LED matrix to a Nuimo controller if it's already being displayed, default: False

Support

Please open an issue or drop us an email to developers@senic.com.

Contributing

Contributions are welcome via pull requests. Please open an issue first in case you want to discus your possible improvements to this SDK.

License

The Nuimo Python SDK is available under the MIT License.

About

Nuimo Python SDK for Linux to connect and communicate with Nuimo controllers made by Senic

Topics

Resources

Stars

55 stars

Watchers

12 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

161 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Nuimo Python SDK

Nuimo is a universal smart device controller made by Senic.

The Nuimo Python SDK for Linux allows you to integrate your Nuimo(s) into any type of Linux application or script that can execute Python code.

Prerequisites

The Nuimo SDK requires Python 3.4+ and a recent installation of BlueZ. It is tested to work fine with BlueZ 5.44, slightly older versions should however work, too.

Installation

These instructions assume a Debian-based Linux.

On Linux the BlueZ library is necessary to access your built-in Bluetooth controller or Bluetooth USB dongle. Some Linux distributions provide a more up-to-date BlueZ package, some other distributions only install older versions that don't implement all Bluetooth features needed for this SDK. In those cases you want to either update BlueZ or build it from sources.

Updating/installing BlueZ via apt-get

  1. bluetoothd --version Obtains the version of the pre-installed BlueZ. bluetoothd daemon must run at startup to expose the Bluetooth API via D-Bus.
  2. sudo apt-get install --no-install-recommends bluetooth Installs BlueZ
  3. If the installed version is too old, proceed with next step: Installing BlueZ from sources

Installing BlueZ from sources

The bluetoothd daemon provides BlueZ's D-Bus interfaces that is accessed by the Nuimo SDK to communicate with Nuimo Bluetooth controllers. The following commands download BlueZ 5.44 sources, built them and replace any pre-installed bluetoothd daemon. It's not suggested to remove any pre-installed BlueZ package as its deinstallation might remove necessary Bluetooth drivers as well.

  1. sudo systemctl stop bluetooth
  2. sudo apt-get update
  3. sudo apt-get install libusb-dev libdbus-1-dev libglib2.0-dev libudev-dev libical-dev libreadline-dev libdbus-glib-1-dev unzip
  4. cd
  5. mkdir bluez
  6. cd bluez
  7. wget http://www.kernel.org/pub/linux/bluetooth/bluez-5.44.tar.xz
  8. tar xf bluez-5.44.tar.xz
  9. cd bluez-5.44
  10. ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --enable-library
  11. make
  12. sudo make install
  13. sudo ln -svf /usr/libexec/bluetooth/bluetoothd /usr/sbin/
  14. sudo install -v -dm755 /etc/bluetooth
  15. sudo install -v -m644 src/main.conf /etc/bluetooth/main.conf
  16. sudo systemctl daemon-reload
  17. sudo systemctl start bluetooth
  18. bluetoothd --version # should now print 5.44

Please note that some distributions might use a different directory for system deamons, apply step 13 only as needed.

Enabling your Bluetooth adapter

  1. echo "power on" | sudo bluetoothctl Enables your built-in Bluetooth adapter or external Bluetooth USB dongle

Using BlueZ commandline tools

BlueZ also provides an interactive commandline tool to interact with Bluetooth devices. You know that your BlueZ installation is working fine if it discovers any Bluetooth devices nearby.

sudo bluetoothctl Starts an interactive mode to talk to BlueZ

  • power on Enables the Bluetooth adapter
  • scan on Start Bluetooth device scanning and lists all found devices with MAC addresses
  • connect AA:BB:CC:DD:EE:FF Connects to a Nuimo controller with specified MAC address
  • exit Quits the interactive mode

Installing Nuimo Python SDK

To install Nuimo module and the Python3 D-Bus dependency globally, run:

sudo pip3 install nuimo
sudo apt-get install python3-dbus

Running the Nuimo control script

To test if your setup is working, run the following command. Note that it must be run as root because on Linux, Bluetooth discovery is a restricted operation.

sudo nuimoctl --discover
sudo nuimoctl --connect AA:BB:CC:DD:EE:FF # Replace the MAC address with your Nuimo's MAC address
sudo nuimoctl --help # To list all available commands

SDK Usage

Discovering nearby Nuimo controllers

The SDK entry point is the ControllerManager class. Check the following example to dicover any Nuimo controller nearby.

Please note that communication with your Bluetooth adapter happens over BlueZ's D-Bus API, hence an event loop needs to be run in order to receive all Bluetooth related events. You can start and stop the event loop via run() and stop() calls to your ControllerManager instance.

importnuimoclassControllerManagerPrintListener(nuimo.ControllerManagerListener):
defcontroller_discovered(self, controller):
print("Discovered Nuimo controller", controller.mac_address)
manager=nuimo.ControllerManager(adapter_name='hci0')
manager.listener=ControllerManagerPrintListener()
manager.start_discovery()
manager.run()

Connecting to a Nuimo controller and receiving user input events

Once ControllerManager has discovered a Nuimo controller you can use the controller object that you retrieved from ControllerManagerListener.controller_discovered() to connect to it. Alternatively you can create a new instance of Controller using the name of your Bluetooth adapter (typically hci0) and Nuimo's MAC address.

Make sure to assign a ControllerListener object to the listener attribute of your controller instance. It will notify you about all Nuimo controller related events such connection, disconnection and user input events.

The following example connects to a Nuimo controller and uses the predefined ControllerPrintListener class to print all controller events:

importnuimomanager=nuimo.ControllerManager(adapter_name='hci0')
controller=nuimo.Controller(mac_address='AA:BB:CC:DD:EE:FF', manager=manager)
controller.listener=nuimo.ControllerListener() # Use an instance of your own nuimo.ControllerListener subclasscontroller.connect()
manager.run()

As with Nuimo controller discovery, remember to start the Bluetooth event loop with ControllerManager.run().

Write to Nuimo's LED matrix

Once a Nuimo controller is connected you can send an LED matrix to its display. Therefor create an LedMatrix object by initializing it with a string. That string should contain 81 characters: each character, starting from top left corner, tells whether the corresponding LED should be on or off. ' ' and '0' signal LED off all other characters power the corresponding LED. The following example shows a cross:

matrix=nuimo.LedMatrix(
"* *"" * * "" * * "" * * "" * "" * * "" * * "" * * ""* *"
)
controller.display_matrix(matrix)

You can pass additional parameters to display_matrix() to control the following options:

  • interval: float # Display interval in seconds, default: 2.0 seconds
  • brightness: float # LED matrix brightness, default: 1.0 (100%)
  • fading: bool # Whether to fade the previous matrix into the next one, aka "onion skinning effect", default: False
  • ignore_duplicates: bool # Whether or not send an LED matrix to a Nuimo controller if it's already being displayed, default: False

Support

Please open an issue or drop us an email to developers@senic.com.

Contributing

Contributions are welcome via pull requests. Please open an issue first in case you want to discus your possible improvements to this SDK.

License

The Nuimo Python SDK is available under the MIT License.

About

Nuimo Python SDK for Linux to connect and communicate with Nuimo controllers made by Senic

Topics

Resources

Stars

55 stars

Watchers

12 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

161 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Nuimo Python SDK

Nuimo is a universal smart device controller made by Senic.

The Nuimo Python SDK for Linux allows you to integrate your Nuimo(s) into any type of Linux application or script that can execute Python code.

Prerequisites

The Nuimo SDK requires Python 3.4+ and a recent installation of BlueZ. It is tested to work fine with BlueZ 5.44, slightly older versions should however work, too.

Installation

These instructions assume a Debian-based Linux.

On Linux the BlueZ library is necessary to access your built-in Bluetooth controller or Bluetooth USB dongle. Some Linux distributions provide a more up-to-date BlueZ package, some other distributions only install older versions that don't implement all Bluetooth features needed for this SDK. In those cases you want to either update BlueZ or build it from sources.

Updating/installing BlueZ via apt-get

  1. bluetoothd --version Obtains the version of the pre-installed BlueZ. bluetoothd daemon must run at startup to expose the Bluetooth API via D-Bus.
  2. sudo apt-get install --no-install-recommends bluetooth Installs BlueZ
  3. If the installed version is too old, proceed with next step: Installing BlueZ from sources

Installing BlueZ from sources

The bluetoothd daemon provides BlueZ's D-Bus interfaces that is accessed by the Nuimo SDK to communicate with Nuimo Bluetooth controllers. The following commands download BlueZ 5.44 sources, built them and replace any pre-installed bluetoothd daemon. It's not suggested to remove any pre-installed BlueZ package as its deinstallation might remove necessary Bluetooth drivers as well.

  1. sudo systemctl stop bluetooth
  2. sudo apt-get update
  3. sudo apt-get install libusb-dev libdbus-1-dev libglib2.0-dev libudev-dev libical-dev libreadline-dev libdbus-glib-1-dev unzip
  4. cd
  5. mkdir bluez
  6. cd bluez
  7. wget http://www.kernel.org/pub/linux/bluetooth/bluez-5.44.tar.xz
  8. tar xf bluez-5.44.tar.xz
  9. cd bluez-5.44
  10. ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --enable-library
  11. make
  12. sudo make install
  13. sudo ln -svf /usr/libexec/bluetooth/bluetoothd /usr/sbin/
  14. sudo install -v -dm755 /etc/bluetooth
  15. sudo install -v -m644 src/main.conf /etc/bluetooth/main.conf
  16. sudo systemctl daemon-reload
  17. sudo systemctl start bluetooth
  18. bluetoothd --version # should now print 5.44

Please note that some distributions might use a different directory for system deamons, apply step 13 only as needed.

Enabling your Bluetooth adapter

  1. echo "power on" | sudo bluetoothctl Enables your built-in Bluetooth adapter or external Bluetooth USB dongle

Using BlueZ commandline tools

BlueZ also provides an interactive commandline tool to interact with Bluetooth devices. You know that your BlueZ installation is working fine if it discovers any Bluetooth devices nearby.

sudo bluetoothctl Starts an interactive mode to talk to BlueZ

  • power on Enables the Bluetooth adapter
  • scan on Start Bluetooth device scanning and lists all found devices with MAC addresses
  • connect AA:BB:CC:DD:EE:FF Connects to a Nuimo controller with specified MAC address
  • exit Quits the interactive mode

Installing Nuimo Python SDK

To install Nuimo module and the Python3 D-Bus dependency globally, run:

sudo pip3 install nuimo
sudo apt-get install python3-dbus

Running the Nuimo control script

To test if your setup is working, run the following command. Note that it must be run as root because on Linux, Bluetooth discovery is a restricted operation.

sudo nuimoctl --discover
sudo nuimoctl --connect AA:BB:CC:DD:EE:FF # Replace the MAC address with your Nuimo's MAC address
sudo nuimoctl --help # To list all available commands

SDK Usage

Discovering nearby Nuimo controllers

The SDK entry point is the ControllerManager class. Check the following example to dicover any Nuimo controller nearby.

Please note that communication with your Bluetooth adapter happens over BlueZ's D-Bus API, hence an event loop needs to be run in order to receive all Bluetooth related events. You can start and stop the event loop via run() and stop() calls to your ControllerManager instance.

importnuimoclassControllerManagerPrintListener(nuimo.ControllerManagerListener):
defcontroller_discovered(self, controller):
print("Discovered Nuimo controller", controller.mac_address)
manager=nuimo.ControllerManager(adapter_name='hci0')
manager.listener=ControllerManagerPrintListener()
manager.start_discovery()
manager.run()

Connecting to a Nuimo controller and receiving user input events

Once ControllerManager has discovered a Nuimo controller you can use the controller object that you retrieved from ControllerManagerListener.controller_discovered() to connect to it. Alternatively you can create a new instance of Controller using the name of your Bluetooth adapter (typically hci0) and Nuimo's MAC address.

Make sure to assign a ControllerListener object to the listener attribute of your controller instance. It will notify you about all Nuimo controller related events such connection, disconnection and user input events.

The following example connects to a Nuimo controller and uses the predefined ControllerPrintListener class to print all controller events:

importnuimomanager=nuimo.ControllerManager(adapter_name='hci0')
controller=nuimo.Controller(mac_address='AA:BB:CC:DD:EE:FF', manager=manager)
controller.listener=nuimo.ControllerListener() # Use an instance of your own nuimo.ControllerListener subclasscontroller.connect()
manager.run()

As with Nuimo controller discovery, remember to start the Bluetooth event loop with ControllerManager.run().

Write to Nuimo's LED matrix

Once a Nuimo controller is connected you can send an LED matrix to its display. Therefor create an LedMatrix object by initializing it with a string. That string should contain 81 characters: each character, starting from top left corner, tells whether the corresponding LED should be on or off. ' ' and '0' signal LED off all other characters power the corresponding LED. The following example shows a cross:

matrix=nuimo.LedMatrix(
"* *"" * * "" * * "" * * "" * "" * * "" * * "" * * ""* *"
)
controller.display_matrix(matrix)

You can pass additional parameters to display_matrix() to control the following options:

  • interval: float # Display interval in seconds, default: 2.0 seconds
  • brightness: float # LED matrix brightness, default: 1.0 (100%)
  • fading: bool # Whether to fade the previous matrix into the next one, aka "onion skinning effect", default: False
  • ignore_duplicates: bool # Whether or not send an LED matrix to a Nuimo controller if it's already being displayed, default: False

Support

Please open an issue or drop us an email to developers@senic.com.

Contributing

Contributions are welcome via pull requests. Please open an issue first in case you want to discus your possible improvements to this SDK.

License

The Nuimo Python SDK is available under the MIT License.

About

Nuimo Python SDK for Linux to connect and communicate with Nuimo controllers made by Senic

Topics

Resources

Stars

55 stars

Watchers

12 watching

Forks

Releases

Packages

Used by

Contributors

Languages