Tous les articles par jb

Suivre les données télé-info de EDF dans Grafana

Hello,

Je vous propose de suivre votre consommation grâce aux données télé-info d’EDF recueilli. Je ne vais pas vous expliquer comment récupérer les données, mais plutôt vous aidez à les afficher dans Grafana dont voici un aperçu.

 

 

Prérequis :

  • La récupération des données fonctionne, voir tuto http://www.magdiblog.fr/gpio/teleinfo-edf-suivi-conso-de-votre-compteur-electrique/
  • Avoir monté une solution de supervision Grafana/Prometheus.

C’est partie pour l’intégration :

Installer le package xinetd qui va permettre d’afficher la page web :

apt update
apt install xinetd

On place le fichier de conf xinetd dans le repertoire /etc/xinetd.d/

cd /etc/xinetd.d/
curl -k -O https://raw.githubusercontent.com/jbsky/jbsky/master/script/edf/etc/edf

Le fichier de config xinetd téléchargé :

[pastacode lang= »bash » user= »jbsky » repos= »jbsky » path_id= »/script/edf/etc/edf » revision= » » highlight= » » lines= » » provider= »github »/]

Ensuite, on place les 3 scripts suivants dans le répertoire /usr/local/bin/

cd /usr/local/bin/
curl -k -O https://raw.githubusercontent.com/jbsky/jbsky/master/script/edf/bin/edf-teleinfo
curl -k -O https://raw.githubusercontent.com/jbsky/jbsky/master/script/edf/bin/edf-expose-metric
curl -k -O https://raw.githubusercontent.com/jbsky/jbsky/master/script/edf/bin/httpwrapper
chmod +x /usr/local/bin/{httpwrapper,edf-teleinfo,edf-expose-metric}

Le 1er qui est lancé par /etc/init.d/edf est en écoute sur le dev, ici à configurer par le votre, alimente au fur et à mesure que des infos sont lues dans un fichier /tmp.

[pastacode lang= »bash » user= »jbsky » repos= »jbsky » path_id= »/script/edf/bin/edf-teleinfo » revision= » » highlight= »3″ lines= » » provider= »github »/]

Le 2e script va afficher les métriques, si vous avez lancé le 1er script, celui-ci devrait afficher les données recueillies.

[pastacode lang= »bash » user= »jbsky » repos= »jbsky » path_id= »/script/edf/bin/edf-expose-metric » revision= » » highlight= » » lines= » » provider= »github »/]

Le dernier est le httpwrapper, en gros, ça va rajouter un header afin que n’importe quel navigateur considère les données du 2e script comme une page web.

[pastacode lang= »bash » user= »jbsky » repos= »jbsky » path_id= »/script/edf/bin/httpwrapper » revision= » » highlight= » » lines= » » provider= »github »/]

Pour la partie lancement de service de la collecte des infos dans le fichier tmp, il faut encore un script à placer dans /etc/init.d/

Malheureusement, même si j’ai un fichier systemd dans le dépot, je n’ai pas réussit à démarrer le service sans qu’il me ramène un code erreur à 2, si quelqu’un à la solution, je suis preneur, bien entendu.

cd /etc/init.d/
curl -k -O https://raw.githubusercontent.com/jbsky/jbsky/master/script/edf/init.d/edf-teleinfo
chmod +x /etc/init.d/edf-teleinfo

[pastacode lang= »bash » user= »jbsky » repos= »jbsky » path_id= »/script/edf/init.d/edf-teleinfo » revision= » » highlight= » » lines= » » provider= »github »/]

Reste à démarrer l’histoire!

systemctl restart xinetd
systemctl enable edf-teleinfo
systemctl start edf-teleinfo

Logiquement, le port 10111 doit être en écoute :

lsof -i -n -P |grep 10111

doit ramener une ligne.

=> http://192.168.X.Y:10111

Attention, un test avec le navigateur est aussi nécessaire.

Si vos données s’affiche, y a plus qu’à configurer dans Prometheus, pas de difficulté apparente, ajouter ce qui suit dans le fichier prometheus.yml.

 - job_name: 'edf'
static_configs:
- targets: ['192.168.X.Y:10111']

Étape finale, le board grafana est disponible à l’URL suivante :

https://grafana.com/grafana/dashboards/11675

Sources :

https://apawel.me/exporting-prometheus-metrics-with-bash-scripts/

[Oracle][PL/SQL] Requête pour balayer les données

Rechercher dans une base oracle un nombre (Search_Valeur), il est possible de filtrer les colonnes en renseignant Search_Colonne.


/* VERSION VALEUR NUMERIQUE */
SET SERVER OUTPUT ON
SET SERVEROUTPUT ON
DECLARE
TYPE curtype
IS
  REF
  CURSOR;
    Curseur_Table curtype;
    Curseur_Colonne curtype;
    Curseur_Search curtype;
    Counter              NUMBER:=0;
    RequeteSQL_Colonne   VARCHAR2(200);
    RequeteSQL_Table     VARCHAR2(500);
    RequeteSQL_Searching VARCHAR2(2048);
    Search_Table         VARCHAR (100):= '';
    Search_Colonne       VARCHAR (100):= '';

    Nom_Table            VARCHAR (200);
    Nom_Colonne          VARCHAR2(200);
    Search_Valeur        VARCHAR (200):='126980';
  BEGIN
    RequeteSQL_Table:='SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME LIKE ''%'||Search_Table||'%''';
    -- dbms_output.put_line(RequeteSQL_Table);
    OPEN Curseur_Table FOR RequeteSQL_Table;
    LOOP
      FETCH Curseur_Table INTO Nom_Table;
    EXIT
  WHEN Curseur_Table%notfound;
    RequeteSQL_Colonne:='SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME='''||Nom_Table||''' AND DATA_TYPE IN (''NUMBER'') AND COLUMN_NAME LIKE ''%'|| Search_Colonne ||'%''';
    -- dbms_output.put_line(RequeteSQL_Colonne);
    OPEN Curseur_Colonne FOR RequeteSQL_Colonne;
    LOOP
      FETCH Curseur_Colonne INTO Nom_Colonne;
      EXIT
    WHEN Curseur_Colonne%notfound;
      RequeteSQL_Searching :='SELECT count(*) FROM "'||Nom_Table||'" WHERE "'||Nom_Colonne||'"=' || Search_Valeur;
      -- dbms_output.put_line(RequeteSQL_Searching);
      EXECUTE IMMEDIATE RequeteSQL_Searching INTO Counter;
      IF Counter > 0 THEN
        dbms_output.put_line(''|| Search_Valeur ||' trouvé '||Counter || ' fois dans "'|| Nom_Table ||'"."'|| Nom_Colonne ||'" SELECT * FROM ' || Nom_Table || ' WHERE ' || Nom_Colonne || ' = ' || Search_Valeur || ';' );
      END IF;
    END LOOP;
    CLOSE Curseur_Colonne;
  END LOOP;
  CLOSE Curseur_Table;
END;

Rechercher dans une base oracle une chaine (Search_String), il est possible de filtrer les colonnes en renseignant Search_Colonne.


/* VERSION CHAINE DE CARACTERES */
SET SERVEROUTPUT ON
SET SERVER OUTPUT ON
DECLARE
TYPE curtype
IS
  REF
  CURSOR;
    Curseur_Table curtype;
    Curseur_Colonne curtype;
    Curseur_Search curtype;
    Counter              NUMBER:=0;
    RequeteSQL_Colonne   VARCHAR2(200);
    RequeteSQL_Table     VARCHAR2(500);
    RequeteSQL_Searching VARCHAR2(2048);
    Search_String        VARCHAR (100) := '' ;
    Search_Table         VARCHAR (100) := '' ;
    Nom_Table            VARCHAR (200) ;
    Nom_Colonne          VARCHAR2(200);
  BEGIN
    RequeteSQL_Table:='SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME LIKE ''%'||Search_Table||'%''';
    --    dbms_output.put_line(RequeteSQL_Table);
    OPEN Curseur_Table FOR RequeteSQL_Table;
    LOOP
      FETCH Curseur_Table INTO Nom_Table;
    EXIT
  WHEN Curseur_Table%notfound;
    RequeteSQL_Colonne:='SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME='''||Nom_Table||''' AND DATA_TYPE IN (''VARCHAR2'',''NVARCHAR2'')';
    -- dbms_output.put_line(RequeteSQL_Colonne);
    OPEN Curseur_Colonne FOR RequeteSQL_Colonne;
    LOOP
      FETCH Curseur_Colonne INTO Nom_Colonne;
      EXIT
    WHEN Curseur_Colonne%notfound;
      RequeteSQL_Searching :='SELECT count(*) FROM "'||Nom_Table||'" WHERE "'||Nom_Colonne||'" LIKE ''%'||Search_String||'%''';
      -- dbms_output.put_line(RequeteSQL_Searching);
      EXECUTE IMMEDIATE RequeteSQL_Searching INTO Counter;
      IF Counter > 0 THEN
        dbms_output.put_line(''''||Search_String ||''' trouvé '||Counter || ' fois dans "'|| Nom_Table ||'"."'|| Nom_Colonne ||'"');
      END IF;
    END LOOP;
    CLOSE Curseur_Colonne;
  END LOOP;
  CLOSE Curseur_Table;
END;