{"id":2486,"date":"2024-01-31T16:06:44","date_gmt":"2024-01-31T15:06:44","guid":{"rendered":"https:\/\/theroamingworkshop.cloud\/b\/?p=2486"},"modified":"2024-09-13T23:15:42","modified_gmt":"2024-09-13T22:15:42","slug":"unihiker-pal-open-source-python-home-assistant-simplified","status":"publish","type":"post","link":"https:\/\/theroamingworkshop.cloud\/b\/en\/2486\/unihiker-pal-open-source-python-home-assistant-simplified\/","title":{"rendered":"UNIHIKER-PAL: open-source python home assistant simplified"},"content":{"rendered":"\n<p><strong>PAL<\/strong> is a simplified version of my python home assistant that I&#8217;m running in the <strong>DFRobot UNIHIKER<\/strong> which I&#8217;m releasing as free open-source.<\/p>\n\n\n\n<p>This is just a demonstration for voice-recognition command-triggering simplicity using python and hopefully will serve as a guide for your own assistant.<\/p>\n\n\n\n<p>Current version: <strong>v0.2.0<\/strong> <em>(updated september 2024)<\/em><\/p>\n\n\n\n<div id=\"menu\" style=\"padding:20px 20px 20px 20px; border-left:2px solid darkgrey;\">\n<p style=\"font-weight:bold;\">Content<\/p>\n<\/div>\n<script>\nvar text;\nvar element;\n\nfunction fillmenu(){\n\nfor (let i=0; i<window.document.getElementsByTagName(\"h2\").length; i++){\nelement = window.document.getElementsByTagName(\"h2\")[i];\ntext = \"\u25b9 \"+element.innerHTML;\nvar newelement = document.createElement(\"a\");\nnewelement.innerHTML=text;\nvar postid=window.document.getElementsByTagName(\"article\")[0].id;\nvar url = \"https:\/\/theroamingworkshop.cloud\/b\/?p=\"+postid.substr(5,postid.length)+\"#\"+element.id;\nnewelement.setAttribute(\"href\", url);\nnewelement.appendChild(document.createElement(\"br\"));\nwindow.document.getElementById(\"menu\").appendChild(newelement);\nconsole.log(text);\n}\n}\nif(window.location.href.includes(\"tag\")){\n\n}else{\nwindow.setTimeout(fillmenu,2000);\n}\n\n<\/script>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"features\">Features<\/h2>\n\n\n\n<p>Current version includes the following:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Voice recognition<\/strong>: using open-source <a href=\"https:\/\/github.com\/Uberi\/speech_recognition\" data-type=\"link\" data-id=\"https:\/\/github.com\/Uberi\/speech_recognition\" target=\"_blank\" rel=\"noreferrer noopener\">SpeechRecognition<\/a> python library, returns an array of all the recognised audio strings.<\/li>\n\n\n\n<li><strong>Weather forecast<\/strong>: using <a href=\"https:\/\/worldweather.wmo.int\/en\/dataguide.html\" data-type=\"link\" data-id=\"https:\/\/worldweather.wmo.int\/en\/dataguide.html\" target=\"_blank\" rel=\"noreferrer noopener\">World Meteorological Organization API<\/a> data, provides today's weather and the forecast for the 3 coming days. Includes WMO weather icons.<\/li>\n\n\n\n<li><strong>Local temperature<\/strong>: reads local BMP-280 temperature sensor to provide a room temperature indicator.<\/li>\n\n\n\n<li><strong>IoT HTTP commands<\/strong>: basic workflow to control IoT smart home devices using HTTP commands. Currently turns ON and OFF a Shelly2.5 smart switch.<\/li>\n\n\n\n<li><strong>Power-save mode<\/strong>: controls brightness to lower power consumption.<\/li>\n\n\n\n<li><strong>Connection manager<\/strong>: regularly checks wifi and pings to the internet to restore connection when it's lost.<\/li>\n\n\n\n<li><strong>PAL voice samples<\/strong>: cloned voice of PAL from \"<em>The Mitchells vs. The Machines<\/em>\" using the AI voice model <a href=\"https:\/\/huggingface.co\/spaces\/coqui\/xtts\" target=\"_blank\" rel=\"noreferrer noopener\">CoquiAI-TTS v2<\/a>.<\/li>\n\n\n\n<li><strong>UNIHIKER buttons<\/strong>: button A enables a simple menu (this is thought to enable a more complex menu in the future).<\/li>\n\n\n\n<li><strong>Touchscreen controls<\/strong>: restore brightness (center), switch program (left) and close program (right), when touching different areas of the screen.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"installation\">Installation<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Install dependencies :<br><strong>pip install SpeechRecognition pyyaml<\/strong><\/li>\n\n\n\n<li>Download the github repo:<br><a href=\"https:\/\/github.com\/TheRoam\/UNIHIKER-PAL\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/TheRoam\/UNIHIKER-PAL<\/a><\/li>\n\n\n\n<li>Upload the files and folders to the UNIHIKER in <strong>\/root\/upload\/PAL\/<\/strong><\/li>\n\n\n\n<li><strong>Configure<\/strong> the <strong><code>PAL_config.yaml<\/code><\/strong> WIFI credentials, IoT devices, theme, etc.<\/li>\n\n\n\n<li>Run the python script <strong><code>python \/root\/upload\/PAL\/PAL_v020.py<\/code><\/strong> from the Mind+ terminal or from the UNIHIKER touch interface.<\/li>\n<\/ol>\n\n\n<div class=\"wp-block-image\">\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a5cbea7db13e&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a5cbea7db13e\" class=\"aligncenter size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"473\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2024\/01\/PAL_Mind-1024x473.png\" alt=\"\" class=\"wp-image-2714\" srcset=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2024\/01\/PAL_Mind-1024x473.png 1024w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2024\/01\/PAL_Mind-300x139.png 300w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2024\/01\/PAL_Mind-768x355.png 768w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2024\/01\/PAL_Mind-676x312.png 676w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2024\/01\/PAL_Mind.png 1379w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Agrandar\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n<\/div>\n\n\n<p>If you enable <strong>Auto boot<\/strong> from the <strong>Service Toggle<\/strong> menu , the script will run every time the UNIHIKER is restarted. <\/p>\n\n\n\n<p><a href=\"https:\/\/www.unihiker.com\/wiki\/faq#Error:%20python3:%20can't%20open%20file\u2026\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.unihiker.com\/wiki\/faq#Error:%20python3:%20can't%20open%20file\u2026<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"configuration\">Configuration<\/h2>\n\n\n\n<p>Version 0.2.0 includes configuration using a yaml file that is read when the program starts.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREDENTIALS:\n    ssid: \"WIFI_SSID\"\n    pwd: \"WIFI_PASSWORD\"\n\nDEVICES:\n    light1:\n        brand: \"Shelly25\"\n        ip: \"192.168.1.44\"\n        channel: 0\n\n    light2:\n        brand: \"Shelly25\"\n        ip: \"192.168.1.44\"\n        channel: 1\n\n    light3:\n        brand: \"Shelly1\"\n        ip: \"192.168.1.42\"\n        channel: 0\n\nPAL:\n    power_save_mode: 0\n    temperature_sensor: 0\n    wmo_city_id: \"195\"<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Location<\/h3>\n\n\n\n<p>The variable \"<strong>CityID<\/strong>\" is used by the WMO API to provide more accurate weather forecast for your location. Define it with the parameter <strong>wmo_city_id<\/strong><\/p>\n\n\n\n<p>You can choose one of the available locations from the official WMO list:<\/p>\n\n\n\n<p><a href=\"https:\/\/worldweather.wmo.int\/en\/json\/full_city_list.txt\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/worldweather.wmo.int\/en\/json\/full_city_list.txt<\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">IoT devices<\/h3>\n\n\n\n<p>At the moment, <strong>PAL v0.2.0<\/strong> only includes functionality for Shelly2.5 for demonstration purposes.<\/p>\n\n\n\n<p>Use variables <strong>lampBrand<\/strong>, <strong>lampChannel<\/strong> and <strong>lampIP<\/strong> to suit your Shelly2.5 configuration.<\/p>\n\n\n\n<p>This is just as an example to show how different devices could be configured. These variables should be used to change the particularities of the HTTP command that is sent to different IoT devices.<\/p>\n\n\n\n<p>More devices will be added in future releases, like Shelly1, ShellyDimmer, Sonoff D1, etc.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Power save mode<\/h3>\n\n\n\n<p>Power saving reduces the brightness of the device in order to reduce the power consumption of the UNIHIKER. This is done using the system command \"<strong>brightness<\/strong>\".<\/p>\n\n\n\n<p>Change \"<strong>ps_mode<\/strong>\" variable to enable (\"1\") or disable (\"0\") the power-save mode.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Room temperature<\/h3>\n\n\n\n<p>Change \"<strong>room_temp<\/strong>\" variable to enable (\"1\") or disable (\"0\") the local temperature reading module. This requires a BMP-280 sensor to be installed using the I2C connector.<\/p>\n\n\n\n<p>Check this other post for details on sensor installation:<\/p>\n\n\n\n<p><a href=\"https:\/\/theroamingworkshop.cloud\/b\/en\/2490\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/theroamingworkshop.cloud\/b\/en\/2490\/<\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Other configurations in the source code:<\/h3>\n\n\n\n<h3 class=\"wp-block-heading\">Theme<\/h3>\n\n\n\n<p>Some theme configuration has been enabled by allowing to choose between different eyes as a background image.<\/p>\n\n\n\n<p>Use the variables \"<strong>eyesA<\/strong>\" and \"<strong>eyesB<\/strong>\" specify one of the following values to change the background image expression of PAL:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\"happy\"<\/li>\n\n\n\n<li>\"angry\"<\/li>\n\n\n\n<li>\"surprised\"<\/li>\n\n\n\n<li>\"sad\"<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-4 is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2024\/01\/PAL_happy.jpg\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"320\" height=\"240\" data-id=\"2541\" src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2024\/01\/PAL_happy.jpg\" alt=\"\" class=\"wp-image-2541\" srcset=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2024\/01\/PAL_happy.jpg 320w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2024\/01\/PAL_happy-300x225.jpg 300w\" sizes=\"auto, (max-width: 320px) 100vw, 320px\" \/><\/a><figcaption class=\"wp-element-caption\">\"happy\"<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2024\/01\/PAL_angry.jpg\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"320\" height=\"240\" data-id=\"2540\" src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2024\/01\/PAL_angry.jpg\" alt=\"\" class=\"wp-image-2540\" srcset=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2024\/01\/PAL_angry.jpg 320w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2024\/01\/PAL_angry-300x225.jpg 300w\" sizes=\"auto, (max-width: 320px) 100vw, 320px\" \/><\/a><figcaption class=\"wp-element-caption\">\"angry\"<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"320\" height=\"240\" data-id=\"2543\" src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2024\/01\/PAL_surprised.jpg\" alt=\"\" class=\"wp-image-2543\" srcset=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2024\/01\/PAL_surprised.jpg 320w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2024\/01\/PAL_surprised-300x225.jpg 300w\" sizes=\"auto, (max-width: 320px) 100vw, 320px\" \/><figcaption class=\"wp-element-caption\">\"surprised\"<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"320\" height=\"240\" data-id=\"2542\" src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2024\/01\/PAL_sad.jpg\" alt=\"\" class=\"wp-image-2542\" srcset=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2024\/01\/PAL_sad.jpg 320w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2024\/01\/PAL_sad-300x225.jpg 300w\" sizes=\"auto, (max-width: 320px) 100vw, 320px\" \/><figcaption class=\"wp-element-caption\">\"sad\"<\/figcaption><\/figure>\n<\/figure>\n\n\n\n<p>\"<strong>eyesA\"<\/strong> is used as the default background and \"<strong>eyesB<\/strong>\" will be used as a transition when voice recognition is activated and <strong>PAL<\/strong> is talking.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"280\" src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2024\/01\/PAL_face.gif\" alt=\"\" class=\"wp-image-2563\" style=\"width:350px\"\/><\/figure>\n<\/div>\n\n\n<p>The default value for \"<strong>eyesA<\/strong>\" is \"<strong>surprised<\/strong>\" and it will change to \"<strong>happy<\/strong>\" when a command is recognized.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Customizable commands<\/h3>\n\n\n\n<p>Adding your own commands to <strong>PAL<\/strong> is simple using the \"comandos\" function.<\/p>\n\n\n\n<p>Every audio recognized by SpeechRecognition is sent as a string to the \"comandos\" function, which then filters the content and triggers one or another matching command.<\/p>\n\n\n\n<p>Just define all the possible strings that could be recognized to trigger your command (note that sometimes SpeechRecognition provides wrong or inaccurate transcriptions).<\/p>\n\n\n\n<p>Then define the command that is triggered if the string is matched.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def comandos(msg):\n    # LAMP ON\n    if any(keyword in msg for keyword in &#91;\"turn on the lamp\", \"turn the lights on\",\"turn the light on\", \"turn on the light\", \"turn on the lights\"]):\n        turnLAMP(\"on\")\n        os.system(\"aplay '\/root\/upload\/PAL\/mp3\/Turn_ON_lights.wav'\")<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Activation keyword<\/h3>\n\n\n\n<p>You can customize the keywords or strings that will activate command functions. If any of the keywords in the list is recognized, the whole sentence is sent to the \"comandos\" function to find any specific command to be triggered.<\/p>\n\n\n\n<p>For the case of PAL v0.2, these are the keywords that activate it (90% it's Paypal):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>activate=&#91;\n    \"hey pal\",\n    \"hey PAL\",\n    \"pal\",\n    \"pall\",\n    \"Pall\",\n    \"hey Pall\",\n    \"Paul\",\n    \"hey Paul\",\n    \"pol\",\n    \"Pol\",\n    \"hey Pol\",\n    \"poll\",\n    \"pause\",\n    \"paypal\",\n    \"PayPal\",\n    \"hey paypal\",\n    \"hey PayPal\"\n]<\/code><\/pre>\n\n\n\n<p>You can change this to any other sentence or name, so PAL is activated when you call it by these strings.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">PAL voice<\/h3>\n\n\n\n<p>Use the sample audio file \"<strong>PAL_full<\/strong>\" below (also in the github repo in <strong>\/mp3<\/strong>) as a reference audio for <strong>CoquiAI-TTS v2<\/strong> voice cloning and produce your personalized voices:<\/p>\n\n\n\n<p><a href=\"https:\/\/huggingface.co\/spaces\/coqui\/xtts\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/huggingface.co\/spaces\/coqui\/xtts<\/a><\/p>\n\n\n\n<figure class=\"wp-block-audio\"><audio controls src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2024\/01\/PAL_full.mp3\"><\/audio><\/figure>\n\n\n<div class=\"wp-block-image\">\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a5cbea7dc882&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a5cbea7dc882\" class=\"aligncenter size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"575\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2024\/01\/CoquiAI-XTTS-1024x575.png\" alt=\"\" class=\"wp-image-2715\" srcset=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2024\/01\/CoquiAI-XTTS-1024x575.png 1024w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2024\/01\/CoquiAI-XTTS-300x169.png 300w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2024\/01\/CoquiAI-XTTS-768x432.png 768w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2024\/01\/CoquiAI-XTTS-1536x863.png 1536w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2024\/01\/CoquiAI-XTTS-676x380.png 676w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2024\/01\/CoquiAI-XTTS.png 1589w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Agrandar\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n<\/div>\n\n\n<p style=\"border-left:3px solid orange;padding-left:5px;font-size:16px;\"><b>TIP! <\/b><br>You can check this other post for voice cloning with CoquiAI-XTTS:<br> <a href=\"https:\/\/theroamingworkshop.cloud\/b\/en\/2425\" target=\"_blank\" rel=\"noopener\">https:\/\/theroamingworkshop.cloud\/b\/en\/2425<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Demo<\/h2>\n\n\n\n<p>Below are a few examples of queries and replies from <strong>PAL<\/strong>:<\/p>\n\n\n\n<figure class=\"wp-block-video aligncenter\"><video height=\"1080\" style=\"aspect-ratio: 1920 \/ 1080;\" width=\"1920\" controls src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2024\/01\/PAL_lightsON.mp4\"><\/video><figcaption class=\"wp-element-caption\">\"Hey PAL, turn on the lights!\"<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-video aligncenter\"><video height=\"1080\" style=\"aspect-ratio: 1920 \/ 1080;\" width=\"1920\" controls src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2024\/01\/PAL_lightsOFF.mp4\"><\/video><figcaption class=\"wp-element-caption\">\"Hey PAL, turn the lights off\"<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-video aligncenter\"><video height=\"1080\" style=\"aspect-ratio: 1920 \/ 1080;\" width=\"1920\" controls src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2024\/01\/PAL_weather-1.mp4\"><\/video><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Future releases (To-Do list)<\/h2>\n\n\n\n<p>I will be developing these features in my personal assistant, and will be updating the open-source release every now and then. Get in touch via github if you have special interest in any of them:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Advanced menu: allow configuration and manually triggering commands.<\/li>\n\n\n\n<li>IoT devices: include all Shelly and Sonoff HTTP API commands.<\/li>\n\n\n\n<li>Time query: requires cloning all number combinations...<\/li>\n\n\n\n<li>Wikipedia\/browser query: requires real-time voice generation...<\/li>\n\n\n\n<li>Improved animations \/ themes.<\/li>\n<\/ul>\n\n\n\n<p>Any thoughts, issues or improvements, I'll be happy to read them via github or Twitter!<\/p>\n\n\n\n<p>\ud83d\udc26 <code><a rel=\"noreferrer noopener\" href=\"https:\/\/twitter.com\/roamingworkshop\" target=\"_blank\">@RoamingWorkshop<\/a><\/code><\/p>\n","protected":false},"excerpt":{"rendered":"<p>PAL is a simplified version of my python home assistant that I&#8217;m running in the DFRobot UNIHIKER which I&#8217;m releasing as free open-source. This is just a demonstration for voice-recognition command-triggering simplicity using python and hopefully will serve as a guide for your own assistant. Current version: v0.2.0 (updated september 2024) Features Current version includes [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":2547,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[609,68,44],"tags":[687,623,403,401,685,701,693,691,397,695,699,689,625,697],"class_list":["post-2486","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-demos-en","category-electronics","category-software","tag-asistente-inteligente","tag-dfrobot","tag-electronica","tag-electronics","tag-home-assistant","tag-http","tag-internet-de-las-cosas","tag-internet-of-things","tag-iot","tag-python","tag-reconocimiento-de-voz","tag-smart-home","tag-unihiker","tag-voice-recognition","post-preview"],"_links":{"self":[{"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/posts\/2486","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/comments?post=2486"}],"version-history":[{"count":25,"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/posts\/2486\/revisions"}],"predecessor-version":[{"id":2725,"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/posts\/2486\/revisions\/2725"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/media\/2547"}],"wp:attachment":[{"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/media?parent=2486"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/categories?post=2486"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/tags?post=2486"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}