Revision:
4:c16866ed9508
Parent:
3:5ae3c983f241
--- a/VBus.cpp	Sun Apr 17 17:25:56 2011 +0000
+++ b/VBus.cpp	Wed May 04 20:15:25 2011 +0000
@@ -1,5 +1,12 @@
 /*
-    Copyright (c) 2010 Wim De Roeve
+    Copyright (c) 2010 Wimpie
+
+    Based on the VBus� Protocol Specification see http://goo.gl/HP6ZY
+    and http://hobbyelektronik.org/w/index.php/VBus-Decoder
+
+    VBus� en Resol� are registrated trademarks see http://www.resol.de
+
+    Debugtrace.h -> http://mbed.org/users/snatch59/programs/DebugTrace/gpdz54
 
     Permission is hereby granted, free of charge, to any person obtaining a copy
     of this software and associated documentation files (the "Software"), to deal
@@ -21,12 +28,11 @@
 */
 
 #include "VBus.h"
-#include "DebugTrace.h"
-
 #define DEBUG 0
 
 #if DEBUG
-DebugTrace pc_VBus(OFF, TO_SERIAL);
+#include "DebugTrace.h"
+DebugTrace pc_VBus(ON, TO_SERIAL);
 #endif
 
 static uint8_t CalcCrc(const unsigned char *Buffer, int Offset, int Length);
@@ -150,8 +156,31 @@
 
         if ((Command==0x0100) and (Bufferlength==10+Framecnt*6)) {
 
-            // Frame info for the Resol ConergyDT5 used by IZEN
+            // Frame info for the Resol ConergyDT5
             // check VBusprotocol specification for other products
+
+            // This library is made for the ConergyDT5 (0x3271)
+
+            //Offset  Size    Mask    Name                    Factor  Unit
+            //0       2               Temperature sensor 1    0.1     �C
+            //2       2               Temperature sensor 2    0.1     �C
+            //4       2               Temperature sensor 3    0.1     �C
+            //6       2               Temperature sensor 4    0.1     �C
+            //8       1               Pump speed pump         1       1
+            //9       1               Pump speed pump 2       1
+            //10      1               Relay mask              1
+            //11      1               Error mask              1
+            //12      2               System time             1
+            //14      1               Scheme                  1
+            //15      1       1       Option PostPulse        1
+            //15      1       2       Option thermostat       1
+            //15      1       4       Option HQM              1
+            //16      2               Operating hours relay 1 1
+            //18      2               Operating hours relay 2 1
+            //20      2               Heat quantity           1       Wh
+            //22      2               Heat quantity           1000    Wh
+            //24      2               Heat quantity           1000000 Wh
+            //26      2               Version 0.01
             //
             // Each frame has 6 bytes
             // byte 1 to 4 are data bytes -> MSB of each bytes
@@ -195,23 +224,48 @@
 
             Septet=Buffer[F+FSeptet];
             InjectSeptet(Buffer,F,4);
-
+#if DEBUG
+            pc_VBus.traceOut("\r\nFrame 4 %i %i %i %i ",Buffer[F],Buffer[F+1],Buffer[F+2],Buffer[F+3]);
+#endif
             SystemTime = Buffer[F+1] << 8 | Buffer[F];
-            System    =  Buffer[F+2];
+            Scheme    =  Buffer[F+2];
 
             OptionPostPulse  = (Buffer[F+3] & 0x01);
             OptionThermostat = ((Buffer[F+3] & 0x02) >> 1);
-            OptionWMZ  = ((Buffer[F+3] & 0x04) >> 2);
+            OptionHQM  = ((Buffer[F+3] & 0x04) >> 2);
 
             //*******************  Frame 5  *******************
             F=FOffset+FLength*4;
 
             Septet=Buffer[F+FSeptet];
             InjectSeptet(Buffer,F,4);
-
+#if DEBUG
+            pc_VBus.traceOut("\r\nFrame 5 %i %i %i %i ",Buffer[F],Buffer[F+1],Buffer[F+2],Buffer[F+3]);
+#endif
             OperatingHoursRelais1=Buffer[F+1] << 8 | Buffer[F];
             OperatingHoursRelais2=Buffer[F+3] << 8| Buffer[F+2];
 
+            //*******************  Frame 6  *******************
+            F=FOffset+FLength*5;
+
+            Septet=Buffer[F+FSeptet];
+            InjectSeptet(Buffer,F,4);
+#if DEBUG
+            pc_VBus.traceOut("\r\nFrame 6 %i %i %i %i ",Buffer[F],Buffer[F+1],Buffer[F+2],Buffer[F+3]);
+#endif
+            HeatQuantity=(Buffer[F+1] << 8 | Buffer[F])+(Buffer[F+3] << 8| Buffer[F+2])*1000;
+
+            //*******************  Frame 7  *******************
+            F=FOffset+FLength*6;
+
+            Septet=Buffer[F+FSeptet];
+            InjectSeptet(Buffer,F,4);
+#if DEBUG
+            pc_VBus.traceOut("\r\nFrame 7 %i %i %i %i ",Buffer[F],Buffer[F+1],Buffer[F+2],Buffer[F+3]);
+#endif
+            HeatQuantity=HeatQuantity+(Buffer[F+1] << 8 | Buffer[F])*1000000;
+            Version=Buffer[F+3] << 8| Buffer[F+2];
+
             ///******************* End of frames ****************
 
             if (Sensor1_temp>Sensor1_temp_max)
@@ -225,21 +279,22 @@
 
 #if DEBUG
 
-            pc_VBus.traceOut("\r\nSensor 1 %f", Sensor1_temp);
-            pc_VBus.traceOut("\r\nSensor 2 %f", Sensor2_temp);
-            pc_VBus.traceOut("\r\nSensor 3 %f", Sensor3_temp);
-            pc_VBus.traceOut("\r\nSensor 4 %f", Sensor4_temp);
-            pc_VBus.traceOut("\r\nPumpSpeed1 %i", PumpSpeed1);
-            pc_VBus.traceOut("\r\nPumpSpeed2 %i", PumpSpeed2);
-            pc_VBus.traceOut("\r\nRelaismask %i", RelaisMask);
-            pc_VBus.traceOut("\r\nErrorMask %i", ErrorMask);
-            pc_VBus.traceOut("\r\nSystemTime %i", SystemTime);
-            pc_VBus.traceOut("\r\nSystem %i", System);
-            pc_VBus.traceOut("\r\nOptionPostPulse %i", OptionPostPulse);
-            pc_VBus.traceOut("\r\nOptionThermostat %i", OptionThermostat);
-            pc_VBus.traceOut("\r\nOptionWMZ %i", OptionWMZ);
-            pc_VBus.traceOut("\r\nOperatingHoursRelais1 %i", OperatingHoursRelais1);
-            pc_VBus.traceOut("\r\nOperatingHoursRelais2 %i", OperatingHoursRelais2);
+            /*           pc_VBus.traceOut("\r\nSensor 1 %f", Sensor1_temp);
+                       pc_VBus.traceOut("\r\nSensor 2 %f", Sensor2_temp);
+                       pc_VBus.traceOut("\r\nSensor 3 %f", Sensor3_temp);
+                       pc_VBus.traceOut("\r\nSensor 4 %f", Sensor4_temp);
+                       pc_VBus.traceOut("\r\nPumpSpeed1 %i", PumpSpeed1);
+                       pc_VBus.traceOut("\r\nPumpSpeed2 %i", PumpSpeed2);
+                       pc_VBus.traceOut("\r\nRelaismask %i", RelaisMask);
+                       pc_VBus.traceOut("\r\nErrorMask %i", ErrorMask);
+                       pc_VBus.traceOut("\r\nSystemTime %i", SystemTime);
+                       pc_VBus.traceOut("\r\nSystem %i", Scheme);
+                       pc_VBus.traceOut("\r\nOptionPostPulse %i", OptionPostPulse);
+                       pc_VBus.traceOut("\r\nOptionThermostat %i", OptionThermostat);
+                       pc_VBus.traceOut("\r\nOptionHQM %i", OptionHQM);
+                       pc_VBus.traceOut("\r\nOperatingHoursRelais1 %i", OperatingHoursRelais1);
+                       pc_VBus.traceOut("\r\nOperatingHoursRelais2 %i", OperatingHoursRelais2);*/
+            pc_VBus.traceOut("\r\nHeatQuantity %i", HeatQuantity);
 
 #endif
         }
@@ -249,41 +304,37 @@
 }
 
 void VBus::SaveToSDcard(char* datetime, char* date,char* dayfn) {
-#if DEBUG
-    pc_VBus.traceOut("save ULX code=%i\r\n",code);
-#endif
-
-    char fn[16];
+    char fn[17];
     strcpy(fn,"/sd/vb");
     strcat(fn,dayfn);
-    strcat(fn,".js");
+    strcat(fn,".csv");
 
     //****************
-    // vbyymmdd.js
+    // filename vbyymmdd.csv
     //
-    // detailed dayinfo , each 5 minutes
+    // detailed dayinfo, each 5 minutes
     //
-    // vb[i++]="dd.mm.yy hh:mm:ss|v1;v2;v3;v4;v5;v6;v7;...
+    // dd.mm.yy hh:mm:ss;v1;v2;v3;v4;v5;v6;v7;...
     //
     //****************
-
-    fprintf(stderr,"vb[i++]=%c%s|%4.1f;%4.1f;%4.1f;%4.1f;%i;%i;%i;%i;%i;%i;%i;%i;%i;%i;%i%c\r\n", 34,datetime,
-            Sensor1_temp, Sensor2_temp,Sensor3_temp, Sensor4_temp,
-            PumpSpeed1,PumpSpeed2,
-            RelaisMask,ErrorMask,SystemTime,System,OptionPostPulse,
-            OptionThermostat, OptionWMZ, OperatingHoursRelais1,OperatingHoursRelais2,
-            34);
+#if DEBUG
+    pc_VBus.traceOut("%s;%4.1f;%4.1f;%4.1f;%4.1f;%i;%i;%i;%i;%i;%i;%i;%i;%i;%i;%i%;%i;%i\r\n",datetime,
+                     Sensor1_temp, Sensor2_temp,Sensor3_temp, Sensor4_temp,
+                     PumpSpeed1,PumpSpeed2,
+                     RelaisMask,ErrorMask,SystemTime,Scheme,OptionPostPulse,
+                     OptionThermostat, OptionHQM, OperatingHoursRelais1,OperatingHoursRelais2,HeatQuantity,Version
+                    );
+#endif
 
     if (_sdcard) {
         FILE *fp = fopen(fn, "a");
         if (fp) {
-            fprintf(fp,"vb[i++]=%c%s|%4.1f;%4.1f;%4.1f;%4.1f;%i;%i;%i;%i;%i;%i;%i;%i;%i;%i;%i%c\r\n", 34,datetime,
+            fprintf(fp,"%s;%4.1f;%4.1f;%4.1f;%4.1f;%i;%i;%i;%i;%i;%i;%i;%i;%i;%i;%i%;%i;%i\r\n",datetime,
                     Sensor1_temp, Sensor2_temp,Sensor3_temp, Sensor4_temp,
                     PumpSpeed1,PumpSpeed2,
-                    RelaisMask,ErrorMask,SystemTime,System,OptionPostPulse,
-                    OptionThermostat, OptionWMZ, OperatingHoursRelais1,OperatingHoursRelais2,
-                    34);
-
+                    RelaisMask,ErrorMask,SystemTime,Scheme,OptionPostPulse,
+                    OptionThermostat, OptionHQM, OperatingHoursRelais1,OperatingHoursRelais2,HeatQuantity,Version
+                   );
             fclose(fp);
         }
     }
@@ -299,11 +350,9 @@
 void VBus::make_Header (unsigned int DAdr,unsigned int SAdr,unsigned char Ver,unsigned int Cmd,unsigned char AFrames) {
     unsigned char Buffer[10]={Sync,(uint8_t)DAdr,DAdr>>8,(uint8_t)SAdr,SAdr>>8,Ver,(uint8_t)Cmd,Cmd>>8,AFrames};
     Buffer[9]=CalcCrc(Buffer,1,8);
-//    pc_VBus.traceOut("\r\nmake_Header\r\n");
     for (unsigned bo=0;bo<=9;bo++) {
         _Serial.putc(Buffer[bo]);
     }
-//  pc_VBus.traceOut("\r\n");
 }
 
 static uint8_t CalcCrc(const unsigned char *Buffer, int Offset, int Length) {
@@ -319,7 +368,7 @@
     int v;
     v = Byte1 << 8 | Byte2;
 
-    if (Byte1 == 0xFF)  // negatief value
+    if (Byte1 == 0xFF)
         v = v - 0x10000;
 
     if (v==SENSORNOTCONNECTED)