diff --git a/Makefile b/Makefile index 092ee12..36a1421 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ # Makefile main: - gcc everblu_meters.c -o everblu_meters -lwiringPi -lpthread -Wall + gcc everblu_meters.c -o everblu_meters -lwiringPi -lmosquitto -lpthread -Wall diff --git a/README.md b/README.md index d141e0d..1ff342e 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ The project runs on Raspberry Pi with an RF transreciver (CC1101). ## Configuration 1. Enable SPI in raspi-config. 2. Install WiringPi from https://github.com/WiringPi/WiringPi/ -3. Install mosquitto-dev: `apt install mosquitto-dev` +3. Install libmosquitto-dev: `apt install libmosquitto-dev` 4. Set meter serial number and production date in `cc1101.c`, it can be found on the meter label itself: ![Cyble Meter Label](meter_label.png) 5. Compile the code with `make` diff --git a/cc1101.c b/cc1101.c index 178c402..a3dac21 100644 --- a/cc1101.c +++ b/cc1101.c @@ -14,8 +14,15 @@ uint8_t CC1101_status_FIFO_FreeByte=0; uint8_t CC1101_status_FIFO_ReadByte=0; uint8_t debug_out=0; -#define METER_YEAR 20 -#define METER_SERIAL 1234567 +struct tmeter_data { + int liters; + int reads_counter; // how many times the meter has been readed + int battery_left; //in months + int time_start; // like 8am + int time_end; // like 4pm +}; + + #define TX_LOOP_OUT 300 @@ -421,19 +428,28 @@ uint8_t cc1101_wait_for_packet(int milliseconds) return TRUE; } -void display_meter_report (uint8_t *decoded_buffer , uint8_t size) +struct tmeter_data parse_meter_report (uint8_t *decoded_buffer , uint8_t size) { - if (size >= 30) - { - echo_debug(1,"\r\n%u/%u/20%u %u:%u:%u ",decoded_buffer[24],decoded_buffer[25],decoded_buffer[26],decoded_buffer[28],decoded_buffer[29],decoded_buffer[30]); - echo_debug(1,"%u litres ",decoded_buffer[18]+decoded_buffer[19]*256 + decoded_buffer[20]*65536 + decoded_buffer[21]*16777216); - } - if (size >= 48) - { - echo_debug(1,"Num %u %u Mois %uh-%uh ",decoded_buffer[48], decoded_buffer[31],decoded_buffer[44],decoded_buffer[45]); - decoded_buffer[43]=0; //to be sure that string will end - echo_debug(1,"serial:%s ",&decoded_buffer[32]); - } + struct tmeter_data data; + + + if (size >= 30) + { + //echo_debug(1,"\r\n%u/%u/20%u %u:%u:%u ",decoded_buffer[24],decoded_buffer[25],decoded_buffer[26],decoded_buffer[28],decoded_buffer[29],decoded_buffer[30]); + //echo_debug(1,"%u litres ",decoded_buffer[18]+decoded_buffer[19]*256 + decoded_buffer[20]*65536 + decoded_buffer[21]*16777216); + + data.liters = decoded_buffer[18]+decoded_buffer[19]*256 + decoded_buffer[20]*65536 + decoded_buffer[21]*16777216; + } + if (size >= 48) + { + //echo_debug(1,"Num %u %u Mois %uh-%uh ",decoded_buffer[48], decoded_buffer[31],decoded_buffer[44],decoded_buffer[45]); + data.reads_counter = decoded_buffer[48]; + data.battery_left = decoded_buffer[31]; + data.time_start = decoded_buffer[44]; + data.time_end = decoded_buffer[45]; + } + + return data; } // Remove the start- and stop-bits in the bitstream , also decode oversampled bit 0xF0 => 1,0 @@ -565,6 +581,7 @@ int receive_radian_frame(int size_byte,int rx_tmo_ms ,uint8_t*rxBuffer,int rxBuf } } if(l_tmo +#include +#include +#include + #include "everblu_meters.h" +#include "cc1101.c" + +void my_message_callback(struct mosquitto *mosq, void *userdata, const struct mosquitto_message *message) +{ + + if(message->payloadlen){ + printf("%s %s", message->topic, (char *)message->payload); + }else{ + printf("%s (null)\n", message->topic); + } + fflush(stdout); +} + +void my_connect_callback(struct mosquitto *mosq, void *userdata, int result) +{ + if(!result){ + /* Subscribe to broker information topics on successful connect. */ + mosquitto_subscribe(mosq, NULL, "CCYY ", 2); + }else{ + fprintf(stderr, "Connect failed\n"); + } +} + +void my_subscribe_callback(struct mosquitto *mosq, void *userdata, int mid, int qos_count, const int *granted_qos) +{ + int i; + printf("Subscribed (mid: %d): %d", mid, granted_qos[0]); + for(i=1; i