Vaillant_routines.pl 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. ########################################################################################
  2. #
  3. # Vaillant_routines.pl ===> Insert into 99_myUtils.pm
  4. #
  5. # Collection of various routines for Vaillant heating systems
  6. #
  7. # KEEP THE NAME AND COPYRIGHT
  8. #
  9. # Prof. Dr. Peter A. Henning
  10. #
  11. # $Id: 99_myUtils.pm 2014-12 - pahenning $
  12. #
  13. ########################################################################################
  14. #
  15. # This programm is free software; you can redistribute it and/or modify
  16. # it under the terms of the GNU General Public License as published by
  17. # the Free Software Foundation; either version 2 of the License, or
  18. # (at your option) any later version.
  19. #
  20. # The GNU General Public License can be found at
  21. # http://www.gnu.org/copyleft/gpl.html.
  22. # A copy is found in the textfile GPL.txt and important notices to the license
  23. # from the author is found in LICENSE.txt distributed with these scripts.
  24. #
  25. # This script is distributed in the hope that it will be useful,
  26. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  27. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  28. # GNU General Public License for more details.
  29. #
  30. ########################################################################################
  31. ###############################################################################
  32. #
  33. # Vaillant_HWC_mode_postproc
  34. #
  35. # postprocessing of
  36. # "get HWC OperatingMode\n\000get HWC Param1"
  37. # "read HWC Status2\n\000read SOL Status2"
  38. #
  39. ###############################################################################
  40. sub Vaillant_HWC_mode_postproc($$){
  41. my ($name,$str)=@_;
  42. my $hash = $defs{"$name"};
  43. my (@values,$day,$night,$off,$min,$max,$mode,$zval);
  44. if( $str =~ /.*;.*/){
  45. # target;mode target;0;0;0;131;22;0;min;max;0
  46. @values = split(/[; \n]/,$str);
  47. $day = sprintf("%4.1f",$values[0]);
  48. $mode = $values[1];
  49. $night = sprintf("%4.1f",$values[6]);
  50. $off = sprintf("%4.1f",$values[7]);
  51. $min = sprintf("%4.1f",$values[9]);
  52. $max = sprintf("%4.1f",$values[10]);
  53. } else {
  54. @values = split(' ',$str);
  55. $day = sprintf("%4.1f",$values[0]);
  56. $night = sprintf("%4.1f",$values[4]);
  57. $off = sprintf("%4.1f",$values[5]);
  58. $min = sprintf("%4.1f",$values[6]);
  59. $max = sprintf("%4.1f",$values[7]);
  60. if( $values[1]==0 ){
  61. $mode="disabled"
  62. }elsif( $values[1]==1 ){
  63. $mode="on"
  64. }elsif( $values[1]==2 ){
  65. $mode="off"
  66. }elsif( $values[1]==3 ){
  67. $mode="auto"
  68. }elsif( $values[1]==4 ){
  69. $mode="eco"
  70. }elsif( $values[1]==5 ){
  71. $mode="low"
  72. }
  73. }
  74. readingsBeginUpdate($hash);
  75. readingsBulkUpdate($hash, "postproc", $str);
  76. readingsBulkUpdate($hash, "mode", $mode);
  77. readingsBulkUpdate($hash, "Storage.day", $day);
  78. readingsBulkUpdate($hash, "Storage.min", $min);
  79. readingsBulkUpdate($hash, "Storage.max", $max);
  80. readingsEndUpdate($hash,1);
  81. $mode;
  82. }
  83. ###############################################################################
  84. #
  85. # Vaillant_HWC_state_postproc
  86. #
  87. # postprocessing of
  88. # "get HWC Status2\n\000get SOL Status2"
  89. # "read HWC Status2\n\000read SOL Status2"
  90. #
  91. ###############################################################################
  92. sub Vaillant_HWC_state_postproc($$){
  93. my ($name,$str)=@_;
  94. my $hash = $defs{"$name"};
  95. my (@values,$rval,$tval,$bval,$pval,$xval,$zval,$sp2,$sp3);
  96. if( $str =~ /.*;.*/){
  97. # status;ladung;SP1;target SP1;SP2;SP3
  98. @values = split(/[; \n]/,$str);
  99. $rval = sprintf("%5.2f",$values[2]);
  100. $tval = sprintf("%4.1f",$values[3]);
  101. $bval = ($values[0] == 80) ? "ON (WW)" : "OFF";
  102. $pval = ($values[1] == 1) ? "ON" : "OFF";
  103. $xval = sprintf("%5.2f %5.2f %5.2f %d %d", $values[2],0.0,$values[3],$values[0],$values[1]);
  104. $zval = sprintf("SP1.T %5.2f °C, %s", $values[2],$pval);
  105. $sp2 = sprintf("%5.2f",$values[5]);
  106. $sp3 = sprintf("%5.2f",$values[6]);
  107. }else{
  108. # SP1 target status ladung SP1 SP2 SP3
  109. @values = split(' ',$str);
  110. $rval = sprintf("%5.2f",$values[0]);
  111. $tval = sprintf("%4.1f",$values[1]);
  112. $bval = ($values[2] == 80) ? "ON (WW)" : "OFF";
  113. $pval = ($values[3] == 1) ? "ON" : "OFF";
  114. $xval = sprintf("%5.2f %5.2f %5.2f %d %d", $values[0],0.0,$values[1],$values[2],$values[3]);
  115. $zval = sprintf("SP1.T %5.2f °C, %s", $values[0],$pval);
  116. $sp2 = sprintf("%5.2f",$values[5]);
  117. $sp3 = sprintf("%5.2f",$values[6]);
  118. }
  119. readingsBeginUpdate($hash);
  120. readingsBulkUpdate($hash, "postproc", $str);
  121. readingsBulkUpdate($hash, "Storage.SP1.T", $rval);
  122. readingsBulkUpdate($hash, "Storage.SP2.T", $sp2);
  123. readingsBulkUpdate($hash, "Storage.SP3.T", $sp3);
  124. readingsBulkUpdate($hash, "Storage.target", $tval);
  125. readingsBulkUpdate($hash, "Burner", $bval);
  126. readingsBulkUpdate($hash, "Pump", $pval);
  127. readingsBulkUpdate($hash, "reading", $xval);
  128. readingsEndUpdate($hash,1);
  129. $zval;
  130. }
  131. ###############################################################################
  132. #
  133. # Vaillant_HWC_broadcast_postproc
  134. #
  135. # postprocessing of
  136. # "get cyc broad StatusHWC\n"
  137. # "read broad StatusHWC
  138. #
  139. ###############################################################################
  140. sub Vaillant_HWC_broadcast_postproc($$){
  141. my ($name,$str)=@_;
  142. my $hash = $defs{"$name"};
  143. my (@values,$rval,$tval,$bval,$pval,$xval,$zval);
  144. if( ($str eq "")||($str eq "no data stored") ){
  145. $rval = "err";
  146. $tval = "err";
  147. $bval = "err";
  148. $pval = "err";
  149. $xval = "err";
  150. $zval = "err";
  151. } elsif( $str =~ /.*;.*/){
  152. # status;ladung;SP1;target
  153. @values = split(';',$str);
  154. $rval = sprintf("%5.2f",$values[2]);
  155. $tval = sprintf("%4.1f",$values[3]);
  156. $bval = ($values[0] == 80) ? "ON (WW)" : "OFF";
  157. $pval = ($values[1] == 1) ? "ON" : "OFF";
  158. $xval = sprintf("%5.2f %5.2f %5.2f %d %d", $values[2],0.0,$values[3],$values[0],$values[1]);
  159. $zval = sprintf("SP1.T %5.2f °C, %s", $values[2],$pval);
  160. } else {
  161. @values=split(' ',$str);
  162. if( $values[1] < 15 ){
  163. $rval = "err";
  164. $tval = "err";
  165. $bval = "err";
  166. $pval = "err";
  167. $xval = "err";
  168. $zval = "err";
  169. }else {
  170. $rval = sprintf("%5.2f",$values[0]);
  171. $tval = sprintf("%4.1f",$values[1]);
  172. $bval = ($values[2] == 80) ? "ON (WW)" : "OFF";
  173. $pval = ($values[3] == 1) ? "ON" : "OFF";
  174. $xval = sprintf("%5.2f %5.2f %5.2f %d %d",$values[0],0.0,$values[1],$values[2],$values[3]);
  175. $zval = sprintf("SP1.T %5.2f °C, %s",$values[0],$pval);
  176. }
  177. }
  178. readingsBeginUpdate($hash);
  179. readingsBulkUpdate($hash, "postproc", $str);
  180. readingsBulkUpdate($hash, "Storage.SP1.T", $rval);
  181. readingsBulkUpdate($hash, "Storage.target", $tval);
  182. readingsBulkUpdate($hash, "Burner", $bval);
  183. readingsBulkUpdate($hash, "Pump", $pval);
  184. readingsBulkUpdate($hash, "reading", $xval);
  185. readingsEndUpdate($hash,1);
  186. $zval;
  187. }
  188. ###############################################################################
  189. #
  190. # Vaillant_HC_mode_postproc
  191. #
  192. # postprocessing of
  193. # "get HC OperatingMode\n\000get HC Param1\n\000get vrs620 NameHC"
  194. # "read HC OperatingMode\n\000read HC Param1\n\000read vrs620 NameHC"
  195. #
  196. ###############################################################################
  197. sub Vaillant_HC_mode_postproc($$$){
  198. my ($name,$str,$circuit)=@_;
  199. my $hash = $defs{"$name"};
  200. my (@values,$room,$night,$off,$add,$min,$max,$pre,$cname,$mode);
  201. $circuit=""
  202. if ( $circuit == 1);
  203. if( $str =~ /.*;.*/){
  204. # room;mode room;night;off;add;min;max;pre cname
  205. @values = split(/[; \n]/,$str);
  206. $room = sprintf("%4.1f",$values[0]);
  207. $mode = $values[1];
  208. $night = sprintf("%4.1f",$values[3]);
  209. $off = sprintf("%4.1f",$values[4]);
  210. $add = sprintf("%4.1f",$values[5]);
  211. $min = sprintf("%4.1f",$values[6]);
  212. $max = sprintf("%4.1f",$values[7]);
  213. $pre = sprintf("%4.1f",$values[8]);
  214. $cname = sprintf("%s",$values[9]);
  215. } else {
  216. @values = split(' ',$str);
  217. $room = sprintf("%4.1f",$values[0]);
  218. $night = sprintf("%4.1f",$values[4]);
  219. $off = sprintf("%4.1f",$values[5]);
  220. $add = sprintf("%4.1f",$values[6]);
  221. $min = sprintf("%4.1f",$values[7]);
  222. $max = sprintf("%4.1f",$values[8]);
  223. $pre = sprintf("%4.1f",$values[9]);
  224. $cname = sprintf("%s",$values[10]);
  225. if( $values[1]==0 ){
  226. $mode="disabled"
  227. }elsif( $values[1]==1 ){
  228. $mode="on"
  229. }elsif( $values[1]==2 ){
  230. $mode="off"
  231. }elsif( $values[1]==3 ){
  232. $mode="auto"
  233. }elsif( $values[1]==4 ){
  234. $mode="eco"
  235. }elsif( $values[1]==5 ){
  236. $mode="low"
  237. }
  238. }
  239. readingsBeginUpdate($hash);
  240. readingsBulkUpdate($hash, "postproc", $str);
  241. readingsBulkUpdate($hash, "mode".$circuit, $mode);
  242. readingsBulkUpdate($hash, "mode".$circuit.".off", $off);
  243. readingsBulkUpdate($hash, "Room".$circuit.".T", $room);
  244. readingsBulkUpdate($hash, "Room".$circuit.".night", $night);
  245. readingsBulkUpdate($hash, "Room".$circuit.".add", $add);
  246. readingsBulkUpdate($hash, "VL".$circuit.".T.min", $min);
  247. readingsBulkUpdate($hash, "VL".$circuit.".T.max", $max);
  248. readingsBulkUpdate($hash, "name".$circuit, $cname);
  249. readingsEndUpdate($hash,1);
  250. $mode;
  251. }
  252. ###############################################################################
  253. #
  254. # Vaillant_HC_mode_postproc
  255. #
  256. # postprocessing of
  257. # "read HC Status1\n\000read HC Status2a\n\000read broad StatusHC"
  258. #
  259. #
  260. ###############################################################################
  261. sub Vaillant_HC_state_postproc($$){
  262. my ($name,$str)=@_;
  263. my $hash = $defs{"$name"};
  264. my (@values,$vval,$rval,$bval,$pval, $qval,$xval,$zval);
  265. if( ($str eq "")||($str eq "no data stored") ){
  266. $vval = "err";
  267. $rval = "err";
  268. $bval = "err";
  269. $pval = "err";
  270. $qval = "err";
  271. $xval = "err";
  272. $zval = "err";
  273. }elsif( $str =~ /.*;.*/){
  274. #
  275. @values = split(/[; \n]/,$str);
  276. $vval = sprintf("%4.1f",$values[10]);
  277. $rval = sprintf("%4.1f",$values[11]);
  278. if( $values[14] == 0 ){
  279. $pval = "OFF";
  280. $qval = "0 0";
  281. }elsif( $values[14] == 1 ){
  282. $pval = "ON (HK)";
  283. $qval = "80 0";
  284. }elsif( $values[14] == 2 ){
  285. $pval = "ON (WW)";
  286. $qval = "0 80";
  287. }else{
  288. $pval = "unknown";
  289. $qval = "err";
  290. }
  291. }else{
  292. #
  293. @values = split(' ',$str);
  294. $vval = sprintf("%4.1f",$values[5]);
  295. $rval = sprintf("%4.1f",$values[6]);
  296. if( $values[2] == 0 ){
  297. $pval = "OFF";
  298. $qval = "0 0";
  299. }elsif( $values[2] == 1 ){
  300. $pval = "ON (HK)";
  301. $qval = "80 0";
  302. }elsif( $values[2] == 2 ){
  303. $pval = "ON (WW)";
  304. $qval = "0 80";
  305. }else{
  306. $pval = "unknown";
  307. $qval = "err";
  308. }
  309. }
  310. $bval = HzBedarf();
  311. $xval = sprintf("%5.2f %5.2f %s %5.2f",$vval,$rval,$qval,$bval);
  312. $zval = sprintf("VL.T %5.2f °C, RL.T %5.2f °C, %s",$vval,$rval,$pval);
  313. if( ($vval < 5) ){
  314. $vval = "err";
  315. $rval = "err";
  316. $bval = "err";
  317. $pval = "err";
  318. $qval = "err";
  319. $xval = "";
  320. $zval = "err";
  321. }
  322. readingsBeginUpdate($hash);
  323. readingsBulkUpdate($hash, "postproc", $str);
  324. readingsBulkUpdate($hash, "VL.T", $vval);
  325. readingsBulkUpdate($hash, "RL.T", $rval);
  326. readingsBulkUpdate($hash, "pump", $pval);
  327. readingsBulkUpdate($hash, "pump.P", $qval);
  328. readingsBulkUpdate($hash, "consumption", $bval);
  329. readingsBulkUpdate($hash, "reading", $xval)
  330. if( $xval ne "" );
  331. readingsEndUpdate($hash,1);
  332. $zval
  333. }
  334. ###############################################################################
  335. #
  336. # Vaillant_SOL_mode_postproc
  337. #
  338. # postprocessing of
  339. # "get HC OperatingMode\n\000get HC Param1\n\000get vrs620 NameHC"
  340. # "read HC OperatingMode\n\000read HC Param1\n\000read vrs620 NameHC"
  341. #
  342. ###############################################################################
  343. sub Vaillant_SOL_state_postproc($$){
  344. my ($name,$str)=@_;
  345. my $hash = $defs{"$name"};
  346. readingsBeginUpdate($hash);
  347. readingsBulkUpdate($hash, "postproc", $str);
  348. readingsEndUpdate($hash,1);
  349. }
  350. ###############################################################################
  351. #
  352. # Vaillant_Timer
  353. #
  354. ###############################################################################
  355. sub Vaillant_Timer($)
  356. {
  357. my @values=split(/[; ]/,$_);
  358. #-- suppress leading zero ?
  359. for(my $i=0;$i<6;$i++){
  360. $values[$i]=~s/^0//;
  361. }
  362. my $sval=sprintf("%s-%s",$values[0],$values[1]);
  363. $sval .=sprintf(", %s-%s",$values[2],$values[3])
  364. if($values[2] ne $values[3]);
  365. $sval .=sprintf(", %s-%s",$values[4],$values[5])
  366. if($values[4] ne $values[5]);
  367. return $sval;
  368. }