Software > Tu Web meteorológica

Script que envía email si no detecta cambios

(1/7) > >>

CarlosLSev:
Hola, este script te envía un email si por ejemplo tu fichero realtime.txt no se actualiza en el tiempo que le indíquenos. Muy útil por si se nos queda pillado nuestro pc, Raspberry etc.



php
// Checks to see if a delimited data file is changing or not (flatlined)
// Requires that a text file named flatline-status.txt be on the server with write permissions (CHMOD 666)
// Include this in a page where you want the message to show up if the data is flatlined
// If flatlined an EMail can be sent
// 1-4-09
// 5-9-12 - Updated to PHP 5 timezone function
// 3-8-19 - Fixed some date() issues & removed the mail test variable
// Jim McMurry - jcweather.us - [email protected]
//
// Configuration
date_default_timezone_set("America/Chicago");       // Zones available at http://us2.php.net/manual/en/timezones.php

$cachefile = 'flatline-status.txt';                 // File to hold cached data for comparison
$watchfile = './clientraw.txt';                     // Data file to watch for changes
$delimit   = " ";                                   // Delimeter used in that file
$offset1   = 4;                                     // Temp
$offset2   = 5;                                     // Humidity
$offset3   = 6;                                     // Baro
$offset4   = 1;                                     // Wind Ave Speed
$offset5   = 72;                                    // DP
$maxage    = 30;                                    // Minutes that the data can remain unchanged w/o email. Recommend minimum 30
$to         = 'Your Email';                    // EMail info
$from      = 'jcweather.us';
$subject   = 'Weather Data Appears Flatlined.';
$subject2  = 'Weather Data Back Online.';
$body      = ' now.  Last data change recorded at ';  // Will go between current date/time & last good date/time in the EMail Body.
$HTMLMsg   = '<div style="text-align:center;">Sorry, Weather Station Data Has Been Disrupted ... Notification Has Been Sent.</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
         }
         echo $HTMLMsg;                                       // put the message on the screen
      } else {
         $status="watching from " . date("g:i a", $cachetime) . ", now " . date("g:i a", $now) . ", static for " . $WatchSpan . " min";
      }
      $now = $cachetime;                                     // leave timestamp as it was for now
   } else {
      if ( $status == "sent" ) {           // mail previously sent            
         mail($to, $subject2 ,"Back active at " . 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("HINT: Manually upload a file named " . $cachefile . " and give it write permissions (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;
}
?>

Sacado de https://jcweather.us/scripts.php


Mi pregunta se podría modificar para que haga lo contrario.
Por ejemplo si le indicamos el valor de lluvia hoy.
Cuando llueva que nos envíe un e-mail.
Para que funcione debe estar instalado, activado y configurado sendmail.

jmviper:
Ummmm lo de modificar scripts.... no es lo mío... probemos este que he creado.

Está en el adjunto de este mensaje y al principio hay que poner unas pocas opciones de configuración:



--- Código: ---
///////////Configuracion/////////////////////

$realtimefile = '/var/www/html/CumulusMX/realtime.txt';
$realtimecachefile = '/var/www/html/CumulusMX/realtimecache.txt';
$umbraltormenta = 4; //umbral en mm sobre el cual se considera tormenta
$tiempocomprobacion = 10; //minutos para la comprobación de la tormenta
$tiemporeanudacion = 120; //minutos comprobacion de reanudacion de lluvia
$direccionaenviar = '';
$test = false; //true, probar correo. false, no probar

/////////////////////////////////////////////


--- Fin del código ---

Las dos primeras opciones para poner la ruta absoluta en la que se encuentra el realtime.txt y la ubicación donde estará el archivo que servirá de comprobación realtimecache.txt que estará por defecto en el mismo sitio que el realtime. Si no lo está mejor ponerlo también en su ruta.

Después viene el umbral de tormenta. Si la cantidad de lluvia caída entre una lectura y otra del realtime es igual o superior a esa cantidad y menor a tiempocomprobacion enviará un correo de tormenta.

Lo recomendable es que el intervalo de ejecución del script en el crontab sea de 10 minutos */10 * * * * php /rutaalscript/correolluvia.php igual que el intervalo de comprobación.

El siguiente campo es el tiempo de reanudación de cuando empiece a llover otra vez. Por ejemplo por defecto están 120 minutos. Si han pasado más de 2 horas desde la última lluvia enviará otro email de que llueve otra vez, todo si no se ha cambiado de día.

El penúltimo campo es a la dirección donde irá el correo. Puede ser la misma que la que envía.

Para probar el envío de correo al último campo test si le ponemos true nos enviará un correo de prueba si ejecutamos el script manualmente en la línea de comandos con php /rutaalscript/correolluvia.php
Ponerlo a false para ejecutarlo normalmente.

Por último y como dices debe de haber un MTA (Agente de transferencia de correo) configurado en la raspi. Yo tengo ssmpt que es muy sencillo y muy ligero y como su nombre indica solo actúa como cliente smtp (que envía correos) y no recibe. Tiene el archivo de configuración en /etc/ssmtp/ssmtp.conf donde se ponen los datos de nuestro smtp (Outlook, Gmail etc etc). PHP usará ese que por defecto será al que apunte /usr/sbin/sendmail

Pruébalo y a ver si funciona como debe en el próximo episodio de lluvia. Lo que lo he probado va ok  :)

Saludos

CarlosLSev:
Mil gracias!!

En principio se adapta a lo que quiero, finalmente lo use con el valor Intensidad (hr) valor 8 de realtime, tiene mas sentido, o esta lloviendo o no.
Me falta la prueba de fuego, probarlo  Lo que si soy incapaz de ejecutar los php desde cron


si ejecuto crontab -e
al final tengo
/*2 * * * * php /var/www/html/webtest/alertalluvia.php
/*2 * * * * php /var/www/html/webtest/alertarealtime.php

Luego hago service cron restart
Lo puse cada 2 minutos para probarlo.
1.- Es el php que me avisa de que llueve
2.- Es el php que me avisa si el fichero realtime no se esta actualizando.

Y nada como el que oye llover

CarlosLSev:
Veamos ya conseguir ejecutar el php desde cron. Eso sí solo el que tú me hiciste. El que postee aqui no. Si lo ejecutó mano si va. No lo entiendo, pero ya lo investigaré.
Sobre el script, usando el valor 9 de realtime. Cada vez que esté se modifica me envía un email. Sin querer darte más trabajo. Quizás lo ideal sería usando el valor 8 (intensidad). Si la intensidad se modifica que envíe el email (está lloviendo), si se ejecuta el cron cada 10 minutos que haya otro valor donde indicarle el tiempo a ignorarlo para que no envie el email.. Por ejemplo cada 6 horas.
No se si me explique...

jmviper:

--- Cita de: CarlosLSev en 14 de Marzo de 2021, 18:53:28 ---Mil gracias!!

Lo que si soy incapaz de ejecutar los php desde cron

si ejecuto crontab -e
al final tengo
/*2 * * * * php /var/www/html/webtest/alertalluvia.php
/*2 * * * * php /var/www/html/webtest/alertarealtime.php

Luego hago service cron restart


--- Fin de la cita ---

Las líneas tienen que empezar con */2 no con /*2 y no hace falta reiniciar el servicio de cron.


--- Cita de: CarlosLSev en 15 de Marzo de 2021, 23:11:15 ---Veamos ya conseguir ejecutar el php desde cron. Eso sí solo el que tú me hiciste. El que postee aqui no. Si lo ejecutó mano si va. No lo entiendo, pero ya lo investigaré.
Sobre el script, usando el valor 9 de realtime. Cada vez que esté se modifica me envía un email. Sin querer darte más trabajo. Quizás lo ideal sería usando el valor 8 (intensidad). Si la intensidad se modifica que envíe el email (está lloviendo), si se ejecuta el cron cada 10 minutos que haya otro valor donde indicarle el tiempo a ignorarlo para que no envie el email.. Por ejemplo cada 6 horas.
No se si me explique...

--- Fin de la cita ---

El problema de usar la intensidad es que puede variar a más o a menos, por lo que no sabes si es la primera lluvia del día o no, además de tener que estar comprobando cuándo fue la última vez que hubo intensidad. Eso ya lo hace el script con la lluvia del día que es un valor que no mengua y se sabe si sigue lloviendo o no.
En resumen que tendrías que usar el archivo de caché para comprobar el intervalo de lluvia para que no enviase correo cada dos minutos cuando hubiera intensidad igual que ocurre con la lluvia.
No le veo, pues, ninguna ventaja ya que harían lo mismo solo que con distintos valores.

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa