From 34cdb7fef8299b363903796df0ea73e4318b3544 Mon Sep 17 00:00:00 2001 From: Petr Polezhaev Date: Tue, 29 Sep 2026 15:40:23 +0300 Subject: [PATCH] =?UTF-8?q?ha(HACS):=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=BB?= =?UTF-8?q?=D0=B5=D0=BA=D1=82=20=D1=84=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20Custom=20Repositories?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - info.md (страница HACS), LICENSE (MIT), codeowners @petr.polezhaev - brand: icon/icon@2x/logo + dark-варианты (сгенерированные плейсхолдеры с силуэтом кондиционера) - .github/workflows/validate-hacs.yaml и hassfest.yaml (включатся на GitHub) - pyproject: license=MIT, license-files; MANIFEST: LICENSE в sdist - README/RELEASE_HA: HACS работает только с публичным GitHub-зеркалом (Custom Repositories), точные команды mirror и настройки GitHub --- .github/workflows/hassfest.yaml | 19 +++++++++ .github/workflows/validate-hacs.yaml | 21 ++++++++++ LICENSE | 26 ++++++++++++ MANIFEST.in | 2 +- README.md | 5 ++- custom_components/fglair/brand/dark_icon.png | Bin 0 -> 1070 bytes .../fglair/brand/dark_icon@2x.png | Bin 0 -> 2777 bytes custom_components/fglair/brand/dark_logo.png | Bin 0 -> 1441 bytes custom_components/fglair/brand/icon.png | Bin 607 -> 1065 bytes custom_components/fglair/brand/icon@2x.png | Bin 0 -> 2930 bytes custom_components/fglair/brand/logo.png | Bin 832 -> 1511 bytes custom_components/fglair/manifest.json | 2 +- docs/RELEASE_HA.md | 39 +++++++++++++----- info.md | 36 ++++++++++++++++ pyproject.toml | 4 +- 15 files changed, 139 insertions(+), 15 deletions(-) create mode 100644 .github/workflows/hassfest.yaml create mode 100644 .github/workflows/validate-hacs.yaml create mode 100644 LICENSE create mode 100644 custom_components/fglair/brand/dark_icon.png create mode 100644 custom_components/fglair/brand/dark_icon@2x.png create mode 100644 custom_components/fglair/brand/dark_logo.png create mode 100644 custom_components/fglair/brand/icon@2x.png create mode 100644 info.md diff --git a/.github/workflows/hassfest.yaml b/.github/workflows/hassfest.yaml new file mode 100644 index 0000000..26273a8 --- /dev/null +++ b/.github/workflows/hassfest.yaml @@ -0,0 +1,19 @@ +name: Validate (hassfest) + +on: + push: + pull_request: + schedule: + - cron: "0 0 * * *" + workflow_dispatch: + +permissions: {} + +jobs: + validate-hassfest: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: hassfest + uses: home-assistant/actions/hassfest@master diff --git a/.github/workflows/validate-hacs.yaml b/.github/workflows/validate-hacs.yaml new file mode 100644 index 0000000..836db0d --- /dev/null +++ b/.github/workflows/validate-hacs.yaml @@ -0,0 +1,21 @@ +name: Validate (HACS) + +on: + push: + pull_request: + schedule: + - cron: "0 0 * * *" + workflow_dispatch: + +permissions: {} + +jobs: + validate-hacs: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: HACS validation + uses: hacs/action@main + with: + category: integration diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8819daa --- /dev/null +++ b/LICENSE @@ -0,0 +1,26 @@ +MIT License + +Copyright (c) 2026 Petr Polezhaev + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +--- + +Вендоренный парсер JSON `third_party/jsmn` распространяется под лицензией +MIT (см. `third_party/jsmn/LICENSE`). diff --git a/MANIFEST.in b/MANIFEST.in index a01a29f..bdd64b9 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,4 +1,4 @@ -include CMakeLists.txt README.md pyproject.toml setup.py +include CMakeLists.txt LICENSE README.md pyproject.toml setup.py recursive-include include *.h *.hpp recursive-include src *.cpp *.hpp recursive-include third_party * diff --git a/README.md b/README.md index 646f0fa..ddd2c99 100644 --- a/README.md +++ b/README.md @@ -126,5 +126,6 @@ converted from the module's 0.01 °C+5000 format. ## License / provenance -Protocol documentation and code reconstructed from the FGLair 3.4.3 APK for -interoperability; `third_party/jsmn` is MIT. +MIT — see [`LICENSE`](LICENSE). Protocol documentation and code reconstructed +from the FGLair 3.4.3 APK for interoperability; vendored `third_party/jsmn` +is MIT. diff --git a/custom_components/fglair/brand/dark_icon.png b/custom_components/fglair/brand/dark_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..cc10c500a86c944a3174c0858cd7af1ae04a281e GIT binary patch literal 1070 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911L)MWvCLk0%subwWBAr-gY-r1O|Z7AS+ zQP)w`qImZz@2wIBGFru}4m2{J)k*)!SKwUBCf2|9yzIvvwKZNFW$Rd&9OwZVerR$q za58WT*; z$O8Gbfq}t+fkAQ`$Zb1CEc_tmxxmwA8m-rHrzu$cFU&;7l248^<_rIv}c4A1N? zm%fuLT{qvF>*2}O>bqZVc1X)V^KA+L;hFn*=D#!H&H86owND-trD)K-IC{W z{J*@JF#DlTxto9gF3EE>^LJI`42Y~BWl>k5tU{PS;`yW9G@zkKV5 zCs!xm{Sv9L**vZKQu{-n_%{FYS!|~D^0xQ+8(7dFd$imf#)K`3wIzp+Mzq~t)c!oC zCv}fyRn4uV5&Iqp{biLBPyX5U_$Dv_|9sr?$LH|$JFz`mpWj@X?RRY*{{b)NxclF$ z7?w$YkiL5~qS}uA!_4YKzZlM#KDcu9XvA-O&a!v!V(e>04owaRhCzDcnR_$dddjyM y*Gk&m&6K+Gr}j&YJ(k#JI^gff;6V=5{>A#cqvYy4(Gy9a)aL2x=d#Wzp$PzsvQ%vV literal 0 HcmV?d00001 diff --git a/custom_components/fglair/brand/dark_icon@2x.png b/custom_components/fglair/brand/dark_icon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a4462351c458cb7efd15a8ec816db69093dc009a GIT binary patch literal 2777 zcmb`I4^We39LIm}%Ydm6Q!`|W+Z}q=dAT|*^%ORQnuN#1>hMZM!xWWdhB*@2-k>s* zJ2>kk&ue1J;brnKbtvLH&r-Yem{>Y_fi3GqPF{y88}|B+e$P8JG|Vt}yL*4{v*-Cf zzu))s{GM%^m!c0JsvHUc;Yo86=L66f(jX^~JY~W@fT3kciSe)HHuJ5?tKN(s{ZXps zSn{d4T=(H4TbUmn-_4EvRDR`^R?B|8f7{#3WXtZG@4dR6J%I6MP`*zIKqG&Gr<7iVvJP! z204|3OhXOy2m^`)GIZ-fg9{vDe%K&oGz}r;5))}+A{L)J>aiuT=L!4C_Gx1i0ssgK{7N}V6$S<{ z#BYm|Knz$P$m713s)B$DA|c-3l0L&QCU5-=TQP)a5<3TT3LfT_q&dLuQ=!FAONkQ` z|9KokV2!0Oksz?KSRBqNqZlqdkfQ_ayatqb!h?0vgiLUIBOwaXSV0fVV4)~y!mw?q z5}C0z25>#@qwaeSt{3|+>vyf(6Gp|wv6fnw{~M8J@_JRBwqCc0_l{Ahur3vNJ>>q{ z5uNu5Z&Ok31A3GD`GYRAj47`$or)rny2pPewt;J`7QHcW-NLk67YqCa0=?6Q^)ee% zQm=I!aGApuP&saQ%emF8s8qwk*yIfDzA5ctT(*`rcGf@Vv$h2rs-{8Bx41=d~N){{1b!S7@mVVW?vN#||$$Qc|Z5F>-R%WBDo?B-c^{`=#Tazf{`0Ar% zWwGEdcKVyeH6fG(JR@q@b?oYRm}(ck=QXXK6a|ELC8Y|Y>1V-+l?qB64>(W|OP zpSGIU5xz(I)zv`aU=DuaQVW#X2o{15> zr&$AwgKexT*2b>Y;`M2WJx&toYTh-oYcz4x-gIu}?~=EQ{NBsfHhzWEEDUFQwDufB zmFQhf`rpfGfVL-8Jng&LoXz5`n-($uE-7ny&5rZiawO{0y^FrgGk6LnI;Cl*#^cU& z^*%{`-t`&ZBC87lR#yt^eoFD|KPkyEAiF)u%V{lI+QC7i@Al>P7-$IZiu_tUB(#Rn zj&abd&$965X@%&nX_GVkui*!8xAdB6B3jn7dk->MBqvNJoj@jQf(VnRRw9$M z4{?=evkjT#=@6>s<%=jV0UOOt*QVo55I#rPIe|FtT#r?__+ps)qTMV+IE%rUtUWA& z`*TX1m$RHOBmY|BOAO4qHJ;11{9=|3_=o#||6uiJs#!Jc`z*NIe4lUhn)pblD&Snj zR?bzYqW05=cbkAJlzZo^U*v7z zZRtTWW^d>-cS$uiISp4&&yc8(6(*lf4ugcC-fibx+UO^T_IIfYr_T zmbWWR%^8xM4ru=~_*J^@*L> zGH;NUiCarrW+Z8u`9C9*$uh!ZR0cA!5hmH2_al?Ngo*D54w=LfsFAyfzzDpcjnqXA zUi%@tMaLH6c-Bm;!sFG0a?BD|4DHlIUAbxz0k=SmQVF~^LyP<`5?_XcHGd0lV^?Vh p?2|{o8P$*Hj=du@$V9r*EmZx^xYWqy%TEJ-l3q$ltem~1;4i2(?#2KB literal 0 HcmV?d00001 diff --git a/custom_components/fglair/brand/dark_logo.png b/custom_components/fglair/brand/dark_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..999233ce0ae33f23ff38f1c82a540d40c84f3b18 GIT binary patch literal 1441 zcmbtSZA?>F7=F*~1@DSLNv0zEXfs{1xeWZubb-+eg8&-A=@MfMYbQ&FMx{;?x`OQq zZgc7omMoGbCKO$!#*Ij(wgItK18$k7-R1_gls2fNe3a4+TW7sx@2Ocrkp0p7=RD_q z&-?K_&pouUv?y7gAqRlulH!6*031RB0z20IwRJf_LS;!o-n)8Nz;mTxNPM>NoqU}z zUfgW`JmH!4siQ*E%je4PO=thwpJK>3Ga8<(3MK%`hk!7^qmcgvMTUW}AZnywH*vOJ$5^=xEVjp%&p^2o9(7Je zxj8eTZVh|@x_e199WwXNa&3lzI1T4w=`4Hch(|fLChYbaZQvX9YHiZZ@DgZ?T^L$% z(QD+*qj$H3{G}g#5wIwUfAaU5?vvS*>Fz2u=M1>BRz2@I5c^IF|4iZB-lgkuT33wD zkLRY<+VwfdYyOP)uRA$Yi5ZBTR6Qs`24DT(>ozTd*`MnG3l9rT&bf)B5jb+}qC zX+RgO?QM{@M$=%6%~I}CB7yXe^~+u?4|ZBip=cscyN+(`J~_7Ly?#x#np=Kb-SXku zj(J!SXeLB^yZ9@8e#NcDaTTUb_G9|B!5bC3Y?45SC-z@eL56gxy&(&ffFoE1^$5(-`)cx+Otun5M6Xbc0`C?=zx04o|eMCHQw5 zZoA-w^nIjrAv3D654X+ai4)2W^(i~NyH&8#_vYT{+mX(Bn1A@qX(W~gmtO0M`5CK) uI~XgP;@H4`fX7^!%d0uhfgKNi{a+}ZgudUl`CscC0wOYCTd%H;VPf-pAPC7uw2ip}GRDf{V z_gpr92EM&FIh`$ksm*k>{Hu1;0Yoq`urVyZzeI}R00Tn<&}+;Mm-9FAFeEU*1wbko zco-NY7#Iu~NRj}C5N?2J=z;g2KmJ@=4GLIfa3EHJ8JioB)u6JO{p>*kVDC7nFtE+3 z1G@hpgG9lv%ZvsOzAR@xaNr_416#Ws5i!6h@L&7IzkvC#nKzt$x&M!CSuKN^^EE|5Vjj&iLbg^@l&PHGe^h^ZtJS`>9%L{T`r( z19z&Y*ZaPsU9QWu#@dh>BqAL&+R$O?%%Eb`z4gaKhE~1 z?|s%y)ydn{YbDQpOZ`!{JU8I?_lv*(GI*fDiVaT>N-~5=UkX=0^>X{2X?twKf6t43 zefHY&#f(21y7@0GVg4ZK9^W&S??C&V@4JAZ^ZxA5S(CS3XHQtlxc+^$EyHErAKmY| zH=e8Edr<$56DYopu{^fM@Y+xRrn}|k@%FW%hbD*nmt8Jzd~@%{ThI8m&9##I?q*6~ v`B(d;&YnRC12P@RcSLg~x~p;UwSO^ItmEYAZag^wl*&9^{an^LB{Ts5EiXm_ literal 607 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911L)MWvCLk0#WHBT4EkcwMxFFW!wDDbcx zJmtu#G$GiR9?B~4|KVBleR$oyvC2V3R@24s|JzyOkCV_>|Ua_{3epRH5y RP6Q?#22WQ%mvv4FO#lUOXgvS` diff --git a/custom_components/fglair/brand/icon@2x.png b/custom_components/fglair/brand/icon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ad63b3b11fb97d4b74ff9fbe2ca21658d21660fa GIT binary patch literal 2930 zcmeHIe@q)y9RFT9x@Oo=g33TQSn5pF7)d%sr=vwMY+0pa(@Ycfn3!b?nu3FMl&*Kd zxG|=}q8TR4l$aR)Sfqx;jje01lex`V1m}-#lm3Wg<42)wWb6vpYkhZZvB0*3q0v9Q zT;9F+{eItjpZEEEzwZuiE-RHT&sh!t(v2HRwg8AwR|FFN(~wjAB|zFU8%v5_+Iw}v zb>^K1zq`Mrd|grIwHEc**Uw#Qel4w{ShcP0`k@appRS4=z`Fh3;-3wMh#oeN^eRPw zfeJtdfWuvNmpVPD!Irc?zBKs!^zhcjou85rJ8q5{RJeWE?RcmN3^RRdF>delsKqic z85P+oFmQcq0SitQ`~w6Ajr7;7LK?n78M_4 z=TD9@Tn6ypQh3Ym=*-1hafPWNakC}9fBR*Z*XyKr)9f*S78n@vQ`SWWIg!`YXeP%V z*h8}!;121}+qN^7T+D0L=)4NSc*N#jt-Z|oOQDgbPnvbC5KDzftbd=?ucO5%A-qN= zje_8%$1WyJ+j6(~eRVYZqzZawj+~1e|KVuCxRH^=`N$&V==Vba-!sNswr3>%musVzl;J@Qy>BOt9uKR;FWz# z2G4SROd8nO$j1l#fl~zf5d^20-1Rzgh(qN!D;`_Btgw<7uVU1<@(+Q-yb#;Y>QB&u zrcKeT;2@8@iZ5w|93gnZ`gy`sJ+=Cp?G464q~O#s?XGdH&ry%grxaC>o4y%j^;uy& z=Ijh?Mp}XSy>}Dl8FZyv{k`Pftv%{Vixbc*|pP6hY3q=FJ zL3IB}WRTsLjd!evi1JOw=?;9)i=a8!L*Fo(Qn3Lb%LchG81`WaB@Vq<&dc;39}#G- zK{DCIyn4qs@aC<^ESuI%obqta0J9RQeW3wmW%O}|m7x171Sbh}eM>LYBcoDezs@Hi zJ0ph=r6~W>dr+nyj?@bB{6Y^685vWJ5-onkEU4Hsy~g6AT-nYf06yCiflnOCaF2MJHKq_dT&?6v+LjG b^dRB6*u8UN$44vb06iODC@blDzM}C@xhbT{ literal 0 HcmV?d00001 diff --git a/custom_components/fglair/brand/logo.png b/custom_components/fglair/brand/logo.png index 541cd307e81ed60a8a02629422b18cb3a5250bc9..b2c434c122e32e11c92d0d3ece1d92caf32d61e7 100644 GIT binary patch literal 1511 zcmc&!ZAepL6h8O5)-qQ!Bgv>cl#~eBvY;Q$ZP{X)_CX(-^x?|dKMDGnrE|MT5rbrX z5EWMTBZXKkWf10OTM}hClL{%)IZbI+wrlI-TGws8?-a6F{pf=(FXuhyaPEE1^PIyq zty`lO#wNuAfG{UpwH|;(E&&33tqK%M0VY{}SHkEP9EpJE%0ny&X#xF;)+DFeCFsEI?sn6xr-u#3-Fgwat{LuO!I2$qwNWyTbl~s*-M1>;qs=TRMcGq93AfXf%ayRpRWtK|@l{X& zw-(+FcCsljawD59@R~u|x9qlUt>MJbWeZo$B!Yvjcv{8TQNxZe6=h=bcAp`11Uds5m&jvXujxih=3_W7Y(*<_ z<;bZtA=sDW2-{0vBd%|oxB4*)tWaS9D&=8lSi$&a9|KPs0|Q$E6f-n1G62~UKrTtl z1fY5dCS5PYO1Kk1P9e!|Bqt9)XDIL@d5=V<1W-K~lN+K9j1s_@0O1wPGBn755+O**W81n=&L^ztFFP23z|+;wWt~$(69A;+V$=Wt diff --git a/custom_components/fglair/manifest.json b/custom_components/fglair/manifest.json index 1557c39..f65a0b9 100644 --- a/custom_components/fglair/manifest.json +++ b/custom_components/fglair/manifest.json @@ -1,7 +1,7 @@ { "domain": "fglair", "name": "FGLair (Fujitsu General)", - "codeowners": [], + "codeowners": ["@petr.polezhaev"], "config_flow": true, "documentation": "https://git.ratigorsk-12.ru/esphome/fgl-aircon", "integration_type": "device", diff --git a/docs/RELEASE_HA.md b/docs/RELEASE_HA.md index 9aa089a..2c738ab 100644 --- a/docs/RELEASE_HA.md +++ b/docs/RELEASE_HA.md @@ -39,25 +39,44 @@ twine upload dist/manylinux/* dist/*.tar.gz repair` внутри, но текущий `bdist_wheel`-хук отдаёт тег `py3-none-`, поэтому проверяйте итоговые теги вручную. -## 2. GitHub-зеркало и HACS +## 2. GitHub-зеркало и Custom Repositories HACS устанавливает интеграции только с публичных **GitHub**-репозиториев -(GitLab/Gitea не поддерживаются). Шаги: +(GitLab/Gitea не поддерживаются: https://hacs.xyz/docs/faq/other_git_providers/). +Публикация в default-репозиторий HACS не требуется — достаточно Custom +Repositories, но хостинг обязан быть GitHub. -* создать GitHub-зеркало (push mirror) и убедиться, что оно содержит - `custom_components/fglair/`, `hacs.json`, тег релиза; -* заполнить `codeowners` в `custom_components/fglair/manifest.json` - (GitHub-хендлы; сейчас пустой список); +```sh +# один раз: зеркало и перенос веток/тегов +git remote add github git@github.com:/fgl-aircon.git +git push --mirror github +``` + +После зеркала: + +* заполнить в настройках GitHub: Description, Topics + (`home-assistant`, `hacs`, `fujitsu`, `air-conditioner`), включить Issues + (эти пункты проверяет HACS Action; файлами они не настраиваются); +* проверить `codeowners` в `custom_components/fglair/manifest.json` — + сейчас `@petr.polezhaev`; для GitHub Action/HACS это должен быть реальный + GitHub-логин; * проверить `documentation`/`issue_tracker` в манифесте; * обновить `version` манифеста под номер тега (сейчас `0.1.0`, pyfglair — - `1.0.0`; синхронизируйте по вкусу — компонент и пакет версионируются - отдельно); + `1.0.0`; компонент и пакет версионируются отдельно); * заменить заглушки `custom_components/fglair/screenshots/step-N.png` реальными скриншотами (описания «что должно быть видно» — в README); -* заменить заглушки `custom_components/fglair/brand/{icon,logo}.png` - фирменными ассетами; +* заменить заглушки `custom_components/fglair/brand/*.png` фирменными + ассетами (сейчас — сгенерированные плейсхолдеры: icon/icon@2x/logo и + тёмные варианты); * создать git-тег (semver) в GitHub-зеркале — HACS покажет версию. +Файлы, которые HACS/hassfest проверяют у интеграции: `hacs.json`, +`custom_components/fglair/manifest.json` (domain/documentation/ +issue_tracker/codeowners/name/version), `custom_components/fglair/brand/icon.png`, +README/info.md, OSI-лицензия (`LICENSE`, MIT). Всё это в репозитории есть; +workflow `.github/workflows/{validate-hacs,hassfest}.yaml` включатся на +GitHub. + ## 3. Приёмка на живом стенде * `tests/acceptance/test_esphome_ha.py quick` — матрица изменений (HA; diff --git a/info.md b/info.md new file mode 100644 index 0000000..8770475 --- /dev/null +++ b/info.md @@ -0,0 +1,36 @@ +# FGLair — локальное управление кондиционерами Fujitsu General + +Интеграция Home Assistant для кондиционеров Fujitsu General (FGLair / Ayla) +**по локальной сети, без облака в рантайме**. Протокол и ядро — C++ +(`fgl-aircon`), доступ из HA — через python-пакет `pyfglair` (cffi). + +## Возможности + +* `climate`: режим (off/cool/dry/fan/heat/auto), скорость вентилятора, + swing (вертикальный и горизонтальный), preset ECO/BOOST, уставка 16–30 °C, + текущая температура; +* `switch`: economy, powerful, coil dry, min heat, outdoor low noise, + human det auto save, Wi-Fi LED, indoor fan control; +* `select`: положение заслонок, `sensor`: температура/код ошибки/состояние + связи, `binary_sensor`: connectivity и флаги op_status; +* настройка через облако FGLair (однократно), вручную или импортом + `config_*.json`; превью шаблона с ручными конверсиями; +* Repair при несовпадении LAN-ключа, диагностика и переводы en/ru. + +## Установка + +HACS работает только с публичными **GitHub**-репозиториями — используйте +GitHub-зеркало этого репозитория: + +1. HACS → ⋮ → **Custom repositories** → URL GitHub-зеркала, категория + **Integration** → Add → Download → перезапуск HA. +2. Либо вручную скопируйте `custom_components/fglair/` в + `/custom_components/`. + +Требуется пакет `pyfglair` (манифест ставит его из PyPI) и HA ≥ 2025.1 на +Linux x86_64/aarch64. + +![Обзор устройства](custom_components/fglair/screenshots/step-7.png) + +Подробная инструкция — в +[`custom_components/fglair/README.md`](custom_components/fglair/README.md). diff --git a/pyproject.toml b/pyproject.toml index 723722b..bf4f9cd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,5 @@ [build-system] -requires = ["setuptools>=68", "wheel"] +requires = ["setuptools>=77", "wheel"] build-backend = "setuptools.build_meta" [project] @@ -7,6 +7,8 @@ name = "pyfglair" version = "1.0.0" description = "Local control of Fujitsu General (FGLair/Ayla) air conditioners: cffi bindings to the fgl-aircon C++ core" readme = "README.md" +license = "MIT" +license-files = ["LICENSE"] requires-python = ">=3.10" dependencies = [ "cffi>=1.15",