Live weer uit logfiles weerstation

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Software Developer

Dit ga je doen Ontwerpen, ontwikkelen en onderhouden van (mobiele) internettoepassingen; Ontwikkelen en onderhouden van Microservices; Ontwerpen en optimaliseren van databases; Identificeren van nieuwe trends/ontwikkelingen binnen de branche. Hier ga je werken Deze marktleider op gebied van fietsen en fietservaring is gevestigd in twee provincies, verspreid over meerdere locaties. Jij zult voornamelijk in regio Joure aan de slag gaan. De organisatie doelt zich op het leveren van kwalitatief hoogwaardige producten aan alle hun klanten. De organisatie telt circa 4.000 medewerkers in meer dan 10 verschillende landen. Momenteel is de organisatie op zoek naar een Software Developer wilt meewerken aan het

Bekijk vacature »

Junior .NET developer

Functie Wij hebben drie scrumteams. Het eerste team focust zich op het stukje hardware wat wij in huis doen. Zij maken als team o.a. gebruik van C++. De andere twee scrumteams zijn allebei bezig met data verwerking en maken hierbij in de backend gebruik van C# .NET / .NET Core. Het verschil tussen deze teams is dat één team de data verwerking doet voor de mobiele applicatie. Zij werken hierbij dus ook met Xamarin. Het andere team focust zich op de webapplicaties en maakt hierbij ook gebruik van ASP.NET MVC. Op basis van jouw ambities en kwaliteiten kijken wij samen

Bekijk vacature »

Traineeship IT regio Amsterdam/Utrecht

Wat ga je doen? Het traineeship begint met een fulltime maand cursussen en praktijkdagen, waarin je de basis van het IT-vak leert op de Shared Servicedesk (SSD). Daarnaast ga je meteen aan de slag voor je eerste certificering! (ITILv4). Je start in een groep met 4 tot 10 deelnemers, waarmee jij gedurende die maand optrekt en je kennis kunt delen. Na het voltooien van de eerste maand ga je direct voor een langere periode aan de slag bij één van onze klanten of blijf je intern bij ons op de Shared Servicedesk. Je bent het eerste aanspreekpunt van de eindgebruikers

Bekijk vacature »

PHP Developer

Als PHP Developer bij Coolblue zorg je ervoor dat onze webshops elke dag een beetje beter zijn. Wat doe je als PHP Developer bij Coolblue? Als PHP Developer werk je met andere development teams samen om onze webshop zo optimaal mogelijk te laten werken en onze klanten blij te maken. Hoewel je een PHP Developer bent, sta je open om C# of Typescript in te zetten of te leren. Ook PHP Developer worden bij Coolblue? Lees hieronder of het bij je past. Dit vind je leuk om te doen pure PHP code schrijven. Samenwerken met de klantreiziger om onze klanten

Bekijk vacature »

Junior Software Developer (HBO / WO)

Functie omschrijving Wij zijn op zoek naar een Junior Software Developer! Sta jij aan het begin van je carrière en heb je net je HBO of WO-diploma in de richting van ICT of Techniek mogen ontvangen? En heb jij grote affiniteit met software development? Dan hebben wij bij Jelling IT Professionals de perfecte opdrachtgever in de omgeving van Utrecht, die jou tot een volwaardig Fullstack Software Developer gaat opleiden. Binnen deze grote organisatie krijg je ruime en professionele trainingen die jouw in korte tijd vakbekwaam maken. Niet alleen het aan technisch aspect, maar ook zeker jouw persoonlijke ontwikkeling wordt veel

Bekijk vacature »

Airport Developer / System engineer

De functie Als onze nieuwe Airport Developer / System Engineer is je doel om uit nieuwbouw- en onderhoudsprojecten maximale waarde te creëren voor Schiphol Group en haar stakeholders. Vanuit je visie en expertise, maar ook (technologische) ontwikkelingen, wetgeving en beleid vertaal je klantwensen naar een gedegen programma van eisen. In de planontwikkelingsfase werk je nauw samen met Plan Ontwikkelaars om je kennis in te brengen ten behoeve van de kwaliteit van het investeringsvoorstel. Je overlegt met diverse partijen, stelt de vraag achter de vraag en verbindt zo de belangen van de luchthaven, proceseigenaar en asseteigenaar om tot een gedragen ontwikkelopgave

Bekijk vacature »

Software developer - C Sharp

Functie omschrijving Heb jij interesse in het programmeren en ontwikkelen van software? En heb jij enige ervaring met Oracle databases en PL/SQL? Wij zijn voor een leuke opdrachtgever in omgeving Naaldwijk op zoek naar een software ontwikkelaar die graag werkt met C#, JAVA of Oracle. Wij zoeken iemand die breed inzetbaar is en die aan veel verschillende applicaties wilt werken. Als software developer werk je met je collega's samen in een leuk en informeel team aan het (her)ontwerpen van bedrijfssystemen. Je houdt je bezig met het ontwikkelen van REST API's en je onderhoudt applicaties in Oracle PL/SQL en APEX. Vind

Bekijk vacature »

Applicatie ontwikkelaar

Functie omschrijving Zelfstandige applicatie ontwikkelaar gezocht voor familiair bedrijf in omgeving Rotterdam! Ben jij op zoek naar een nieuwe uitdaging en zoek jij een informele werkgever waar je zelfstandig kunt werken binnen een leuk IT team, lees dan snel verder want wie weet zijn wij op zoek naar jou! Binnen deze rol houdt jij je met het volgende bezig: Onderhouden en ontwikkelen van de IT systemen; Opzetten van Azure Cloud systemen, denk aan interfaces, hardware op de Cloud, webportalen of BI functies; Werken aan scripts binnen verschillende software applicaties, denk aan ERP en CAD; Ontwikkelen en implementeren van MS PowerApps

Bekijk vacature »

Java Ontwikkelaar

Java/Kotlin Developer Ben jij een ervaren Java/Kotlin developer met een passie voor het automatiseren van bedrijfsprocessen? Wil je graag deelnemen aan uitdagende projecten bij aansprekende klanten? En ben je op zoek naar een professioneel, ambitieus en dynamisch bedrijf om je carrière verder te ontwikkelen? Kom dan ons team bij Ritense in Amsterdam versterken! Zo ziet de functie eruit: Als Java/Kotlin developer bij Ritense ben je verantwoordelijk voor de ontwikkeling en implementatie van applicaties die bedrijfsprocessen automatiseren, zodat onze klanten slimmer, efficiënter en klantgerichter kunnen werken. Als developer ben je in de lead en zorg je voor de correcte oplevering van

Bekijk vacature »

Delphi Programmeur

Functie omschrijving Onze opdrachtgever is gespecialiseerd in kantoor-bedrijfssoftware en zit gevestigd in omgeving Numansdorp. Als programmeur ben jij bij dit bedrijf met het volgende bezig; Je vertaalt technische en functionele ontwerpen naar kwalitatieve software. Je ontwikkelt, ontwerpt en test software. Je maakt daarbij veel gebruik met de volgende tools & technologieën: Delphi 10.3 (Rio), QuickReport 6. Je krijgt in deze rol veel vrijheid en verantwoordelijkheid. Je levert projecten van A - Z op, en werkt daarbij projectmatig en gestructureerd. Bedrijfsprofiel Dit bedrijf richt zich op maatwerk software oplossingen. Deze software oplossingen worden ingezet in de financiële branche. Het betreft een

Bekijk vacature »

Frontend Developer - Leeuwarden

Frontend Developer – Leeuwarden Als Frontend Developer bouw jij mee aan het onderwijs van de toekomst! In een scrum team werken met jonge en enthousiaste collega’s, moderne technieken, ruimte voor eigen ontwikkeling en op een proactieve wijze kunnen meewerken aan innovatie binnen het onderwijs. Magister is het state-of-the-art softwarepakket dat scholen in het voortgezet onderwijs op alle fronten ontzorgt. Van leerlingenadministratie tot het ondersteunen van individuele leerlijnen, van toegang tot digitaal lesmateriaal tot het plannen van het lesrooster. In de Magister app bedient Magister ruim 2,5 miljoen gebruikers waarvan, dagelijks meer dan 600.000 unieke. Hiermee is Magister de absolute marktleider

Bekijk vacature »

Software Developer .NET

Functie omschrijving .NET developer gezocht! Wij zoek op zoek naar een .NET Developer die zich niet uit het veld laat slaan voor een software bedrijf in de regio Veenendaal. Je gaat in deze functie aan de slag met het door ontwikkelen van bestaande producten en het ontwikkelen van nieuwe producten. Dit bedrijf ontwikkeld SaaS applicaties die zowel intern als extern gebruikt worden. Verder bestaat je functie uit: Het ontwikkelen en bouwen van webapplicatie, mobiele applicaties en websites vallen onder jouw verantwoordelijkheden; Werken met onder andere .NET, C#, HTML/CSS, Javascript en MSSQL/Oracle Databases; Hierin werk je samen met andere developers en

Bekijk vacature »

.NET Developer Azure

Dit ga je doen Het ontwerpen en bouwen van diverse applicaties (C#, ASP.NET, MVC); Het ontwikkelen van Webservices (WCF); Het meewerken aan de transitie naar Azure; Het samenwerken met collega's binnen een Scrumteam en meedenken over de User Stories; Het bouwen van unittesten; Meedenken over nieuwe tooling, ontwikkelingen en technologieën in de markt. Hier ga je werken Je komt te werken bij een organisatie die verantwoordelijk is voor de ontwikkeling van verschillende portalen. Deze portalen worden gebruikt door diverse partijen en jouw taak is om ervoor te zorgen dat deze optimaal functioneren. Je wordt onderdeel van een Scrumteam en werkt

Bekijk vacature »

Front end developer React Sportgames

Functie Als Front end developer ga jij aan de slag bij een gave en bekende organisatie op het gebied van sportgames. Jij gaat aan de slag in een scrumteam met 6 developers die gepassioneerd en actief bezig zijn om spelers kwalitatieve en mooie spelervaringen aan te bieden. Als scrumteam werken ze in drie wekelijkse sprints en begin je iedere ochtend met een stand-up. Als Front end developer werk jij bij deze organisatie voornamelijk met Javascript, html, css en React. Er wordt veel gebruikt gemaakt ook van C#, Docker en Kubernetes. Het team hecht veel waarde aan het leveren van hoogwaardige

Bekijk vacature »

Low Code Developer

Functie omschrijving Ben jij toe aan een nieuwe uitdaging en ben jij HBO afgestudeerd in de richting van IT? Heb jij verstand van datamodellering, NO CODE Platformen en kun jij het aan om projecten te leiden? Voor een leuke opdrachtgever in omgeving Rotterdam zijn wij op zoek naar een No Code developer die zich bezig gaat houden met het optimaliseren van bedrijfsprocessen bij klanten in heel het land! Wat ga je hier zoal doen? Je gaat geen code kloppen maar bedenken hoe applicaties eruit moet komen te zien. Je gaat werken met een non code platform, je kunt denken aan

Bekijk vacature »
Sven Dekker

Sven Dekker

18/05/2010 08:33:41
Quote Anchor link
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!
Gewijzigd op 18/05/2010 10:46:36 door Sven Dekker
 
PHP hulp

PHP hulp

16/05/2024 02:45:44
 
Sven Dekker

Sven Dekker

20/05/2010 08:55:20
Quote Anchor link
ik zal even de code plakken zover ik hem heb. Deze is nog niet getest, dus er kunnen typo's inzitten. Heeft iemand een idee hoe ik van iedere sensor alleen de laatste waardes kan tonen?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<?php

// open de 2 log bestanden, zorg er wel voor dat de tijdsvolgorde klopt
$file1 = file("/var/log/wflogger.log.1");
$file2 = file("/var/log/wflogger.log");

// voeg de 2 logbestanden samen
$lines = array_merge($file1,$file2);

// zet de array regel voor regel
foreach($lines 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;
    }
}


// tja, en toen zat ik vast... ik wil nu alleen nog alleen van iedere sensor de laatste informatie...

?>
Gewijzigd op 20/05/2010 08:56:42 door Sven Dekker
 
Elwin - Fratsloos

Elwin - Fratsloos

20/05/2010 13:08:40
Quote Anchor link
Ik denk dat je een array bij moet houden met daarin de keys van de sensors die je wilt benaderen. Vervolgens moet je zo door je regels heenlopen dat je nieuwste waarden als eerste aan de beurt zijn (dat ligt aan je logfile). Zoiets is het dan in theorie:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
// Array met sensors
$aSensor = array();
$aSensor['Barometer'] = NULL;
$aSensor['Temperature_th1'] = NULL;
$aSensor['Rain'] = NULL;
$aSensor['Wind'] = NULL;

/*
Dan door de log heenlopen, ervan uitgaande dat in je huidige logs de nieuwste waarden bovenaan staan.
*/

foreach($lines as $line) {
  // Doe je berekeningen
  
  // Check of de sensor nog niet gevuld is

  if($aSensor[$parts[4]] == NULL) {
    // Vul de sensor
    $aSensor[$parts[4]] = $jeHuidigeEcho;
  }
}

?>


Dan zou je nog een controle kunnen maken of alle elementen in je array al gevuld zijn, dan kan je een break in je foreach zetten. Scheelt weer verwerkingstijd.

Offtopic:
Wat voor weerstation heb je eigenlijk? En waarom de keuze voor linux?
Zelf heb ik de site http://www.grandix.nl gemaakt op basis van mijn vaders weerstation (Davis VP2). Daar heb je heel goede Windows software voor die goede .htm's (of whatever) genereert die je heel goed met PHP kan inlezen.
Ook een leuke om je bij aan te sluiten is http://www.hetweeractueel.nl.
 
Sven Dekker

Sven Dekker

20/05/2010 13:44:52
Quote Anchor link
hey Elwin,

bedankt voor jouw berichtje! Mijn budget strekte niet ver genoeg voor een Davis, ik heb daarom een Oregon WRMS-200 gekocht. Dit bestaat alleen uit een antenne (met barometer en interne temp/hum sensor) en standaard 3 buiten sensoren (wind, regen, temp/hum). De keuze voor linux is gekomen omdat ik dit alles thuis draai op een Qnap nas (TS-109) met daarop een alternatief besturingssysteem (Debian i.p.v. de qnap firmware).

Hoewel ik mcsa ben, ligt mijn voorkeur niet zo zeer bij windows, maar bij de beste oplossing. In mijn geval wilde ik een uber lowpower systeem dat maar toch geschikt om een website op te draaien. Je komt dan al snel uit op dit soort oplossingen, op volle stoom trekt dit dingetje inc. draaiende hdd 15 watt, een windows systeem kan gewoon niet op zo weinig power lopen (en ook nog redelijk performen).

Daarnaast hou ik wel een beetje van een uitdaging en zie het weerstation als hobby projectje, het belangrijkste is dat de opa's en oma's foto's van hun kleindochter kunnen zien (op te roepen nadat ze ingelogd zijn).

Anyway, weer ontopic:
ik ga jouw oplossing thuis proberen, ik denk dat ik jouw zienswijze begrijp. Ik moet gewoon een array_reverse doen, dan staan de laatste log entries boven. dit ga ik wel even proberen :) thnx!
 
Elwin - Fratsloos

Elwin - Fratsloos

20/05/2010 14:41:25
Quote Anchor link
Precies. Dan moet je een arrayy_reverse doen. En dan als de array helemaal gevuld is met de waarden die je wilt hebben de foreach afsluiten met een break. Dan gaat die niet helemaal door tot het einde van alle logs.

Offtopic:
Wat betreft Windows; ik ben geen fanboy van enig OS, ik vind dat ze allemaal zwakke en sterke kanten hebben, maar wij hebben een micro PC met een Windows Server 2003 install waarop WebcamXP Pro, FireDeamon en Weatherlink draaien. Die vreten ook bijna geen stroom, wat inderdaad een fijne bijkomstigheid is.

De website draait daar overigens niet op. Deze server exporteert de data in verschillende bestanden naar een webstek waar de data door mijn site en bijvoorbeeld Hetweeractueel.nl en Weather Underground worden opgepakt. De site draait gewoon weer op een shared hosting account. Lekker weinig verkeer op die manier over het ADSL lijntje, maar wel de mogelijkheid om veel bezoekers op te vangen.

Maar goed, mocht je willen weten hoe het ongeveer werkt; http://www.grandix.nl/over/techniek/

Bij de weg; mijn budget is ook niet genoeg voor een Davis. Maar ooit komt er één! :) Best verslavend het weer. Voorlopig kan ik in ieder geval mijn ei kwijt in de site. :)
 
Sven Dekker

Sven Dekker

20/05/2010 18:26:39
Quote Anchor link
Elwin,

het ziet er al aardig uit, maar werkt nog niet helemaal. Op de een of andere manier worden toch nog de records weergegeven die ik eigenlijk niet wil hebben, en dan nog met data van een andere sensor ook...check dit is de code:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
<?php

// Array met sensors
$aSensor = array();
$aSensor['Barometer'] = NULL;
$aSensor['Temperature_th1'] = NULL;
$aSensor['Rain'] = NULL;
$aSensor['Wind'] = NULL;

// open de 2 log bestanden, zorg er wel voor dat de tijdsvolgorde klopt
$file1 = file("/var/log/wflogger.log.1");
$file2 = file("/var/log/wflogger.log");

// voeg de 2 logbestanden samen
$lines = array_reverse(array_merge($file1,$file2));

// zet de array regel voor regel
foreach($lines 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
            $data = $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[8];
            $temperature_trend = str_replace($special,"",$parts[10]); //haakjes en komma weghalen
            $temperature_hum = $parts[12];
            $temperature_dew = $parts[17];
            // tijdelijk even laten zien wat we er nu uit hebben gehaald, csv style
            $data = $temperature_date.",".$temperature_time.",".$temperature_temp.",".$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
            $data = $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

            $data = $rain_date.",".$rain_time.",".$rain_battery.",".$rain_rate.",".$rain_hour.",".$rain_day."<br>";
        break;
    }

   // Check of de sensor nog niet gevuld is
   if($aSensor[$parts[4]] == NULL) {
   // Vul de sensor
   $aSensor[$parts[4]] = $data;
   echo $parts[4]." ".$data;
  }
}


?>
Gewijzigd op 20/05/2010 18:28:00 door Sven Dekker
 
- Mark -

- Mark -

20/05/2010 20:08:23
Quote Anchor link
Probeer het volgende eens. In de $data array komt de laatste log regel te staan voor elke sensor " Als het goed is " Je moet ze dan wel nog effe leesbaar maken natuurlijk. Dat gedeelte heb ik niet naar gekeken maar dat werkte al als ik je post goed heb begrepen.

Ik zou het stukje code eerst los testen door even de $data array te printen. " print_r() " om te kijken of ook echt de juiste regels worden opgeslagen.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
<?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){
                    
                    #| Kijken voor welke sensor de huidige regel is bedoeld.
                    
                        if(strpos($log[$i], str_replace("_", " ",$sensor))){
                        
                        #| Log data opslaan voor de huidige sensor.
                        
                            $data[$sensor] = $log[$i];
                    
                        }
                    }
                }

            
            
            #| Teller updaten.
            
                $i++;
                
            }
        }

        
?>
Gewijzigd op 20/05/2010 20:13:18 door - Mark -
 
Sven Dekker

Sven Dekker

20/05/2010 21:09:02
Quote Anchor link
wow mark!

haha.. die gaat me even boven m'n pet. ik raak je kwijt bij "Kijken voor welke sensor de huidige regel is bedoeld." Het script geeft geen foutmeldingen, maar ik zou niet weten hoe ik hier uit data moet tonen...

Groetjes!
 
- Mark -

- Mark -

20/05/2010 21:34:13
Quote Anchor link
Je krijgt de laatste log regel voor elke sensor opgeslagen in de data array. Het is plus minus het zelfde als Elwin bedoelde maar dan uitgewerkt voor elke sensor en zonder dat je de hele log file doorloopt. Tevens staat het los van je eigen gescripte stuk.

if(strpos($log[$i], str_replace("_", " ",$sensor))){

kijkt tot welke sensor de log regel behoort.


Zo zou hij in zijn geheel moeten werken. " Als het goed is. "

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
<?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){
                    
                    #| Kijken voor welke sensor de huidige regel is bedoeld.
                    
                        if(strpos($log[$i], str_replace("_", " ",$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;
    }
}


?>
Gewijzigd op 20/05/2010 21:35:54 door - Mark -
 
Sven Dekker

Sven Dekker

20/05/2010 22:19:34
Quote Anchor link
Ja hoor, 't werkt! Daar was ik zelf echt niet op gekomen, thanx a million!
 
Sven Dekker

Sven Dekker

23/05/2010 19:49:41
Quote Anchor link
Hey jongens, ik kom toch nog een klein hiccupje tegen in het script... als je 'm een aantal keer refreshed dan blijven er wel 4 lijnen, maar 2 ervan is de barometer en de regen meter verdwijnt... ik heb al lopen stoeien om het limiet van 25 te verhogen naar bijvoorbeeld 400 lijnen.... maar dat helpt niet

Ook heb ik gekeken(en ook aangepast) naar de volgorde van de eerste array en de bewerkingen, helaas zonder succes. Ik heb het vermoeden dat het alleen voorkomt als er regen voorspeld wordt, zou het kunnen dat de sensor "Rain" en de status "Rainy" voor verwarring kunnen zorgen.. of dat dat cr*p wat ik nu praat...

update --> ik praat idd geen cr*p, ik heb de log gekopieerd naar een andere locatie, het script die file uit laten lezen en de status "Rainy" vervangen voor "Regen" en dat werkt wel... nu er nog achter komen wat dit probleem veroorzaakt...

update2 --> ik denk dat 't hier in zit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
                    #| Kijken voor welke sensor de huidige regel is bedoeld.
                        if(strpos($log[$i], str_replace("_", " ",$sensor))){

update3 --> heerlijk dat hardop denken :) probleem opgelost, ergens tussen positie 45 en 65 staat welke sensor 't is, dus de regel iets aangepast:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
                    #| Kijken voor welke sensor de huidige regel is bedoeld.
                        if (strpos(substr($log[$i],45,65), str_replace("_", " ",$sensor))){


update 4 --> helaas dat werkt niet...

update 5 --> tijdelijk even het weerstation script zelf aangepast, de sensoren zijn nu in het Engels, de waarden in het Nederlands :o)
Gewijzigd op 24/05/2010 10:03:30 door Sven Dekker
 
- Mark -

- Mark -

25/05/2010 10:39:00
Quote Anchor link
Probeer het volgende eens. Is niet getest maar zou moeten werken.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
<?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;
    }
}
  

?>
        
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.