Come estrarre una parola all'interno di una pagina web?

Buonasera a tutti :slight_smile:
mi sto impiccando a trovare una soluzione ad una cosa che sembra molto semplice, ma non riesco a capire come fare.

Ho una telecamera foscam che, tramite un comando, mi da come risultato tutte le impostazioni del motion detection.

Se nel browser incollo questo indirizzo
http://IP:PORTA/cgi-bin/CGIProxy.fcgi?cmd=getMotionDetectConfig&usr=admin&pwd=admin

il risultato è:

<CGI_Result>
    <result>0</result>
    <isEnable>0</isEnable>
    <linkage>0</linkage>
    <snapInterval>0</snapInterval>
    <sensitivity>0</sensitivity>
    <triggerInterval>0</triggerInterval>
    <isMovAlarmEnable>1</isMovAlarmEnable>
    <isPirAlarmEnable>1</isPirAlarmEnable>
    <schedule0>0</schedule0>
    <schedule1>0</schedule1>
    <schedule2>0</schedule2>
    <schedule3>0</schedule3>
    <schedule4>0</schedule4>
    <schedule5>0</schedule5>
    <schedule6>0</schedule6>
    <area0>0</area0>
    <area1>0</area1>
    <area2>0</area2>
    <area3>0</area3>
    <area4>0</area4>
    <area5>0</area5>
    <area6>0</area6>
    <area7>0</area7>
    <area8>0</area8>
    <area9>0</area9>
</CGI_Result>

A me servirebbe solo ricavare lo stato di , se 0 o 1… non ci riesco :’(

Ho trovato in rete un piccolo sketch che utilizza la libreria ESP8266HTTPClient.h con il quale riesco ad avere queste informazioni sul Serial Monitor …ho una scheda Wemos D1R2

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266HTTPClient.h>

const char* ssid = "ssid";
const char* password = "password";

ESP8266WebServer server(80); //Server on port 80
WiFiClient client;

void setup() {
  // put your setup code here, to run once:
Serial.begin(115200);
// Connect to WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
}
//If connection successful show IP address in serial monitor
  Serial.println("");
  Serial.print("Use this URL : ");
  Serial.print("http://");
  Serial.print(WiFi.localIP());
  Serial.println("/");
  
  
  HTTPClient http;  //Declare an object of class HTTPClient

  
    http.begin("http://IP:PORT/cgi-bin/CGIProxy.fcgi?cmd=getMotionDetectConfig&usr=admin&pwd=admin");  //Specify request destination
    
    
    http.GET();                                                                  //Send the request
   
    
      Serial.println(http.getString()); //Print the response payload
  
      String stato = http.getString();

      Serial.println(stato);
      
      http.end();   //Close connection
   
  }


void loop() {
    
 
}

Ho provato ad usare substring o indexOf, ma non ottengo risultati :confused:
Potete darmi qualche indicazione o aiutarmi a capire cosa devo fare?

Grazie in anticipo :slight_smile:

Eh eh eh, credo di sapere cosa stai facendo! Ho fatto qualcosa di simile, per attivare/disattivare la motion detection tramite una tessera RFID.

Io ho usato un ESP8266, quindi avevo un po' di risorse a disposizione ed ho potuto usare una libreria per il parsing dell'XML, TinyXML. Vedi qua quel che ho ottenuto: https://gist.github.com/SukkoPera/3e87aacedf3939fc50bbe893016dabab. Funziona alla perfezione da mesi!

Ti ringrazio dell’interessamento :slight_smile:
Il tuo lavoro, oltre che essere ‚Äúmostruoso‚ÄĚ, va ben oltre le mie scarse capacit√†.

La tessera RFID per ora non la prendo assolutamente in considerazione, però hai capito perfettamente quello che sto cercando di fare :wink:

Vorrei estrarre il valore 0 o 1 del tag ed andarlo ad inserire, con ‚Äúreplace‚ÄĚ, all‚Äôinterno della pagina iniziale del WebServer della ESP8266 in modo che da remoto so se il MD √® inserito o meno; nel caso non lo fosse posso attivarlo e disattivarlo tramite due pulsanti (questo l‚Äôho gi√† fatto, non in modo elegante ma funziona! :smiley: )

Comunque ho capito che bisogna fare un parsing usando TinyXML come hai fatto tu oppure usare Json o‚Ķforse ancora pi√Ļ ‚Äúsemplice‚ÄĚ TextFinder.

Dovrò strudiare ancora …e parecchio!

PS: è un’idea aggiungere un LED che è acceso quando il MD è attivato, ma ne ho 5 di Foscam e già sono pieno di LED (antifurto, centralina, barriere infrarossi, alimentazioni…) :confused:

Beh, puoi riciclare tutto il mio codice togliendo ogni riferimento al RFID. Nella variabile motionDetectionEnabled avrai semplicemente true o false a seconda dello stato della MD...

Ti ringrazio, sei molto gentile :) Purtroppo di programmazione non ne so molto, ma domani a mente fresca e lavoro permettendo esaminerò meglio il tuo codice e cercherò di riciclare ciò che mi serve ....ora sono cotto :D

Grazie ancora! :)

Rieccomi :slight_smile:
dopo ore passate a cercare di capire (si, perchè non sono un programmatore) non sono riuscito nell’intento di modificare il tuo ESP_ToggleFoscamMotionDetection.ino; mi dava un sacco di errori di compilazione, soprattutto sulla voce STATUS_TAG_TEXT e non sono riuscito a capire quali fossero i problemi :frowning:

Poi ho cercato di modificare degli esempi di TinyXML ma senza successo :frowning:
Ho provato con Json, ma non è quello che mi serve :frowning:
Ho fatto miriadi di prove con TextFinder, ma nulla mi usciva dal monitor seriale :frowning:

Alla fine, cercando, ho trovato (non ricorso dove) queste 4 righe di codice che stanno funzionando :smiley:

void getMD(){
const char* url = "/cgi-bin/";

  client.connect(foscam1, httpPort1);
  String url1 = url;
  url1 += command1;
  client.print(String("GET ") + url1 + " HTTP/1.1\r\n" +
               "Host: " + foscam1 + "\r\n" +
               "Connection: close\r\n\r\n");

  client.find("<isEnable>");
  enabled1 = client.parseInt();
}

Poi nel void handleRoot() ho messo

String s = index_page;
getMD();

if (enabled1 == 0) {
    s.replace("@@stato1@@", String("OFF"));
  } else {
    s.replace("@@stato1@@", String("ON"));
  }

Ora, ogni volta che apre la home page, mi da lo stato del MD :smiley:

Grazie comunque! :slight_smile: