Allen,

Het is lang geleden dat ik dit forum weer eens heb opgezocht. Meestal werk ik zelf de uitdagingen wel uit, maar in dit geval zit ik een beetje in de knoop.

Wat is de situatie:
Ik heb een weerstation en wil de gegevens publiceren op het internet. Nu schrijft dit weerstation zijn data weg in een log bestand en om de 5 minuten wordt die data verwerkt in een sql database. Mijn originele idee was om die data te gebruiken om te publiceren. Er zijn echter weer sites die hun data live publiceren. Ik denk dat dit via AJAX gaat, maar ik wil me eerst concentreren op het verkrijgen van de juiste gegevens.

Wat heb ik tot nu toe:
Voor het live weer moet ik die log bestanden in kunnen lezen en daar de juiste (laatste) gegevens uit halen. Het systeem laat een log oplopen tot een aantal Kb en dan vindt er een turnover plaats. Bijvoorbeeld: weerstation.log wordt gerenamed naar weerstation.log.1 en er is een lege weerstation.log die weer gevuld wordt met recente data. Om te voorkomen dat je met een leeg bestand zit moet je deze 2 logfiles dus achterelkaar plakken. So far so good, je kan hier zien hoe de 2 achterelkaar geplakte logfiles eruit zien.

waarschuwing: LET NIET op de clock regels in de logfiles, dit weerstation wordt alleen geleverd met windows software en doordat ik gebruik maak van alternatieve linux software kan ik de ontvanger niet "programmeren", de timestamp is dus leading

De uitdaging:
uit deze data wil ik de laatste (zie timestamp) gegevens verkrijgen van:

Temperature th1
-Temp (in graden celcius)
-Trend (steady/rising/falling)
-Humidity (relatief in %)
-Dew Point (in graden celcius)

Barometer
-Forecast (Cloudy/PartiallyCloudy/Rainy/Sunny/Snowy)
-Absolute pressure (mb)

Wind
-batteryOk (true/false)
-direction (0 t/m 15)
-gust (m/s)
-avg. speed (m/s)

Rain
-batteryOk (true/false)
-This Day (mm)

de "Temperature thInt" sensor wordt overgeslagen, dit is de interne temperatuur sensor in de woonkamer en betekent niets voor het weer ;)

Waar zit ik vast:
Het lukt me om beide bestanden onder elkaar te zetten (zie voorbeeld)
Het lukt me om alleen de laatste regel te tonen van de hele file, maar daar heb ik natuurlijk niets aan omdat dit slechts 1 bericht is van 1 sensor, terwijl ik het laatste bericht van iedere (temp out,baro,wind,rain) sensor wil hebben.
Het lukt me ook om via explode de gegevens van de sensoren te splitsen, ik krijg dan alleen nog steeds een hele lijst van alle timestamps.

Hopelijk zijn jullie php experts bereid mij een beetje te "spoonfeeden" :o)


Groetjes!
Probeer het volgende eens. Is niet getest maar zou moeten werken.


<?php

    #| Set " $data " array voor het opslaan van het laatste log regel per sensor.
    
        $data = array(
                      
                      'Barometer'             => NULL,
                      'Temperature_th1'     => NULL,
                      'Rain'                 => NULL,
                      'Wind'                 => NULL
                      
                      );
        
    
    #| Teller.
    
        $i = 0;
        

    #| open de 2 log bestanden.
    
        $file1 = file("/var/log/wflogger.log.1");
        $file2 = file("/var/log/wflogger.log");


    #| voeg de 2 logbestanden samen en draai ze om. Het omdraaien is om de laatste logs te verkrijgen.
    
        $log = array_reverse(array_merge($file1,$file2));     


    #| controleren of het log niet leeg is.
    
        if(is_array($log) and !empty($log)){
        
        #| Log bestand doorlopen tot voor alle sensoren de laatste log regel is gevonden.
        
        /*---- INFO: Er is een marge van 25 regels ingestel voor het geval er iets helemaal fout is.  ----*/
        
            while(in_array(NULL, $data) and $i < 25){
            
            #| Alle sensoren aflopen.
            
                foreach($data as $sensor => $value){
                
                #| Controleren of er al data is opgeslagen voor de huidige sensor.
                
                    if($value == NULL){
                    
					/*---- INFO! ----> 
					
					Lijst met uitzonderingen, Niet zo mooi maar er is niets aan te doen.
					
						(1)	" Rainy " word er uit gehaald om te voorkomen dat de barometer sensor roet in het eten gooit voor 
						    de temperatuurs sensor.
							
							
						(2) " _ " word er uit gehaald omdat de sleutel in de $data array van de temperatuurs sensor niet overeen
						    komt met wat we zoeken. " We zoeken Temperature th1 en niet Temperature_th1 "
								
					*/

                    #| Kijken voor welke sensor de huidige regel is bedoeld.

                        if(strpos($log[$i], str_replace(array("_", "Rainy"), " ",$sensor))){
                        
                        #| Log data opslaan voor de huidige sensor.
                        
                            $data[$sensor] = $log[$i]; 
                    
                        }
                    }
                }
            
            
            #| Teller updaten.
            
                $i++;
                
            }
        } 


////////////////////////////////////////////////////////
//// Je eigen stuk voor het uitwerken van de data. ////
//////////////////////////////////////////////////////

foreach($data as $line)
{
    // haal uit elkaar om de juiste sensor te vinden
    $parts = explode(' ', $line);
    // tja, door een explode te doen op een spatie weet je niet meer of het nou de interne of externe temperatuursensor is
    $sensor = $parts[4];
    // dus als je dat wil weten plak je het 5e deel er nog even achteraan en nu aan elkaar!
    if ($sensor == "Temperature"){
        $parts[4] = $parts[4]."_".$parts[5];
    }

    // in de data zitten vervelende characters die we eruit willen hebben, defineer deze
    $special = array('(',')',',');

    // ok, dan gaan we nu de informatie uit iedere regel halen die we willen hebben
    switch($parts[4]){
        case 'Barometer':
            $barometer_date = $parts[0];
            $barometer_time = substr($parts[1],0,8); //tijd hoeft niet in een duizendste van een seconde
            $barometer_forecast = str_replace($special,"",$parts[6]); //even de komma weghalen
            $barometer_pressure = $parts[9];
            // tijdelijk even laten zien wat we er nu uit hebben gehaald, csv style
            echo $barometer_date.",".$barometer_time.",".$barometer_forecast.",".$barometer_pressure."<br>";
        break;
        case 'Temperature_th1':
            $temperature_date = $parts[0];
            $temperature_time = substr($parts[1],0,8); //tijd hoeft niet in een duizendste van een seconde
            $temperature_temp = $parts[7];
            $temperature_trend = str_replace($special,"",$parts[9]); //haakjes en komma weghalen
            $temperature_hum = $parts[11];
            $temperature_dew = $parts[16];
            // tijdelijk even laten zien wat we er nu uit hebben gehaald, csv style
            echo $temperature_date.",".$temperature_time.",".$temperature_temp.",".$temperature_trend.",".$temperature_trend.",".$temperature_hum.",".$temperature_dew."<br>";
        break;
        case 'Wind':
            $wind_date = $parts[0];
            $wind_time = substr($parts[1],0,8); //tijd hoeft niet in een duizendste van een seconde
            $wind_battery = str_replace($special,"",$parts[6]); //komma weghalen
            $wind_direction = $parts[8];
            $wind_gust = $parts[11];
            $wind_avg = $parts[15];
            // tijdelijk even laten zien wat we er nu uit hebben gehaald, csv style
            echo $wind_date.",".$wind_time.",".$wind_battery.",".$wind_direction.",".$wind_gust.",".$wind_avg."<br>";
        break;
        case 'Rain':
            $rain_date = $parts[0];
            $rain_time = substr($parts[1],0,8); //tijd hoeft niet in een duizendste van een seconde
            $rain_battery = str_replace($special,"",$parts[7]); //komma weghalen
            $rain_rate = str_replace($special,"",$parts[9]); //komma weghalen
            $rain_hour = str_replace($special,"",$parts[12]); //komma weghalen
            $rain_day = str_replace($special,"",$parts[15]); //komma weghalen
            // tijdelijk even laten zien wat we er nu uit hebben gehaald, csv style
            echo $rain_date.",".$rain_time.",".$rain_battery.",".$rain_rate.",".$rain_hour.",".$rain_day."<br>";
        break;
    }
}  

?>		

Reageren