Repository files navigation

Immer - Immersive Art Installations

But:

  • Supermarket Hardware instead of professional expert equipment.
  • Mobile and Reproducible instead of local one-off setups.
  • Open Source and No-Code instead of expensive expert software.

Read more on immerart.org.

Installation (Mac OS)

Right now we only support MacOS but we will add support for more operating systems.

Make sure a Chrome or Chromium browser is installed.

Make sure Homebrew is installed.

Install Ruby 3.0.5. Check this blog post

brew install chruby ruby-install ruby-install ruby-3.0.5

Follow all the instructions, e.g. in case you'll have to add it to your CLI path.

Install Browser library, audio, QR code reader

brew install chromedriver ffmpeg python@3.12 zbar
pip3 install pyzbar --break-system-packages
pip3 install pyzbar[scripts] --break-system-packages
pip3 install numpy --break-system-packages
pip3 install imutils --break-system-packages
pip3 install opencv-python --break-system-packages
pip3 install requests --break-system-packages

Configure Immersive Art Installations

An experience may run on many sets of hardware called environments. E.g. a home environment, an atelier one, a gallery one, and many customer environments. To enable that define multiple environments with identically named devices that will have varying local device identifiers.

Similarly, many immersive art installations, that we sometimes call experiences, may run in the same environment. E.g. a wildflower experience and a mountain-top experience running in the same home environment using the same hardware.

Ultimately, you will start Immer providing as parameters a fixed environment and a (soon-to-be) changeable initial experience to load.

Configure Home Assistant

# ./config/ha.ymlha:
mac: 'xxx'# Home Assistant MAC address / device identifier as found in your Home Assistant UItoken: 'xxx'# Home Assistant security token as found in your Home Assistant UI 

Configure devices to be used

By default the named devices "this_screen" and "this_speaker" of your current laptop are made available.

Discover accessible devices: ruby ./util/discover_devices.rb

# ./config/devices.ymldevices:
home: # name your environmentfan: # name your devicemodel_class: HaSwitch # found in ./devices/*entity_id: switch.plug_jenny # found in the Home Assistant UIanother_device:
# ...another_environment:
# ...

Configure sensors to listen to

# ./config/sensors.ymlsensors:
home: # name your environmentqr_code_reader: # name your sensormodel_class: QrCodeReader # found in ./devices/*another_device:
# ...another_environment:
# ...

Configure immersive art installation experiences

# Create a new experience
cp -R ./installations/template/ ./installations/<MY_INSTALLATION_NAME>
  • Put videos and other media directly viewable in a web browser into the media folder.
  • Put images and other media that requires resizing into the images folder and run the according script from the ./util/ folder to embed it into a web page viewable in a web browser.
  • Put custom code scripts into the scripts folder. A default device "terminal" with cmd "execute" allows you to start them locally.

Configure a set of sequences (WIP: rn only one sequence is possible)

Configure at which point in time (currently always in milliseconds) within the experience which device shall perform which action or "cmd" (short for command).

# ./<MY_INSTALLATION_NAME>/sequences.ymlsequence_script:
loops: true # if true will loop this sequence until the process receives an exit signalloops_pause_ms: 1000length_ms: 45000start: # set the initial state of the environment before starting the experiencethis_screen: # device name as in ./config/devices.yml or the default devicescmd: turn_on # device action or command specific to the device typefile: sonar.xhtml # a parameter custom to the specific device actionanother_parameter: "..."another_device:
# ...end: # set the final state of the environment after stopping the experiencegold_bulb: # device name as in ./config/devices.yml or the default devicescmd: turn_off # device action or command specific to the device typeanother_device:
# ...sequence: # a sequence to run once or many times500: # milliseconds after experience start at which to perform the followingtv_speaker: # device name as in ./config/devices.yml or the default devicescmd: play # device action or command specific to the device typetune: underwater.mp3 # a parameter custom to the specific device actionduration_ms: 45000# a parameter custom to the specific device actionanother_parameter: "..."another_device:
# ...another_ms_mark:
# ...

Configure a set of responses to sensor events

WIP: Rn only immediate device actions can be configured in response to events. The near term goal is to instead start a sequence as defined in ./<MY_INSTALLATION_NAME>/sequences.yml.

events:
btn_sasha: # sensor name as configured in ./config/sensors.ymlpress: # event name custom to the sensorgold_bulb: # # device name as in ./config/devices.yml or the default devicescmd: flash_color # device action or command specific to the device typecolor: blue # a parameter custom to the specific device actionduration_ms: 2000# a parameter custom to the specific device actionanother_parameter: "..."another_device:
# ...another_event_name:
# ...another_sensor:
# ...

Run your immersive art experience

Start the Ruby script immer.rb with paramaters environment and installation_name.

ruby immer.rb home demo

Roadmap

WARNING: This project is in very much work in progress. There is a long list of TODOs on our road to an initial stable version.

  • Refactor: run.yml to sequences.yml, cmd option to action
  • Start Home Assistant connector only if necessary
  • Create a demo experience without Home Assistant
  • Make immer run the main experience and the server listening for events run at the same time communicating with each other
  • Fix shutdown of an experience at application exit
  • Catch configuration errors at startup like invalid device names, action names, etc
  • Make switching experiences work on-the-fly
  • Provide a basic intranet web interface for listing experiences and switching them
  • Replace Screen device definition x_position: 2000px with position: left
  • Allow multiple layers for screen media and transitions between them. Allow events to trigger layer switches.
  • Detect and store laptop IP to remove option from TouchDesginer definitions

Please create GitHub issues for further bugs, feature requests, etc. Be nice at all times and to everyone.

License

Distributed under the MIT License. See LICENSE.txt for more information.

Contributing

Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.

If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag "enhancement". Don't forget to give the project a star! Thanks again!

  1. Fork the Project
  2. Create your Feature Branch (git checkout -b feature/AmazingFeature)
  3. Commit your Changes (git commit -m 'Add some AmazingFeature')
  4. Push to the Branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

1 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

Repository files navigation

Immer - Immersive Art Installations

But:

  • Supermarket Hardware instead of professional expert equipment.
  • Mobile and Reproducible instead of local one-off setups.
  • Open Source and No-Code instead of expensive expert software.

Read more on immerart.org.

Installation (Mac OS)

Right now we only support MacOS but we will add support for more operating systems.

Make sure a Chrome or Chromium browser is installed.

Make sure Homebrew is installed.

Install Ruby 3.0.5. Check this blog post

brew install chruby ruby-install ruby-install ruby-3.0.5

Follow all the instructions, e.g. in case you'll have to add it to your CLI path.

Install Browser library, audio, QR code reader

brew install chromedriver ffmpeg python@3.12 zbar
pip3 install pyzbar --break-system-packages
pip3 install pyzbar[scripts] --break-system-packages
pip3 install numpy --break-system-packages
pip3 install imutils --break-system-packages
pip3 install opencv-python --break-system-packages
pip3 install requests --break-system-packages

Configure Immersive Art Installations

An experience may run on many sets of hardware called environments. E.g. a home environment, an atelier one, a gallery one, and many customer environments. To enable that define multiple environments with identically named devices that will have varying local device identifiers.

Similarly, many immersive art installations, that we sometimes call experiences, may run in the same environment. E.g. a wildflower experience and a mountain-top experience running in the same home environment using the same hardware.

Ultimately, you will start Immer providing as parameters a fixed environment and a (soon-to-be) changeable initial experience to load.

Configure Home Assistant

# ./config/ha.ymlha:
mac: 'xxx'# Home Assistant MAC address / device identifier as found in your Home Assistant UItoken: 'xxx'# Home Assistant security token as found in your Home Assistant UI 

Configure devices to be used

By default the named devices "this_screen" and "this_speaker" of your current laptop are made available.

Discover accessible devices: ruby ./util/discover_devices.rb

# ./config/devices.ymldevices:
home: # name your environmentfan: # name your devicemodel_class: HaSwitch # found in ./devices/*entity_id: switch.plug_jenny # found in the Home Assistant UIanother_device:
# ...another_environment:
# ...

Configure sensors to listen to

# ./config/sensors.ymlsensors:
home: # name your environmentqr_code_reader: # name your sensormodel_class: QrCodeReader # found in ./devices/*another_device:
# ...another_environment:
# ...

Configure immersive art installation experiences

# Create a new experience
cp -R ./installations/template/ ./installations/<MY_INSTALLATION_NAME>
  • Put videos and other media directly viewable in a web browser into the media folder.
  • Put images and other media that requires resizing into the images folder and run the according script from the ./util/ folder to embed it into a web page viewable in a web browser.
  • Put custom code scripts into the scripts folder. A default device "terminal" with cmd "execute" allows you to start them locally.

Configure a set of sequences (WIP: rn only one sequence is possible)

Configure at which point in time (currently always in milliseconds) within the experience which device shall perform which action or "cmd" (short for command).

# ./<MY_INSTALLATION_NAME>/sequences.ymlsequence_script:
loops: true # if true will loop this sequence until the process receives an exit signalloops_pause_ms: 1000length_ms: 45000start: # set the initial state of the environment before starting the experiencethis_screen: # device name as in ./config/devices.yml or the default devicescmd: turn_on # device action or command specific to the device typefile: sonar.xhtml # a parameter custom to the specific device actionanother_parameter: "..."another_device:
# ...end: # set the final state of the environment after stopping the experiencegold_bulb: # device name as in ./config/devices.yml or the default devicescmd: turn_off # device action or command specific to the device typeanother_device:
# ...sequence: # a sequence to run once or many times500: # milliseconds after experience start at which to perform the followingtv_speaker: # device name as in ./config/devices.yml or the default devicescmd: play # device action or command specific to the device typetune: underwater.mp3 # a parameter custom to the specific device actionduration_ms: 45000# a parameter custom to the specific device actionanother_parameter: "..."another_device:
# ...another_ms_mark:
# ...

Configure a set of responses to sensor events

WIP: Rn only immediate device actions can be configured in response to events. The near term goal is to instead start a sequence as defined in ./<MY_INSTALLATION_NAME>/sequences.yml.

events:
btn_sasha: # sensor name as configured in ./config/sensors.ymlpress: # event name custom to the sensorgold_bulb: # # device name as in ./config/devices.yml or the default devicescmd: flash_color # device action or command specific to the device typecolor: blue # a parameter custom to the specific device actionduration_ms: 2000# a parameter custom to the specific device actionanother_parameter: "..."another_device:
# ...another_event_name:
# ...another_sensor:
# ...

Run your immersive art experience

Start the Ruby script immer.rb with paramaters environment and installation_name.

ruby immer.rb home demo

Roadmap

WARNING: This project is in very much work in progress. There is a long list of TODOs on our road to an initial stable version.

  • Refactor: run.yml to sequences.yml, cmd option to action
  • Start Home Assistant connector only if necessary
  • Create a demo experience without Home Assistant
  • Make immer run the main experience and the server listening for events run at the same time communicating with each other
  • Fix shutdown of an experience at application exit
  • Catch configuration errors at startup like invalid device names, action names, etc
  • Make switching experiences work on-the-fly
  • Provide a basic intranet web interface for listing experiences and switching them
  • Replace Screen device definition x_position: 2000px with position: left
  • Allow multiple layers for screen media and transitions between them. Allow events to trigger layer switches.
  • Detect and store laptop IP to remove option from TouchDesginer definitions

Please create GitHub issues for further bugs, feature requests, etc. Be nice at all times and to everyone.

License

Distributed under the MIT License. See LICENSE.txt for more information.

Contributing

Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.

If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag "enhancement". Don't forget to give the project a star! Thanks again!

  1. Fork the Project
  2. Create your Feature Branch (git checkout -b feature/AmazingFeature)
  3. Commit your Changes (git commit -m 'Add some AmazingFeature')
  4. Push to the Branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

1 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

Repository files navigation

Immer - Immersive Art Installations

But:

  • Supermarket Hardware instead of professional expert equipment.
  • Mobile and Reproducible instead of local one-off setups.
  • Open Source and No-Code instead of expensive expert software.

Read more on immerart.org.

Installation (Mac OS)

Right now we only support MacOS but we will add support for more operating systems.

Make sure a Chrome or Chromium browser is installed.

Make sure Homebrew is installed.

Install Ruby 3.0.5. Check this blog post

brew install chruby ruby-install ruby-install ruby-3.0.5

Follow all the instructions, e.g. in case you'll have to add it to your CLI path.

Install Browser library, audio, QR code reader

brew install chromedriver ffmpeg python@3.12 zbar
pip3 install pyzbar --break-system-packages
pip3 install pyzbar[scripts] --break-system-packages
pip3 install numpy --break-system-packages
pip3 install imutils --break-system-packages
pip3 install opencv-python --break-system-packages
pip3 install requests --break-system-packages

Configure Immersive Art Installations

An experience may run on many sets of hardware called environments. E.g. a home environment, an atelier one, a gallery one, and many customer environments. To enable that define multiple environments with identically named devices that will have varying local device identifiers.

Similarly, many immersive art installations, that we sometimes call experiences, may run in the same environment. E.g. a wildflower experience and a mountain-top experience running in the same home environment using the same hardware.

Ultimately, you will start Immer providing as parameters a fixed environment and a (soon-to-be) changeable initial experience to load.

Configure Home Assistant

# ./config/ha.ymlha:
mac: 'xxx'# Home Assistant MAC address / device identifier as found in your Home Assistant UItoken: 'xxx'# Home Assistant security token as found in your Home Assistant UI 

Configure devices to be used

By default the named devices "this_screen" and "this_speaker" of your current laptop are made available.

Discover accessible devices: ruby ./util/discover_devices.rb

# ./config/devices.ymldevices:
home: # name your environmentfan: # name your devicemodel_class: HaSwitch # found in ./devices/*entity_id: switch.plug_jenny # found in the Home Assistant UIanother_device:
# ...another_environment:
# ...

Configure sensors to listen to

# ./config/sensors.ymlsensors:
home: # name your environmentqr_code_reader: # name your sensormodel_class: QrCodeReader # found in ./devices/*another_device:
# ...another_environment:
# ...

Configure immersive art installation experiences

# Create a new experience
cp -R ./installations/template/ ./installations/<MY_INSTALLATION_NAME>
  • Put videos and other media directly viewable in a web browser into the media folder.
  • Put images and other media that requires resizing into the images folder and run the according script from the ./util/ folder to embed it into a web page viewable in a web browser.
  • Put custom code scripts into the scripts folder. A default device "terminal" with cmd "execute" allows you to start them locally.

Configure a set of sequences (WIP: rn only one sequence is possible)

Configure at which point in time (currently always in milliseconds) within the experience which device shall perform which action or "cmd" (short for command).

# ./<MY_INSTALLATION_NAME>/sequences.ymlsequence_script:
loops: true # if true will loop this sequence until the process receives an exit signalloops_pause_ms: 1000length_ms: 45000start: # set the initial state of the environment before starting the experiencethis_screen: # device name as in ./config/devices.yml or the default devicescmd: turn_on # device action or command specific to the device typefile: sonar.xhtml # a parameter custom to the specific device actionanother_parameter: "..."another_device:
# ...end: # set the final state of the environment after stopping the experiencegold_bulb: # device name as in ./config/devices.yml or the default devicescmd: turn_off # device action or command specific to the device typeanother_device:
# ...sequence: # a sequence to run once or many times500: # milliseconds after experience start at which to perform the followingtv_speaker: # device name as in ./config/devices.yml or the default devicescmd: play # device action or command specific to the device typetune: underwater.mp3 # a parameter custom to the specific device actionduration_ms: 45000# a parameter custom to the specific device actionanother_parameter: "..."another_device:
# ...another_ms_mark:
# ...

Configure a set of responses to sensor events

WIP: Rn only immediate device actions can be configured in response to events. The near term goal is to instead start a sequence as defined in ./<MY_INSTALLATION_NAME>/sequences.yml.

events:
btn_sasha: # sensor name as configured in ./config/sensors.ymlpress: # event name custom to the sensorgold_bulb: # # device name as in ./config/devices.yml or the default devicescmd: flash_color # device action or command specific to the device typecolor: blue # a parameter custom to the specific device actionduration_ms: 2000# a parameter custom to the specific device actionanother_parameter: "..."another_device:
# ...another_event_name:
# ...another_sensor:
# ...

Run your immersive art experience

Start the Ruby script immer.rb with paramaters environment and installation_name.

ruby immer.rb home demo

Roadmap

WARNING: This project is in very much work in progress. There is a long list of TODOs on our road to an initial stable version.

  • Refactor: run.yml to sequences.yml, cmd option to action
  • Start Home Assistant connector only if necessary
  • Create a demo experience without Home Assistant
  • Make immer run the main experience and the server listening for events run at the same time communicating with each other
  • Fix shutdown of an experience at application exit
  • Catch configuration errors at startup like invalid device names, action names, etc
  • Make switching experiences work on-the-fly
  • Provide a basic intranet web interface for listing experiences and switching them
  • Replace Screen device definition x_position: 2000px with position: left
  • Allow multiple layers for screen media and transitions between them. Allow events to trigger layer switches.
  • Detect and store laptop IP to remove option from TouchDesginer definitions

Please create GitHub issues for further bugs, feature requests, etc. Be nice at all times and to everyone.

License

Distributed under the MIT License. See LICENSE.txt for more information.

Contributing

Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.

If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag "enhancement". Don't forget to give the project a star! Thanks again!

  1. Fork the Project
  2. Create your Feature Branch (git checkout -b feature/AmazingFeature)
  3. Commit your Changes (git commit -m 'Add some AmazingFeature')
  4. Push to the Branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

1 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

Repository files navigation

Immer - Immersive Art Installations

But:

  • Supermarket Hardware instead of professional expert equipment.
  • Mobile and Reproducible instead of local one-off setups.
  • Open Source and No-Code instead of expensive expert software.

Read more on immerart.org.

Installation (Mac OS)

Right now we only support MacOS but we will add support for more operating systems.

Make sure a Chrome or Chromium browser is installed.

Make sure Homebrew is installed.

Install Ruby 3.0.5. Check this blog post

brew install chruby ruby-install ruby-install ruby-3.0.5

Follow all the instructions, e.g. in case you'll have to add it to your CLI path.

Install Browser library, audio, QR code reader

brew install chromedriver ffmpeg python@3.12 zbar
pip3 install pyzbar --break-system-packages
pip3 install pyzbar[scripts] --break-system-packages
pip3 install numpy --break-system-packages
pip3 install imutils --break-system-packages
pip3 install opencv-python --break-system-packages
pip3 install requests --break-system-packages

Configure Immersive Art Installations

An experience may run on many sets of hardware called environments. E.g. a home environment, an atelier one, a gallery one, and many customer environments. To enable that define multiple environments with identically named devices that will have varying local device identifiers.

Similarly, many immersive art installations, that we sometimes call experiences, may run in the same environment. E.g. a wildflower experience and a mountain-top experience running in the same home environment using the same hardware.

Ultimately, you will start Immer providing as parameters a fixed environment and a (soon-to-be) changeable initial experience to load.

Configure Home Assistant

# ./config/ha.ymlha:
mac: 'xxx'# Home Assistant MAC address / device identifier as found in your Home Assistant UItoken: 'xxx'# Home Assistant security token as found in your Home Assistant UI 

Configure devices to be used

By default the named devices "this_screen" and "this_speaker" of your current laptop are made available.

Discover accessible devices: ruby ./util/discover_devices.rb

# ./config/devices.ymldevices:
home: # name your environmentfan: # name your devicemodel_class: HaSwitch # found in ./devices/*entity_id: switch.plug_jenny # found in the Home Assistant UIanother_device:
# ...another_environment:
# ...

Configure sensors to listen to

# ./config/sensors.ymlsensors:
home: # name your environmentqr_code_reader: # name your sensormodel_class: QrCodeReader # found in ./devices/*another_device:
# ...another_environment:
# ...

Configure immersive art installation experiences

# Create a new experience
cp -R ./installations/template/ ./installations/<MY_INSTALLATION_NAME>
  • Put videos and other media directly viewable in a web browser into the media folder.
  • Put images and other media that requires resizing into the images folder and run the according script from the ./util/ folder to embed it into a web page viewable in a web browser.
  • Put custom code scripts into the scripts folder. A default device "terminal" with cmd "execute" allows you to start them locally.

Configure a set of sequences (WIP: rn only one sequence is possible)

Configure at which point in time (currently always in milliseconds) within the experience which device shall perform which action or "cmd" (short for command).

# ./<MY_INSTALLATION_NAME>/sequences.ymlsequence_script:
loops: true # if true will loop this sequence until the process receives an exit signalloops_pause_ms: 1000length_ms: 45000start: # set the initial state of the environment before starting the experiencethis_screen: # device name as in ./config/devices.yml or the default devicescmd: turn_on # device action or command specific to the device typefile: sonar.xhtml # a parameter custom to the specific device actionanother_parameter: "..."another_device:
# ...end: # set the final state of the environment after stopping the experiencegold_bulb: # device name as in ./config/devices.yml or the default devicescmd: turn_off # device action or command specific to the device typeanother_device:
# ...sequence: # a sequence to run once or many times500: # milliseconds after experience start at which to perform the followingtv_speaker: # device name as in ./config/devices.yml or the default devicescmd: play # device action or command specific to the device typetune: underwater.mp3 # a parameter custom to the specific device actionduration_ms: 45000# a parameter custom to the specific device actionanother_parameter: "..."another_device:
# ...another_ms_mark:
# ...

Configure a set of responses to sensor events

WIP: Rn only immediate device actions can be configured in response to events. The near term goal is to instead start a sequence as defined in ./<MY_INSTALLATION_NAME>/sequences.yml.

events:
btn_sasha: # sensor name as configured in ./config/sensors.ymlpress: # event name custom to the sensorgold_bulb: # # device name as in ./config/devices.yml or the default devicescmd: flash_color # device action or command specific to the device typecolor: blue # a parameter custom to the specific device actionduration_ms: 2000# a parameter custom to the specific device actionanother_parameter: "..."another_device:
# ...another_event_name:
# ...another_sensor:
# ...

Run your immersive art experience

Start the Ruby script immer.rb with paramaters environment and installation_name.

ruby immer.rb home demo

Roadmap

WARNING: This project is in very much work in progress. There is a long list of TODOs on our road to an initial stable version.

  • Refactor: run.yml to sequences.yml, cmd option to action
  • Start Home Assistant connector only if necessary
  • Create a demo experience without Home Assistant
  • Make immer run the main experience and the server listening for events run at the same time communicating with each other
  • Fix shutdown of an experience at application exit
  • Catch configuration errors at startup like invalid device names, action names, etc
  • Make switching experiences work on-the-fly
  • Provide a basic intranet web interface for listing experiences and switching them
  • Replace Screen device definition x_position: 2000px with position: left
  • Allow multiple layers for screen media and transitions between them. Allow events to trigger layer switches.
  • Detect and store laptop IP to remove option from TouchDesginer definitions

Please create GitHub issues for further bugs, feature requests, etc. Be nice at all times and to everyone.

License

Distributed under the MIT License. See LICENSE.txt for more information.

Contributing

Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.

If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag "enhancement". Don't forget to give the project a star! Thanks again!

  1. Fork the Project
  2. Create your Feature Branch (git checkout -b feature/AmazingFeature)
  3. Commit your Changes (git commit -m 'Add some AmazingFeature')
  4. Push to the Branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

1 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

Repository files navigation

Immer - Immersive Art Installations

But:

  • Supermarket Hardware instead of professional expert equipment.
  • Mobile and Reproducible instead of local one-off setups.
  • Open Source and No-Code instead of expensive expert software.

Read more on immerart.org.

Installation (Mac OS)

Right now we only support MacOS but we will add support for more operating systems.

Make sure a Chrome or Chromium browser is installed.

Make sure Homebrew is installed.

Install Ruby 3.0.5. Check this blog post

brew install chruby ruby-install ruby-install ruby-3.0.5

Follow all the instructions, e.g. in case you'll have to add it to your CLI path.

Install Browser library, audio, QR code reader

brew install chromedriver ffmpeg python@3.12 zbar
pip3 install pyzbar --break-system-packages
pip3 install pyzbar[scripts] --break-system-packages
pip3 install numpy --break-system-packages
pip3 install imutils --break-system-packages
pip3 install opencv-python --break-system-packages
pip3 install requests --break-system-packages

Configure Immersive Art Installations

An experience may run on many sets of hardware called environments. E.g. a home environment, an atelier one, a gallery one, and many customer environments. To enable that define multiple environments with identically named devices that will have varying local device identifiers.

Similarly, many immersive art installations, that we sometimes call experiences, may run in the same environment. E.g. a wildflower experience and a mountain-top experience running in the same home environment using the same hardware.

Ultimately, you will start Immer providing as parameters a fixed environment and a (soon-to-be) changeable initial experience to load.

Configure Home Assistant

# ./config/ha.ymlha:
mac: 'xxx'# Home Assistant MAC address / device identifier as found in your Home Assistant UItoken: 'xxx'# Home Assistant security token as found in your Home Assistant UI 

Configure devices to be used

By default the named devices "this_screen" and "this_speaker" of your current laptop are made available.

Discover accessible devices: ruby ./util/discover_devices.rb

# ./config/devices.ymldevices:
home: # name your environmentfan: # name your devicemodel_class: HaSwitch # found in ./devices/*entity_id: switch.plug_jenny # found in the Home Assistant UIanother_device:
# ...another_environment:
# ...

Configure sensors to listen to

# ./config/sensors.ymlsensors:
home: # name your environmentqr_code_reader: # name your sensormodel_class: QrCodeReader # found in ./devices/*another_device:
# ...another_environment:
# ...

Configure immersive art installation experiences

# Create a new experience
cp -R ./installations/template/ ./installations/<MY_INSTALLATION_NAME>
  • Put videos and other media directly viewable in a web browser into the media folder.
  • Put images and other media that requires resizing into the images folder and run the according script from the ./util/ folder to embed it into a web page viewable in a web browser.
  • Put custom code scripts into the scripts folder. A default device "terminal" with cmd "execute" allows you to start them locally.

Configure a set of sequences (WIP: rn only one sequence is possible)

Configure at which point in time (currently always in milliseconds) within the experience which device shall perform which action or "cmd" (short for command).

# ./<MY_INSTALLATION_NAME>/sequences.ymlsequence_script:
loops: true # if true will loop this sequence until the process receives an exit signalloops_pause_ms: 1000length_ms: 45000start: # set the initial state of the environment before starting the experiencethis_screen: # device name as in ./config/devices.yml or the default devicescmd: turn_on # device action or command specific to the device typefile: sonar.xhtml # a parameter custom to the specific device actionanother_parameter: "..."another_device:
# ...end: # set the final state of the environment after stopping the experiencegold_bulb: # device name as in ./config/devices.yml or the default devicescmd: turn_off # device action or command specific to the device typeanother_device:
# ...sequence: # a sequence to run once or many times500: # milliseconds after experience start at which to perform the followingtv_speaker: # device name as in ./config/devices.yml or the default devicescmd: play # device action or command specific to the device typetune: underwater.mp3 # a parameter custom to the specific device actionduration_ms: 45000# a parameter custom to the specific device actionanother_parameter: "..."another_device:
# ...another_ms_mark:
# ...

Configure a set of responses to sensor events

WIP: Rn only immediate device actions can be configured in response to events. The near term goal is to instead start a sequence as defined in ./<MY_INSTALLATION_NAME>/sequences.yml.

events:
btn_sasha: # sensor name as configured in ./config/sensors.ymlpress: # event name custom to the sensorgold_bulb: # # device name as in ./config/devices.yml or the default devicescmd: flash_color # device action or command specific to the device typecolor: blue # a parameter custom to the specific device actionduration_ms: 2000# a parameter custom to the specific device actionanother_parameter: "..."another_device:
# ...another_event_name:
# ...another_sensor:
# ...

Run your immersive art experience

Start the Ruby script immer.rb with paramaters environment and installation_name.

ruby immer.rb home demo

Roadmap

WARNING: This project is in very much work in progress. There is a long list of TODOs on our road to an initial stable version.

  • Refactor: run.yml to sequences.yml, cmd option to action
  • Start Home Assistant connector only if necessary
  • Create a demo experience without Home Assistant
  • Make immer run the main experience and the server listening for events run at the same time communicating with each other
  • Fix shutdown of an experience at application exit
  • Catch configuration errors at startup like invalid device names, action names, etc
  • Make switching experiences work on-the-fly
  • Provide a basic intranet web interface for listing experiences and switching them
  • Replace Screen device definition x_position: 2000px with position: left
  • Allow multiple layers for screen media and transitions between them. Allow events to trigger layer switches.
  • Detect and store laptop IP to remove option from TouchDesginer definitions

Please create GitHub issues for further bugs, feature requests, etc. Be nice at all times and to everyone.

License

Distributed under the MIT License. See LICENSE.txt for more information.

Contributing

Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.

If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag "enhancement". Don't forget to give the project a star! Thanks again!

  1. Fork the Project
  2. Create your Feature Branch (git checkout -b feature/AmazingFeature)
  3. Commit your Changes (git commit -m 'Add some AmazingFeature')
  4. Push to the Branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

1 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

Repository files navigation

Immer - Immersive Art Installations

But:

  • Supermarket Hardware instead of professional expert equipment.
  • Mobile and Reproducible instead of local one-off setups.
  • Open Source and No-Code instead of expensive expert software.

Read more on immerart.org.

Installation (Mac OS)

Right now we only support MacOS but we will add support for more operating systems.

Make sure a Chrome or Chromium browser is installed.

Make sure Homebrew is installed.

Install Ruby 3.0.5. Check this blog post

brew install chruby ruby-install ruby-install ruby-3.0.5

Follow all the instructions, e.g. in case you'll have to add it to your CLI path.

Install Browser library, audio, QR code reader

brew install chromedriver ffmpeg python@3.12 zbar
pip3 install pyzbar --break-system-packages
pip3 install pyzbar[scripts] --break-system-packages
pip3 install numpy --break-system-packages
pip3 install imutils --break-system-packages
pip3 install opencv-python --break-system-packages
pip3 install requests --break-system-packages

Configure Immersive Art Installations

An experience may run on many sets of hardware called environments. E.g. a home environment, an atelier one, a gallery one, and many customer environments. To enable that define multiple environments with identically named devices that will have varying local device identifiers.

Similarly, many immersive art installations, that we sometimes call experiences, may run in the same environment. E.g. a wildflower experience and a mountain-top experience running in the same home environment using the same hardware.

Ultimately, you will start Immer providing as parameters a fixed environment and a (soon-to-be) changeable initial experience to load.

Configure Home Assistant

# ./config/ha.ymlha:
mac: 'xxx'# Home Assistant MAC address / device identifier as found in your Home Assistant UItoken: 'xxx'# Home Assistant security token as found in your Home Assistant UI 

Configure devices to be used

By default the named devices "this_screen" and "this_speaker" of your current laptop are made available.

Discover accessible devices: ruby ./util/discover_devices.rb

# ./config/devices.ymldevices:
home: # name your environmentfan: # name your devicemodel_class: HaSwitch # found in ./devices/*entity_id: switch.plug_jenny # found in the Home Assistant UIanother_device:
# ...another_environment:
# ...

Configure sensors to listen to

# ./config/sensors.ymlsensors:
home: # name your environmentqr_code_reader: # name your sensormodel_class: QrCodeReader # found in ./devices/*another_device:
# ...another_environment:
# ...

Configure immersive art installation experiences

# Create a new experience
cp -R ./installations/template/ ./installations/<MY_INSTALLATION_NAME>
  • Put videos and other media directly viewable in a web browser into the media folder.
  • Put images and other media that requires resizing into the images folder and run the according script from the ./util/ folder to embed it into a web page viewable in a web browser.
  • Put custom code scripts into the scripts folder. A default device "terminal" with cmd "execute" allows you to start them locally.

Configure a set of sequences (WIP: rn only one sequence is possible)

Configure at which point in time (currently always in milliseconds) within the experience which device shall perform which action or "cmd" (short for command).

# ./<MY_INSTALLATION_NAME>/sequences.ymlsequence_script:
loops: true # if true will loop this sequence until the process receives an exit signalloops_pause_ms: 1000length_ms: 45000start: # set the initial state of the environment before starting the experiencethis_screen: # device name as in ./config/devices.yml or the default devicescmd: turn_on # device action or command specific to the device typefile: sonar.xhtml # a parameter custom to the specific device actionanother_parameter: "..."another_device:
# ...end: # set the final state of the environment after stopping the experiencegold_bulb: # device name as in ./config/devices.yml or the default devicescmd: turn_off # device action or command specific to the device typeanother_device:
# ...sequence: # a sequence to run once or many times500: # milliseconds after experience start at which to perform the followingtv_speaker: # device name as in ./config/devices.yml or the default devicescmd: play # device action or command specific to the device typetune: underwater.mp3 # a parameter custom to the specific device actionduration_ms: 45000# a parameter custom to the specific device actionanother_parameter: "..."another_device:
# ...another_ms_mark:
# ...

Configure a set of responses to sensor events

WIP: Rn only immediate device actions can be configured in response to events. The near term goal is to instead start a sequence as defined in ./<MY_INSTALLATION_NAME>/sequences.yml.

events:
btn_sasha: # sensor name as configured in ./config/sensors.ymlpress: # event name custom to the sensorgold_bulb: # # device name as in ./config/devices.yml or the default devicescmd: flash_color # device action or command specific to the device typecolor: blue # a parameter custom to the specific device actionduration_ms: 2000# a parameter custom to the specific device actionanother_parameter: "..."another_device:
# ...another_event_name:
# ...another_sensor:
# ...

Run your immersive art experience

Start the Ruby script immer.rb with paramaters environment and installation_name.

ruby immer.rb home demo

Roadmap

WARNING: This project is in very much work in progress. There is a long list of TODOs on our road to an initial stable version.

  • Refactor: run.yml to sequences.yml, cmd option to action
  • Start Home Assistant connector only if necessary
  • Create a demo experience without Home Assistant
  • Make immer run the main experience and the server listening for events run at the same time communicating with each other
  • Fix shutdown of an experience at application exit
  • Catch configuration errors at startup like invalid device names, action names, etc
  • Make switching experiences work on-the-fly
  • Provide a basic intranet web interface for listing experiences and switching them
  • Replace Screen device definition x_position: 2000px with position: left
  • Allow multiple layers for screen media and transitions between them. Allow events to trigger layer switches.
  • Detect and store laptop IP to remove option from TouchDesginer definitions

Please create GitHub issues for further bugs, feature requests, etc. Be nice at all times and to everyone.

License

Distributed under the MIT License. See LICENSE.txt for more information.

Contributing

Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.

If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag "enhancement". Don't forget to give the project a star! Thanks again!

  1. Fork the Project
  2. Create your Feature Branch (git checkout -b feature/AmazingFeature)
  3. Commit your Changes (git commit -m 'Add some AmazingFeature')
  4. Push to the Branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

1 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

Repository files navigation

Immer - Immersive Art Installations

But:

  • Supermarket Hardware instead of professional expert equipment.
  • Mobile and Reproducible instead of local one-off setups.
  • Open Source and No-Code instead of expensive expert software.

Read more on immerart.org.

Installation (Mac OS)

Right now we only support MacOS but we will add support for more operating systems.

Make sure a Chrome or Chromium browser is installed.

Make sure Homebrew is installed.

Install Ruby 3.0.5. Check this blog post

brew install chruby ruby-install ruby-install ruby-3.0.5

Follow all the instructions, e.g. in case you'll have to add it to your CLI path.

Install Browser library, audio, QR code reader

brew install chromedriver ffmpeg python@3.12 zbar
pip3 install pyzbar --break-system-packages
pip3 install pyzbar[scripts] --break-system-packages
pip3 install numpy --break-system-packages
pip3 install imutils --break-system-packages
pip3 install opencv-python --break-system-packages
pip3 install requests --break-system-packages

Configure Immersive Art Installations

An experience may run on many sets of hardware called environments. E.g. a home environment, an atelier one, a gallery one, and many customer environments. To enable that define multiple environments with identically named devices that will have varying local device identifiers.

Similarly, many immersive art installations, that we sometimes call experiences, may run in the same environment. E.g. a wildflower experience and a mountain-top experience running in the same home environment using the same hardware.

Ultimately, you will start Immer providing as parameters a fixed environment and a (soon-to-be) changeable initial experience to load.

Configure Home Assistant

# ./config/ha.ymlha:
mac: 'xxx'# Home Assistant MAC address / device identifier as found in your Home Assistant UItoken: 'xxx'# Home Assistant security token as found in your Home Assistant UI 

Configure devices to be used

By default the named devices "this_screen" and "this_speaker" of your current laptop are made available.

Discover accessible devices: ruby ./util/discover_devices.rb

# ./config/devices.ymldevices:
home: # name your environmentfan: # name your devicemodel_class: HaSwitch # found in ./devices/*entity_id: switch.plug_jenny # found in the Home Assistant UIanother_device:
# ...another_environment:
# ...

Configure sensors to listen to

# ./config/sensors.ymlsensors:
home: # name your environmentqr_code_reader: # name your sensormodel_class: QrCodeReader # found in ./devices/*another_device:
# ...another_environment:
# ...

Configure immersive art installation experiences

# Create a new experience
cp -R ./installations/template/ ./installations/<MY_INSTALLATION_NAME>
  • Put videos and other media directly viewable in a web browser into the media folder.
  • Put images and other media that requires resizing into the images folder and run the according script from the ./util/ folder to embed it into a web page viewable in a web browser.
  • Put custom code scripts into the scripts folder. A default device "terminal" with cmd "execute" allows you to start them locally.

Configure a set of sequences (WIP: rn only one sequence is possible)

Configure at which point in time (currently always in milliseconds) within the experience which device shall perform which action or "cmd" (short for command).

# ./<MY_INSTALLATION_NAME>/sequences.ymlsequence_script:
loops: true # if true will loop this sequence until the process receives an exit signalloops_pause_ms: 1000length_ms: 45000start: # set the initial state of the environment before starting the experiencethis_screen: # device name as in ./config/devices.yml or the default devicescmd: turn_on # device action or command specific to the device typefile: sonar.xhtml # a parameter custom to the specific device actionanother_parameter: "..."another_device:
# ...end: # set the final state of the environment after stopping the experiencegold_bulb: # device name as in ./config/devices.yml or the default devicescmd: turn_off # device action or command specific to the device typeanother_device:
# ...sequence: # a sequence to run once or many times500: # milliseconds after experience start at which to perform the followingtv_speaker: # device name as in ./config/devices.yml or the default devicescmd: play # device action or command specific to the device typetune: underwater.mp3 # a parameter custom to the specific device actionduration_ms: 45000# a parameter custom to the specific device actionanother_parameter: "..."another_device:
# ...another_ms_mark:
# ...

Configure a set of responses to sensor events

WIP: Rn only immediate device actions can be configured in response to events. The near term goal is to instead start a sequence as defined in ./<MY_INSTALLATION_NAME>/sequences.yml.

events:
btn_sasha: # sensor name as configured in ./config/sensors.ymlpress: # event name custom to the sensorgold_bulb: # # device name as in ./config/devices.yml or the default devicescmd: flash_color # device action or command specific to the device typecolor: blue # a parameter custom to the specific device actionduration_ms: 2000# a parameter custom to the specific device actionanother_parameter: "..."another_device:
# ...another_event_name:
# ...another_sensor:
# ...

Run your immersive art experience

Start the Ruby script immer.rb with paramaters environment and installation_name.

ruby immer.rb home demo

Roadmap

WARNING: This project is in very much work in progress. There is a long list of TODOs on our road to an initial stable version.

  • Refactor: run.yml to sequences.yml, cmd option to action
  • Start Home Assistant connector only if necessary
  • Create a demo experience without Home Assistant
  • Make immer run the main experience and the server listening for events run at the same time communicating with each other
  • Fix shutdown of an experience at application exit
  • Catch configuration errors at startup like invalid device names, action names, etc
  • Make switching experiences work on-the-fly
  • Provide a basic intranet web interface for listing experiences and switching them
  • Replace Screen device definition x_position: 2000px with position: left
  • Allow multiple layers for screen media and transitions between them. Allow events to trigger layer switches.
  • Detect and store laptop IP to remove option from TouchDesginer definitions

Please create GitHub issues for further bugs, feature requests, etc. Be nice at all times and to everyone.

License

Distributed under the MIT License. See LICENSE.txt for more information.

Contributing

Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.

If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag "enhancement". Don't forget to give the project a star! Thanks again!

  1. Fork the Project
  2. Create your Feature Branch (git checkout -b feature/AmazingFeature)
  3. Commit your Changes (git commit -m 'Add some AmazingFeature')
  4. Push to the Branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

1 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

Repository files navigation

Immer - Immersive Art Installations

But:

  • Supermarket Hardware instead of professional expert equipment.
  • Mobile and Reproducible instead of local one-off setups.
  • Open Source and No-Code instead of expensive expert software.

Read more on immerart.org.

Installation (Mac OS)

Right now we only support MacOS but we will add support for more operating systems.

Make sure a Chrome or Chromium browser is installed.

Make sure Homebrew is installed.

Install Ruby 3.0.5. Check this blog post

brew install chruby ruby-install ruby-install ruby-3.0.5

Follow all the instructions, e.g. in case you'll have to add it to your CLI path.

Install Browser library, audio, QR code reader

brew install chromedriver ffmpeg python@3.12 zbar
pip3 install pyzbar --break-system-packages
pip3 install pyzbar[scripts] --break-system-packages
pip3 install numpy --break-system-packages
pip3 install imutils --break-system-packages
pip3 install opencv-python --break-system-packages
pip3 install requests --break-system-packages

Configure Immersive Art Installations

An experience may run on many sets of hardware called environments. E.g. a home environment, an atelier one, a gallery one, and many customer environments. To enable that define multiple environments with identically named devices that will have varying local device identifiers.

Similarly, many immersive art installations, that we sometimes call experiences, may run in the same environment. E.g. a wildflower experience and a mountain-top experience running in the same home environment using the same hardware.

Ultimately, you will start Immer providing as parameters a fixed environment and a (soon-to-be) changeable initial experience to load.

Configure Home Assistant

# ./config/ha.ymlha:
mac: 'xxx'# Home Assistant MAC address / device identifier as found in your Home Assistant UItoken: 'xxx'# Home Assistant security token as found in your Home Assistant UI 

Configure devices to be used

By default the named devices "this_screen" and "this_speaker" of your current laptop are made available.

Discover accessible devices: ruby ./util/discover_devices.rb

# ./config/devices.ymldevices:
home: # name your environmentfan: # name your devicemodel_class: HaSwitch # found in ./devices/*entity_id: switch.plug_jenny # found in the Home Assistant UIanother_device:
# ...another_environment:
# ...

Configure sensors to listen to

# ./config/sensors.ymlsensors:
home: # name your environmentqr_code_reader: # name your sensormodel_class: QrCodeReader # found in ./devices/*another_device:
# ...another_environment:
# ...

Configure immersive art installation experiences

# Create a new experience
cp -R ./installations/template/ ./installations/<MY_INSTALLATION_NAME>
  • Put videos and other media directly viewable in a web browser into the media folder.
  • Put images and other media that requires resizing into the images folder and run the according script from the ./util/ folder to embed it into a web page viewable in a web browser.
  • Put custom code scripts into the scripts folder. A default device "terminal" with cmd "execute" allows you to start them locally.

Configure a set of sequences (WIP: rn only one sequence is possible)

Configure at which point in time (currently always in milliseconds) within the experience which device shall perform which action or "cmd" (short for command).

# ./<MY_INSTALLATION_NAME>/sequences.ymlsequence_script:
loops: true # if true will loop this sequence until the process receives an exit signalloops_pause_ms: 1000length_ms: 45000start: # set the initial state of the environment before starting the experiencethis_screen: # device name as in ./config/devices.yml or the default devicescmd: turn_on # device action or command specific to the device typefile: sonar.xhtml # a parameter custom to the specific device actionanother_parameter: "..."another_device:
# ...end: # set the final state of the environment after stopping the experiencegold_bulb: # device name as in ./config/devices.yml or the default devicescmd: turn_off # device action or command specific to the device typeanother_device:
# ...sequence: # a sequence to run once or many times500: # milliseconds after experience start at which to perform the followingtv_speaker: # device name as in ./config/devices.yml or the default devicescmd: play # device action or command specific to the device typetune: underwater.mp3 # a parameter custom to the specific device actionduration_ms: 45000# a parameter custom to the specific device actionanother_parameter: "..."another_device:
# ...another_ms_mark:
# ...

Configure a set of responses to sensor events

WIP: Rn only immediate device actions can be configured in response to events. The near term goal is to instead start a sequence as defined in ./<MY_INSTALLATION_NAME>/sequences.yml.

events:
btn_sasha: # sensor name as configured in ./config/sensors.ymlpress: # event name custom to the sensorgold_bulb: # # device name as in ./config/devices.yml or the default devicescmd: flash_color # device action or command specific to the device typecolor: blue # a parameter custom to the specific device actionduration_ms: 2000# a parameter custom to the specific device actionanother_parameter: "..."another_device:
# ...another_event_name:
# ...another_sensor:
# ...

Run your immersive art experience

Start the Ruby script immer.rb with paramaters environment and installation_name.

ruby immer.rb home demo

Roadmap

WARNING: This project is in very much work in progress. There is a long list of TODOs on our road to an initial stable version.

  • Refactor: run.yml to sequences.yml, cmd option to action
  • Start Home Assistant connector only if necessary
  • Create a demo experience without Home Assistant
  • Make immer run the main experience and the server listening for events run at the same time communicating with each other
  • Fix shutdown of an experience at application exit
  • Catch configuration errors at startup like invalid device names, action names, etc
  • Make switching experiences work on-the-fly
  • Provide a basic intranet web interface for listing experiences and switching them
  • Replace Screen device definition x_position: 2000px with position: left
  • Allow multiple layers for screen media and transitions between them. Allow events to trigger layer switches.
  • Detect and store laptop IP to remove option from TouchDesginer definitions

Please create GitHub issues for further bugs, feature requests, etc. Be nice at all times and to everyone.

License

Distributed under the MIT License. See LICENSE.txt for more information.

Contributing

Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.

If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag "enhancement". Don't forget to give the project a star! Thanks again!

  1. Fork the Project
  2. Create your Feature Branch (git checkout -b feature/AmazingFeature)
  3. Commit your Changes (git commit -m 'Add some AmazingFeature')
  4. Push to the Branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages