Sensor Web Scraping

Sensor Web Scraping ne renvoie rien

Bonjour,

J’ai essayé de créé un sensor web scraping mais celui-ci me renvoie – au lieu d’un chiffre
Le site (PiAlert) n’est accessible que dans le LAN.
J’ai bien retrouvé le css selector, via l’inspecteur du navigateur.
Voici la définition de mon sensor :

- platform: scrape
  name: NewDeviceLan
  scan_interval: 60
  resource: http://192.168.10.99/pialert/
  select: "#devicesNew"
  index: 0

Voila la partie inspecteur dans le navigateur avec le site :

J’ai essayé plusieurs index différends (0,1,2,3,4,5), comment trouver ce fameux index ?

Il n’y en a pas malheureusement…

SI tu affiches le code source de la page, tu va tomber sur :

<!-- top small box 3 ------------------------------------------------------- -->
        <div class="col-lg-3 col-sm-6 col-xs-6">
          <a href="#" onclick="javascript: getDevicesList('new');">
            <div  class="small-box bg-yellow pa-small-box-yellow">

              <div class="inner">
                <h4>New Devices</h4>
                <h3 id="devicesNew"> -- </h3>
              </div>

              <div class="icon"> <i class="ion ion-plus-round"></i> </div>
              <div class="small-box-footer"> Details <i class="fa fa-arrow-circle-right"></i> </div>
            </div>
          </a>

et donc on retrouve bien les 2 tirets…

En fait, le problème est que la valeur est renseigné par du javascript :

// -----------------------------------------------------------------------------
function getDevicesTotals () {
  // stop timer
  stopTimerRefreshData();

  // get totals and put in boxes
  $.get('php/server/devices.php?action=getDevicesTotals', function(data) {
    var totalsDevices = JSON.parse(data);

    $('#devicesAll').html        (totalsDevices[0].toLocaleString());
    $('#devicesConnected').html  (totalsDevices[1].toLocaleString());
    $('#devicesNew').html        (totalsDevices[2].toLocaleString());
    $('#devicesDown').html       (totalsDevices[3].toLocaleString());

    // Timer for refresh data
    newTimerRefreshData (getDevicesTotals);
  } );
}

et ça, le scrape ne sait pas le récupérer…

Tu ne peux donc pas le faire avec cette intégration…

Par contre !

En analysant le code, tu peux très bien récupérer les valeurs des 4 tuiles :+1:

Il te faut pour cela utiliser l’intégration Rest de la manière suivante :

  - platform: rest
    name: PiAlert
    resource: http://192.168.10.99/pialert/php/server/devices.php?action=getDevicesTotals

  - platform: template
    sensors:
      pialert_all:
        friendly_name: "Total d'appareils"
        value_template: >
          {% set list = states('sensor.pialert')[1:] %}
          {% set list = list[:-1] %}
          {% set list = list.split(',') %}
          {{list[0]}}
  - platform: template
    sensors:
      pialert_connected:
        friendly_name: "Appareils connectés"
        value_template: >
          {% set list = states('sensor.pialert')[1:] %}
          {% set list = list[:-1] %}
          {% set list = list.split(',') %}
          {{list[1]}}
  - platform: template
    sensors:
      pialert_newdevices:
        friendly_name: "Nouveaux appareils"
        value_template: >
          {% set list = states('sensor.pialert')[1:] %}
          {% set list = list[:-1] %}
          {% set list = list.split(',') %}
          {{list[2]}}
  - platform: template
    sensors:
      pialert_down:
        friendly_name: "Appareils déconnectés"
        value_template: >
          {% set list = states('sensor.pialert')[1:] %}
          {% set list = list[:-1] %}
          {% set list = list.split(',') %}
          {{list[3]}}

Ce qui donne :


1 « J'aime »

Merci beaucoup,

Je teste ça cette après midi.

Merci pour la réponse et surtout merci pour toutes les explications c est beaucoup plus claire

Edit:

Cela fonctionne parfaitement chapeau l’artiste :slight_smile: