int main(int argc, char *argv[]) { int key = 0; int iCheck = 0; int iX; int iK; char KeyInput[_MAX_PATH]; char Key[3]; char CommandlineDatPath[_MAX_PATH]; double csvValue; int Meters = 0; unsigned long ReturnValue; FILE *hDatFile; uint16_t InfoFlag = SILENTMODE; uint16_t Port = 0; uint16_t Mode = RADIOT2; uint16_t LogMode = LOGTOCSV; uint16_t wMBUSStick = iM871AIdentifier; char comDeviceName[100]; int hStick; //Variables added for CIVIS project FILE *fp; char row[100], word1[50], word2[50]; char *res; int i=1; char filepath[50]="/home/pi/sw/civis_config.txt\0"; //---- ecwMBUSMeter ecpiwwMeter[MAXMETER]; memset(ecpiwwMeter, 0, MAXMETER*sizeof(ecwMBUSMeter)); memset(CommandlineDatPath, 0, _MAX_PATH*sizeof(char)); if(argc > 1) parseparam(argc, argv, CommandlineDatPath, &InfoFlag, &Port, &Mode, &LogMode); //read config back if ((hDatFile = fopen("meter.dat", "rb")) != NULL) { Meters = fread((void*)ecpiwwMeter, sizeof(ecwMBUSMeter), MAXMETER, hDatFile); fclose(hDatFile); } Intro(); //Gets ApartmentID for CIVIS project fp=fopen(filepath, "r"); do { memset(row, 0, 100); memset(word1,0, 50); memset(word2,0, 50); strcpy(row,""); strcpy(word1,""); strcpy(word2,""); res=fgets(row, 99, fp); sscanf(row, "%s %s", word1, word2); if (strcmp(word1, "ID")==0){ strcpy(ApartmentID,word2); break; } } while (res!=NULL); printf("ApartmentID=%s\n", ApartmentID); fclose(fp); //------ //open wM-Bus Stick #1 wMBUSStick = iM871AIdentifier; sprintf(comDeviceName, "/dev/ttyUSB%d", Port); hStick = wMBus_OpenDevice(comDeviceName, wMBUSStick); if(hStick <= 0) { //try 2.Stick wMBUSStick = iAMB8465Identifier; usleep(500*1000); hStick = wMBus_OpenDevice(comDeviceName, wMBUSStick); } if(hStick <= 0) { ErrorAndExit("no wM-Bus Stick not found\n"); } if((iM871AIdentifier == wMBUSStick) && (APIOK == wMBus_GetStickId(hStick, wMBUSStick, &ReturnValue, InfoFlag)) && (iM871AIdentifier == ReturnValue)) { if(InfoFlag > SILENTMODE) { printf("IMST iM871A Stick found\n"); } } else { wMBus_CloseDevice(hStick, wMBUSStick); //try 2. Stick wMBUSStick = iAMB8465Identifier; hStick = wMBus_OpenDevice(comDeviceName,wMBUSStick); if((iAMB8465Identifier == wMBUSStick) && (APIOK == wMBus_GetStickId(hStick, wMBUSStick, &ReturnValue, InfoFlag)) && (iAMB8465Identifier == ReturnValue)) { if(InfoFlag > SILENTMODE) { printf("Amber Stick found\n"); } } else { wMBus_CloseDevice(hStick, wMBUSStick); ErrorAndExit("no wM-Bus Stick not found\n"); } } if(APIOK == wMBus_GetRadioMode(hStick, wMBUSStick, &ReturnValue, InfoFlag)) { if(InfoFlag > SILENTMODE) { printf("wM-BUS %s Mode\n", (ReturnValue == RADIOT2) ? "T2" : "S2"); } if (ReturnValue != Mode) wMBus_SwitchMode(hStick, wMBUSStick, (uint8_t) Mode, InfoFlag); } else ErrorAndExit("wM-Bus Stick not found\n"); wMBus_InitDevice(hStick, wMBUSStick, InfoFlag); UpdateMetersonStick(hStick, wMBUSStick, Meters, ecpiwwMeter, InfoFlag); IsNewMinute(); while (!((key == 0x1B) || (key == 'q'))) { usleep(500*1000); //sleep 500ms key = getkey(); /*key =fgetc(stdin); while(key!='\n' && fgetc(stdin) != '\n'); printf("Key=%d",key);*/ //add a new Meter if (key == 'a') { iX=0; while(0 != ecpiwwMeter[iX].manufacturerID) { iX++; if(iX == MAXMETER-1) continue; } //check entry in list of meters if(iX < MAXMETER) { printf("\nAdding Meter #%d \n",iX+1); printf("Enter Meter Ident (12345678): "); if(fgets(KeyInput, _MAX_PATH,stdin)) ecpiwwMeter[iX].ident=CalcUIntBCD(atoi(KeyInput)); printf("Enter Meter Type (2 = Electricity ; 3 = Gas ; 7 = Water) : "); if(fgets(KeyInput, _MAX_PATH,stdin)) { switch(atoi(KeyInput)) { case METER_GAS : ecpiwwMeter[iX].type = METER_GAS; break; case METER_WATER: ecpiwwMeter[iX].type = METER_WATER; break; default: printf(" - wrong Type ; default to Electricity"); case METER_ELECTRICITY : ecpiwwMeter[iX].type = METER_ELECTRICITY; break; } } ecpiwwMeter[iX].manufacturerID = FASTFORWARD; ecpiwwMeter[iX].version = 0x01; printf("Enter Key (0 = Zero ; 1 = Default ; 2 = Enter the 16 Bytes) : "); if(fgets(KeyInput, _MAX_PATH, stdin)) { switch(atoi(KeyInput)) { case 0 : for(iK = 0; iK<AES_KEYLENGHT_IN_BYTES; iK++) ecpiwwMeter[iX].key[iK] = 0; break; default: case 1 : for(iK = 0; iK<AES_KEYLENGHT_IN_BYTES; iK++) ecpiwwMeter[iX].key[iK] = (uint8_t)(0x1C + 3*iK); break; case 2 : printf("Key:"); fgets(KeyInput, _MAX_PATH, stdin); for(iK = 0; iK<AES_KEYLENGHT_IN_BYTES; iK++) ecpiwwMeter[iX].key[iK] = 0; if((strlen(KeyInput)-1) < AES_KEYLENGHT_IN_BYTES*2) printf("Key is too short - default to Zero\n"); else { memset(Key,0,sizeof(Key)); for(iK = 0; iK<(int)(strlen(KeyInput)-1)/2; iK++) { Key[0] = KeyInput[2*iK]; Key[1] = KeyInput[2*iK+1]; ecpiwwMeter[iX].key[iK] = (uint8_t) strtoul(Key, NULL, 16); } } break; } } Meters++; Meters = min(Meters, MAXMETER); DisplayListofMeters(Meters, ecpiwwMeter); UpdateMetersonStick(hStick, wMBUSStick, Meters, ecpiwwMeter, InfoFlag); } else printf("All %d Meters defined\n", MAXMETER); } // display list of meters if(key == 'l') DisplayListofMeters(Meters, ecpiwwMeter); //remove a meter from the list if(key == 'r') { printf("Enter Meterindex to remove: "); if(fgets(KeyInput, _MAX_PATH, stdin)) { iX = atoi(KeyInput); if(iX-1 <= Meters-1) { printf("Remove Meter #%d\n",iX); memset(&ecpiwwMeter[iX-1], 0, sizeof(ecwMBUSMeter)); DisplayListofMeters(Meters, ecpiwwMeter); UpdateMetersonStick(hStick, wMBUSStick, Meters, ecpiwwMeter, InfoFlag); } else printf("Index not defined\n"); } } // switch to S2 mode if(key == 's') wMBus_SwitchMode( hStick,wMBUSStick, RADIOS2,InfoFlag); // switch to T2 mode if(key == 't') wMBus_SwitchMode( hStick,wMBUSStick, RADIOT2,InfoFlag); //check whether there are new data from the EnergyCams if (IsNewMinute() || (key == 'u')) { if(wMBus_GetMeterDataList() > 0) { iCheck = 0; for(iX=0; iX<Meters; iX++) { if((0x01<<iX) & wMBus_GetMeterDataList()) { ecMBUSData RFData; int iMul=1; int iDiv=1; wMBus_GetData4Meter(iX, &RFData); if(RFData.exp < 0) { //GAS for(iK=RFData.exp; iK<0; iK++) iDiv=iDiv*10; csvValue = ((double)RFData.value)/iDiv; } else { for(iK=0; iK<RFData.exp; iK++) iMul=iMul*10; csvValue = (double)RFData.value*iMul; } if(InfoFlag > SILENTMODE) { Colour(PRINTF_GREEN, false); printf("Meter #%d : %4.1f %s", iX+1, csvValue, (ecpiwwMeter[iX].type == METER_ELECTRICITY) ? "Wh" : "m'3"); } if(ecpiwwMeter[iX].type == METER_ELECTRICITY) csvValue = csvValue/1000.0; if(InfoFlag > SILENTMODE) { if((RFData.pktInfo & PACKET_WAS_ENCRYPTED) == PACKET_WAS_ENCRYPTED) printf(" Decryption OK"); if((RFData.pktInfo & PACKET_DECRYPTIONERROR) == PACKET_DECRYPTIONERROR) printf(" Decryption ERROR"); if((RFData.pktInfo & PACKET_WAS_NOT_ENCRYPTED) == PACKET_WAS_NOT_ENCRYPTED) printf(" not encrypted"); if((RFData.pktInfo & PACKET_IS_ENCRYPTED) == PACKET_IS_ENCRYPTED) printf(" is encrypted"); printf(" RSSI=%i dbm, #%d \n", RFData.rssiDBm, RFData.accNo); Colour(0,false); } Log2File(CommandlineDatPath, LogMode, iX, InfoFlag, csvValue, &RFData, ecpiwwMeter[iX].ident); } } } else { if(InfoFlag > SILENTMODE) { Colour(PRINTF_YELLOW, false); printf("%02d ", iCheck); Colour(0, false); if((++iCheck % 20) == 0) printf("\n"); } } } } // end while if(hStick >0) wMBus_CloseDevice(hStick, wMBUSStick); //save Meter config to file if(Meters > 0) { if ((hDatFile = fopen("meter.dat", "wb")) != NULL) { fwrite((void*)ecpiwwMeter, sizeof(ecwMBUSMeter), MAXMETER, hDatFile); fclose(hDatFile); } } return 0; }
int main(int argc, char *argv[]) { //Projektwerkstatt if(argc != 4) { ErrorAndExit("Illegal number of Parameters"); } //Projektwerkstatt int key=0; int Reading; char OCR[20]; char Version[20]; int iReadRequest=0; int ReadingPeriod=10; int ReadingTimer=ReadingPeriod+1; uint16_t Data = 0; uint32_t Build = 0; uint32_t OCRData = 0; int iRetry = 3; int iTimeout = 0; int sock; int connected; Intro(ReadingPeriod); if (wiringPiSetup () == -1) { fprintf (stderr, "Not running on raspberry pi - now ending\n") ; exit(0); } EnergyCamOpen(0); //open serial port //get Status & wakeup iRetry = 3; do { if(iRetry-- < 0 ) break; }while(MODBUSERROR == EnergyCam_GetManufacturerIdentification(&Data)); if(Data == SAIDENTIFIER) { Colour(PRINTF_GREEN,false); printf("EnergyCAM Sensor connected "); Colour(0,true); } else { ErrorAndExit("EnergyCAM not found "); } //Read Buildnumber if (MODBUSOK == EnergyCam_GetAppFirmwareBuildNumber(&Build)) { printf("Build %d \n",Build); } //Check Buildnumber, GetResultOCRInt requires Build 8374 if (Build < 8374) { ErrorAndExit("This App requires a Firmwareversion >= 8374. "); } //Is EnergyCam installed Data = DisplayInstallationStatus(); //try to install the device if not installed if((Data == INSTALLATION_NODIGITS) || (Data == INSTALLATION_NOTDONE)){ EnergyCam_TriggerInstallation(); usleep(2000*1000); //sleep 2000ms - wait for Installation printf("Installing "); iTimeout = 20; do { usleep(500*1000); //sleep 500ms printf("."); if (MODBUSERROR == EnergyCam_GetResultOCRInstallation(&Data)) { Data = 0xFFFD; //retry if MODBUS returns with an Error } } while((iTimeout-->0) && (Data == 0xFFFD)); printf("\n"); //Is EnergyCam installed Data = DisplayInstallationStatus(); } if((Data == INSTALLATION_NODIGITS) || (Data == INSTALLATION_NOTDONE) || (Data == INSTALLATION_FAILED) || (Data == INSTALLATION_ONGOING)){ ErrorAndExit("EnergyCAM not installed "); } //get last Reading EnergyCam_TriggerReading(); sleep(4); iRetry = 3; do{ if(iRetry-- < 0) break; }while(MODBUSERROR == EnergyCam_GetStatusReading(&Data)); if (MODBUSOK == EnergyCam_GetResultOCRInt(&OCRData,&Data)) { time_t t = time(NULL); struct tm tm = *localtime(&t); printf("(%02d:%02d:%02d) Reading %04d.%d \n",tm.tm_hour,tm.tm_min,tm.tm_sec,OCRData,Data); //Projektwerkstatt sendDataToServer(argv[1],argv[2],argv[3],OCRData,Data); //Projektwerkstatt EnergyCam_Log2CSVFile("/var/www/ecpi/data/ecpi.csv",OCRData,Data); } IsNewMinute(); ReadingTimer=ReadingPeriod+1; while (!((key == 0x1B) || (key == 'q'))) { usleep(500*1000); //sleep 500ms key = getkey(); /*if(key == 'r') { iReadRequest++; //Read now } if(key == 'R') { ReadingTimer=1; //read in 1 minute //get Status & wakeup iRetry = 3; do { if(iRetry-- < 0 ) break; }while(MODBUSERROR == EnergyCam_GetStatusReading(&Data)); printf("GetStatusReading %04X \n",Data); //trigger new reading EnergyCam_TriggerReading(); }*/ if(IsNewMinute()){ if(--ReadingTimer<=1)iReadRequest++; printf("%02d ",ReadingTimer); fflush(stdout); iRetry = 3; do { if(iRetry-- < 0 ) break; }while(MODBUSERROR == EnergyCam_GetStatusReading(&Data)); //trigger new reading EnergyCam_TriggerReading(); } if(iReadRequest > 0) { iReadRequest=0; printf("%02d \n",ReadingTimer); ReadingTimer=ReadingPeriod+1; //get Status & wakeup iRetry = 3; do { if(iRetry-- < 0 ) break; }while(MODBUSERROR == EnergyCam_GetStatusReading(&Data)); //printf("GetStatusReading %04X \n",Data); EnergyCam_GetOCRPicDone(&Data); //printf("Pictures %04d \n",Data); if (MODBUSOK == EnergyCam_GetResultOCRInt(&OCRData,&Data)) { time_t t = time(NULL); struct tm tm = *localtime(&t); printf("(%02d:%02d:%02d) Reading %04d.%d \n",tm.tm_hour,tm.tm_min,tm.tm_sec,OCRData,Data); //Projektwerkstatt sendDataToServer(argv[1],argv[2],argv[3],OCRData,Data); //Projektwerkstatt EnergyCam_Log2CSVFile("/var/www/ecpi/data/ecpi.csv",OCRData,Data); } } } // end while EnergyCamClose(); return 0; }