Skip to content

Commit 99e35dc

Browse files
committed
Merge branch 'develop'
2 parents b99f977 + 7616095 commit 99e35dc

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+3745
-1797
lines changed

.dockerignore

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
.DS_Store
2+
.git/
3+
.gitattributes
4+
.gitignore
5+
.pio/
6+
.vscode
7+
README.md
8+
build/
9+
buildall.sh
10+
cli.py
11+
data/
12+
data_src/
13+
docs/
14+
lib/
15+
platformio.ini
16+
prep_data_folder.py
17+
coverage/

.gitignore

+7
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
1+
.vscode/c_cpp_properties.json
2+
.vscode/launch.json
3+
.vscode/settings.json
4+
.vscode/.ropeproject/
15
data/
26
.pio/
7+
build/
8+
coverage/
9+
__pycache__/
310

411

512
#

CMakeLists.txt

+80
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
cmake_minimum_required(VERSION 3.13)
2+
3+
project(tic)
4+
5+
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
6+
set(CMAKE_CXX_STANDARD 14)
7+
set(CMAKE_CXX_EXTENSIONS OFF)
8+
9+
option(DUMP_VARS "dump CMake variables" OFF)
10+
11+
12+
if(CMAKE_HOST_SYSTEM_NAME STREQUAL Darwin)
13+
find_package(gtest REQUIRED)
14+
else()
15+
set(GTEST_BOTH_LIBRARIES gtest gtest_main)
16+
endif()
17+
18+
19+
# Code Coverage Configuration
20+
add_library(coverage_config INTERFACE)
21+
22+
option(CODE_COVERAGE "Enable coverage reporting" OFF)
23+
if(CODE_COVERAGE AND CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
24+
# Add required flags (GCC & LLVM/Clang)
25+
target_compile_options(coverage_config INTERFACE
26+
-O0 # no optimization
27+
-g # generate debug info
28+
--coverage # sets all required flags
29+
)
30+
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.13)
31+
target_link_options(coverage_config INTERFACE --coverage)
32+
else()
33+
target_link_libraries(coverage_config INTERFACE --coverage)
34+
endif()
35+
endif()
36+
37+
38+
add_executable(tic
39+
test/test_teleinfo.cpp
40+
test/test_config.cpp
41+
test/test_tic.cpp
42+
test/test_sys.cpp
43+
test/test_filesystem.cpp
44+
test/test_support.cpp
45+
test/mock_time.cpp
46+
test/mock.cpp
47+
test/mock_support.cpp)
48+
49+
target_include_directories(tic
50+
PRIVATE ${GTEST_INCLUDE_DIRS}
51+
PRIVATE src
52+
PRIVATE test/support)
53+
54+
target_compile_options(tic PUBLIC -Wall -pedantic)
55+
56+
if(CMAKE_SYSTEM_PROCESSOR STREQUAL armv7l)
57+
# https://github.com/nlohmann/json/issues/658
58+
target_compile_options(tic PUBLIC -Wno-psabi)
59+
endif()
60+
61+
target_link_libraries(tic
62+
PRIVATE ${GTEST_BOTH_LIBRARIES} pthread)
63+
64+
target_link_libraries(tic PUBLIC coverage_config)
65+
66+
67+
enable_testing()
68+
add_test(NAME tic_test COMMAND tic)
69+
70+
71+
function(dump_cmake_variables)
72+
get_cmake_property(_variableNames VARIABLES)
73+
list(SORT _variableNames)
74+
foreach (_variableName ${_variableNames})
75+
message(STATUS "${_variableName}=${${_variableName}}")
76+
endforeach()
77+
endfunction()
78+
if(DUMP_VARS)
79+
dump_cmake_variables()
80+
endif()

Dockerfile

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
FROM alpine:3.10
2+
3+
RUN apk add --no-cache gcc g++ gdb make cmake musl-dev gtest-dev vim wget curl bash perl \
4+
&& wget -P /usr/local/include/nlohmann/ https://github.com/nlohmann/json/releases/download/v3.7.3/json.hpp
5+
6+
RUN curl -slkL https://github.com/linux-test-project/lcov/releases/download/v1.14/lcov-1.14.tar.gz | tar -C /tmp -xzf - \
7+
&& cd /tmp/lcov-1.14 \
8+
&& make install \
9+
&& cd / \
10+
&& rm -rf /tmp/lcov-1.14
11+
12+
VOLUME /tic
13+
14+
VOLUME /coverage
15+
16+
WORKDIR /build

README.md

+123
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
# WifInfo
2+
3+
WifInfo est un module de consignation de la téléinformation des compteurs électriques avec serveur web embarqué.
4+
5+
## Introduction
6+
7+
Ce projet est la fusion de développements réalisés en vue du remplacement d'un [eco-devices](http://gce-electronics.com/fr/111-eco-devices) sur base de [ESP-01](https://fr.wikipedia.org/wiki/ESP8266) et de la une réécriture quasi complète - sauf la partie interface web - du projet homonyme de C-H. Hallard [LibTeleinfo](https://github.com/hallard/LibTeleinfo) avec des modifications notamment de [olileger](https://github.com/olileger/LibTeleinfo) et [Doume](https://github.com/Doume/LibTeleinfo).
8+
9+
* Meilleure séparation des fonctions dans des fichiers sources différents
10+
* Homogénéisation du nommage, nettoyage du code source
11+
* Minimisation des allocations mémoire (nouvelle librairie teleinfo)
12+
* Server-sent event ([SSE](https://fr.wikipedia.org/wiki/Server-sent_events)) pour les mises à jour des index
13+
* Notifications HTTP sur changements HC/HP et dépasssement de seuils ou ADPS
14+
* Client en liaison série pour mise au point avec [SimpleCLI](https://github.com/spacehuhn/SimpleCLI)
15+
* Tests sur PC avec [Google Test](https://github.com/google/googletest) et couverture avec [lcov](http://ltp.sourceforge.net/coverage/lcov.php)
16+
* Client Python de simulation [cli.py](./cli.py) sur base de `miniterm.py` de [pySerial](https://pyserial.readthedocs.io/)
17+
* Compression et minimisation de la partie web avant écriture du filesystem (`data_src``data` au moment du build)
18+
* Serveur Python [Flask](https://www.palletsprojects.com/p/flask/) pour développement de la partie web
19+
* Utilisation de [PlatformIO](https://platformio.org) comme environnement de développement
20+
21+
## Documentation
22+
23+
Documentation ERDF sur la [téléinformation client](https://www.enedis.fr/sites/default/files/Enedis-NOI-CPT_02E.pdf) pour les compteurs électroniques et pour les compteurs [Linky](https://www.enedis.fr/sites/default/files/Enedis-NOI-CPT_54E.pdf).
24+
25+
Module [PiTInfo](https://hallard.me/pitinfov12/) et explications pourquoi le montage avec uniquement optocoupleur et résistances ne suffit pas avec un esp8266.
26+
27+
## Compilation
28+
29+
Le projet est prévu pour PlatformIO sous macOS ou Linux, en conjonction avec [Visual Studio Code](https://code.visualstudio.com) et son l'extension [PlatformIO](https://marketplace.visualstudio.com/items?itemName=platformio.platformio-ide).
30+
L'IDE d'Arduino peut également être utilisé.
31+
32+
La page HTML est compressée avec [html-minifier](https://github.com/kangax/html-minifier) et gzip.
33+
34+
### PlatformtIO
35+
36+
```bash
37+
platformio run -t uploadfs
38+
platformio run -t upload
39+
```
40+
41+
### IDE Arduino
42+
43+
Cf. les nombreux tutos pour l'utilisation d'esp8266-arduino et l'upload de SPIFFS.
44+
45+
Le répertoire `data` est préparé à l'aide du script suivant (nécessite python3, gzip, html-minifier) :
46+
47+
```bash
48+
python3 prep_data_folder.py
49+
```
50+
51+
## Client de test/mise au point
52+
53+
```bash
54+
pip3 install pySerial
55+
python3 cli.py [port]
56+
```
57+
58+
Pour activer le mode commande, il faut taper <TAB> puis la commande (ls, config, time, esp, ...).
59+
60+
* `Ctrl-T` envoie une trame de téléinformation
61+
* `Ctrl-Y` bascule l'envoi automatique de trames
62+
* `Ctrl-P` bascule entre heures creuses et heures pleines
63+
* `Ctrl-C` sort du client
64+
65+
## Tests unitaires
66+
67+
Les tests unitaires et la couverture sont faites dans un conteneur Docker.
68+
69+
Néanmoins, les logiciels et librairies suivants sont nécessaires:
70+
* [CMake](https://cmake.org)
71+
* [Google Test](https://github.com/google/googletest)
72+
* [nlohmann json](https://github.com/nlohmann/json)
73+
* [lcov](http://ltp.sourceforge.net/coverage/lcov.php)
74+
75+
Préparation de l'image:
76+
```bash
77+
docker build -t tic .
78+
```
79+
80+
Lancement des tests et couverture:
81+
```bash
82+
docker run --rm -ti -v $(pwd):/tic:ro -v $(pwd)/coverage:/coverage tic /tic/runtest.sh
83+
```
84+
85+
La couverture est disponible dans `./coverage/index.html`
86+
87+
88+
## Développement web
89+
90+
### Avec module simulé (aucun esp8266 requis)
91+
92+
```bash
93+
pip3 install flask flask_cors
94+
python3 tools/srv.py
95+
```
96+
L'interface est alors disponible à cette adresse: [http://localhost:5000/](http://localhost:5000/).
97+
98+
### Avec module et partie web sur PC
99+
100+
[nginx](http://nginx.org/en/) est utilisé en reverse proxy pour accéder aux pages dynamiques du module.
101+
102+
```bash
103+
tools/httpdev.sh [adresse IP du module]
104+
```
105+
L'interface alors sera disponible à cette adresse: [http://localhost:5001/](http://localhost:5001/), avec les requêtes dynamiques redirigées vers le module (qui doit donc être opérationnel et joignable).
106+
107+
## Montage
108+
109+
Le montage final utilise un ESP-01S avec le module [PiTInfo](http://hallard.me/pitinfov12-light/) - à acheter sur [tindie](https://www.tindie.com/products/Hallard/pitinfo/). L'alimentation est assurée par module USB.
110+
111+
![teleinfo](docs/teleinfo.jpg)
112+
113+
## Licence
114+
115+
Compte-tenu de la diversité d'origine des sources, ce travail est publié avec la licence de [WifInfo](https://github.com/hallard/LibTeleinfo/tree/master/examples/Wifinfo).
116+
117+
<div align="center">
118+
119+
[![Licence Creative Commons](https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-nc-sa/4.0/)
120+
121+
</div>
122+
123+
Ce(tte) œuvre est mise à disposition selon les termes de la [Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International](http://creativecommons.org/licenses/by-nc-sa/4.0/).

buildall.sh

+11-5
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
1-
#!/bin/sh
1+
#!/usr/bin/env bash
2+
3+
set -euo pipefail
24

35
platformio run -t size
6+
platformio run -t buildfs
47

5-
mkdir -p test/build
6-
cd test/build
7-
cmake .. -DCMAKE_BUILD_TYPE=Debug
8-
make
8+
docker buildx build -t test .
9+
docker run --rm -ti \
10+
-v $(pwd):/tic:ro \
11+
-v $(pwd)/build:/build \
12+
-v $(pwd)/coverage:/coverage \
13+
test \
14+
/tic/runtest.sh

0 commit comments

Comments
 (0)