<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:media="http://search.yahoo.com/mrss/"
     xmlns:atom="http://www.w3.org/2005/Atom"
     xmlns:yandex="http://news.yandex.ru">
 <channel>
  <title>pirogovx</title>
  <link>https://pirogovx.ru/</link>
  <atom:link href="https://pirogovx.ru/feed.xml" rel="self" type="application/rss+xml"/>
  <description>Личный блог об умном доме, ESP32, Matter, Zigbee, Home Assistant, прошивках для бытовой техники и DIY-проектах. Статьи, прошивки, курсы.</description>
  <language>ru</language>
  <lastBuildDate>Mon, 25 May 2026 20:34:20 GMT</lastBuildDate>
  <yandex:logo>https://pirogovx.ru/static/favicon.svg</yandex:logo>
  <yandex:logo type="square">https://pirogovx.ru/static/favicon.svg</yandex:logo>
  <item>
    <title>Royal Clima и Midea в Home Assistant через ESP32, Matter и Zigbee</title>
    <link>https://pirogovx.ru/articles/royal-clima-matter-zigbee/</link>
    <guid isPermaLink="true">https://pirogovx.ru/articles/royal-clima-matter-zigbee/</guid>
    <pubDate>Sat, 16 May 2026 21:00:00 GMT</pubDate>
    <author>noreply@pirogovx.ru (Pirogovx)</author>
    <description>Как заменить Wi-Fi модуль Royal Clima OSK302 на ESP32-C6 или ESP32-H2 и подключить кондиционер к Home Assistant через Matter или Zigbee без облака.</description>
    <content:encoded><![CDATA[<p>У меня дома 4 кондиционера. На одном из них уже стоял родной Wi-Fi-свисток <strong>Royal Clima OSK302</strong> за 2500-2700 ₽. Когда я прикинул, во сколько обойдётся докупить ещё три таких — стало грустно. Плюс родной модуль умеет только облако через приложение NetHome Plus, без локального API, без HomeKit, без Home Assistant без костылей.</p>
<p>После пары вечеров копания выяснилось:</p>
<ul>
<li>Внутри Royal Clima (серии Triumph) — обычная <strong>Midea OEM-платформа</strong>.</li>
<li>Кондиционер общается со штатным Wi-Fi модулем по <strong>UART 9600 8N1</strong> через 4 контакта (5V / GND / TX / RX).</li>
<li>Этот же протокол давно отреверсен сообществом (<code>dudanov/MideaUART</code>, <code>mac-zhou/midea-msmart</code> и т.д.).</li>
<li>А значит — можно выкинуть «свисток» и поставить <strong>свой</strong> контроллер на ESP32 за 200-300 ₽, локально, без облака.</li>
</ul>
<p>В итоге я собрал два варианта одного и того же модуля:</p>
<ul>
<li><strong>ESP32-C6 SuperMini + Matter</strong> (Wi-Fi) — нативно подключается в Apple Home, Google Home, Алису, Home Assistant.</li>
<li><strong>ESP32-H2 SuperMini + Zigbee</strong> — заходит в Zigbee2MQTT той же сетью, где уже живут датчики и реле.</li>
</ul>
<p>В обоих вариантах работает: вкл/выкл, режимы (Auto / Cool / Heat / Dry / Fan), задание температуры, скорость вентилятора, swing шторок (V/H), sleep, turbo, эконом, температура внутреннего и наружного блоков. Без облака, без приложения производителя, без IR-«пыхалок» в потолок.</p>
<p>В этой статье — полный путь от «у меня кондиционер Royal Clima» до «работает в Home Assistant локально». В двух вариантах: «для нормальных людей» (готовый бинарник, веб-флешер) и «для maker'ов» (сборка из исходников через ESP-IDF).</p>
<hr>
<h2 id="tldr">TL;DR — кому это подойдёт</h2>
<p>Работает с любым кондиционером, у которого <strong>внутри Midea UART-протокол</strong>. Самый надёжный признак: штатный Wi-Fi модуль работает через приложение <strong>NetHome Plus</strong>, <strong>Midea Air</strong> или <strong>MSmartHome</strong>.</p>
<p><strong>Точно совместимые бренды и линейки:</strong></p>
<ul>
<li><strong>Royal Clima</strong> — серии Triumph, Triumph Gold, Triumph Inverter, Vela, Renaissance.</li>
<li><strong>Pioneer</strong> — большинство моделей.</li>
<li><strong>Comfee</strong> — дочерний бренд Midea, всё совместимо.</li>
<li><strong>Inventor</strong> — большинство моделей (Греция).</li>
<li><strong>Lessar</strong> — часть моделей.</li>
<li><strong>Marsalle</strong>.</li>
<li><strong>Senville</strong>, <strong>MrCool</strong>, <strong>Klimaire</strong> — часть моделей.</li>
<li><strong>Cooper&amp;Hunter</strong> — часть моделей.</li>
<li><strong>Electrolux</strong> — европейские модели (часть).</li>
<li><strong>Carrier</strong>, <strong>Toshiba</strong> — некоторые модели (Midea-Carrier joint venture).</li>
</ul>
<p><strong>Точно НЕ совместимые (там другие UART-протоколы):</strong></p>
<ul>
<li>Gree, Ballu (почти все), TCL (часть), Hisense с приложением ConnectLife — это <strong>Gree-протокол</strong>.</li>
<li>Haier — <strong>H-Link / U-Link</strong>.</li>
<li>Daikin — <strong>S21</strong>.</li>
<li>Mitsubishi — <strong>CN105</strong>.</li>
</ul>
<h3 id="30">Как точно проверить свой кондиционер за 30 секунд</h3>
<ol>
<li>Посмотрите на штатный Wi-Fi модуль. Если на нём наклейка <strong>OSK102 / OSK103 / OSK104 / OSK105 / OSK302 / SK10x / SK11x / EU-SK10x</strong> — это Midea OEM, подойдёт.</li>
<li>Посмотрите приложение из инструкции: NetHome Plus / Midea Air / MSmartHome — наш клиент.</li>
<li>Посмотрите тип разъёма на корпусе внутреннего блока. <strong>USB-A гнездо</strong> (выглядит как обычный USB) — это Midea OEM с UART внутри.</li>
</ol>
<hr>
<h2 id="1-bom">Часть 1. Что покупать (BOM)</h2>
<h3 id="_1">Минимум для одного кондиционера</h3>
<table>
<thead>
<tr>
<th>Что</th>
<th>Где брать</th>
<th>Цена</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>ESP32-C6 SuperMini</strong> (для Matter)</td>
<td>Ali / Озон</td>
<td>~250 ₽</td>
</tr>
<tr>
<td>ИЛИ <strong>ESP32-H2 SuperMini</strong> (для Zigbee)</td>
<td>Ali / Озон</td>
<td>~300 ₽</td>
</tr>
<tr>
<td><strong>BSS138 level-shifter 4-channel</strong></td>
<td>Ali / Озон</td>
<td>~70 ₽</td>
</tr>
<tr>
<td>Кабель <strong>USB → JST-XH 2.54 мм 4-pin</strong></td>
<td>Ali (~50 ₽) или из комплекта OSK</td>
<td>0-100 ₽</td>
</tr>
<tr>
<td>Провода МГТФ / DuPont</td>
<td>у любого мейкера</td>
<td>копейки</td>
</tr>
</tbody>
</table>
<p><strong>Итого: ~300-450 ₽ за модуль.</strong> Можно собрать аккуратно, обмотать термоусадкой, и спрятать прямо за родной USB-A разъём в корпусе кондера.</p>
<h3 id="osk302">Что лежит в коробке OSK302 (если у вас уже есть родной модуль)</h3>
<p>Если родной свисток уже куплен — там в комплекте уже есть <strong>USB→JST-XH удлинитель</strong>, который можно переиспользовать. Просто отрежьте USB-A конец, провода зачистите — вот и весь кабель.</p>
<hr>
<h2 id="2">Часть 2. Схема подключения</h2>
<h3 id="usb-a-midea-ac">Распиновка USB-A разъёма Midea (на корпусе AC)</h3>
<p>Это <strong>не USB</strong>! Это UART 9600 8N1 в стандартной USB-A обвязке. Распиновка по 4 контактам:</p>
<p><img alt="Распиновка USB-A разъёма Midea" src="https://pirogovx.ru/static/images/midea-pinout.jpg">
<em>Подпись курсивом под картинкой — необязательно</em></p>
<div class="highlight"><pre><span></span><code>Pin 1 → +5V    (питание)
Pin 2 → UART_RX_5V0  (вход кондера — наш TX)
Pin 3 → UART_TX_5V0  (выход кондера — наш RX, 5В!)
Pin 4 → GND
</code></pre></div>

<h3 id="_2">Полная схема</h3>
<div class="highlight"><pre><span></span><code>       Кондиционер                  BSS138                  ESP32-C6 SuperMini

       USB-A 4 pin                  4-канальный
       ┌─────────────┐              level shifter           ┌──────────────┐
       │ pin 1 (+5V) ├──┬───────────┤ HV          LV ├─┬────┤ 5V (или 3V3) │
       │             │  │           │                 │ │    │              │
       │             │  └─────────────────────────────┼─┤    │ 3V3 ────────┘
       │             │              │                 │ │    │              │
       │ pin 4 (GND) ├──────────────┤ GND        GND ├─┤────┤ GND          │
       │             │              │                 │ │    │              │
       │ pin 3 (TX,  │              │ HV1        LV1 ├─────┤ GPIO 7 (RX1) │
       │   5В)       ├──────────────┤                 │ │    │              │
       │             │              │                 │ │    │              │
       │ pin 2 (RX)  ├──────────────┤ HV2        LV2 ├─────┤ GPIO 6 (TX1) │
       │             │              │                 │ │    │              │
       └─────────────┘              └─────────────────┘ │    └──────────────┘
                                                       │
                                          (HV3/HV4 и LV3/LV4 не используются)
</code></pre></div>

<p><strong>Важные нюансы:</strong></p>
<ol>
<li>На HV-стороне level shifter'а опорное напряжение — <strong>5V с кондера</strong>. На LV-стороне — <strong>3.3V с пина 3V3 ESP32-C6</strong> (это вывод внутреннего LDO, можно использовать как опору).</li>
<li><strong>Общая земля обязательна</strong> — без GND между AC и ESP UART не заработает, даже если всё остальное правильно.</li>
<li>Питать ESP можно либо от 5V кондера (он спокойно тянет 200 мА), либо от USB-C для отладки. Кондер при отключённом ESP всё равно подаёт 5V на разъём.</li>
</ol>
<h3 id="level-shifter">Тест без level shifter (на свой страх)</h3>
<p>Если очень хочется попробовать «прямо сейчас», и нет BSS138 — поставьте <strong>один резистор 4.7 кΩ в разрыв TX кондера → GPIO 7 ESP</strong>. Это защитит входной пин ESP от 5В (ток через ESD-диод ограничится до безопасных 340 µA). Линию ESP→AC можно подключать напрямую — кондер прочитает 3.3В как «1». Минус: форма сигнала будет хуже из-за RC, постоянно так оставлять не стоит.</p>
<hr>
<h2 id="3-ha">Часть 3. Быстрый путь (для пользователя HA)</h2>
<p>Если не хотите возиться с ESP-IDF, компилятором и Linux/WSL — есть готовый прошитый бинарник, который льётся одним кликом через браузер.</p>
<h3 id="1-web-flasher-esptool">Шаг 1 — флеш через Web Flasher или esptool</h3>
<p>Готовые бинарники лежат в репозитории в папке <code>release/</code>:</p>
<ul>
<li><code>release/matter-esp32c6/</code> — для <strong>Matter-варианта</strong> (ESP32-C6 SuperMini)</li>
<li><code>release/zigbee-esp32h2/</code> — для <strong>Zigbee-варианта</strong> (ESP32-H2 SuperMini)</li>
</ul>
<p>В каждой папке: <code>bootloader.bin</code>, <code>partition-table.bin</code>, основной <code>.bin</code> приложения, и файл <code>flash_args</code> с готовыми адресами для прошивки.</p>
<p><strong>Способ А — Web Flasher (без установки чего-либо)</strong></p>
<ol>
<li>Откройте <a href="https://web.esphome.io/">ESPHome Web Flasher</a> в <strong>Chrome или Edge</strong> (Firefox/Safari не поддерживают Web Serial).</li>
<li>Подключите ESP в USB-C к компьютеру.</li>
<li>Нажмите «Connect», выберите COM-порт (если порт не появился — поставьте драйвер CH340/CP2102 в зависимости от вашей платы).</li>
<li>Загрузите три файла из release-папки (bootloader / partition-table / основной .bin) на соответствующие адреса (см. ниже).</li>
</ol>
<p><strong>Способ Б — esptool.py из командной строки</strong></p>
<p>Для <strong>Matter (ESP32-C6):</strong></p>
<div class="highlight"><pre><span></span><code>esptool.py<span class="w"> </span>--chip<span class="w"> </span>esp32c6<span class="w"> </span>--port<span class="w"> </span>COM9<span class="w"> </span>--baud<span class="w"> </span><span class="m">460800</span><span class="w"> </span>write_flash<span class="w"> </span><span class="se">\</span>
<span class="w">    </span>--flash_mode<span class="w"> </span>dio<span class="w"> </span>--flash_freq<span class="w"> </span>80m<span class="w"> </span>--flash_size<span class="w"> </span>4MB<span class="w"> </span><span class="se">\</span>
<span class="w">    </span>0x0<span class="w">      </span>bootloader.bin<span class="w"> </span><span class="se">\</span>
<span class="w">    </span>0x8000<span class="w">   </span>partition-table.bin<span class="w"> </span><span class="se">\</span>
<span class="w">    </span>0x10000<span class="w">  </span>ac_matter.bin
</code></pre></div>

<p>Для <strong>Zigbee (ESP32-H2):</strong></p>
<div class="highlight"><pre><span></span><code>esptool.py<span class="w"> </span>--chip<span class="w"> </span>esp32h2<span class="w"> </span>--port<span class="w"> </span>COM9<span class="w"> </span>--baud<span class="w"> </span><span class="m">460800</span><span class="w"> </span>write_flash<span class="w"> </span><span class="se">\</span>
<span class="w">    </span>--flash_mode<span class="w"> </span>dio<span class="w"> </span>--flash_freq<span class="w"> </span>48m<span class="w"> </span>--flash_size<span class="w"> </span>2MB<span class="w"> </span><span class="se">\</span>
<span class="w">    </span>0x0<span class="w">      </span>bootloader.bin<span class="w"> </span><span class="se">\</span>
<span class="w">    </span>0x8000<span class="w">   </span>partition-table.bin<span class="w"> </span><span class="se">\</span>
<span class="w">    </span>0xf000<span class="w">   </span>ota_data_initial.bin<span class="w"> </span><span class="se">\</span>
<span class="w">    </span>0x20000<span class="w">  </span>zb_midea_ac.bin
</code></pre></div>

<p>После прошивки откройте <code>idf.py monitor</code> или любой serial-терминал (115200 бод). Должна появиться строка <code>Matter AC started</code> или <code>Zigbee AC started</code> соответственно.</p>
<h3 id="2_1">Шаг 2 — подключение к кондиционеру</h3>
<p>Спаяйте по схеме выше (модуль BSS138 + 4 провода). Включите кондер в розетку (он подаёт 5V на разъём, даже когда выключен пультом).</p>
<h3 id="3-home-assistant">Шаг 3 — добавление в Home Assistant</h3>
<ol>
<li>В HA: <code>Settings → Devices &amp; Services → Add Integration → Matter</code>.</li>
<li>На устройстве — длинное нажатие GPIO 9 (BOOT-кнопка) на 5 секунд — это сбрасывает фабрику и открывает окно комиссионинга на 5 минут.</li>
<li>В мониторе (или в логе) появится QR-код / pairing code — введите в HA или отсканируйте телефоном.</li>
<li>Через 30-60 секунд устройство появится в HA.</li>
</ol>
<h3 id="4-entity">Шаг 4 — переименование entity</h3>
<p>После сопряжения вы увидите такие сущности в HA:</p>
<ul>
<li><code>climate.ac_thermostat</code> — основной термостат</li>
<li><code>fan.ac_fan</code> — карточка вентилятора</li>
<li><code>sensor.ac_indoor_temperature</code>, <code>sensor.ac_outdoor_temperature</code> — температуры</li>
<li><code>light.ac_swing_v</code>, <code>light.ac_swing_h</code>, <code>light.ac_eco</code>, <code>light.ac_turbo</code>, <code>light.ac_sleep</code>, <code>light.ac_display</code> — переключатели (HA опознаёт OnOff-light как лампочку, в UI работает как toggle)</li>
</ul>
<p>Переименуйте в Settings → Devices → ваш AC → Entities — клик по карандашику, новое имя и иконка <code>mdi:fan</code> / <code>mdi:lightbulb-off</code> и т.д.</p>
<h3 id="5-lovelace-">Шаг 5 — пример Lovelace-карточки</h3>
<div class="highlight"><pre><span></span><code><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">vertical-stack</span>
<span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Кондиционер в спальне</span>
<span class="nt">cards</span><span class="p">:</span>
<span class="w">  </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">thermostat</span>
<span class="w">    </span><span class="nt">entity</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">climate.bedroom_ac</span>
<span class="w">  </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">entities</span>
<span class="w">    </span><span class="nt">entities</span><span class="p">:</span>
<span class="w">      </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">entity</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">fan.bedroom_ac</span>
<span class="w">      </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">entity</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">light.bedroom_ac_swing_v</span>
<span class="w">        </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Шторки вертикально</span>
<span class="w">      </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">entity</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">light.bedroom_ac_swing_h</span>
<span class="w">        </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Шторки горизонтально</span>
<span class="w">      </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">entity</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">light.bedroom_ac_eco</span>
<span class="w">        </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Эко</span>
<span class="w">      </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">entity</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">light.bedroom_ac_turbo</span>
<span class="w">        </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Турбо</span>
<span class="w">      </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">entity</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">light.bedroom_ac_sleep</span>
<span class="w">        </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Sleep</span>
<span class="w">      </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">entity</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">light.bedroom_ac_display</span>
<span class="w">        </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Дисплей</span>
<span class="w">      </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">entity</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">sensor.bedroom_ac_indoor_temperature</span>
<span class="w">        </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Температура в комнате</span>
<span class="w">      </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">entity</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">sensor.bedroom_ac_outdoor_temperature</span>
<span class="w">        </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Температура на улице</span>
</code></pre></div>

<hr>
<h2 id="4-maker">Часть 4. Сборка из исходников (для maker'а)</h2>
<p>Если хочется собрать самому, что-то подправить или сделать форк под свою модель.</p>
<h3 id="_3">Требования</h3>
<ul>
<li><strong>ESP-IDF v5.4.1+</strong> (<a href="https://docs.espressif.com/projects/esp-idf/en/v5.4.1/esp32c6/get-started/index.html">инструкция установки</a>)</li>
<li><strong>esp-matter SDK</strong> (склонировать с GitHub espressif/esp-matter)</li>
<li><strong>Git, Python 3.11+</strong></li>
<li>Windows / Linux / macOS — всё работает</li>
</ul>
<h3 id="_4">Сборка</h3>
<div class="highlight"><pre><span></span><code>git<span class="w"> </span>clone<span class="w"> </span>https://github.com/pirsasha/esp32-midea-ac.git
<span class="nb">cd</span><span class="w"> </span>esp32-midea-ac

<span class="c1"># поднимаем окружение</span>
.<span class="w"> </span>/path/to/esp-idf/export.sh<span class="w">           </span><span class="c1"># Linux/macOS</span>
C:<span class="se">\e</span>sp-idf<span class="se">\e</span>xport.bat<span class="w">                  </span><span class="c1"># Windows</span>
<span class="nb">set</span><span class="w"> </span><span class="nv">ESP_MATTER_PATH</span><span class="o">=</span>C:<span class="se">\e</span>sp-matter<span class="w">      </span><span class="c1"># путь к esp-matter</span>

<span class="c1"># собираем</span>
idf.py<span class="w"> </span>set-target<span class="w"> </span>esp32c6
idf.py<span class="w"> </span>build
idf.py<span class="w"> </span>-p<span class="w"> </span>COM9<span class="w"> </span>flash<span class="w"> </span>monitor<span class="w">           </span><span class="c1"># COM9 = ваш порт</span>
</code></pre></div>

<p>После прошивки в <code>monitor</code> увидите:</p>
<div class="highlight"><pre><span></span><code>I (xxxx) matter_ac: Matter AC started. UART1: TX=GPIO6 RX=GPIO7 @9600 8N1
I (xxxx) chip[SVR]: SetupQRCode: [MT:Y.K9042C00KA0648G00]
</code></pre></div>

<p>QR-код этим Setup'ом сканируете в HA / Apple Home / Google Home / Алисе. </p>
<h3 id="_5">Структура проекта</h3>
<div class="highlight"><pre><span></span><code>royal-matter-firmware/
├── CMakeLists.txt
├── partitions_matter.csv      # партиции с esp_secure_cert
├── sdkconfig.defaults
└── main/
    ├── CMakeLists.txt
    ├── main.cpp               # Matter endpoints + маппинги
    ├── midea.cpp              # UART-драйвер протокола Midea
    └── midea.h
</code></pre></div>

<h3 id="_6">Что менять под другой бренд</h3>
<p>Если ваш кондер — не Royal Clima, а, скажем, Pioneer или Inventor, базовый функционал заработает «из коробки» — кадры Midea одинаковые. Что может потребовать правок:</p>
<ul>
<li><strong>Формула температуры</strong> в <code>midea.cpp</code> → <code>parse_status()</code>: сейчас <code>(raw - 50) / 2</code>. На некоторых прошивках бывает иначе.</li>
<li><strong>Display toggle</strong> (<code>build_display_toggle_frame</code>): байты могут различаться от модели к модели. Если стандартные не сработали, можно снять рабочие байты сниффером (см. ниже).</li>
<li><strong>Set state body</strong> — если какие-то функции (например, sleep / turbo) не реагируют, нужно подкорректировать байт <code>[8]</code> в <code>build_set_frame()</code>.</li>
</ul>
<h3 id="-sniffer">Если что-то не работает — sniffer</h3>
<p>Самый надёжный способ узнать «как правильно» — записать, что делает родной OSK302 в той же ситуации. Для этого есть готовый инструмент:</p>
<p><a href="https://github.com/reneklootwijk/midea-uartsniffer"><strong>reneklootwijk/midea-uartsniffer</strong></a> — ESP-прошивка, которая садится «в разрыв» между OEM-модулем и кондером и пишет в лог все кадры в обе стороны. Жмёте кнопку на пульте → видите ровно тот байтовый поток, который надо воспроизвести.</p>
<hr>
<h2 id="5-zigbee-esp32-h2">Часть 5. Zigbee-вариант (ESP32-H2)</h2>
<p>Если в доме уже Zigbee2MQTT — и Matter заводить не хочется — параллельно сделан вариант на <strong>ESP32-H2 SuperMini</strong>. Внутри тот же <code>midea.cpp</code> UART-драйвер, но вместо Matter — Zigbee cluster library (ZCL) на базе <strong>ESP Zigbee SDK</strong>.</p>
<p>Размер прошивки получается заметно меньше: ~530 КБ против ~1.65 МБ у Matter-варианта (Zigbee не тащит TLS / Wi-Fi / TCP/IP стек).</p>
<h3 id="_7">Схема подключения — та же</h3>
<p>Распиновка идентична Matter-варианту: 5V → 5V, GND → GND, TX кондера → GPIO 7 ESP (через level shifter), RX кондера → GPIO 6 ESP. Тот же BSS138, тот же кабель. Единственное отличие — у ESP32-H2 нет Wi-Fi, только Zigbee (802.15.4), плюс BLE для отладки.</p>
<h3 id="_8">Прошивка</h3>
<p>Берёте <code>release/zigbee-esp32h2/</code> и шьёте через esptool (команда выше) либо Web Flasher. Стартовая прошивка сразу открывает permit join — устройство готово к включению в Zigbee2MQTT-сеть.</p>
<h3 id="zigbee2mqtt">Что увидите в Zigbee2MQTT</h3>
<p>Устройство опознаётся как:
- <strong>Vendor:</strong> Custom
- <strong>Model:</strong> ZB-MIDEA-AC
- <strong>Description:</strong> Zigbee air conditioner Royal Clima/Midea on ESP32-H2</p>
<p>И сразу экспонирует через Z2M:</p>
<table>
<thead>
<tr>
<th>Параметр</th>
<th>Тип</th>
<th>Значения</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>climate</code> (<code>occupied_heating_setpoint</code>)</td>
<td>numeric</td>
<td>16..30 °C, шаг 0.5</td>
</tr>
<tr>
<td><code>local_temperature</code></td>
<td>numeric (read)</td>
<td>температура в комнате</td>
</tr>
<tr>
<td><code>system_mode</code></td>
<td>enum</td>
<td>off / auto / cool / heat / dry / fan_only</td>
</tr>
<tr>
<td><code>fan_mode</code></td>
<td>enum</td>
<td>auto / low / medium / high / quiet</td>
</tr>
<tr>
<td><code>swing_mode</code></td>
<td>enum</td>
<td>off / horizontal / vertical / both</td>
</tr>
<tr>
<td><code>preset</code></td>
<td>enum</td>
<td>none / sleep / turbo</td>
</tr>
<tr>
<td><code>display</code></td>
<td>binary</td>
<td>ON / OFF (дисплей и звуковой сигнал)</td>
</tr>
<tr>
<td><code>outdoor_temperature</code></td>
<td>numeric (read)</td>
<td>температура наружного блока, °C</td>
</tr>
<tr>
<td><code>firmware_version</code></td>
<td>numeric (read)</td>
<td>версия прошивки</td>
</tr>
</tbody>
</table>
<p>Под капотом — кастомные атрибуты на стандартном <code>genAnalogInput</code> кластере (0xF000..0xF009) плюс зеркало основных параметров в <code>hvacThermostat</code> для совместимости со старыми контроллерами.</p>
<h3 id="zigbee2mqtt_1">Настройка Zigbee2MQTT</h3>
<p>Просто включите паринг в Z2M, перезагрузите ESP — устройство появится. Но чтобы Z2M понимал все наши атрибуты, нужно подключить <strong>external converter</strong> — JS-файл, который лежит в репе: <code>release/zigbee-esp32h2/esp-ac.js</code>.</p>
<ol>
<li>Положите <code>esp-ac.js</code> в папку <code>data/external_converters/</code> вашего Zigbee2MQTT.</li>
<li>В <code>configuration.yaml</code> Zigbee2MQTT добавьте:</li>
</ol>
<div class="highlight"><pre><span></span><code><span class="nt">external_converters</span><span class="p">:</span>
<span class="w">  </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">esp-ac.js</span>
</code></pre></div>

<ol start="3">
<li>Перезапустите Z2M.</li>
<li>Спарьте устройство (<code>permit_join: true</code> в Z2M, потом перезагрузка ESP — она автоматически просит сети).</li>
<li>В Z2M-вебе появится новое устройство с полным набором контролов.</li>
</ol>
<p>В Home Assistant оно подтянется через интеграцию <code>MQTT → Zigbee2MQTT</code> автоматически, как <code>climate.&lt;имя&gt;</code> плюс несколько вспомогательных entity.</p>
<h3 id="ha-zigbee-">Пример карточки в HA для Zigbee-варианта</h3>
<div class="highlight"><pre><span></span><code><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">vertical-stack</span>
<span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Кондиционер (Zigbee)</span>
<span class="nt">cards</span><span class="p">:</span>
<span class="w">  </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">thermostat</span>
<span class="w">    </span><span class="nt">entity</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">climate.zb_midea_ac</span>
<span class="w">  </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">entities</span>
<span class="w">    </span><span class="nt">entities</span><span class="p">:</span>
<span class="w">      </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">entity</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">select.zb_midea_ac_fan_mode</span>
<span class="w">        </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Скорость вентилятора</span>
<span class="w">      </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">entity</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">select.zb_midea_ac_swing_mode</span>
<span class="w">        </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Шторки</span>
<span class="w">      </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">entity</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">select.zb_midea_ac_preset</span>
<span class="w">        </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Пресет (sleep/turbo)</span>
<span class="w">      </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">entity</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">switch.zb_midea_ac_display</span>
<span class="w">        </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Дисплей</span>
<span class="w">      </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">entity</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">sensor.zb_midea_ac_outdoor_temperature</span>
<span class="w">        </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Температура на улице</span>
</code></pre></div>

<h3 id="matter-vs-zigbee">Сравнение Matter vs Zigbee варианта</h3>
<table>
<thead>
<tr>
<th>Что</th>
<th>Matter (ESP32-C6)</th>
<th>Zigbee (ESP32-H2)</th>
</tr>
</thead>
<tbody>
<tr>
<td>Размер прошивки</td>
<td>~1.65 МБ</td>
<td>~530 КБ</td>
</tr>
<tr>
<td>Сеть</td>
<td>Wi-Fi 2.4 ГГц</td>
<td>Zigbee 3.0 (802.15.4)</td>
</tr>
<tr>
<td>Что нужно дома</td>
<td>Matter Controller (HA + Matter Server / Apple Home / Алиса)</td>
<td>Zigbee-координатор (Sonoff, ConBee и т.п.) + Zigbee2MQTT</td>
</tr>
<tr>
<td>Шаринг между экосистемами</td>
<td>Один QR в Apple/Google/Алиса/HA</td>
<td>Только через Z2M</td>
</tr>
<tr>
<td>Энергопотребление</td>
<td>~80-150 мА (Wi-Fi)</td>
<td>~20-40 мА (Zigbee)</td>
</tr>
<tr>
<td>Цена платы</td>
<td>~250 ₽</td>
<td>~300 ₽</td>
</tr>
</tbody>
</table>
<hr>
<h2 id="6-faq">Часть 6. FAQ и траблшутинг</h2>
<h3 id="midea-status">«В мониторе нет строк <code>midea: status: ...</code>»</h3>
<p>Кондер не отвечает. Проверьте по порядку:</p>
<ol>
<li><strong>5V приходит на пин 5V ESP</strong> — мультиметром между 5V и GND.</li>
<li><strong>Общая земля</strong> — реально соединена между AC и ESP.</li>
<li><strong>TX/RX не перепутаны</strong> — поменяйте местами средние два провода и перезагрузите ESP. Поломок от этого нет.</li>
<li><strong>Кондер включён в розетку.</strong> Даже выключенный с пульта, он подаёт 5V на разъём и должен отвечать на запросы статуса.</li>
<li><strong>Level shifter</strong> — проверьте, что HV запитан 5V, LV — 3.3V, GND общая.</li>
</ol>
<h3 id="bad-checksum">«В мониторе вижу <code>bad checksum</code>»</h3>
<p>Помехи / плохой контакт / без делителя или level shifter. Перепроверьте пайку, попробуйте на коротких проводах.</p>
<h3 id="matter-ha">«Matter не паирится в HA»</h3>
<ul>
<li>В HA должен стоять <strong>Matter Server</strong> (addon <code>Matter Server</code> или Home Assistant OS с поддержкой Matter).</li>
<li>Должен быть <strong>Wi-Fi 2.4 ГГц</strong> — ESP32-C6 на 5 GHz сети не подключится.</li>
<li>Откройте <code>idf.py monitor</code> и найдите строки <code>BLE advertising started</code> и <code>Pairing code: XXX</code>. Окно открыто 5 минут после загрузки.</li>
<li>Если не успели — зажмите GPIO 9 на 5 секунд, окно откроется снова.</li>
</ul>
<h3 id="display-eco-turbo">«Display / Eco / Turbo не реагируют на кнопку»</h3>
<p>Конкретные байты этих команд могут различаться от модели к модели. В коде используются стандартные значения из <code>dudanov/MideaUART</code>. Если не работает — снимайте сниффером, какие байты шлёт OSK302, и подставляйте в <code>build_set_frame</code> или <code>build_display_toggle_frame</code>.</p>
<h3 id="osk">«Можно ли совместить с родным OSK модулем?»</h3>
<p>Нет. Их одновременно нельзя — кондер общается только с одним мастером. Либо OSK + NetHome Plus, либо наш ESP + Matter/Zigbee. Зато можно в любой момент откатиться — просто отключить ESP и вставить OSK обратно.</p>
<hr>
<h2 id="_9">Итог</h2>
<p>Вместо 4 родных модулей за ~10 000 ₽, NetHome Plus с облачной задержкой и зависимостью от чужих серверов — получился свой локальный Matter/Zigbee-модуль за ~300 ₽ на каждый кондер, с полным управлением из Home Assistant.</p>
<p>Главное приятное: устройство <strong>больше не зависит от облака и приложения производителя</strong>. Работает локально, не отваливается при проблемах с интернетом, видно всем умным домам через Matter и Zigbee.</p>
<p>Исходники, готовый бинарник, прошивка для Zigbee, конвертер для Z2M, схема — всё на GitHub: <strong><a href="https://github.com/pirsasha/esp32-midea-ac">github.com/pirsasha/esp32-midea-ac</a></strong>.</p>
<p>Если статья зайдёт — будут ещё разборы по протоколу Midea, как добавить поддержку Haier / Gree / Daikin и как сделать универсальный модуль с автоопределением. Звёздочка на GitHub, issue с фидбеком, PR с поддержкой вашей модели кондера — всё это очень приветствуется.</p>
<hr>
<h2 id="_10">Ссылки</h2>
<ul>
<li><strong><a href="https://github.com/pirsasha/esp32-midea-ac">github.com/pirsasha/esp32-midea-ac</a></strong> — исходники проекта, готовые бинарники, схемы, Z2M-конвертер.</li>
<li><a href="https://github.com/dudanov/MideaUART">dudanov/MideaUART</a> — референсная C++ библиотека UART-протокола Midea.</li>
<li><a href="https://github.com/mac-zhou/midea-msmart">mac-zhou/midea-msmart</a> и активный форк <a href="https://github.com/mill1000/midea-msmart">mill1000/midea-msmart</a> — Python-реализация (msmart-ng).</li>
<li><a href="https://github.com/reneklootwijk/midea-uartsniffer">reneklootwijk/midea-uartsniffer</a> — sniffer для подсмотра рабочих команд.</li>
<li><a href="https://esphome.io/components/climate/midea/">ESPHome Midea component</a> — альтернатива через ESPHome.</li>
<li><a href="https://smlight.tech/product/slwf-01">SMLIGHT SLWF-01pro</a> — коммерческий аналог на ESP32 для ESPHome.</li>
<li><a href="https://github.com/espressif/esp-matter">Espressif esp-matter SDK</a> — Matter для ESP-серии.</li>
</ul>]]></content:encoded>
    <category>esp32</category>
    <category>matter</category>
    <category>zigbee</category>
    <category>home-assistant</category>
    <category>midea</category>
    <category>royal-clima</category>
    <category>hvac</category>
    <category>diy</category>
    <media:thumbnail url="https://pirogovx.ru/static/favicon.svg"/>
    <enclosure url="https://pirogovx.ru/static/favicon.svg" type="image/jpeg"/>
  </item>
 </channel>
</rss>
