# v2 git bundle 3f698d6e16927d777ea3b020d932b0cb41376dff refs/heads/bundle 3f698d6e16927d777ea3b020d932b0cb41376dff HEAD PACK xDtree 9dd93020524d69a7b0623881ba00f212990a179f author 不求圣剑 1760409840 +0800 committer 不求圣剑 1760409840 +0800 first commit 9? ?/5a:Uw,$$Ɨ%fZ[ !{K) , 3)椖E 61ʜx$40000 workflowsOG1Jzujhdx(100644 validate.ymldd!BD36x+Vxename: Validate on: push: pull_request: workflow_dispatch: jobs: validate: runs-on: ubuntu-latest name: Validate steps: - name: Checkout the repository uses: actions/checkout@v4 - name: HACS validation uses: hacs/action@main with: category: integration - name: Hassfest validation uses: home-assistant/actions/hassfest@master *xw# Python-generated files __pycache__/ *.py[oc] build/ dist/ wheels/ *.egg-info # Virtual environments .venv .DS_Store (c5x3.13 бx1 # 数据传输格式说明 ## 概述 Energy Monitor 系统使用 MQTT 协议进行数据传输,包含两个主要的通信方向: 1. **Home Assistant → 设备**: 发送数据获取请求 2. **设备 → Home Assistant**: 返回设备数据 ## 数据流图 ``` Home Assistant 集成 │ ▼ /data/data-get (请求) │ ▼ 设备端处理 │ ▼ /device/data (响应) │ ▼ Home Assistant 集成 │ ▼ 更新传感器状态 ``` ## 数据格式 ### 1. 数据获取请求 **主题**: `/data/data-get` **格式**: 纯文本 **内容**: `get_data` **频率**: 每秒5次(每0.2秒一次) ```bash 主题: /data/data-get 内容: get_data ``` ### 2. 设备数据响应 **主题**: `/device/data` **格式**: JSON **编码**: UTF-8 #### 完整数据格式 ```json { "solar_power": 1500.5, "home_power": 1200.0, "grid_import": 300.0, "grid_export": 0.0, "battery_charge": 200.0, "battery_discharge": 0.0, "battery_soc": 85.5 } ``` #### 字段说明 | 字段名 | 类型 | 单位 | 说明 | |--------|------|------|------| | `solar_power` | float | W | 太阳能发电功率 | | `home_power` | float | W | 家庭用电功率 | | `grid_import` | float | W | 从电网购买功率 | | `grid_export` | float | W | 向电网出售功率 | | `battery_charge` | float | W | 电池充电功率 | | `battery_discharge` | float | W | 电池放电功率 | | `battery_soc` | float | % | 电池电量百分比 | ## 使用示例 ### Python 设备端示例 ```python import json import paho.mqtt.client as mqtt def on_message(client, userdata, msg): if msg.topic == "/data/data-get": # 收到数据请求,发送设备数据 data = { "solar_power": 1500.5, "home_power": 1200.0, "grid_import": 300.0, "grid_export": 0.0, "battery_charge": 200.0, "battery_discharge": 0.0, "battery_soc": 85.5 } # 发送到 /device/data 主题 client.publish("/device/data", json.dumps(data)) # 设置 MQTT 客户端 client = mqtt.Client() client.on_message = on_message client.connect("192.168.0.101", 1883, 60) client.subscribe("/data/data-get") client.loop_forever() ``` ### 测试命令 使用 mosquitto 客户端测试: ```bash # 监听数据获取请求 mosquitto_sub -h 192.168.0.101 -t "/data/data-get" # 监听设备数据 mosquitto_sub -h 192.168.0.101 -t "/device/data" # 手动发送数据请求 mosquitto_pub -h 192.168.0.101 -t "/data/data-get" -m "get_data" # 手动发送设备数据 mosquitto_pub -h 192.168.0.101 -t "/device/data" -m '{"solar_power": 1500.5, "home_power": 1200.0}' ``` ## 注意事项 1. **JSON 格式**: 设备数据必须是有效的 JSON 格式 2. **数值类型**: 所有功率值应为数字类型(int 或 float) 3. **电量范围**: battery_soc 应在 0-100 之间 4. **功率单位**: 所有功率值单位为瓦特 (W) 5. **实时性**: 数据应尽可能实时更新 6. **错误处理**: 设备端应处理数据请求失败的情况 ## 数据验证 Home Assistant 集成会验证接收到的数据: - JSON 格式正确性 - 必需字段存在性 - 数值类型正确性 - 数值范围合理性 如果数据格式不正确,会在日志中记录警告信息。 ٽBx-MIT License Copyright (c) 2025 JackeryHome 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. qTAxY[S~_ёkl$wJV^&-\.i,hݢa'aAb`!f-˨['_?ltR!A4UNǻfeZ6'#StwrLܓ{z'㺞:a5⪒Bj:߆/=#x>d0SJH=ՐUx^(NҰҕެ)UG+ E_ Մ8-s 5n`LÍ8NYB]RcJx8u|ו]$noQ~{ 4oii)`\>{\͛CFWCXi|0yI'Z?l$ BGaX\_1ǖ]=8 6co?*kv>fА9Ǟr浐?NnztQ{i.v#[M%mmfq V>!`Q4'O`9gVpu4mulo?>~@r-X kwP}eZ,YAI2S?UQگȓϵI8:z[9Mj*鏞"\^6 5+f_! 0IH2Rt6ks?yCw>ёEZa3{e ĪkFy̝Ƚ$Q ! i鄜dl4d596rsbӐf!Y'Ƴ:HI\ÆuPѩi:[:L螬X\* V9B=$s>\Aƙ ]*? Ĝۡ" C$i1u{bZtnG2CK *-7ʣFOAEcTg`ܺ~ ~DGT|,Q\6 a9ti]d7̩%+̀O*c :ٌal%J"Zvi^B2tu(OKttG:ޛay<_„UDW*8wtdlAfeaY܆/*,1|P`KysnZ$w4/6y<ۆ'CW'ۖw`[(`loB/XCoXokp{eCB!g1tGC&{a@E{g\UhxRD%6ȜϨ6&$#12EO4psת{m ti`p%4zi~o]_HϧCS=/gYj]xQR'+5kCx)w>@mOttR2__1L?>@h TyO4`qqwHR-?±/N!F]HF?f0@Qp5ԚyJ8;[!$1.H}MCI좥a!EWmo83 !c`H0Ctah[O0}A%s[kDЃ 0]Q & DzBwg+oTgk.|ͣqK?H60Şu|Z[`[#&[%.tajxW3_+$-CY_1ib|n‰u 2]N! o債"d \ z }Cr` x f!֛@r|ޗ^0k[,\ĝ;mmbӴkI6vܥ\p]׏Pߺ2v `=ya;S?Ac]) ᗳ,{'Ht4p&dW# eKX1a3 mmVx ´q uH4oVx *;`r/׏HSz,@!+IBvws[e:>gN4i _|z`* nCþ-|% 7(hUcOI3JVkWsMѾkx=P! Z[%ԌGQ_]*⦽9 Io$s3#x&40000 JackeryHomeCx7/HpϏo7K-ţx340031QrutuMaڰ[gWvm 2(,+dxkq&U_&]U_R}md',-UZ\U`}GbN_V;^<UXW_2}=^na_=;O+)*)K//=cr' |41ļĒb;?wLظ\paHk9b$wI֮#Dj"ǻ,F4! /Gaq~tclϟQ]j%AGsV5ɐπ!1 *3n4Y [AքWHKCNMIJE4lk X5^VAM60<6f0L(_B'\m R+ p;ܳK'6ط哃Bd fyZaY'.ے&t228$>;4iuơo7p5Baz13NKxkr Ł& 9VD?4%= Oc*솄,-X <}J>ȓ(,2FxRMk0W2aBҴIv AhْeJ(2; zeK Ϳ_Tҭ0<0T4\KfK nɄA;x>$JC,P `R<"LhYUKt}bKh9v5 ^wcͲ B r=?bkLy0B;Հ$Nv74? BfS HtZSתj=ހg/୔q C!O7?,k NK_U<}.Bp]ӃۉPV|84.-f6QRo4jF4v-gOƒEJPmxGU|99zHvw: N̳?MXy2%`rƵ\Ēki9liғ?U|gtn6^_5}kGr~*S¯!t㍫wx}UOo0SXaT TmeL%Nkؙ0R i\!@8ķ~gI ;1M1AQ"ՑPIhGҌq bR ڃԢCd{ɒ<9@B<+1`)FB!`hlsƅ8{K9Icb L>|2_?o~_Zx;lib ȱ9%g9$vD 3D3fhkLΡhƀИUbc5԰YSE)Ms"``4K YnvZS׸ Vgz 3seib0KP,b݊˝^ wZ{ *85p.8>+:m9{(еuZlϾŒy"JgpiHc:T(CKx! D~.zC]ij{"3ɴb9mbt.A x$U5¬李;W;a4,-D N̟&aci)q r8DXGn,l*qd9 Sm'KVpԽ jWs±Ϣs1?9~xs4#N31 ljC29K+ӝrwQ= ?%$-4 !?O }owﴻ2:A,{o}bͧaG!~_='na* ˜8QϯA(^j~ 6{M҄+`g>ıU\#I8En;>TBPDwl#qIn@åK:"7pev~mٰ_ҌIȅ=3RHSDR!u&yuhYiw2=7Lcr*q8̓" +`mf6uhb_MJN?U(LW!VOlwԶ˅k$9u;{áC$Y_~sWoN..Q f;:Lt Vo|}u[WNm>NX~r/Ol}߿!z-bIlYmQYq]qqv'M8b =gD/֞7޴v[{v) 8qdϛohᆰ_ꂼ)ȏ* IO0f3D^LAK ;UQ(r~ ceI`ZQ.u盏%Lm!o\K=)0,LijgyڳhaNǵ rbew{ˣ߆iYa NXmE2x`izrdegi2踱)`ɴTމ.^Vy dU)QwfPMm/:c~3( =6HԭACͮ#cuډI}4haY|q=|#c`,e Aa42Ry|ä zhIB=Y6Uɨm-q×V!w!JR*@LapLYnDC izN+^!0##rVĵNNRFzcǿʮ('1)=E+ A<(#2"Kɉ;~2ub(5uiń1{UnrԼ2cK:r ǽ)` R0 7n} :(J[lgŶ@m|lpV'MVnpz65;=3m- ~x%o@XX.wRzo!  !vgut"a,uf$v~jFu61{xv6%Y_E$$+^RFcs[\ůDV6l}4 ~ơGm7^Xcn+3= k2ɟM9'àg睰Eba$ya^cl/W*0&yob]R M=Qд>c+I.^#>glI #, O Q8$v(KEy )4lhs LDZAHBs*ϯ|0$+2C֓+_?Á[TBH:3VxijXz).ivʖ0V9lkw 0pu[;W(Q&RN'|kI}p#QUOQGU8E:O%* NN:4<)EhrҰdWg`eU`(ˁboĕ1]`kNmM+kApD,?*CRf2%8R.wSQ} 94K=wI8:R9 9s¼xn[1eN]G :\x3L!f)T!)}m<ȆN?#NKƔ-*- j]F O^|qupa=.ǯn=X?`ƹ/|G5iP,9zeVq0g[ .C9r1o55YHlB:-16+N\6 DF;* ^X<̰ܝC-"Y}tap6D6Xbz7?wXtBlH.qPV)嶄}pkN1þ/<aa:*҆t@šP+3;׍ aipأ,b]lHS8ƳZ*:3]>/e#/uZJY3bR"0\89x/T~k9|/P>pƂ0 wTxRt%+j0,V\Z"--N-˔d^>߻N+19;#?7UISyJjqrQfAIf~HӋu@|CBrь4<ٽYgShlׄ'>[lg밚Xy'd&eV,ŰM C_-v^-rԢ|@QJ)JMLniQj أ뗾c !Ĥ!k o֨x(100644 zh-Hans.jsonkswέKqT ]xXmSOusvksgnR:M;kCz:ɒ+ɹ0fq..NB Jz z9 %cI+_Z޵dz [aE˼:W~QCx}Xy[ճ٘{Z'j+ґ8|tl ] y?x'kSô-Co .lwB W#YVAsYNXXN!x]Rgo:ӝ"e:?  };2>,ʠ%>kW4hlaX'|9Z̫gu 9Mw{0:,w5_\&9|[bREM )/eʷI\ʧ}/}1ps7Q%C,Q_hiGǖ` ɌrIN kʈBfkl*Dp_:/j/aE J7iȧ`S ҙ]?̢`-Zyяqƒ [䭑H3HuK26 VDGo7|{4' ʘf(9)F'㡰o65g٧ Iq!ͤYXߛ,tasZ$$Z9BUPH[WZSQйS8[T&ĦA?ԗMV@Elv6Y 1vVo2qm`(~ۭ0S")y,Ed~'ҩ ro:lDO:Bt%m}*|^gvJy9ކ3<8z07SUip3/uP1\ Ӣ2J3s{u˭oWvcT3N qSStX=(;jPgq"Jv{Ԕ[:#066ÏBEvT1󤡚Tmc|ק c``߽7,,;sOC膍F ~Ԑnُ>­} &E]2¡60V:PZ ;$&%Hz3% ;|Ж8W_~dE=A'S"E<櫈\ܻvD .B,H|} ]P!`jzw->܌Ÿx܅QGOU#*%CO!UtE6pkS3X(i5Jpb|`@o}^E>'0LySk  ?/~7c2"YhDb؆BPֲnH0f+Lo%5wo(z9ow)OZmo844:Aaap_$S;@a8^"gW'İ1W"Fpfm̀TsNt-fُH"bSseޢs6fcl;Hߕ+g{lW Uxm6M;啈f/)X6}5jXt!`J¡H1Z2 ԧ&; =A{ =Z ƃqw{z"` Y'tNl'<6d(fǢY,ؑo#~adpgP`< M#qg aUW4m,aZ6f/ Jq9xno7c0"Qjl.:>a~97#dtraC< 7kJ>ΟUl~ep9/NWD.Vw7?C%!CD DRcy3 r0YqAw5t(~#B:5X}s^iP3ԲT(]FUrV{ TrGfU}Jjօ '3.lݾi Ҿۛ(ЊxNZW`4;,Y&%fZd]xSMKA ,kbA9&=2$Ό@ V+-UJCŖB*q=On-t3>/n8r[1h<([ xWE_*Bn@M6R=FH%S|J-{[B896|a( fr% +B fe ї3b LQL QUP4PQ\^D1s&N+FʝQ+-6oZܵYW* ĶQkL0D+&7uPE&*H%#%̸AR>xǡz>_?O6K;f(&|kd1WUO?.kϝˣEwi]jmH)'l˙0VW0rwybzƝߺnMJOT"L)&*1-<o7-k,dGehPs: 7S}:zMO!C\Y1G<ۺ/&$(uӠ퓻EN0:t`F0 d(UMAO2fn@Mʵ*! q`M'.a]ұko.9;P[~$xMlKt%ijr #wN ݍ㷗GTx&KD60\_Cg2AzB@Jh(;.xJ1yH+ f f3!ɲW@"(A[Q%xL0X`| tpZ LPAg!p $F<(g\N˻ϫE #T,n[MMH}ڠRYy'\](u(z_h-f5]-w'o"h"B7WSy=epR 㴔O|<|1:OJmǮ;-Ojf( PEV_CYD2aʿg^vwv}>^ݙyo<@OSmzNձfW6,gpwϽ7~!'jV7dW?ql8is4טŎɈӵ-ߣFp}lK[ 4FQo`.[Nʠ[粮@>VZk>shTht)gLkbRK,= Μ;=n=yf| <1ʢ7|7&W=%$ͱttʨaոlZb^cRU ۫OM;{P_}ۼYh\bF4huM˷ʨe[mVFQFu0 fQRjʸ|O1C˘ğEB̧E(Mج$+sIYQAk }gք]e֠dYc0lOnާ mQҝ"J;=wHHn-7C,խt8̘9tX[m{3תM C9#ǧsɇК= j8GT֍O?KOIaM&~?.#eۉ-ph6\Τhgᬸ,1^lҔEۼQhRwjkbꗲH%#wA('7{{_~Vэvw^i rbI:Դ-e,u"b Xڄ8df %v1PO]"zob ƭCVVXea2跐6t2ʛ\NGjhayog.(4ayE͎wScT`h5BH%>}̼iQ1HWH̆Bɫà:R>D&Y%n2k >i]TA'O~xf[`u#qMIӔ`~BhB s>P<C+$$E ׆@>~M"ǹ^69{ >#ƬE`/#yJʽj *u2ȐOǢ!n kyKk_ `+,p_ˣjz/y5㛽Z|"قX5!!__)i0?\k\K{[2|}T~(%*E`p\$E[őڄ%il9cӴтIiN&dzDhSCycӎ<@4r‚|E1?ӫCtG<{z/:0T/e ቃ=/g\ޯDjj7v6qS(1t0F4s%IIfh:R3)9E,5xv"@`8 ,,O^5wZ'_YOzE8Ά1v{yU\CQ~J""/r#~u%˴y&汚0T~?;U<YDžnac+xzog'V< ԅDsW%<0|'A, HFJxУ>fq`9 0</L%QiD_jX׊7J(nab᣿mgLHˉHUH#Ҭ{< iiʨP=A%Cb繴3Ї0SdJ%9 Vւ[b Ҋk~NԯX%D[V=mXN-+`X+#K'\ufQRH0(oʑLؤvF|P4d[F!tV{hKփ6XJ:_vϕ <Y˟H/؉gJ/KV;_.;A|^duuo|t&6h4JTqxo0LS;1Mu~ ~)2zVm.]ڻxVSW~߿qFӱQ:f0ì6vIc4`H8jM+6-*eyBr.yis%/G| xL) g{ Ziȓ.5hgNZ # phؿw )0Zuض5k^elvWj7J0}AX 1?5hn F[ygO?Y^`*i{gP=iPT` vZqȘPV<3A]Bb8̉RHxw?)"c㞑iZXz+FYᕤ!h<$>~DW |y3蔆Na0CynMwpwl?̚B~w9|@s=mx,&*:58,+:]6ie%o4WyYb .Z&6M(;U^Z!$0>=eg?` x,-%ARdiJ1^ÂжqCA m(,Sl(i6# нA &=_v3t@oP!ӲuBMn{@SzcV9hgP XyROCSe;K9Kp^dSt~TߓX`.{{rSwt٤|PuRrZ2N1QOu~MKBRBDvz )ԳLȣ#r8L&\tKƯU^I" ^1[UבFqo+L[K 5wj;98b!) xQ[project] name = "home-assistant-demo-mqtt" version = "0.1.0" description = "Add your description here" requires-python = ">=3.13" dependencies = [ "paho-mqtt>=2.1.0", ] 7