Hola actualmente uso 2 script que me envían un email si el fichero realtime.txt (fichero que sube CumulusMX cada 10 segundos mi web) no se actualiza o si vuelve actualizarse. Script original
https://jcweather.us/flatline-check.zipTengo otro que creo jmviper que me envía un email si llueve, vuelve a llover, o si la cantidad de lluvia es superior a una cantidad que se le indique.
Script aquí (ojo hay una actualización del código del script en la 2 pagina del post)
https://forum.meteoclimatic.net/index.php/topic,3439.0.htmlMe he animado y he "creado", mas bien con lo que ya tenia he apañado otro script utilizando el original flatline-check que me avisa si no se están subiendo datos a meteoclimatic, igualmente vuelve a avisar cuando vuelve a enviarlo. Creo que puede estar bien por si nuestra estacion se queda atontada y nos avise que no se esta actualizando meteoclimatic.
Estos script los tengo en el servidor web, y no en la raspberry pi, es mas fácil quedarme yo sin Internet, que falle el sitio web, con lo cual no nos avisaría por eso mejor a la nube. Se programa desde cron cada 8 o 10 minutos y listo.
Primero capturo de la plantilla de meteoclimatic la fecha y hora
Para ello utilice esto:
https://deerme.org/php/capturar-datos-de-otra-web-en-phpLuego utilizo el primer script con alguna pequeña modificacion (con sendmail funcionaba el remitente "From:" pero con ssmtp no) A parte le añadi hora del envió en el asunto, así evito el anidamiento de los mensajes
<?php
$data = file_get_contents("laurldelaplantillameteoclimatic/");
if ( preg_match('|<a href="xxxxxxxxxxxxxxxxxxxx(.*?)yyyyyyyyyyyyyyyyy|is' , $data , $cap ) )
{
// echo "".$cap[1];
}
// en xxxxxxxxxxxxx ponemos justo lo que hay delante de fecha y hora y en yyyyyyyy lo que hay después (mejor revisar link esta mejor explicado)
// Configuration
date_default_timezone_set("Europe/Madrid"); // Zones available at http://us2.php.net/manual/en/timezones.php
$ultima = $cap[1]; // Valor creado para captura la hora
$ahora = date('H:i:s'); //Obtener hora actual y dar formato
$cachefile = '/var/www/html/alertameteoclimatic.txt'; // File to hold cached data for comparison Ruta total a fichero cache
$watchfile = '/var/www/html/meteoclimatic.txt'; // Data file to watch for changes Ruta Total a fichero con los datos capturados
file_put_contents($watchfile, $ultima); // Esta linea escribe en el fichero el campo capturado
$delimit = " "; // Delimeter used in that file
$offset1 = 2; // Uso el 2 en todas, que es el campo hora
$offset2 = 2; //
$offset3 = 2; //
$offset4 = 2; //
$offset5 = 2;
$maxage = 1; // Minutes that the data can remain unchanged w/o email. Recommend minimum 30
$to = 'tuemailaqui@gmail.com'; // EMail info
$from = 'Datos del remitente';
$subject = ("Los datos no se estan subiendo a Meteoclimatic. "). $ahora; //Asunto si no se actualiza
$subject2 = ("Los datos se estan subiendo a Meteoclimatic. "). $ahora; //Asunto si se esta actualizando
$body = '. Ultima actualizacion a las '; // Will go between current date/time & last good date/time in the EMail Body.
//$HTMLMsg = '<div style="text-align:center;">ALERTA, los datos meteorologicos no estan actualizados.</div>';
// End of configurable items
$now = time();
$newdata = get_contents( $watchfile , $delimit); // read the target file
$current = " (" . $newdata[$offset1] . " " . $newdata[$offset2] . " " . $newdata[$offset3] . " " . $newdata[$offset4] . " " . $newdata[$offset5] . ")";
$cachedata = get_contents( $cachefile , ","); // read the cache file
$cachetime = $cachedata[0];
if ($newdata[0] != -9999 && $cachedata[0] != -9999) { // was able to read the files
$flat = ($newdata[$offset1] == $cachedata[1]) &&
($newdata[$offset2] == $cachedata[2]) &&
($newdata[$offset3] == $cachedata[3]) &&
($newdata[$offset4] == $cachedata[4]) &&
($newdata[$offset5] == $cachedata[5]); // compare various offsets
$status = substr(trim($cachedata[6]), 0, 4); // capture the "sent" if it's already there
$WatchSpan = round(($now - $cachetime) / 60); // minutes since last data change
if ($flat) {
if ($WatchSpan >= $maxage) { // wait time is expired
if ( $status != "sent" ) { // mail hasn't been sent yet
mail($to, $subject , date("m-d-y H:i") . $body . date( "m-d-y H:i", $cachetime) . $current, 'From: ' . $from);
$status ="sent " . date("m-d-y H:i", $now);
} else {
$status = trim($cachedata[6]); // carry over the original entry
}
$HTMLMsg; // put the message on the screen
} else {
$status="Escuchando desde: " . date("g:i a", $cachetime) . ", ahora a las " . date("g:i a", $now) . ", sin cambios desde hace " . $WatchSpan . " min";
}
$now = $cachetime; // leave timestamp as it was for now
} else {
if ( $status == "sent" ) { // mail previously sent
mail($to, $subject2 ,"Vuelve a estar activo a las " . date("m-d-y g:i a") . $current, 'From: ' . $from);
}
$status="active " . date("m-d-y g:i a", $now);
}
$fp = fopen($cachefile, "w") or die("SUGERENCIA: Sube un fichero llamado " . $cachefile . " y dale permisos de (CHMOD 666).");
fputs($fp, $now . "," . $newdata[$offset1] . "," . $newdata[$offset2] . "," . $newdata[$offset3] . "," . $newdata[$offset4] . "," . $newdata[$offset5] . ", " . $status);
fclose($fp);
} // else we couldn't read one of the files
function get_contents( $rawfile , $delimiter) {
$rawdata = array();
$fd = fopen($rawfile, "r");
if ($fd) {
$rawinfo = '';
while (! feof ($fd) ) {
$rawinfo .= fread($fd, 8192);
}
fclose($fd);
$rawinfo = preg_replace("/\x0D/", "", $rawinfo);
$rawinfo = preg_replace("/\x0A/", "", $rawinfo);
$rawdata = explode ($delimiter, $rawinfo);
} else {
$rawdata[0]= -9999;
}
return $rawdata;
}
?>
Si hay algún problema con el script o no se puede hacer Scraping, lo borro.
P.D. No se por que motivo si existe algún echo loquesea ademas de ponerlo en pantalla del php al ejecutarlo en el navegador, me los envía por email cada vez que cron se ejecuta, mi solución suprimir los echo, solo me pasa con ssmtp...