Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions examples/Raspberry_cJSON/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
*.o
*.bak
raspjson_standard
32 changes: 27 additions & 5 deletions examples/Raspberry_cJSON/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,26 @@ Se connecter en ssh sur votre Pi, il doit y avoir les environnements de dévelop

`apt-get install build-essential git-core libcjson-dev libcurl4-openssl-dev`

Nous utilisons la version récente de développement de la librairie spdlog (Ne pas utiliser le packge):
Version Static (.a)
```
$ cd /home/pi/GIT (Adapter en fonction de votre système / voir aussi dans Makefile ensuite)
$ git clone https://github.com/gabime/spdlog.git
$ cd spdlog && mkdir build && cd build
$ cmake .. && make -j
```

Version Dynamic (.so)
```
$ cd /home/pi/GIT (Adapter en fonction de votre système / voir aussi dans Makefile ensuite)
$ git clone https://github.com/gabime/spdlog.git
$ cd spdlog && mkdir build && cd build
$ cmake .. -DSPDLOG_BUILD_BENCH=OFF -DSPDLOG_BUILD_EXAMPLES=OFF -DSPDLOG_BUILD_TESTS=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local -DCMAKE_INSTALL_LIBDIR=lib -DSPDLOG_BUILD_SHARED=ON
$ cd ../include & sudo cp -Rf spglog /usr/local/include/spdlog
$ sudo cp -a build/libspdlog.* /usr/local/lib/
$ sudo ldconfig
```

Ensuite :
```
git clone https://github.com/Tifaifai/LibTeleinfo
Expand All @@ -20,6 +40,9 @@ make
./raspjson
```

Exemple avec un alias de lancement :
alias linky='/usr/local/bin/raspjson_standard -m s -y /dev/ttyACM0 -e -k aa38f67...... -r http://....fr/input/post -n linky -d'

### Installation MQTT : Publication MQTT
Lire le README_MQTT.md pour installer MQTT (mosquitto 2.0.15 avec support de Websockets 4.3.2)

Expand All @@ -31,7 +54,7 @@ make raspjson_mqtt
./raspjson_mqtt
```

Et voilà ce que ça donne avec un dongle MicroTeleinfo
Et voilà ce que ça donne avec un dongle MicroTeleinfo en mode Historique sur le Linky

```
root@pi01(rw):~# git clone https://github.com/Tifaifai/LibTeleinfo
Expand All @@ -42,9 +65,9 @@ remote: Total 23 (delta 5), reused 21 (delta 3), pack-reused 0
Unpacking objects: 100% (23/23), done.
root@pi01(rw):~# cd LibTeleinfo/examples/Raspberry_cJSON/
root@pi01(rw):~/LibTeleinfo/examples/Raspberry_cJSON# make
cc -DRASPBERRY_PI -c raspjson.cpp
cc -DRASPBERRY_PI -c ../../LibTeleinfo.cpp
cc -DRASPBERRY_PI -o raspjson raspjson.o LibTeleinfo.o

....

root@pi01(rw):~/LibTeleinfo/examples/Raspberry_JSON# ./raspjson -d /dev/ttyUSB0
{"_UPTIME":34957, "ADCO":2147483647, "OPTARIF":"HC..", "ISOUSC":15, "HCHC":247418, "HCHP":0, "PTEC":"HC..", "IINST":1, "IMAX":1, "PAPP":150, "HHPHC":"A", "MOTDETAT":0}
{"PAPP":140}
Expand Down Expand Up @@ -94,4 +117,3 @@ Vous pouvez aller voir les nouveautés et autres projets sur [blog][7]
[8]: https://community.hallard.me/category/7
[9]: https://community.hallard.me
[10]: https://hallard.me/libteleinfo

17 changes: 13 additions & 4 deletions examples/Raspberry_cJSON/makefile
Original file line number Diff line number Diff line change
Expand Up @@ -11,21 +11,30 @@ CXXFLAGS += -lcjson
# cURL
CXXFLAGS += -lcurl

