Newsgroup: it.comp.www.php
Titolo: Discriminare notte/giorno

Sto' lavorando ad un progetto WEB che permette la visione dei dati di
un impianto solare, on-line.. ( 
www.portalsole.it/liveplant.php
 )
Con l'ultimo aggiornamento ho aggiunto la features che permette la
sostituzione dinamica di un'immagine che viene scelta in base alla
situazione metereologica della zona dell'impianto.. tale dato viene
ricavato da un sito di previsioni meteo.
..tuttavia mi sono accorto che non'e' simpatico far vedere una bella
immagine di un cielo sereno quando sull'impianto č in realta' notte;
quindi mi sono posto il problema di inserire un'immagine di un cielo
notturno in queste circostanze.
Ma come fare ?
Potrei determinare lo stato di giorno/notte attraverso l'ora, tuttavia
dovrei almeno stagionalmente modificare i parametri orari di
determinazione.
Non esiste una classe che permetta di verificare l'ora dell'alba e del
tramonto nei vari giorni dell'anno ?
Qualche idea ?
Grazie,
Fabrizio.

Fabrizio ha scritto:

Cerca krono/kronoclass su phpclasses.
Bye.

 Fabrizio.
con..
http://php.net/date_sunrise
http://php.net/date_sunset
?
-- 
www.iuz-lab.info

 
beh vedo che hai anche gia' latitudine e longitudine, ti mancherebbe solo lo
zenith e leggi bene le note anche se siamo nell'emisfero e nel quadrante di
'default'..
-- 
www.iuz-lab.info

 
Belle! Non le conoscevo (infatti sono state introdotte con php5).
Per Fabrizio:
Io ho risolto con una classe che trovai su 
phpclasses.org
 (mi pare si 
chiamasse sun o sunrise). Inoltre qui trovi gli algoritmi:
http://williams.best.vwh.net/sunrise_sunset_algorithm.htm
ciao

Ringrazio tutti per le informazioni.
Non immaginavo proprio che esistevano delle funzioni direttamente da 
Php; peccato che non posso usarle dato che credo di disporre di php4.
Ad ogni modo usero le classi che mi avete suggerito.
Grazie a tutti,
Fabrizio.

Fabrizio Cattaneo wrote:

perche' non riscrivi in PHP le funzioni dettate dall'algoritmo che Magilla
ha notificato..
se ce la faccio stasera, provo anch'io..
-- 
www.iuz-lab.info

iuz wrote:

ho fatto una prova traducendo direttamente il codice C del sorgente di
php5..
non ho la possibilita' di testare al momento (se qualcuno avesse la
cortesia)
prototipo: php_sunrise_sunset(int tmestamp, string format, float latitude,
float longitude, float zenith, float gmt_offset, bool sunset_or_sunrise);
i valori devono essere specificati tutti, (molti non sono disponibili per
default in php 4)..
il gmt_offset dovrebbe essere specificato in ore..
non sono assolutamente sicuro del codice che ho scritto (soprattutto del
finale)..
<?php
function php_sunrise_sunset($N, $format, $latitude, $longitude, $zenith,
$gmt_offset, $calc_sunset){
   $N = date('z', $N) + 1;
   $M_PI  = 3.14159265358979323846;
   // step 2
   $lngHour = $longitude / 15;
   if($calc_sunset){
     $t = floatval($N ((18 - $lngHour) / 24));
   }
   else {
     $t = floatval($N ((6 - $lngHour) / 24));
   }
   // step 3
   $M = (0.9856 * $t) - 3.289;
 
   //    step 4
   $L = $M + (1.916 * sin(($M * $M_PI / 180))) + (0.020 * sin(((2 * $M) *
$M_PI / 180))) + 282.634;
 
   while($L < 0){
     $Lx = $L + 360;
     assert($Lx != $L);
     $L = $Lx;
   }
 
   while($L >= 360){
     $Lx = $L - 360;
     assert($Lx != $L);
     $L = $Lx;
   }
 
   // step 5a
   $RA = ((atan(0.91764 * tan(($L * $M_PI / 180)))) * 180 / $M_PI);
   while($RA < 0){
     $RAx = $RA + 360;
     assert($RAx != $RA);
     $RA = $RAx;
   }
   while($RA >= 360){
     $RAx = $RA - 360;
     assert($RAx != $RA);
     $RA = $RAx;
   }
 
   // step 5b
   $Lquadrant = floor($L / 90) * 90;
   $RAquadrant = floor($RA / 90) * 90;
   $RA = $RA + ($Lquadrant - $RAquadrant);
 
   // step 5c
   $RA /= 15;
 
   // step 6
   $sinDec = 0.39782 * sin(($L * $M_PI / 180));
   $cosDec = cos(asin($sinDec));
 
   // step 7a
   $cosH = (cos(($zenith * $M_PI / 180)) - ($sinDec * sin(($latitude *
$M_PI / 180)))) / ($cosDec * cos(($latitude * $M_PI / 180)));
 
   // step 7b
   if($calc_sunset){
     $H = (acos($cosH) * 180 / $M_PI);
   }
   else{
     $H = 360 - (acos($cosH) * 180 / $M_PI);
   }
   $H = $H / 15;
 
   // step 8
   $T = $H + $RA - (0.06571 * $t) - 6.622;
 
   // step 9
   $UT = $T - $lngHour;
   while ($UT < 0) {
     $UTx = $UT + 24;
     assert($UTx != $UT);
     $UT = $UTx;
   }
   while ($UT >= 24){
     $UTx = $UT - 24;
     assert($UTx != $UT);
     $UT = $UTx;
   }
 
   $UT += $gmt_offset;
 
   return sprintf($format, "%02d:%02d", intval($UT), intval(60 * ($UT%1)));
}
?>
-- 
www.iuz-lab.info

 float longitude, float zenith, float gmt_offset, bool sunset_or_sunrise);
mi sa che la testo. Grazie iuz, farò sapere

Vorrei testare il tuo script..
Mi spieghi prevemente come fare ?
In $oggi ho il timestamp corrispondente a ''questo momento''
Come chiamo il tuo script per avere in $tramonto e il $alba i 2 
timestamp corrispondente al sunser e al sunrise ?
Come vuole il tuo script le variabili longitudine e latitudine ?
Io ho queste :
Lat: 45 28 00 N  degrees minutes   Lat: 45.4667  decimal degrees
Long: 008 52 00 E  degrees minutes   Long: 8.8667  decimal degrees
Grazie,
Fabrizio.


> ?>
credo di aver individuato degli errori..
puoi farmi un favore..
puoi postare qualche corrispondenza tra giorno ed alba..
dd-mm-yyyy alba=hh:mm tramonto=hh:mm
ie.
2-5-2005 alba=07:11 tramonto=20:23
3-5-2005 alba=07:09 tramonto=20:26
-- 
www.iuz-lab.info

 
ho trovato cio' che mi serve per fare il debug..
pero' adesso non ho tempo, guardo se riesco a postare il codice corretto e
testato entro domattina..
-- 
www.iuz-lab.info

 testato entro domattina..
Ti ringrazio...
non dimenticarti di mettere anche un esempio di come usare il tuo 
sccript ;-))
Grazie,
F.

Fabrizio Cattaneo wrote:

ho trovato dei bug nel codice di php5..
al 99% hanno usato lo stesso documento indicato da Magilla.. e quello stesso
documento di fatto e', in certi punti, ambiguo ed incoerente..
invito a leggere il sorgente 'php-5.0.4/ext/standard/sunfuncs.c' nella
directory di installazione di php 5.0.4..
nel prossimo post c'e' la funzione che ho scritto con alcune modifiche ed il
codice di esempio per capirne l'uso..
ad ogni riga commentata con '// here' significa che non ero sicuro che il
documento intendesse quello che io ho inteso oppure che ho apportato delle
modifiche su detta linea..
-- 
www.iuz-lab.info

<?php
function sunrise_sunset ($timeStamp, $latitude, $longitude, $zenith,
$offSet, $rise = TRUE)
{
  $N = date('z', $timeStamp) + 1;
  $lngHour = $longitude / 15;
  if ($rise == TRUE) $t = $N + ((6 - $lngHour) / 24);
  else $t = $N + ((18 - $lngHour) / 24);
  $M = (0.9856 * $t) - 3.289;
  $L = $M + (1.916 * sin(deg2rad($M))) + (0.020 * sin(deg2rad(2 * $M))) +
282.634;
  while ($L >= 360) $L -= 360; // here
  while ($L <= 1) $L += 360; // here
  $RA = rad2deg(atan(0.91764 * tan(deg2rad($L))));
  while ($RA >= 360) $RA -= 360; // here
  while ($RA <= 1) $RA += 360; // here
  $Lquadrant = floor($L / 90) * 90;
  $RAquadrant = floor($RA / 90) * 90;
  $RA = $RA + ($Lquadrant - $RAquadrant);
  $RA /= 15;
  $sinDec = 0.39782 * sin(deg2rad($L));
  $cosDec = cos(asin(rad2deg(asin(deg2rad($sinDec))))); // here
  $cosH = (cos(deg2rad($zenith)) - ($sinDec * sin(deg2rad($latitude)))) /
($cosDec * cos(deg2rad($latitude))); // here
  // if($cosH > 1 || $cosH < -1) return FALSE; // here the sun seems to be
inexistent
  if ($rise == TRUE) $H = 360 - rad2deg(acos($cosH));
  else $H = rad2deg(acos($cosH));
  $H /= 15;
  $T = $H + $RA - (0.06571 * $t) - 6.622;
  $UT = $T - $lngHour;
  while ($UT >= 24) $UT -= 24; // here
  while ($UT <= 1) $UT += 24; // here
  $localT = $UT + $offSet;
  $hours = intval($localT);
  $minutes = 60*($localT-$hours);
  return sprintf('%02d:%02d', $hours, $minutes);
}
echo "<table border='0'><tr><td>";
echo <<<table
<table border='0' cellpadding='2' cellspacing='1' bgcolor='#eeeeee'>
<tr>
  <th colspan='5'>Sunrise</th>
</tr>
<tr>
  <th>Iter.</th>
  <th>Date (TS)</th>
  <th>date_sunrise()</th>
  <th>sunrise_sunset()</th>
  <th>Errors</th>
</tr>
table;
for ($to = strtotime('now'), $since = strtotime('5/25/2002'), $i = 0; $since
< $to; $since+=86400, ++$i)
{
  $date = date('d-m-Y', $since);
  $php5 = date_sunrise($since, SUNFUNCS_RET_STRING, 40.9, -74.3, 90.5, -4);
  $iuz = sunrise_sunset($since, 40.9, -74.3, 90.5, -4, 1);
  $error = ($php5 != $iuz) ? 'Mismatching results' : '';
echo <<<row
<tr bgcolor='#dddddd'>
  <td>$i</td>
  <td>$date ($since)</td>
  <td>$php5</td>
  <td>$iuz</td>
  <td>$error</td>
</tr>
row;
}
echo <<<table
</table>
table;
echo "</td><td>";
echo <<<table
<table border='0' cellpadding='2' cellspacing='1' bgcolor='#eeeeee'>
<tr>
  <th colspan='5'>Sunset</th>
</tr>
<tr>
  <th>Iter.</th>
  <th>Date (TS)</th>
  <th>date_sunset()</th>
  <th>sunrise_sunset()</th>
  <th>Errors</th>
</tr>
table;
for ($to = strtotime('now'), $since = strtotime('5/25/2002'), $i = 0; $since
< $to; $since+=86400, ++$i)
{
  $date = date('d-m-Y', $since);
  $php5 = date_sunset($since, SUNFUNCS_RET_STRING, 40.9, -74.3, 90.5, -4);
  $iuz = sunrise_sunset($since, 40.9, -74.3, 90.5, -4, 0);
  $error = ($php5 != $iuz) ? 'Mismatching results' : '';
echo <<<row
<tr bgcolor='#dddddd'>
  <td>$i</td>
  <td>$date ($since)</td>
  <td>$php5</td>
  <td>$iuz</td>
  <td>$error</td>
</tr>
row;
}
echo <<<table
</table>
table;
echo "</td></tr></table>";
?>

 modifiche su detta linea..
A me non funzione, da' il seguente risultato :
Fatal error: Call to undefined function: date_sunrise()
Avrei bisogno di qualcosa che funzioni con php 4.3
Ciao,
Fabrizio.

Fabrizio Cattaneo wrote:

e' normale.. il codice completo comprende un test comparato con la funzione
date_sunrise e date_sunset di php5.. 
ti devi prendere solo la dichiarazione della funzione..
<?php
function sunrise_sunset ($timeStamp, $latitude, $longitude, $zenith,
$offSet, $rise = TRUE)
{
// function code
}
// e poi richiamala con string sunrise_sunset (int timestamp, float
latitude, float longitude, float zenith, int offset[, bool rise_or_set]);
ie.
sunrise_sunset(time(), 40.9, -74.3, 90.5, -4, 1); // sunrise
sunrise_sunset(time(), 40.9, -74.3, 90.5, -4, 0); // sunset
fammi sapere se hai capito?
-- 
www.iuz-lab.info

 fammi sapere se hai capito?
Forse si...
Devo chiamare la funzione cosi :
$alba = sunrise_sunset($adesso, 40.9, -74.3, 90.5, -4, 1);
$tramonto = sunrise_sunset($adesso, 40.9, -74.3, 90.5, -4, 0);
In $adesso metto il timestamp corrispondente al momento del caricamento 
della pagina php ?
In $alba e $tramonto mi ritrovo i valori in timestamp ?
Grazie,
F.

 F.
no, trovi l'ora nel formato hh:ss..
se vuoi il timestamp cmq ti basta fare una lieve modifica, se non riesci
fammi sapere..
-- 
www.iuz-lab.info

 fammi sapere..
Ho fatto la modifica per ottenere il timestamp...
Ho sostituito l'ultima righa della tua funzione :
return sprintf('%02d:%02d', $hours, $minutes);
con :
$oggi =  mktime (0,0,0,date("m")  ,date("d"),date("Y"));
   $minutes = intval($minutes);
   $oggi = $oggi + ((3600*$hours)+(60*$minutes));
   return ($oggi);
Sembra che funzioni.
Ti sembra corretta ?
Ciao,
F.

Fabrizio Cattaneo wrote:

potresti anche fare direttamente (ma non testato)..
return (intval($timeStamp/86400)*86400) + intval($localT * 3600);
cmq tieni un occhio sul thread.. in questi giorni testo completamente la
funzione sulla maggior parte delle latitudini/longitudini terrestri per
tutti i giorni di un anno, almeno sono sicuro che funzioni..
(oltretutto ho il vago sospetto che la funzione date_sunset() di php5
contenga piu' di un bug che compromette troppo spesso il risultato)
-- 
www.iuz-lab.info

  > cmq tieni un occhio sul thread..
Sta diventando un po vecchiotto il tread.
Comunque puoi scrivermi presso la mia e-mail nel caso non ti risponda.
Ho messo sul sito la tua funzione... adesso dopo il tramonto e prima 
dell'alba, appare l'immagine della notte sul pannelli solari ;-))
Ciao e grazie,
F.
