From 246b50d1be8eb83d2120b9dd3671b62ba0b22685 Mon Sep 17 00:00:00 2001 From: proddy Date: Thu, 17 May 2018 12:22:27 +0200 Subject: [PATCH] added boiler stats to MQTT --- README.md | 64 +++++++++++++++++++++++-------------------- doc/ha/ha.JPG | Bin 26776 -> 0 bytes doc/ha/ha.png | Bin 0 -> 59098 bytes doc/ha/ha_notify.jpg | Bin 0 -> 9701 bytes src/boiler.ino | 64 +++++++++++++++++++++++++++++-------------- src/ems.cpp | 6 ++-- 6 files changed, 82 insertions(+), 52 deletions(-) delete mode 100644 doc/ha/ha.JPG create mode 100644 doc/ha/ha.png create mode 100644 doc/ha/ha_notify.jpg diff --git a/README.md b/README.md index c18af91cb..6e7bf5f38 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ EMS-ESP-Boiler is an implementation of the EMS bridge protocol (Energy Managemen ## Introduction -I originally started this project with the intention to build my own smart thermostat for my Nefit Trendline boiler and control it via Home Assistant. When I started deciphering the boiler EMS codes I began adding new features such as timing how long the shower was running for and triggering an alarm (actually a shot of cold water!) after a certain duration. This to the delight of my two teenage daughters :-) +I originally started this project with the intention to build my own smart thermostat for my Nefit Trendline boiler and control it via [Home Assistant](https://www.home-assistant.io/). When I started deciphering the boiler EMS codes I began adding new features such as timing how long the shower was running for and triggering an alarm (actually a shot of cold water!) after a certain duration. This to the delight of my two teenage daughters :-) ## Which Boilers are supported? @@ -45,7 +45,7 @@ First, a big thanks and appreciation to the following people and their projects **bbqkees** - Kees built a circuit and sample Arduino code to read from the EMS and push to Domoticz. His SMD circuit is available for purchase. Check it out at https://github.com/bbqkees/Nefit-Buderus-EMS-bus-Arduino-Domoticz - **susisstrolch** - Probably the first working version of the EMS bridge circuit designed for the ESP8266. I borrowed his schematic and code logic. https://github.com/susisstrolch/EMS-ESP12 + **susisstrolch** - Probably the first working version of the EMS bridge circuit designed for the ESP8266. I borrowed Juergen's schematic and code logic. https://github.com/susisstrolch/EMS-ESP12 **EMS Wiki** - A reference for decoding the EMS telegrams (which I found not always 100% accurate). https://emswiki.thefischer.net/doku.php?id=wiki:ems:telegramme. Use Google Translate if you can't read German. @@ -57,7 +57,7 @@ I've tested the code and circuit with a Wemos D1 Mini, Wemos D1 Mini Pro, Nodemc ## Getting Started -1. Build the circuit (or purchase a ready built one from Kees via his [GitHub](https://github.com/bbqkees/Nefit-Buderus-EMS-bus-Arduino-Domoticz) page or the [Domoticz forum](http://www.domoticz.com/forum/viewtopic.php?f=22&t=22079&start=20)). +1. Build the circuit (or purchase a ready built one from bbqkees via his [GitHub](https://github.com/bbqkees/Nefit-Buderus-EMS-bus-Arduino-Domoticz) page or the [Domoticz forum](http://www.domoticz.com/forum/viewtopic.php?f=22&t=22079&start=20)). 2. Connect the EMS to the circuit and the RX/TX to the ESP8266 on pins D7 and D8. The EMS connection can either be the 12-15V AC direct from the EMS (split from the Thermostat if you have one) or from the Service Jack at the front. Again bbqkees has a nice explanation [here](https://github.com/bbqkees/Nefit-Buderus-EMS-bus-Arduino-Domoticz/tree/master/Documentation). 3. Optionally connect the three LEDs to show RX and TX traffic and Error codes to pins D1, D2, D3 respectively. I use 220 Ohm pull-down resistors. The pins are configurable in ``boiler.ino``. See the explanation below in the **code** section. 3. Build and upload the firmware to an ESP8266 device. Make sure you set the MQTT and WiFi credentials. If you're not using MQTT leave the MQTT_IP blank. The firmware supports OTA too and the default hostname is 'boiler' or 'boiler.' depending on the mdns resolve. @@ -95,7 +95,7 @@ You can issue commands directly to the bus using 'r' and some other examples I p ## Building the Circuit -The EMS circuit is really all credit to the hard work many people have done before me, noticeably Juergen with his ESP8266 [version](https://github.com/susisstrolch/EMS-ESP8266_12-PCB/tree/newmaster/Schematics/EMS-ESP8266-12). +The EMS circuit is really all credit to the hard work many people have done before me, noticeably *susisstrolch* with his ESP8266 [version](https://github.com/susisstrolch/EMS-ESP8266_12-PCB/tree/newmaster/Schematics/EMS-ESP8266-12). I've included a prototype boards you can build yourself on a breadboard. One for only Reading values from the Boiler and a second with the inclusion of the Write logic to send commands. @@ -118,7 +118,7 @@ Here's a pretty rough example circuit using a NodeMcu2 with the additional LEDs ![Breadboard](doc/schematics/breadboard.png) -The nicest solution ultimately is to purchase a ready made circuit from [Kees](http://www.domoticz.com/forum/memberlist.php?mode=viewprofile&u=1736). Here's an example of one working with a Wemos D1 Mini: +The nicest solution ultimately is to purchase a ready made circuit from [bbqkees](http://www.domoticz.com/forum/memberlist.php?mode=viewprofile&u=1736). Here's an example of one working with a Wemos D1 Mini: ![WemosD1](doc/schematics/wemos_kees.png) @@ -153,7 +153,7 @@ Each device has a unique ID. The Boiler (MC10) has an ID of 0x08 and also referred to as the Bus Master. -My thermostat, which is a Moduline 300 uses the RC20 format and has an ID 0x17. If you're using an RC30 or RC35 type thermostat use 0x10 and make adjustments in the code as appropriate. Kees did a nice write-up on his github page [here](https://github.com/bbqkees/Nefit-Buderus-EMS-bus-Arduino-Domoticz/blob/master/README.md). +My thermostat, which is a Moduline 300 uses the RC20 format and has an ID 0x17. If you're using an RC30 or RC35 type thermostat use 0x10 and make adjustments in the code as appropriate. bbqkees did a nice write-up on his github page [here](https://github.com/bbqkees/Nefit-Buderus-EMS-bus-Arduino-Domoticz/blob/master/README.md). Our circuit acts as a service device and uses a special reserved ID of 0x0B (called a service key). @@ -228,6 +228,8 @@ When doing a write request, the 7th bit is masked in the ``[dest]``. After a wri When the ESP8266 boots it will send a start signal via MQTT. This is picked up by Home Assistant it sends me a notification informing me that the device has booted. Useful for knowing when the ESP gets reset - it can happen. +I'm using the standard PubSubClient client so make sure you set -DMQTT_MAX_PACKET_SIZE=512 as the default package size is 128 and our JSON messages are around 220 bytes. + I run Mosquitto on my Raspberry PI 3. The temperature values of the thermostat are sent as a JSON object using @@ -251,16 +253,14 @@ Assuming you've setup up MQTT as I did, this is what my HA configuration looks l **sensors.yaml** - platform: mqtt - state_topic: 'home/boiler/thermostat' + state_topic: 'home/boiler/thermostat_currtemp' name: 'Boiler Thermostat Current Temperature' unit_of_measurement: '°C' - value_template: '{{ value_json.currtemp }}' - platform: mqtt - state_topic: 'home/boiler/thermostat' + state_topic: 'home/boiler/thermostat_seltemp' name: 'Boiler Thermostat Set Temperature' unit_of_measurement: '°C' - value_template: '{{ value_json.seltemp }}' - platform: template sensors: @@ -277,6 +277,12 @@ Assuming you've setup up MQTT as I did, this is what my HA configuration looks l showertime_time: value_template: '{{ as_timestamp(states.sensor.last_shower_duration.last_updated) | int | timestamp_custom("%-I:%M %P on %a %-d %b") }}' + - platform: mqtt + state_topic: 'home/boiler/boiler_data' + name: 'Warm Water current temperature' + unit_of_measurement: '°C' + value_template: '{{ value_json.wWCurTmp }}' + **automations.yaml** - id: thermostat_temp @@ -319,33 +325,33 @@ Assuming you've setup up MQTT as I did, this is what my HA configuration looks l **groups.yaml** + boiler: + name: Boiler + view: no + entities: + - sensor.boiler_boottime + - sensor.warm_water_current_temperature + + shower: + name: Shower + view: no + entities: + - sensor.last_shower_duration + - sensor.showertime_time + thermostat: name: Thermostat view: no entities: - - sensor.boiler_thermostat_current_temperature - - sensor.boiler_thermostat_set_temperature + - sensor.thermostat_current_temperature + - sensor.thermostat_set_temperature - input_number.thermostat_temp -**customize.yaml** - - sensor.boiler_boottime: - friendly_name: Boot time - icon: mdi:clock-start - - sensor.showertime_time: - friendly_name: 'Last shower' - icon: mdi:timelapse - - sensor.boiler_thermostat_current_temperature: - friendly_name: 'Current room temperature' - - sensor.boiler_thermostat_set_temperature: - friendly_name: 'Set thermostat temperature' - And in Home Assistant looks like: - ![Home Assistant panel)](doc/ha/ha.JPG) +![Home Assistant panel)](doc/ha/ha.png) + +![Home Assistant iPhone notify)](doc/ha/ha_notify.JPG) # Building the Firmware diff --git a/doc/ha/ha.JPG b/doc/ha/ha.JPG deleted file mode 100644 index f294640bda6dbf73975645668fb1d286c8dc347a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26776 zcmeHv1z1(vy7nX&jUWh0N(j>3t(1s#E&+i>v*>O`5f?}bNOzaS0!itV?v{{}ZpnY? z-n#d5?!EuH`+f&;pGB=h=@PZe{c$nh;O+4;uQZsO3$w`|3csw0>2RWg}^Ta{y>0>gHu3=gI9=? zo0^MTh=)^%hXeS}o&kU|U|tdr z2w@Nx!^IMD6LN#vK~0yL3gPC4@bhvCaG7!%(fr;# z#Q10HcFqpg-`j>5vzu6(Kuv6%91&=6veU5t*6Dv$n+S-0Hu|5!j~FAOjLh{SFSz~^0)MISFX{RP*Iz>5FBSeJUH_NC^#{o{u|Y6fR|JKnXjo=tq#Q4{62uO)<-6SO@B_X3^xJ^buPeDRT!$w2Tc$b-l`4%-hH#-v- z0~0gTw@Q#e7#LWXSVY*^L`>wQSXpL{+2HZCLp<+ow| z9NFKDivTe$WK>iXRM59^AtAdW0tx{t+HFpBLP-^nq5X9luBRA8QsJp3jhM9DsyoC+ z4g**>=y>MocfSqo`^f%#1AF!ljqK;Z{utLJfP;dBczGxUfH-h0#F*xX^?yhpa-_Mt z=!kaS%dBuF#J(-QEZ$Vwe(oiC1?Z`Lh0Ud4B~SEU0q$1-=OvM^*}aRE^Y#;sYDVPj zBPa1$-;cg8sD9=X+rWU_i$wh6`U)t@J#V!g1+IY5K=ChmzMSBLp9Ovt z{5Qo&@i|vOd(#zAb)l%19~XM=#eSANJR$@zrop}k#I&Qj<~yc-X;k?I@NI9QIvf#y zTX+gcx#TjuE9U9nt~J?3?uA;(@3MY)S%CKO-IT6uHhuRynW@;DeW;6Ri?D-Sh_<1- zfv}1KAG#am$ckn?-XQ!0+%kvfCF`5Yd&ZMlC}!oJEWolO(B>eTgPi06&X4BSVh3n2YK_HO79&1d?2TZY4tMrOG6iY(1P*S6U6Ds!D*YRaj zf<1PZw7ZnK`CbgW72yk1G zL{17uhf^cv8>9)VS^9xX%%K4{cWfPNz|-P0>b? z>H%Zhi8^v-o!tz#1ckZ}<3Q$4$u7BTo>MsH+vzuk&nX@a^1G}B56+y#%a!h|TUGMI zs;vVdLa z26*L)*$iKqhSO>`<+gFjwYje)ge+9%<2Ob}AL(NbER;VJP}@+UD9J&gM`GCJt&%_^ zQu!YZH>-aNebt}lLJBgB@q0j}+T8_RI4dnP`@94FX&FL(U-Kd0*5jDS#}>CLs#1bp zaw(xl`WV7wM8Srr$i5S;E^m}UOmlcn1fOc=aHa}dZp5@Ze_Uf*`|Kde*4ywoL>M+S zcFt?IAdb_Ws^2N%Qkuss!h+(LLC}fnLXocz0~&Vm{hj&<+Rbf})p1nLm@+BNI5u~w{H87&%ybJ8e z7D=~<(}pjHd^6YW8Q!oTbcfziO`c{z>#xQf8dsPf70i>VS&I_V#9ZH(zyqWY-HF^@>4vQ!D}ULz)5v^eV%L>>JCa zlv=SzH5rv>;}h?%*JO(dX{`TTZ5Z?Lb2oNzgbbpR`9`)xW@h+Gi#S7%s#o9!h{?#5 z5tmrtS~{_9S_Q)|=aDDloQUA!5EMjx;wW)rHR~Q@9BP!tuuuTfa6Znde}`CG^8e<` zp$0Ju=Vs!0p&k|#T=}jOMO;k+FYO&`t%^u>Pf?=#{ETLkLds{l#7!Lul?bI6ZVvLN z3C=W?2-M?Qo-yjn;4~7IU}U~(Pa%)ol*dUkC)ChVUMB^q7I3fQQ=i=eyoof-53w!a zcQgnk6(?p3H1-Y+4f?SR{7wi|)OjhC&cwDK`FHM%%{VUE%)CynaqWBL zv&`A9>#sBRq0|NnO&wx)W)4dEe7kJ#Dc1YWJF=3YZ(UPxEt#>tv|ItE98%SMnW7tE zU-xwG({M?|wmptTcHSV3^bZ~_O7=$2&IZrvl(@0c63WO?hsn5uG6C)1WeXu+sTr2O zlhMb7?)qAh&aCzPHofi4N&ZFLFyI4XuKY8yiPB7X*Nc1C=X9#1eVw2vpR`tmPj640XEYaXc`~}I{%JE;`O+qplmCb4`w6Q zi&eo+vw{Yxj3N)XXhzlRwdM#u ztY?P`YsXkAWu$Kb5Zyv{S}Bi!H%Ot0%TT%w6Edcn6{Z5Rk|;(}4Dj1U z3uI=^k5>0|x1GbbTWeMvH+uCzeF=`Rt@C@f#4FEc$rP+ID;4w*Qz`ZCjop&?_H+JxWwy*X5dBf7UUjEQ-;kV!_R>Bqketrh>q2&8#Xst5^ zard|9-}4%68={r*K(B*~uv${KC2!N^`S%HY8p}|TpmaW>kZG5Ps!0v8X|Tf4g`hz) zDx;XR1nspwdF@K#?Vf3xUP=~m8KlCrCMYz8DK4ex|oIUXJCw7)E7Q8|#GcaG@XY>B*~6tj%tm_QYO zQujz8S(n=lwx|-(_izN2HJ!EIv^1KqZv|Q79x#D2w9Y)pn1au))R z!3RghvWQU)dUJ82u+^o`8BFsf+r)vTE%(S=2@KzGP`&p)k1?u~6?vkNdtziYBX011 z#ObJRgl6#58PBYafQq% zrK2{j@Q%JZ7jy&rVeTs3yL3PNVoiT6Rnd6zFoun7l*#nbReNpnoZqJ#T zt;o)(-IGqy&8&>a6gE|l*+LnVa5?xI;QeL5JO!U`c&WZ(fVajokzcK1!GC3qc^9t}Qj2jh|qyK$Xd@JpF62R;R-{!7Fx$_met zrOZ#U>EAXUO{sGkVUHVV>hQ`%KZ+-VsLHirwn;2zIwdhz44PHL#i(}<;tF$KH}z1I zO}|Zu`ub2VV?TJS4M~4wXh4D-X&5d_+jJ`P+7Ue;XN-V9(VaMW3~Gg8bM5WO72sL! z$KBA#AOIYwHrw()HK`b6-A=FMgA#Gdl1bX-kpPTg$c1Y)#5IUcJrvT+yztMTTD|2v zk!EbIvpBe1s`Ez9YvhbuCQ&GAM5SE3bMA@Tli&fyv6Ao1s|J75wg=U-ynyL^gAv zpRKyk8Iu?@9Lm@YC`LQq#WarIwvKLzrbg!6+smGs zg}>%IjjfIrrGz!_ELVwT9_6#D5><|{kkhxAKN}%!#Y58+=Qx?%sXK#im ztkPU)#@Hxj8GAe^|MZ76>X3mgJm4@~0-Wz+1LO!6YZ1OpotOwJL-+ z8d6Sh`I$5fo5UF;tc1c4@&>6yT5D)~^H5O?dx~M7IuRxPnk4l%@;PGUhs8uzlUWLP zUy{#Iza%xXAU~Q{C$wUsBGyryAIL8tk>Y#X5JuV_w}*-2DbdTN?JBTkFG1#{X%k*3 zn@<)PH@MKXKJu*3%Hg^P#N?4mtQ_t8J86Sn3MK`Xr$zDBW%Ru<956#BKQh|eF{qzC zf_FQ3kcy=tt3Gt4yJ&5h#Ls%J0K%zsE830}=J!CvTL#($vk=Kb%kOl%=jX;~r03^u z2_RCD{vHrYsvo+kL%%;}+xI*NG13}XyY{X+{~&4{^Juk;4SqxyR&ok*ZE;)N@%bGw zW*w(5u8cVqqwDCp5~N}F>k5=&Q5&aoFVQpIZ=`3>bY@$Iv9(kM+u&67wyQO>!;PBf zlL@e6Z!+|kA9)4TmA-3jMj0yx#!Q65f>zcYhM&iMUgdAbWIw;NF9X@X)h=6EUh~A^ zmVKYWW78Usz5yo%MfB#43hoG%H#FD0* z8~~nttCF;&8Ggza!5!R+7`)hgzI60A*QUC&XLJLcL(xz_!ctcJ?wJjiI8g}g+VDPy zze}3z`tpF*COK0f`$oJyh|)1}@YBV9@Yz@{f!9L+thD0-+1FJK$yus8hv8_-4Q)Zc#}9h*IrI81R`hf{Qb56+v8h zhssT>2j|O#yV9pU-tj3i+)A7$Zt=eRIzE8f%`pu1QyBMM}G3iFub$Bb^Z+89rl8 z??pB#O3K=!vYn$6GuF{4^E*?SIv-D+r?WptSd0a8Ze_?H;K5g<B>_=32?)an+3| z8KId9I7g$W2P(nQOa~bvucSb}{{XFoZ29+gDs1HPL0ef@U+Een-`L9ljch)BlS>=aqdh*-K?i)QJ>X4!D zCZa~R4;isl+%bV6^k$5A`rGJBA;Zm0_IC;HY9vtA1*}pDh%)!H6nq*gFf1zz?S6(z z&=$*J8RE|nm*gjCi#K6;V-{3fS|QJBqY8e%F{;7*x%lm+Cij4SB}ECWv1G_-4*%%J zEAQ;yXtg_e`(P0Rb4N<#GJ>E zi$?i=5$_D&DY)mJbO^zbf=mqe-591RBn&xck+7-`5Uh~oMWpi3R!DA!$YAUInR?}Q zsg{hch>Ly?IlS3qj=nk%MIt06+5M20#z%DvzGbq@U;S}w%zM4}A0GuC$B93i$rxhG z@~wRA9!3p$bAJp!MrC;Z(I*g{)21Gj2&wyoZ>l3%Jz|t>^je2fVsn*cW6?#~xLsPbS&2#%@IKPVlDH z)ySld3M9VL5PtijZ-_BhDuoS!`*yk$%?j?QEBYt`D;R+y@Jt_|T zP?dcJ%vD|i3ppq`X;r?P1_Zv2N>{)K+bf_|I&FZ_q99;I*aqYIP<+^@)LqF$6Su=k{t6~0cS^7z_|w1WIfI0a`F}6^II3v zesuxyB7ULpO&our@UKB(^e2BDGLBn!p7Z?twT_dt0cAJ)yORBz@*EHhClQ!#bUYL& zWZ&rc@PPqg$}jtqHai8&cOnciNtM1E?SG^mr}^DQC^he0d=>v@;r~5B>;MC@FJkeJ zmk{QDl^+R>E=J_!BZ&B12GK9#sg$K%F8eHrz^WS6~3DMxp8vshyC`BURI(tI&c_p-6+#!;`MvX|i%5Fuae zJBBcKr52ibDU`tBCk!l_qr0sX1ui|vX@0b~hfqC~L1x8nk#ak&fwg1B3uQ0jEn_;( zY^7Bq+Q(6pSM}NYYZZ)nXJ6*DyAn}-k zgj2XWbPzOz)gG00dEUXB8T@dk4>rI1;yAEYRxB`0k8{%`NI^%vOR}pB)GN1S#)DLq z?e$3{^4!|0|+#kFTZQmFo12$5cmZ7vqo58#_fAf zvo7b!GOdtv_VUWglbhx{lH|6$Z~ADN{PgN=N~(@R=*E*70^P3?PhdneORY2 z>={uL%uLqRC8|v=EL+uTcrGjVX_vvDofWv1d{o^`#*Wipn#?JGxh0sBHUzI@Z`D02 z{*+q|b(uZ=MD|7a)knu>CPo8Rh;noG&O6c`z~ZERfif}Wgi_J=L3O~E{Jhya6PSEj z)JxO5$Fjq)fdMbGjCCJEJr~cG%8C%)vxjAEJ9M_?grK)bv<&{ep4T6Xj*Nyo@6fgy zjK@8WlZ|Fm-RhFZ{>p#zYl9%|&9z{BL$E&GhqBTW-}&(^ryRIde0F(2*QDzNRgyZ? zOw2#BzaM?ne;2!H_RcVFNKk&eXuoRHjn@mNDAn64@4dOT<##n3FX{Q7)?WB;d}2ZD z#rJXBV=HZE+CKW;;Jh3$Iw=w-l3tiYQ(6!#mlB7M(A;w3DhPT5Z73`0TI|Og>6g6% z7?Aicg1%e<={YF1f0*IEn|gnkeE-=Ph5t`l)4$|~q$yT4A1{7Qe~n)&qBk^C4?73- zAz+3=YV9B1XRX;vgcP%&h&v+$RYc{A=k$VsW_z|F%p?{!x2{Agm%`p~+jP*zFW zXHU zucQyT1^Ybvi7Xs@MoFbY=l(lISLbRg7iHwHHoznaxfWO&uTy5etOnx2ikFXkLCFZ+1m=Ny`vFQvY^1~q`!WHl>gj*j0q!@2R;_=-CEYH?6%fLbtoFXzidCU^vJ~Yr--z*^ zSqKJ7XdCy6$OY&Hkyh z)}Ep$m5VySMcfI8(>}pYM?&Pu9&_sN&PYski5C?q5%7$pCjq7}dIvey?V6MC&HAzY z#7?6ajtvze{ahE*El)3}zRAG0K`e_>MN{x6=N4l9-peUvdEG%Jj(glvD;A{A0)~C5 z+Y&eao{H{2=I5>JzOIkVR`hiHcsmfXsrpe~06-d!kU*LBV^z_v@S%q-&9pmbTi)R3 z3&%{FG>?|Q#ht(v7~2fVB?XB%FpUNkG#2S}+Cy=60<+z2GDsBMe1w0K2PswBOtGLX zu5@kmsFL5&E6enSmPvJ`)J6;53_5r+SO279wCmCwH*sn7sFcN3tAvRZ8v9Pd`kis} zU3&GWNeCtSum-MyW~gkre8w}YfbbRzA~ILOMiCooJ0y|tp)pvd?GTv-#KrLxp@Z)F9tF}pp=3Dg7=?J=+KF(#5qzI(m!w^LEfWamH z8H*2=&}<>z%d{CwEs1iMwfA|4#tBF#5oqogbuU(4l-q*VbrY+ut=ZaDKGin8Eo`VX zUz6NbhoU=}GR6Z=41Pz|vOz5>i%M1#XJ zu2C^ycie2XeWapbkUVn*puHVdtix-9F&5xH%eT}l^vu+oOov*0a%-k+eG_~MH-!P8 zd7%1B+7=#y1MFfG$nCge$tW2dXpcz=r7BZ zh20O-wB~;+GYWFp!~D|AJb=(+3zzLgm96?v1}w@MnbvbzV(s#2yE`H+n0)Cn8(}$it0&V=s~k=r zOtAEw+S2uy4NAblT%Xf zQQk372ox2;fc@5;9+kyOcc~Vrx&S@MaYUbYRV!` zafy=5s)M3@q|#hh?pZQF1Qi|QQIi^q%jl<-WEq4{z?u`J=5^Z8L3|JtOYzY_N|~qG zb4G*1A{uJa{@q4^{CbFcz;P4b(UA{>6)sUmbR}nJMqr9~)y1?)Fn}MkJd^mgv)5{H zH3d&?0X-C&cj7a$bpRihF5Il`xe4E&mZ3A?wglwAI);I0Vasq`|4{F#U z6<-#D(aC$GFavDC&p(=*S*v@`vI3t1UXCjBm8y0;e=LlPqJRA68*t3PJ zVBoyPaCnK55v8Z-AU>BTeqeq^2+WFmhyghxI`w*?OZ{9LFN#oAd7oaMDwg>G@v?VQOEug~H#WvmBik_gzBvPc^K|q-1PyvB(sm}X zKDq|cV{$jK@?Osfs+&SJaeUj9fU|@LH|>`9mwL9c;Xz)pJY;aD-ZZ3SSdR=gzB6+1 z38|V*?x0v6@iJz3nv2)>I$bkn$*^C$Jy2brSe(07HdXb;&n0>>IrSjtzb$BgYtjAR z-m8zWBWOBLe*9e7V?B3*m}|N%kcfL1BPyMD3K1-)@_8|BeRXwhwZitMLX_s)zN~4m zEFrQ>%WEdaCsiVcbdi1n*WEmO1`m34t!k{ouYl{quZVBlFmq;a)Ig!5vRqwF!57#? zhkclwTvW)=)3c1}A&-;ZQ05LKm&xO#MwQZtp-X^JUNDWOQ*5}LUcyF69A+$sURFdi zyPE6h3XH^NpjbkgCU7JL76prrU_h~}u~m*P8B}VLEQgFNEs0}YZpqH=%j1K{%9piT zxq8zR`id4g(x6EC#QZ*ZKQUvMU(|*qEqRi(GmkQwB9qR_(CxUb4(%RlmeDhR(mfAC zfnK4rl|nGWNBkc*BmO%##Xs8m$2P~mDc*~zcf?}b<)Zshvo;K_v7U5ytg2i374#NOt{{*00OReQi!_cX^Gu^ zCb;PT=w1DYncI!|g);SzDwQ*)TwG5R$N>d%#OKrjmY=oGH(8O0dl(rLVA2(lK`{Od zpV~i6HYZ>GpQ57ah3oyR9;~C8PS~5QhuP{{)YDgfRtAq3KjQBN>O)>E)m%@eQAc zN3J(~lr5yrThbYO!3-`O9!rM>N_cKYO?z|A(XNx2U|~Hb^CIXLOPoNf)AH#z8T$l=Fqi^&uN}Pag4xs6d#H( z5QY;*=`@~=+dSR(AB=@&UL=jSiC1p^- zp@#;-T&Z<>e>-KZS*@hXjW%LF<=M(3ZyAAfvybw0jILYQuM5PsspH_r>2#E|JInc= z^GD#~jVfv`cU+$EhkVxfY?uab1aR7e!;{<(gcwme%k?N1j=`_)4A2HlZnZ54uae2d zQA3)dbh4rX-&6a)Y!mvlujl)`Jf82w$}FQZlLdoSBtA$XNc^tuL&Lq`bQc7$7@`hV zd5AUlwUa{NIp_S8)8L}NVtGXb^B09gbgPUrrOy3$Cy3eVNf`P~!R@%&p>tM>!`A1w zF5)fiq%*3~Yv4?&!6`Z8AIG1(Z=idJGR8ZHaGtPFTjjDiN+PM#6Ee5WfJgB%2fVHw zrIc@o4P{tHA**)D)2AA0nRE$ac;Pe^Pod~EN)i)ly-SzUAcaDU^T2h37Ole1!>L%! z1TVONtAImV+ROs&MKE9VtIv(7Mgl{0o5~#MN(>0c!8(4adOZepf~MVR3K}L$q>%wzzUm?z2fZ~z49bAa@-SeCBPMpx!W3xKAPRJ!vZi2B=9JjLj zMgKK|Y$ZjdR!%w9Y~GV~%+)*b+}LzFy5CU=Joy@0$vEZKO^_6uO;R`jv=623xW_%jC!Sf+g6@EX^&td-W20S%Vpg zEfA+3epT2Ov+p(YXH9$H*P5Sr3rfH>QW_DwEQ3gJz9{Pe>ID0QF?VS|tEL1#%!*r) z3dJ49eLbK=>P+V#AmUu)AwShT%RF4PWnFxye3-_+Gop87WpWkkjfupABkJ%FC7S9u zM&zt0mi@J`9#;s9Y1j=b@5W$vQA~0(3h({V!vB{|?*GB@k$5GEc~`$G>m*M>7*ixO zwDXL&c;aEQ&CKzo@BGwI=!4-gAL^;KxH1b5%|!bG0~v8oih8@3L)3&yMIhqhlBDQ$ zvrXf|-g<;5Veu=nmTIp`LW_NEd7LbU5VhoZV8>0gU76XT?9F4nSc|NpXRy1GiWIek zirlCnylfjD0J?kz=Yb|(^1^%eqC(@CM;}UI$Cn~oY%0i)&uiXKetxrwI^UGU?C>YL zp^TD~H#+$Oz8rfa70Py|V|1M^UakwlIAlCDn7w_ldlZzO^>|Hro-x$I7U_MImGR#M z?@@^?lCDYI8vfl=jYvf!Ub#Z?k*H{9>u?EAC*@GrT_9nRLfgj)aq!4Gf<>h~f}9EY zqc@NPW#23=AGh6v%t3ji%$Fu*mT0Lz?IR9js3>dCf!B4tNGep_D~<_X(RgRrsB+=q z)9&UX&U^fJ3*a`@)_OClo)mptSAW5{uQ-8l`11)boUn?{vckkh6L2yNxVObD^(LKB zOoy2(U7%NFz*SP3Nd3)!I%7$AHno04miJ+kvp zvKD2yMJ{iRWLCUt!hV|pAOA{?o6<|Z6vkO8HjLCipw0``7p3W8h?sSsl*I^ZuJj}) z^w~%IgzPR_XBpK8dlKS?a8_c6>&&9PcPkj-CW0R81P7;>fdImG5Db_`oCd0XT~U~Q z&l~c2KGq>47uAK@zk_;-V4Z2?pK*BEPku2dY2sL@ZBW`?fL&@rNX`?qnN+(a9#||> zWZNQ!Iv}Fpcoe^y0b3!pC>&?z*i3ka|5I>Rh6fW z6tbhqI{K75n=t`SLnhfbA3j``GVyLH0lYzygK#T;t5w}PI99;6?|AlJ3i##Tlr`Jb z{g>o-1q47@_G&6}W=L7s-JWM)1Dw`^$@?m!TkR?VN@bI;U)sjd`A1NhBi)R-`AJhN zpqAI(o;@-TeBYGMK{lsplIUGfHnnkYlDrPX?Epz-U!+!#Od_OCHv_ry$oUsVVW$t8 z()v1+dKdb-a2XBWzA?Gk4cThLf1Ct=HQ$G$tq(qN=slBUHnYl9B<`tejg%!#b^=#2 zGvdhONK&svaF5o}AeJ}qYg%=0erY|`sgLghdgclA&G*+S)zj3<-=;g82qVvT2mpKB zebN~x?!E6K*DLmB`>fKz8T?w;!o2!TrX}e8ya=YllWNE85zAX!{HJc>E8w}ZVrsAg zq%-&B^95BJ)qDYQPuzYnI}bJ1@(*Q`ng&5mT>6C{ftvlwD2ur){} zT;mdQ{=U3*Anpk!co&WK@Ru`7*EI{AApR{r zGc6o(*Bszs(2?l(sT~j`XH7k^C?<(q`if`*=J_?U@?_9HV9-J zK}Cwr>dK(-qF44*0V2XSagXgRDxwFay)7J5dYqCizKS{81P5PG5dzH&qWj=U-xuli z@89_wltCY1l*dSnxn!zyz9A;N8IMCkiW&`gEY~2k`n^1Q=!#-PO~?7!ins^SrCFJF z1C?>jodVZ6m(ClET_24oG@rV~KN^7S6vaCl=N82^?d@(R(Y+zXkboGzdUWypNku>Y zqo{T3)Pbk~jR1_Cf=%joB>{s2BJZh#Wp6r7zohedEqbr#QY#d85H9vN%@cj3sHoOeqaiFNCT} zG%iathT$Ovcc|8fqlBkFp5f(Q0g|ETQMzKydA|L|R{*_c`D&4I&VP}Ug46eIJ^6t2 z3h2~G-w?{aKo{TBuzCao{;Tp>d`FeL)6CPB`d-F@p&c51lxfAkud+|9M)!Lb*l{~? zxa7(CBg%{N_O~;V1EGyP~i2rKw9wsjQNS(W%ST+9>2fwEpe7E0Dxm(S^DPTgzR0R*F)LBC#x+`rbu;xiadg z#YUKwkj<#nH|Vak!u(-@%p<{lr^sKfp}!nt|DSRb#)bYoio+*Z ml&yDMZxBC35DbXla{hTV=Re&C{M-!vHC@0zT9@zD#Qy@a)#RK2 diff --git a/doc/ha/ha.png b/doc/ha/ha.png new file mode 100644 index 0000000000000000000000000000000000000000..2d1c867ba57c9606a840291f21d1bf7e58419e6a GIT binary patch literal 59098 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 literal 0 HcmV?d00001 diff --git a/doc/ha/ha_notify.jpg b/doc/ha/ha_notify.jpg new file mode 100644 index 0000000000000000000000000000000000000000..defff12a89a0227188db57732d57653c1f843d8b GIT binary patch literal 9701 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 jsonBuffer; + // Boiler values as one JSON object + StaticJsonBuffer<512> jsonBuffer; + char data[512]; + char s[20]; JsonObject & root = jsonBuffer.createObject(); - root["currtemp"] = (String)EMS_Thermostat.curr_roomTemp; - root["seltemp"] = (String)EMS_Thermostat.setpoint_roomTemp; + root["wWCurTmp"] = _float_to_char(s, EMS_Boiler.wWCurTmp); + root["wWHeat"] = EMS_Boiler.wWHeat ? "on" : "off"; + root["curFlowTemp"] = _float_to_char(s, EMS_Boiler.curFlowTemp); + root["retTemp"] = _float_to_char(s, EMS_Boiler.retTemp); + root["burnGas"] = EMS_Boiler.burnGas ? "on" : "off"; + root["heatPmp"] = EMS_Boiler.heatPmp ? "on" : "off"; + root["fanWork"] = EMS_Boiler.fanWork ? "on" : "off"; + root["ignWork"] = EMS_Boiler.ignWork ? "on" : "off"; + root["wWCirc"] = EMS_Boiler.wWCirc ? "on" : "off"; + root["selBurnPow"] = (String)EMS_Boiler.selBurnPow; + root["curBurnPow"] = (String)EMS_Boiler.curBurnPow; + root["sysPress"] = _float_to_char(s, EMS_Boiler.sysPress); + root["boilTemp"] = _float_to_char(s, EMS_Boiler.boilTemp); + root["pumpMod"] = (String)EMS_Boiler.pumpMod; - char data[100]; root.printTo(data, root.measureLength() + 1); - myESP.publish(TOPIC_THERMOSTAT, data); + myESP.publish(TOPIC_BOILER_DATA, data); + + if (EMS_Sys_Status.emsThermostatEnabled) { + // only send thermostat values if we actually have them + if (((int)EMS_Thermostat.curr_roomTemp == (int)0) || ((int)EMS_Thermostat.setpoint_roomTemp == (int)0)) { + return; + } + + myESP.publish(TOPIC_THERMOSTAT_CURRTEMP, _float_to_char(s, EMS_Thermostat.curr_roomTemp)); + myESP.publish(TOPIC_THERMOSTAT_SELTEMP, _float_to_char(s, EMS_Thermostat.setpoint_roomTemp)); + } } @@ -386,11 +408,11 @@ void setup() { // set up Wifi, MQTT, Telnet myESP.setWifiCallback(WIFIcallback); + myESP.setMQTTCallback(MQTTcallback); myESP.addSubscription(TOPIC_START); - myESP.addSubscription(TOPIC_THERMOSTAT); myESP.addSubscription(TOPIC_THERMOSTAT_TEMP); - myESP.addSubscription(TOPIC_SHOWERTIME); + myESP.consoleSetHelpProjectsCmds(PROJECT_CMDS); myESP.consoleSetCallBackProjectCmds(myDebugCallback); myESP.begin(HOSTNAME); diff --git a/src/ems.cpp b/src/ems.cpp index 5246f41f1..36096ce07 100644 --- a/src/ems.cpp +++ b/src/ems.cpp @@ -428,8 +428,8 @@ void _processType(uint8_t * telegram, uint8_t length) { */ bool _process_UBAParameterWW(uint8_t * data, uint8_t length) { EMS_Boiler.wWSelTemp = data[2]; - EMS_Boiler.wWActivated = (data[1] == 0xFF); - EMS_Boiler.wWCircPump = (data[6] == 0xFF); + EMS_Boiler.wWActivated = (data[1] == 0xFF); // 0xFF means on + EMS_Boiler.wWCircPump = (data[6] == 0xFF); // 0xFF means on EMS_Boiler.wWDesiredTemp = data[8]; return true; @@ -488,6 +488,8 @@ bool _process_UBAMonitorSlow(uint8_t * data, uint8_t length) { EMS_Boiler.burnWorkMin = _toLong(13, data); EMS_Boiler.heatWorkMin = _toLong(19, data); + EMS_Sys_Status.emsRefreshed = true; // triggers a send the values back to Home Assistant via MQTT + return true; }