{"id":33046,"date":"2019-10-31T21:50:27","date_gmt":"2019-10-31T18:50:27","guid":{"rendered":"https:\/\/prohoster.info\/blog\/vizualnoe-programmirovanie-dlya-sonoff-basic\/"},"modified":"2019-10-31T21:50:27","modified_gmt":"2019-10-31T18:50:27","slug":"vizualnoe-programmirovanie-dlya-sonoff-basic","status":"publish","type":"post","link":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/vizualnoe-programmirovanie-dlya-sonoff-basic","title":{"rendered":"Visual programming for Sonoff Basic","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Visual programming for Sonoff Basic\" src=\"\/wp-content\/uploads\/2019\/05\/0682cb274648d8a8d16b17bced0116d7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAn article on how to create a programmable logic controller from a cheap Chinese device. This device can be used for home automation as well as for practical computer science classes in schools.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n<em>For reference, by default, the Sonoff Basic program works with a mobile application through a Chinese cloud service, but after the proposed modifications, all further interactions with this device will be possible through a browser.<\/em> <\/p>\n<h2>Section I. Connecting Sonoff to the MGT24 service<\/h2>\n<p><\/p>\n<h3>Step 1. Creating a control panel<\/h3>\n<p>\nRegister on the website <noindex><a rel=\"nofollow\" href=\"http:\/\/mgt24.ru\">mgt24<\/a><\/noindex> (if not already registered) and log in to your account.<br \/>\n<b class=\"spoiler_title\">Login<\/b><img decoding=\"async\" alt=\"Visual programming for Sonoff Basic\" src=\"\/wp-content\/uploads\/2019\/05\/e9b310a7cb7d2da90ac8161407944a8c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTo create a control panel for a new device, click the button &#171;+&#187;.<br \/>\n<b class=\"spoiler_title\">Example of panel creation<\/b><img decoding=\"async\" alt=\"Visual programming for Sonoff Basic\" src=\"\/wp-content\/uploads\/2019\/05\/dc10d7009ea65c72714c2ccd2314ed0b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAfter the panel is created, it will appear in your list of panels.<\/p>\n<p>In the \u2018Setup\u2019 tab of the created panel, locate the \u2018Device ID\u2019 and \u2018Authorization Key\u2019 fields; this information will be needed for setting up the Sonoff device.<br \/>\n<b class=\"spoiler_title\">Example tab<\/b><img decoding=\"async\" alt=\"Visual programming for Sonoff Basic\" src=\"\/wp-content\/uploads\/2019\/05\/f6cc6f1f469c6278c38c4c63288d9ba2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Step 2. Flashing the device<\/h3>\n<p>\nUsing the utility <noindex><a rel=\"nofollow\" href=\"https:\/\/esp8266.ru\/download\/esp8266-utils\/XTCOM_UTIL.zip\">XTCOM_UTIL<\/a><\/noindex> upload the firmware <noindex><a rel=\"nofollow\" href=\"http:\/\/mgt24.ru\/en\/docs\/firmware\/plc_basic.bin\">PLC Sonoff Basic<\/a><\/noindex> to the device; for this, you will need a USB-TTL converter. Here\u2019s the <noindex><a rel=\"nofollow\" href=\"https:\/\/esp8266.ru\/esp8266-obnovlenie-proshivki-xtcom_util\/\">the instruction<\/a><\/noindex> and <noindex><a rel=\"nofollow\" href=\"http:\/\/mgt24.ru\/en\/docs\/#!sonoff.md#%D0%9F%D0%B5%D1%80%D0%B5%D0%BF%D1%80%D0%BE%D1%88%D0%B8%D0%B2%D0%BA%D0%B0_Sonoff_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_\">video guide<\/a><\/noindex>.<\/p>\n<h3>Step 3. Configuring the device<\/h3>\n<p>\nPower the device, and once the LED lights up, press and hold the button until the LED starts blinking periodically.<br \/>\nAt this moment, a new Wi-Fi network named \u2018PLC Sonoff Basic\u2019 will appear; connect your computer to this network.<br \/>\n<b class=\"spoiler_title\">Decoding LED indicators<\/b><\/p>\n<p>LED indicators<br \/>\nDevice status<\/p>\n<p>periodic double blinking<br \/>\nno connection to the router<\/p>\n<p>steady light<br \/>\nconnection to the router established<\/p>\n<p>periodic steady blinking<br \/>\nWi-Fi access point mode<\/p>\n<p>off<br \/>\nno power<\/p>\n<p>Open a web browser and enter \u2018192.168.4.1\u2019 in the address bar to go to the device network settings page.<\/p>\n<p>Fill in the fields as follows:<\/p>\n<ul>\n<li>\u2018Network Name\u2019 and \u2018Password\u2019 (to bind the device to your home Wi-Fi router).<\/li>\n<li>\u2018Device ID\u2019 and \u2018Authorization Key\u2019 (for device authorization on the MGT24 service).<\/li>\n<\/ul>\n<p>\n<b class=\"spoiler_title\">Example of device network settings<\/b><img decoding=\"async\" alt=\"Visual programming for Sonoff Basic\" src=\"\/wp-content\/uploads\/2019\/05\/47d02b3883ce3896157da4dcc4fe7f40.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSave the settings and reboot the device.<br \/>\nHere <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/XTzGJI7y7t8?t=376\">video guide<\/a><\/noindex>.<\/p>\n<h3>Step 4. Connecting Sensors (Optional)<\/h3>\n<p>\nThe current firmware supports up to four ds18b20 temperature sensors. Here <noindex><a rel=\"nofollow\" href=\"http:\/\/mgt24.ru\/en\/docs\/#!sonoff.md#%D0%9F%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%82%D0%B5%D1%80%D0%BC%D0%BE%D0%B4%D0%B0%D1%82%D1%87%D0%B8%D0%BA%D0%B0_ds18b20_%D0%BA_Sonoff,_%D0%BC%D0%BE%D0%BD%D1%82%D0%B0%D0%B6%D0%BD%D1%8B%D0%B5_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B\">video guide<\/a><\/noindex> is the installation of the sensors. Apparently, this step will be the most challenging, as it will require skilled hands and a soldering iron.<\/p>\n<h2>Section II. Visual Programming<\/h2>\n<p><\/p>\n<h3>Step 1. Creating Scripts<\/h3>\n<p>\nThe programming environment used is <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.google.com\/blockly\/\">Blockly<\/a><\/noindex>, which is easy to learn, so you don\u2019t need to be a programmer to create simple scripts.<\/p>\n<p>I added specialized blocks for reading and writing device parameters. Access to any parameter is done by name. For parameters of remote devices, composite names are used: \u2018parameter@device\u2019.<br \/>\n<b class=\"spoiler_title\">Parameter Dropdown List<\/b><img decoding=\"async\" alt=\"Visual programming for Sonoff Basic\" src=\"\/wp-content\/uploads\/2019\/05\/6ba0f789a4d3e0a394f4773d2c401416.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Example of a script for toggling a load on and off (1Hz):<br \/>\n<img decoding=\"async\" alt=\"Visual programming for Sonoff Basic\" src=\"\/wp-content\/uploads\/2019\/05\/66876fcb1d029b1a06098a8f2118bba7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nExample of a script that synchronizes the operation of two separate devices. Specifically, the relay of the target device replicates the work of the relay of the remote device.<br \/>\n<img decoding=\"async\" alt=\"Visual programming for Sonoff Basic\" src=\"\/wp-content\/uploads\/2019\/05\/a44e81ce1301c7908ac9fa7437785162.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nScript for a thermostat (without hysteresis):<br \/>\n<img decoding=\"async\" alt=\"Visual programming for Sonoff Basic\" src=\"\/wp-content\/uploads\/2019\/05\/0efa8a8f5e67f5ffd0812af5a2cececa.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTo create more complex scripts, you can use variables, loops, functions (with arguments), and other constructs. I won\u2019t go into detail here, as there is already quite a lot of <noindex><a rel=\"nofollow\" href=\"http:\/\/blockly.ru\/\">educational material about Blockly<\/a><\/noindex>.<\/p>\n<h3>Step 2. Execution Order of Scripts<\/h3>\n<p>\nThe script runs in continuous mode, and as soon as it reaches its end, it starts again. There are two blocks that can temporarily pause the script\u2019s execution: \u2018delay\u2019 and \u2018pause\u2019.<br \/>\nThe \u2018delay\u2019 block is used for millisecond or microsecond delays. This block strictly maintains the time interval, blocking the operation of the entire device. <br \/>\nThe \u2018pause\u2019 block is used for second (or shorter) delays, and it does not block the execution of other processes in the device.<br \/>\nIf a script contains an infinite loop without a \u2018pause\u2019, the interpreter will independently initiate a short pause.<br \/>\nIn case of exhausting the allocated stack memory, the interpreter will stop the execution of such a resource-intensive script (be cautious with recursive functions).<\/p>\n<h3>Step 3. Debugging Scripts<\/h3>\n<p>\nTo debug a script that has already been uploaded to the device, you can run a step-by-step tracing of the program. This can be extremely useful when the script's behavior is not as intended by the author. In this case, tracing allows the author to quickly find the source of the problem and fix the error in the script.<\/p>\n<p>Factorial calculation script in debug mode:<br \/>\n<img decoding=\"async\" alt=\"Visual programming for Sonoff Basic\" src=\"\/wp-content\/uploads\/2019\/05\/ea6e23729fd530b79b89c9481e78bd64.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nThe debugging tool is very simple and consists of three main buttons: 'start', 'step forward', and 'stop' (also don't forget about 'enter' and 'exit' debug mode). In addition to step-by-step tracing, you can set a breakpoint on any block (by clicking on the block).<br \/>\nTo display the current values of parameters (sensors, relays) on the monitor, use the 'print' block.<br \/>\nHere <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/2mK6gvqe_18\">overview video<\/a><\/noindex> on using the debugger.<\/p>\n<h2>A section for the curious. So, what's under the hood?<\/h2>\n<p>\nTo ensure scripts run on the target device, a bytecode interpreter and an assembler with 38 instructions were developed. A specialized code generator was integrated into the blockly source code, which converts visual blocks into assembly instructions. This assembly program is then transformed into bytecode and sent to the device for execution.<br \/>\nThe architecture of this virtual machine is quite simple, and there isn't much point in describing it; you will find many articles online about designing simple virtual machines.<br \/>\nI typically allocate 1000 bytes for the stack of my virtual machine, which is more than enough. Of course, deep recursions can exhaust any stack, but they're unlikely to have practical applications.<\/p>\n<p>The resulting bytecode is quite compact. For example, the bytecode for calculating the same factorial is only 49 bytes. Here is its visual representation:<br \/>\n<img decoding=\"async\" alt=\"Visual programming for Sonoff Basic\" src=\"\/wp-content\/uploads\/2019\/05\/1c6a8b693cbf2131f1f1369d97ad034b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAnd here is its assembly program:<\/p>\n<pre><code class=\"javascript\">shift -1\nldi 10\ncall factorial, 1\nprint\nexit\n:factorial\nld_arg 0\nldi 1\ngt\nje 8\nld_arg 0\nld_arg 0\nldi 1\nsub\ncall factorial, 1\nmul\nret\nldi 1\nret\n<\/code><\/pre>\n<p>If the assembly representation has no practical value, the 'javascript' tab, on the other hand, provides a more familiar view than visual blocks:<\/p>\n<pre><code class=\"javascript\">function factorial(num) {\n  if (num &gt; 1) {\n    return num + factorial(num - 1);\n  }\n  return 1;\n}\n\nwindow.alert(factorial(10));\n<\/code><\/pre>\n<p>In terms of performance, when running the simplest blinking script, I obtained a 47 kHz square wave on the oscilloscope screen (with a processor clock frequency of 80 MHz).<br \/>\n<img decoding=\"async\" alt=\"Visual programming for Sonoff Basic\" src=\"\/wp-content\/uploads\/2019\/05\/961a50c7ef269265443e078a1a81291a.jpg\" style=\"display:block;margin: 0 auto;\" \/><img decoding=\"async\" alt=\"Visual programming for Sonoff Basic\" src=\"\/wp-content\/uploads\/2019\/05\/a416044b4cea01121e04e27ae7d1fef2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nI consider this a decent result; at least this speed is almost ten times faster than that of <noindex><a rel=\"nofollow\" href=\"http:\/\/esp8266freq.blogspot.com\/2016\/12\/esp-speed-compare-in-lua-micropython.html\">Lua<\/a><\/noindex> and <noindex><a rel=\"nofollow\" href=\"https:\/\/www.espruino.com\/Performance\">Espruino<\/a><\/noindex>.<\/p>\n<h2>Final Part<\/h2>\n<p>\nTo sum up, I would say that using scripts allows us not only to program the logic of a single device but also to connect multiple devices into a cohesive mechanism, where some devices influence the behavior of others. <br \/>\nI would also note that the chosen method of storing scripts (directly in the devices rather than on a server) simplifies switching already operational devices to another server, such as a home Raspberry Pi, here. <noindex><a rel=\"nofollow\" href=\"http:\/\/mgt24.ru\/en\/docs\/#!raspberry.md\">the instruction<\/a><\/noindex>.<\/p>\n<p><i>That\u2019s all; I would appreciate any advice and constructive criticism.<\/i><br \/>\n<br \/>Source: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/436272\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0421\u0442\u0430\u0442\u044c\u044f \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0438\u0437 \u0434\u0435\u0448\u0451\u0432\u043e\u0433\u043e \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440. \u0422\u0430\u043a\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043d\u0430\u0439\u0434\u0451\u0442 \u0441\u0432\u043e\u0451 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043a\u0430\u043a \u0432 \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438, \u0442\u0430\u043a \u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u043d\u044f\u0442\u0438\u0439 \u043f\u043e \u0448\u043a\u043e\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u043a\u0435. \u0414\u043b\u044f \u0441\u043f\u0440\u0430\u0432\u043a\u0438, \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 Sonoff Basic \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u0447\u0435\u0440\u0435\u0437 \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u0438\u0439 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441, \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u043a\u0438, \u0432\u0441\u0451 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u044d\u0442\u0438\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c \u0441\u0442\u0430\u043d\u0435\u0442 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":24803,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-33046","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0421\u0442\u0430\u0442\u044c\u044f \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0438\u0437 \u0434\u0435\u0448\u0451\u0432\u043e\u0433\u043e \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/vizualnoe-programmirovanie-dlya-sonoff-basic\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0412\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f Sonoff Basic | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0421\u0442\u0430\u0442\u044c\u044f \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0438\u0437 \u0434\u0435\u0448\u0451\u0432\u043e\u0433\u043e \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/vizualnoe-programmirovanie-dlya-sonoff-basic\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:50:27+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:50:27+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Visual Programming for Sonoff Basic | ProHoster","description":"An article on how to turn a cheap Chinese device.","canonical_url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/vizualnoe-programmirovanie-dlya-sonoff-basic","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"en_US","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0412\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f Sonoff Basic | ProHoster","og:description":"\u0421\u0442\u0430\u0442\u044c\u044f \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0438\u0437 \u0434\u0435\u0448\u0451\u0432\u043e\u0433\u043e \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430.","og:url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/vizualnoe-programmirovanie-dlya-sonoff-basic","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:50:27+00:00","article:modified_time":"2019-10-31T18:50:27+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"33046","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 13:45:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:47:29","updated":"2026-01-21 13:45:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/33046","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/comments?post=33046"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/33046\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media\/24803"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media?parent=33046"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/categories?post=33046"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/tags?post=33046"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}