# spdlog
#INCLUDES += -I/home/pi/GIT/spdlog/include
#CXXFLAGS += -pthread -lspdlog -DSPDLOG_COMPILED_LIB
#LDFLAGS += -L/home/pi/GIT/spdlog/build -lspdlog
INCLUDES += -I/usr/local/include/spdlog/
CXXFLAGS += -pthread -lspdlog -DSPDLOG_COMPILED_LIB
LDFLAGS += -L/usr/local/lib/ -lspdlog


# raspjson
all: raspjson_standard

# ===== Compile
LibTeleinfo.o: ../../src/LibTeleinfo.cpp
$(CC) $(CFLAGS) -c ../../src/LibTeleinfo.cpp
$(CC) $(CFLAGS) -c ../../src/LibTeleinfo.cpp

raspjson.o: raspjson.cpp
$(CC) $(CFLAGS) -c raspjson.cpp $(CXXFLAGS) $(INCLUDES)
$(CC) $(CFLAGS) -c raspjson.cpp $(INCLUDES) $(CXXFLAGS)

raspjson_stand.o: raspjson_stand.cpp
$(CC) $(CFLAGS) -c raspjson_stand.cpp $(CXXFLAGS) $(INCLUDES)
$(CC) $(CFLAGS) -c raspjson_stand.cpp $(INCLUDES) $(CXXFLAGS)

raspjson_mqtt.o: raspjson_mqtt.cpp
$(CC) $(CFLAGS) -g -c raspjson_mqtt.cpp $(CXXFLAGS) $(INCLUDES) -lmosquitto
$(CC) $(CFLAGS) -g -c raspjson_mqtt.cpp $(INCLUDES) $(CXXFLAGS) -lmosquitto

# ===== Link
raspjson: raspjson.o LibTeleinfo.o
Expand Down
123 changes: 35 additions & 88 deletions examples/Raspberry_cJSON/raspjson_stand.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@

#include "cJSON.h"
#include <curl/curl.h>
#include "spdlog/spdlog.h"
#include "spdlog/sinks/rotating_file_sink.h" // support for rotating file logging

// ----------------
// Constants
Expand Down Expand Up @@ -81,10 +83,8 @@ static struct
// Configuration structure defaults values
} opts;

void log_syslog( FILE * stream, const char *format, ...);
void sendJSON(ValueList * me, bool all);


// ======================================================================
// Global vars
// ======================================================================
Expand All @@ -100,35 +100,6 @@ char http_buffer[HTTP_BUFFER_SIZE]; // Where http returned data will be filled
// Used to indicate if we need to send all date or just modified ones
bool fulldata = true;

/* ======================================================================
Function: getValueFromLabelIndex
Purpose : return label value from label index
Input : label index to search for
Output : value filled
Comments: -
====================================================================== */
char * getValueFromLabelIndex(int labelIndex, char * value)
{
fprintf(stdout, "I:%d, V%s\n", labelIndex, &value);
if (!value) {
return nullptr;
}
char labelName[17];
*value = '\0';

// Get the label name
GetTextIndexed(labelName, sizeof(labelName), labelIndex, kLabel);
// Get value of label name
tinfo.valueGet(labelName, value) ;

// Standard mode has values with space before/after
if (opts.mode ==TINFO_MODE_STANDARD) {
Trim(value);
}

return *value ? value : nullptr;
}

/* ======================================================================
Function: ADPSCallback
Purpose : called by library when we detected a ADPS on any phased
Expand Down Expand Up @@ -316,19 +287,19 @@ int http_post( char * str_url )

// Set curl URL
if ( curl_easy_setopt(g_pcurl, CURLOPT_URL, str_url) != CURLE_OK )
log_syslog(stderr, "Error while setting curl url %s : %s", str_url, curl_easy_strerror(res));
spdlog::error("Error while setting curl url {} : {}", str_url, curl_easy_strerror(res));
else
{
// Perform the request, res will get the return code
if( (res = curl_easy_perform(g_pcurl)) != CURLE_OK)
{
log_syslog(stderr, "Error on http request %s : %s", str_url, curl_easy_strerror(res));
spdlog::error("Error on http request {} : {}", str_url, curl_easy_strerror(res));
}
else
{
// return data received
if (opts.verbose)
log_syslog(stdout, "http_post %s ==> '%s'\n", str_url, http_buffer);
spdlog::info("http_post {} ==> '{}'", str_url, http_buffer);

// emoncms returned string "ok", all went fine
if (strcmp(http_buffer, "ok") == 0 )
Expand All @@ -351,18 +322,21 @@ Comments: -
bool isBlacklistedLabel(char * name, char * value)
{
bool bl = false;
if ( strstr(kLabelBlacklist, name) ) {
char rname[32] = "";
sprintf(rname, "|%s|", name);

if ( strstr(kLabelBlacklist, rname) ) {
bl = true;
if(opts.verbose) {
fprintf(stdout, "TIC: %s is blacklisted\n", name);
}
}
if ( !strstr(kLabel, name) ) {
if ( !strstr(kLabel, rname) ) {
bl = true;
if(opts.verbose) {
fprintf(stdout, "TIC: Label %s:%s no exist in datasheet\n", name, value);
}
log_syslog(stderr, "TIC: Label [%s:%s] no exist\n",name, value);
spdlog::error("TIC: Label [{}:{}] no exist",name, value);
}
return bl;
}
Expand Down Expand Up @@ -408,8 +382,6 @@ void sendJSON(ValueList * me, bool all)
if (!isBlacklistedLabel(me->name, me->value)) {

if (opts.mode == TINFO_MODE_STANDARD) {
//getValueFromLabelIndex(LABEL_LTARF, me->value);
//getValueFromLabelIndex(LABEL_NGTF, me->value);
tlf_treat_label_standard(me->name, me->value);
}

Expand Down Expand Up @@ -474,7 +446,7 @@ void sendJSON(ValueList * me, bool all)
// Send data to emoncms
if (!http_post(emoncms_url))
{
log_syslog(stderr, "emoncms post error\n");
spdlog::error("emoncms post error [{}]", emoncms_url);
}
}
else
Expand All @@ -486,41 +458,6 @@ void sendJSON(ValueList * me, bool all)
// ======================================================================
void tlf_close_serial(int);

/* ======================================================================
Function: log_syslog
Purpose : write event to syslog
Input : stream to write if needed
string to write in printf format
printf other arguments
Output : -
Comments:
====================================================================== */
void log_syslog( FILE * stream, const char *format, ...)
{
static char tmpbuff[512]="";
va_list args;
int len;

// do a style printf style in ou buffer
va_start (args, format);
len = vsnprintf (tmpbuff, sizeof(tmpbuff), format, args);
tmpbuff[sizeof(tmpbuff) - 1] = '\0';
va_end (args);

// Write to logfile
openlog( PRG_NAME, LOG_PID|LOG_CONS, LOG_USER);
syslog(LOG_INFO, "%s", tmpbuff);
closelog();

// stream passed ? write also to it
if (stream && opts.verbose && !opts.daemon)
{
fprintf(stream, "%s", tmpbuff);
//fprintf(stream, "\n");
fflush(stream);
}
}

/* ======================================================================
Function: clean_exit
Purpose : exit program
Expand All @@ -540,7 +477,7 @@ void clean_exit (int exit_code)
{
// Restore Old parameters.
if ( (r = tcsetattr(g_fd_teleinfo, TCSAFLUSH, &g_oldtermios)) < 0 )
log_syslog(stderr, "cannot restore old parameters %s: %s", opts.port, strerror(errno));
spdlog::error("cannot restore old parameters {}: {}", opts.port, strerror(errno));

// then close
tlf_close_serial(g_fd_teleinfo);
Expand Down Expand Up @@ -645,13 +582,13 @@ void signal_handler (int signum)
{
// Indicate we want to quit
g_exit_pgm = true;
log_syslog(stdout, "\nReceived SIGINT\n");
spdlog::info("Received SIGINT");
}
else if ( signum==SIGTERM )
{
// Indicate we want to quit
g_exit_pgm = true;
log_syslog(stdout, "\nReceived SIGTERM\n");
spdlog::info("Received SIGTERM");
}
}

Expand All @@ -671,14 +608,14 @@ int tlf_init_serial(void)
if ( (tty_fd = open(opts.port, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK)) < 0 )
fatal( "tlf_init_serial %s: %s", opts.port, strerror(errno));
else
log_syslog( stdout, "'%s' opened.\n",opts.port);
spdlog::info("'{}' opened.",opts.port);

// Set descriptor status flags
fcntl (tty_fd, F_SETFL, O_RDWR ) ;

// Get current parameters for saving
if ( (r = tcgetattr(tty_fd, &g_oldtermios)) < 0 )
log_syslog(stderr, "cannot get current parameters %s: %s", opts.port, strerror(errno));
spdlog::error("cannot get current parameters {}: {}", opts.port, strerror(errno));

// copy current parameters and change for our own
memcpy( &termios, &g_oldtermios, sizeof(termios));
Expand All @@ -689,11 +626,11 @@ int tlf_init_serial(void)
if(opts.mode == TINFO_MODE_HISTORIQUE) {
// Set serial speed to 1200 bps
if (cfsetospeed(&termios, B1200) < 0 || cfsetispeed(&termios, B1200) < 0 )
log_syslog(stderr, "cannot set serial speed to 1200 bps (mode historique): %s", strerror(errno));
spdlog::error("cannot set serial speed to 1200 bps (mode historique): {}", strerror(errno));
} else {
// Set serial speed to 9600 bps
if (cfsetospeed(&termios, B9600) < 0 || cfsetispeed(&termios, B9600) < 0 )
log_syslog(stderr, "cannot set serial speed to 9600 bps (mode standard): %s", strerror(errno));
spdlog::error("cannot set serial speed to 9600 bps (mode standard): {}", strerror(errno));
}

// Parity Even
Expand All @@ -716,7 +653,7 @@ int tlf_init_serial(void)

// now setup the whole parameters
if ( tcsetattr (tty_fd, TCSANOW | TCSAFLUSH, &termios) <0)
log_syslog(stderr, "cannot set current parameters %s: %s", opts.port, strerror(errno));
spdlog::error("cannot set current parameters {}: {}", opts.port, strerror(errno));

// Sleep 50ms
// trust me don't forget this one, it will remove you some
Expand Down Expand Up @@ -973,6 +910,15 @@ int main(int argc, char **argv)
g_fd_teleinfo = 0;
g_exit_pgm = false;

bool m_gen_log = true;
if(m_gen_log) {
spdlog::set_level(spdlog::level::debug);
auto file_logger = spdlog::rotating_logger_mt("file_logger", "/home/pi/linky.log", 1024 * 1024 * 5, 3);
spdlog::set_default_logger(file_logger);
spdlog::flush_on(spdlog::level::debug);
spdlog::info("{} - LINKY Téléinfo", __FUNCTION__);
}

// get configuration
read_config(argc, argv);

Expand Down Expand Up @@ -1010,7 +956,7 @@ int main(int argc, char **argv)
else
{
if (opts.verbose)
log_syslog(stderr, "Curl Initialized\n");
spdlog::info("Curl Initialized");
}
}
}
Expand All @@ -1031,11 +977,11 @@ int main(int argc, char **argv)
tinfo.attachUpdatedFrame(UpdatedFrame);
tinfo.attachNewFrame(NewFrame);

log_syslog(stdout, "Inits succeded, entering Main loop\n");
spdlog::info("Inits succeded, entering Main loop");

if (opts.daemon)
{
log_syslog(stdout, "Starting as a daemon\n");
spdlog::info("Starting as a daemon");
daemonize();
}

Expand All @@ -1058,8 +1004,9 @@ int main(int argc, char **argv)
usleep(10000);
}

log_syslog(stderr, "Program terminated\n");

spdlog::info("Program terminated");
spdlog::shutdown();

clean_exit(EXIT_SUCCESS);

// avoid compiler warning
Expand Down
Loading