{"id":1761,"date":"2025-04-01T13:00:00","date_gmt":"2025-04-01T11:00:00","guid":{"rendered":"https:\/\/www.domedia.net\/?p=1761"},"modified":"2025-06-07T11:26:21","modified_gmt":"2025-06-07T09:26:21","slug":"use-case-freeing-a-fully-locked-home-automation-system","status":"publish","type":"post","link":"https:\/\/www.domedia.net\/?p=1761&lang=en","title":{"rendered":"Use case: Freeing a fully locked home-automation system"},"content":{"rendered":"\r\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-ad2f72ca wp-block-group-is-layout-flex\">\r\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"732\" class=\"wp-image-1747\" style=\"width: 331px; height: auto;\" src=\"https:\/\/www.domedia.net\/wp-content\/uploads\/2025\/05\/CAN_Logo.svg_-1024x732.png\" alt=\"CANBus logo\" srcset=\"https:\/\/www.domedia.net\/wp-content\/uploads\/2025\/05\/CAN_Logo.svg_-1024x732.png 1024w, https:\/\/www.domedia.net\/wp-content\/uploads\/2025\/05\/CAN_Logo.svg_-980x701.png 980w, https:\/\/www.domedia.net\/wp-content\/uploads\/2025\/05\/CAN_Logo.svg_-480x343.png 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">One of our customer has offered a challenge. The mission was to succeed to connect a fully open-source home automation system: <a href=\"https:\/\/www.home-assistant.io\/sistant\" target=\"_blank\" rel=\"noreferrer noopener\" data-type=\"link\" data-id=\"https:\/\/www.home-assistant.io\/sistant\">Home-Assistant<\/a> with a fully closed and proprietary system. Goal was to get an intuitive system, easily customisable by customer, and way more evoluary without constraints, and without changing all hardware installed. At end of article, you&rsquo;ll know how to interface easily with <a href=\"https:\/\/en.wikipedia.org\/wiki\/CAN_bus\" target=\"_blank\" rel=\"noreferrer noopener\" data-type=\"link\" data-id=\"https:\/\/en.wikipedia.org\/wiki\/CAN_bus\">CANBus<\/a> home-automation system installed by <a href=\"https:\/\/spline.ch\/\" target=\"_blank\" rel=\"noreferrer noopener\" data-type=\"link\" data-id=\"https:\/\/spline.ch\/\">Spline<\/a> \/ <a href=\"https:\/\/www.innoxel.ch\/\" target=\"_blank\" rel=\"noreferrer noopener\" data-type=\"link\" data-id=\"https:\/\/www.innoxel.ch\/\">Innoxel<\/a> using Home-Assistant to take control over whole system.<\/p>\r\n<\/div>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">I&rsquo;ll start to present existing and informations we could collect, then I&rsquo;ll go into the practical steps to discover the protocol and be able to mimic it with Home-Assistant and final result.<\/p>\r\n\r\n\r\n\r\n<p><!--more--><\/p>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">Existing system, installed around 10 years ago, is quite cumbersome and also not really common in home-automation. It&rsquo;s based on <a href=\"https:\/\/www.amx.com\" target=\"_blank\" rel=\"noreferrer noopener\" data-type=\"link\" data-id=\"https:\/\/www.amx.com\">AMX<\/a> platform with NI-2100 controller that controls a CAN gateway.<\/p>\r\n\r\n\r\n\r\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\r\n<p class=\"has-medium-font-size\"><strong>CAN is a fieldbus at slow speed on one or two wires, very much used in cars and in industrial applications, quite similar in concept with KNX. It has been developped by Bosch in the 80&rsquo;s.<\/strong><\/p>\r\n<\/blockquote>\r\n\r\n\r\n\r\n<div class=\"wp-block-media-text is-stacked-on-mobile\">\r\n<figure class=\"wp-block-media-text__media\"><img loading=\"lazy\" decoding=\"async\" width=\"303\" height=\"556\" class=\"wp-image-1692 size-full\" src=\"https:\/\/www.domedia.net\/wp-content\/uploads\/2025\/04\/Screenshot_20250420_183442.png\" alt=\"CAN List\" srcset=\"https:\/\/www.domedia.net\/wp-content\/uploads\/2025\/04\/Screenshot_20250420_183442.png 303w, https:\/\/www.domedia.net\/wp-content\/uploads\/2025\/04\/Screenshot_20250420_183442-163x300.png 163w\" sizes=\"(max-width: 303px) 100vw, 303px\" \/><\/figure>\r\n<div class=\"wp-block-media-text__content\">\r\n<p class=\"has-text-align-left has-medium-font-size\">All inputs\/outputs in the system are on the CANBus, which is very original for home-automation. According at our investigations, software part of the system is probably using a generic code loaded in the AMX\u00a0controller, and a customised part done through a proprietary software (<a href=\"https:\/\/technik.spline.ch\/de\/software\/\" target=\"_blank\" rel=\"noreferrer noopener\" data-type=\"link\" data-id=\"https:\/\/technik.spline.ch\/de\/software\/\">Smart-Control<\/a>) from <a href=\"https:\/\/spline.ch\/\" target=\"_blank\" rel=\"noreferrer noopener\">Spline<\/a> company. Luckily, customer got copy of the programming software and project files. We have been able to discover that it works in a very similar way at KNX with a collection of inputs interfaces (dry contacts of wal buttons, radars, temperature sensors) and outputs (lights dimming, shades control, relays for heating system. Each module is physically numbered in electrical panel and also in program, so it should be easy to find connection between both.<\/p>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">After some investigations on Internet, we have found out that interfaces are manufactured by a swiss company <a href=\"https:\/\/www.innoxel.ch\/\" target=\"_blank\" rel=\"noreferrer noopener\">Innoxel<\/a> and use a non-documented protocol Noxnet. We&rsquo;ll have to listen message on CANBus to try to decode it and understand the protocol.<\/p>\r\n<\/div>\r\n<\/div>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"408\" class=\"wp-image-1689\" style=\"width: 725px; height: auto;\" src=\"https:\/\/www.domedia.net\/wp-content\/uploads\/2025\/04\/Armoire_CAN.png\" alt=\"Modules CAN\" srcset=\"https:\/\/www.domedia.net\/wp-content\/uploads\/2025\/04\/Armoire_CAN.png 800w, https:\/\/www.domedia.net\/wp-content\/uploads\/2025\/04\/Armoire_CAN-480x245.png 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 800px, 100vw\" \/>\r\n<figcaption class=\"wp-element-caption\">CAN Modules<\/figcaption>\r\n<\/figure>\r\n\r\n\r\n\r\n<div class=\"wp-block-media-text is-stacked-on-mobile\">\r\n<figure class=\"wp-block-media-text__media\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" class=\"wp-image-1698 size-full\" src=\"https:\/\/www.domedia.net\/wp-content\/uploads\/2025\/04\/esp-can-1024x768.png\" alt=\"ESP-CAN Interface\" srcset=\"https:\/\/www.domedia.net\/wp-content\/uploads\/2025\/04\/esp-can-1024x768.png 1024w, https:\/\/www.domedia.net\/wp-content\/uploads\/2025\/04\/esp-can-980x735.png 980w, https:\/\/www.domedia.net\/wp-content\/uploads\/2025\/04\/esp-can-480x360.png 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\r\n<div class=\"wp-block-media-text__content\">\r\n<p class=\"has-medium-font-size\">To do that, we are going to use <a href=\"https:\/\/esphome.io\/\" target=\"_blank\" rel=\"noreferrer noopener\">ESPHome<\/a> that supports CAN natively, using a standard CAN interface based on TJA1050, that is the most used chip for CAN interface. Simple assembly like on picture on left (<a href=\"https:\/\/www.seeedstudio.com\/Seeed-XIAO-ESP32C3-p-5431.html\" target=\"_blank\" rel=\"noreferrer noopener\">ESP32-C3 de SeeedStudio<\/a> and <a href=\"https:\/\/www.aliexpress.com\/item\/32826190818.html?spm=a2g0o.order_list.order_list_main.41.44ed1802TvyWJW\" target=\"_blank\" rel=\"noreferrer noopener\">CAN interface<\/a>) and little piece of ESPHome code should be all we need to listen what happens on the bus. Warning CAN\u00a0is supported only on ESP32, not ESP8266 neither 8285.<\/p>\r\n<\/div>\r\n<\/div>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code has-small-font-size\"><code>canbus:\r\n\u00a0 - platform: esp32_can\r\n\u00a0 \u00a0 tx_pin: GPIO3\r\n\u00a0 \u00a0 rx_pin: GPIO33\r\n\u00a0 \u00a0 can_id: 4\r\n\u00a0 \u00a0 bit_rate: 100kbps\r\n\u00a0 \u00a0 use_extended_id: false\r\n\u00a0 \u00a0 on_frame: \u00a0 \r\n\u00a0 \u00a0 - can_id: 0x000\r\n\u00a0 \u00a0 \u00a0 can_id_mask: 0x000\r\n\u00a0 \u00a0 \u00a0 then:\r\n\u00a0 \u00a0 \u00a0 - lambda: |-\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 std::string b(x.begin(), x.end());\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ESP_LOGD(\"can id 0x42B \", \"%s\", &amp;b[0] );<\/code><\/pre>\r\n\r\n\r\n\r\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\r\n<p class=\"has-medium-font-size\"><strong>4 keypoints regarding ESPHome sketch:<\/strong><\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li class=\"has-medium-font-size\">can_id is address used by ESPHome for messages sent on CAN\u00a0bus. For now, it doesn&rsquo;t matter.<\/li>\r\n\r\n\r\n\r\n<li class=\"has-medium-font-size\">bit_rate is bus speed, you need to be at correct speed to be able to communicate properly. Here we found the proper speed in Spline software.<\/li>\r\n\r\n\r\n\r\n<li class=\"has-medium-font-size\">use_extended_id is sometimes used for large CAN systems. If you are in the wrong mode, ESPHome logs will tell you.<\/li>\r\n\r\n\r\n\r\n<li class=\"has-medium-font-size\">we activate advanced debug options to get all details of CAN messages.<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">Once completed assembly of the ESP with CAN interface and flashed the ESP, we just need to connect the 2\u00a0CAN output wires on CAN bus of the installation (careful with polarity). We discover then there is a lot of traffic on the CAN\u00a0bus. Even without any use of the system, a lot of CAN\u00a0messages pass through (at such point, that ESPHome tells us some messages are lost\/incomplete due to too much traffic).<\/p>\r\n<\/div>\r\n\r\n\r\n\r\n<div class=\"wp-block-media-text is-stacked-on-mobile is-vertically-aligned-center\" style=\"grid-template-columns: 56% auto;\">\r\n<figure class=\"wp-block-media-text__media\"><video src=\"https:\/\/www.domedia.net\/wp-content\/uploads\/2025\/04\/simplescreenrecorder-2025-04-21_12.02.13.webm\" controls=\"controls\" width=\"300\" height=\"150\"><\/video><\/figure>\r\n<div class=\"wp-block-media-text__content\">\r\n<p>&nbsp;<\/p>\r\n\r\n\r\n\r\n<p>&nbsp;<\/p>\r\n<\/div>\r\n<\/div>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">First idea is to disconnect CAN gateway of the AMX\u00a0controller but it doesn&rsquo;t have really any effect, as it&rsquo;s still as chatty than before. We think it might be the temperature sensor reporting all the time their status. We decide then, for start, to focus on a basic device like switches. We are going to monitor CAN\u00a0traffic while we actuate a lot a switch during 30 seconds to find out messages for switch on and off.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>[08:32:05][D][canbus:072]: received can message (#1) std can_id=0x41e size=2\r\n[08:32:05][V][canbus:079]: can_message.data[0]=74\r\n[08:32:06][V][canbus:079]: can_message.data[1]=33\r\n[08:32:06][D][can id 41E:115]: t3\r\n[08:32:08][D][canbus:072]: received can message (#1) std can_id=0x41e size=2\r\n[08:32:08][V][canbus:079]: can_message.data[0]=54\r\n[08:32:08][V][canbus:079]: can_message.data[1]=33\r\n[08:32:08][D][can id 41E:115]: T3\r\n[08:32:09][D][canbus:072]: received can message (#1) std can_id=0x223 size=2\r\n[08:32:09][V][canbus:079]: can_message.data[0]=50\r\n[08:32:09][V][canbus:079]: can_message.data[1]=46\r\n[08:32:09][D][canbus:072]: received can message (#2) std can_id=0x42d size=2\r\n[08:32:09][V][canbus:079]: can_message.data[0]=50\r\n[08:32:09][V][canbus:079]: can_message.data[1]=46\r\n[08:32:09][D][canbus:072]: received can message (#5) std can_id=0x41e size=2\r\n[08:32:09][V][canbus:079]: can_message.data[0]=74\r\n[08:32:09][V][canbus:079]: can_message.data[1]=33\r\n[08:32:09][D][can id 41E:115]: t3\r\n[08:32:09][D][canbus:072]: received can message (#6) std can_id=0x465 size=2\r\n[08:32:09][V][canbus:079]: can_message.data[0]=6c\r\n[08:32:09][V][canbus:079]: can_message.data[1]=3<\/code><\/pre>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">What a surprise, we discover messages containing a T or t followed by a digit. Few additional pushes on different buttons confirm that they send a simple message: T\u00a0for push and t for release followed by button number pushed (buttons are logically numbered in the opposite way of the physical position so button 8\u00a0on keypad shows up with number 0 in CAN).\u00a0If we use ESPHome to send same message on bus using same address as one showing up in logs, Spline system reacts and trigger light commands for that button. So we are already able to get status of push buttons and also of radars as they work the same way.<\/p>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">We are also able now to find out the link between CAN addresses in Spline software and the ones used on the bus, by playing with few different keypads:<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li class=\"has-medium-font-size\"><strong>A1 -&gt; Ax for everything that is relay<\/strong>, power commands -&gt; x203 for A1 and so on with one address not used in between each time (we&rsquo;ll talk about it later). <a href=\"https:\/\/www.domedia.net\/wp-content\/uploads\/2025\/04\/Relays_Switches_CAN_ID.pdf\">List of CAN\u00a0addresses and Spline index.<\/a><\/li>\r\n\r\n\r\n\r\n<li class=\"has-medium-font-size\"><strong>B1 -&gt; Bx for all dimming<\/strong> (whatever dimming way: phase dimming, 0-10V, DALI) -&gt; x60C for B1 and so on.<a href=\"https:\/\/www.domedia.net\/wp-content\/uploads\/2025\/04\/Dimmers_CAN_ID.pdf\"> List of CAN addresses and Spline index.<\/a><\/li>\r\n\r\n\r\n\r\n<li class=\"has-medium-font-size\"><strong>C1 -&gt; Cx for everything that is input<\/strong> (wall push-buttons, radars) -&gt; x402 for C1 and so on. <a href=\"https:\/\/www.domedia.net\/wp-content\/uploads\/2025\/04\/Inputs_CAN_ID.pdf\">List of CAN addresses and Spline index<\/a>.<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">Next step is to find out how lights and relays work. We are going to use the bargraphs avalaible on the touch panel of the system. This way, we&rsquo;ll be able to get system to send lot of dimming commands and recognise them more easily..<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>[19:44:36][D][canbus:078]: received can message (#1) std can_id=0x614 size=8\r\n[19:44:36][D][can id 0x42B :103]: W2000004\r\n[19:44:36][D][canbus:078]: received can message (#2) std can_id=0x614 size=8\r\n[19:44:36][D][can id 0x42B :103]: W3100004\r\n[19:44:36][D][canbus:078]: received can message (#3) std can_id=0x610 size=6\r\n[19:44:36][D][canbus:078]: received can message (#4) std can_id=0x614 size=8\r\n[19:44:36][D][can id 0x42B :103]: W1000004\r\n[19:44:36][D][canbus:078]: received can message (#5) std can_id=0x610 size=6\r\n[19:44:36][D][canbus:078]: received can message (#6) std can_id=0x62c size=8\r\n[19:44:36][D][can id 0x42B :103]: W1000004<\/code><\/pre>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">This time, syntax is a little more complex but not much. We receive W to indicate dimming command, followed by a digit for the output number on CAN dimming module, then 3 digits for dimming value and again 3\u00a0digits for dimming time. For example,<code>W2000004<\/code> is to dim circuit 6 (as for buttons outputs are numbered in reverse way), <code>000<\/code> to switch off the circuit and <code>004<\/code> for a dim curve in 4 seconds. Few tests have determined that the existing dimming, that is really not smooth, was due at bad quality of dimmers themselves. We&rsquo;ll handle dimming ramp in Home-Assistant and not in the dimmer.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>[19:44:02][D][canbus:078]: received can message (#1) std can_id=0x21b size=2\r\n[19:44:02][D][can id 0x42B :103]: C0\r\n[19:45:02][D][canbus:078]: received can message (#1) std can_id=0x21d size=2\r\n[19:45:02][D][can id 0x42B :103]: C1<\/code><\/pre>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">For on\/off type of outputs such as relays, syntax is quite similar with binary inputs but this time it uses the letter C\u00a0to indicate a relay with circuit number as previously. We&rsquo;ll find same logic with shades using U for Up, D for Down and H\u00a0for stop and circuit number. System is not able to handle intermediate position and once checked on touchpanel, system is only able to fully open\/close shades without presets at specific positions !<br \/>We have now all we need to be able to control system from Home-Assistant easily using entities for each device\/equipment controlled. It&rsquo;ll give us native Home-Assistant controls for all Spline devices and then be able to remove the AMX\u00a0controller and software that goes with it. We&rsquo;ll have then a fully open home automation system, easy to customise according at customer wishes\/requests, even possible by customer itself considering how easy HA is to use.<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li class=\"has-medium-font-size\"><strong>Inputs of buttons and other dry contacts<\/strong> (Radar for example)<strong>:<\/strong><\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>canbus:\r\n\u00a0 - platform: esp32_can\r\n\u00a0 \u00a0 tx_pin: GPIO3\r\n\u00a0 \u00a0 rx_pin: GPIO33\r\n\u00a0 \u00a0 can_id: 4\r\n\u00a0 \u00a0 bit_rate: 100kbps\r\n\u00a0 \u00a0 use_extended_id: false\r\n\u00a0 \u00a0 on_frame: \u00a0 \r\n\u00a0 \u00a0 - can_id: 0x450 \u00a0# ID du device CAN \u00e0 \u00e9couter\r\n\u00a0 \u00a0 \u00a0 then:\r\n\u00a0 \u00a0 \u00a0 \u00a0 - lambda: |-\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0   std::string message(x.begin(), x.end()); \u00a0\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if (message == \"T3\") {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0   id(can_bus_button_state).publish_state(true); \u00a0\/\/ Bouton appuy\u00e9\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 } else if (message == \"t3\") {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 id(can_bus_button_state).publish_state(false); \u00a0\/\/ Bouton rel\u00e2ch\u00e9\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\r\n\r\nbinary_sensor:\r\n\u00a0 - platform: template\r\n\u00a0 \u00a0 name: \"bouton lumiere\"\r\n\u00a0 \u00a0 id: can_bus_button_state<\/code><\/pre>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">Here we manage pushbutton at CAN address 0x450 and wired on input 5 of CAN module. It&rsquo;ll show up now straight in HA and so we&rsquo;ll be able to trigger some automations or other depending of state of the button.<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li class=\"has-medium-font-size\"><strong>Control of ON\/OFF circuits<\/strong> (usually everything that is relay based)<strong>:<\/strong><\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>switch:\r\n\u00a0 - platform: template\r\n\u00a0 \u00a0 name: \"Pompe piscine\"\r\n\u00a0 \u00a0 optimistic: True\r\n\u00a0 \u00a0 turn_on_action: \r\n\u00a0 \u00a0 \u00a0 - canbus.send: \r\n\u00a0 \u00a0 \u00a0 \u00a0   data: \"S6\"\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 can_id: 0x21D\r\n\u00a0 \u00a0 turn_off_action: \r\n\u00a0 \u00a0 \u00a0 - canbus.send:\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 data: \"C6\"\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 can_id: 0x21D<\/code><\/pre>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">Here we are going to control a pump through a relay that is the 3rd one on CAN interface at address 0x21D. It&rsquo;ll show up as a binary contact in HA.<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li class=\"has-medium-font-size\"><strong>Shades\/Curtains<\/strong> <strong>control:<\/strong><\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>cover:\r\n\u00a0 - platform: time_based\r\n\u00a0 \u00a0 name: Canbus Test Cover\r\n\u00a0 \u00a0 id: TestCover\r\n\u00a0 \u00a0 device_class: shutter\r\n\u00a0 \u00a0 has_built_in_endstop: true\r\n\u00a0 \u00a0 open_action:\r\n\u00a0 \u00a0 \u00a0 - canbus.send:\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 data: \"U0\"\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 can_id: 0x211\r\n\u00a0 \u00a0 open_duration: 39s\r\n\u00a0 \u00a0 close_action:\r\n\u00a0 \u00a0 \u00a0 - canbus.send:\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 data: \"D0\"\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 can_id: 0x211\r\n\u00a0 \u00a0 close_duration: 36s\r\n\u00a0 \u00a0 stop_action:\r\n\u00a0 \u00a0 \u00a0 - canbus.send:\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 data: \"H0\"\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 can_id: 0x211<\/code><\/pre>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">For curtains, we&rsquo;ll have 3 commands instead of 2 with U for up, D for Down and H for stop. HA being able to manage shades with timer, we&rsquo;ll be able now to do some specific settings like \u00ab\u00a0open the shade at 50%).<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li class=\"has-medium-font-size\"><strong>Lights dimming<\/strong> (lights with only ON\/OFF\u00a0are controlled like relays)<strong>:<\/strong><\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>light:\r\n\u00a0 - platform: monochromatic\r\n\u00a0 \u00a0 name: \"light1\"\r\n\u00a0 \u00a0 id: light1\r\n\u00a0 \u00a0 output: output1\r\n\u00a0 \u00a0 default_transition_length: 3s\r\n\r\noutput:\r\n\u00a0 - platform: template\r\n\u00a0 \u00a0 id: output1\r\n\u00a0 \u00a0 type: float\r\n\u00a0 \u00a0 write_action:\r\n\u00a0 \u00a0 \u00a0 then:\r\n\u00a0 \u00a0 \u00a0 \u00a0 - if:\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 condition:\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 - light.is_off: light1\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 then:\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 - canbus.send:\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 can_id: 0x67C\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 data: \"W2000000\" \u00a0\r\n\u00a0 \u00a0 \u00a0 \u00a0 - if:\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 condition:\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 - light.is_on: light1\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 then:\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 - canbus.send:\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 can_id: 0x67C\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 data: !lambda |\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 char buf[128];\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 int brightness = static_cast&lt;int&gt;(id(light1).current_values.get_brightness ()* 100);\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 brightness = (brightness &gt; 100) ? 100 : brightness;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 int transfer_time = 0; # temps de transfert du can\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 sprintf(buf, \"W2%03d%03d\", brightness, transfer_time);\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 std::string s = buf;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return std::vector&lt;unsigned char&gt;(s.begin(), s.end());<\/code><\/pre>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">String to send being more complex here, we&rsquo;ll need to use Lambda in ESPHome but it allows light circuits to show like a light entity in HA. As we have seen previously that dim ramp are poorly managed by dimmers, we&rsquo;ll keep the time at 0\u00a0all the time and handle it only in HA (it&rsquo;s not perfect but a lot better without changing dimmer hardware).<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-pullquote\">\r\n<blockquote>\r\n<p>We now have all the tools to get the whole CAN system usable and controlable by Home-Assistant in an native way as all CAN interfaces will show up now as Home-Assistant entities.<br \/>It&rsquo;ll grand also lot more scalabitily at system as we can now integrate also all devices supported by HA and in a lot easier way than the Spline system.<\/p>\r\n<\/blockquote>\r\n<\/figure>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">\u00a0<\/p>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">That investigation has been possible thanks at one of our customer that was ready to pay work on it without any warranty of a positive result. Thanks to him, other users of Spline system can now free their system and open it so it&rsquo;s a lot more usable and scalable, and for a lot lower cost.<\/p>\r\n\r\n\r\n\r\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\r\n<p class=\"has-medium-font-size\"><strong>You are the owner of a Spline or Innoyel system and you want to enhance it for a more open and scalable system. Feel free to contact us.<\/strong><\/p>\r\n<\/blockquote>\r\n\r\n\r\n\r\n<p>&nbsp;<\/p>\r\n","protected":false},"excerpt":{"rendered":"<p>One of our customer has offered a challenge. The mission was to succeed to connect a fully open-source home automation system: Home-Assistant with a fully closed and proprietary system. Goal was to get an intuitive system, easily customisable by customer, and way more evoluary without constraints, and without changing all hardware installed. At end of [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","footnotes":""},"categories":[7,46],"tags":[625,1135,1109,1137,1139,1141,310,673,1127,1100,507,1143,229,1145,1147,716,1130,1149,1118,1120,1151],"class_list":["post-1761","post","type-post","status-publish","format-standard","hentry","category-general-en","category-technology","tag-amx-en","tag-can-en","tag-canbus-en","tag-debug-en","tag-discover-en","tag-entity-en","tag-esp32-en","tag-esphome","tag-freedom-en","tag-germany","tag-ha-en","tag-home-assistant-2-en","tag-home-assistant-en","tag-innoxel-en","tag-noxnet-en","tag-protocol-en","tag-smart-control","tag-spline-en","tag-swiss-german","tag-switzerland","tag-zidatech-en"],"_links":{"self":[{"href":"https:\/\/www.domedia.net\/index.php?rest_route=\/wp\/v2\/posts\/1761","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.domedia.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.domedia.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.domedia.net\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.domedia.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1761"}],"version-history":[{"count":19,"href":"https:\/\/www.domedia.net\/index.php?rest_route=\/wp\/v2\/posts\/1761\/revisions"}],"predecessor-version":[{"id":1805,"href":"https:\/\/www.domedia.net\/index.php?rest_route=\/wp\/v2\/posts\/1761\/revisions\/1805"}],"wp:attachment":[{"href":"https:\/\/www.domedia.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1761"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.domedia.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1761"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.domedia.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1761"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}