Live weer uit logfiles weerstation

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

PHP Developer

Dit ga je doen Ontwikkelen, implementeren en testen van PHP-oplossingen en Apps voor klanten en bedrijfsprocessen; Opstellen van requirements en uitwerken van de oplossingen; Testen van software en borgen van een soepele overdracht, inclusief documentatie; Proactief adviseren vanuit eigen expertisegebied over ontwikkelingen en verbeterpunten in technische toepassingen en processen binnen de organisatie. Hier ga je werken De organisatie is een ambitieuze en vooruitstrevende speler in de markt in de regio Rotterdam. Ze zijn de snelst groeiende in hun branche. Met een excellent aanbod en service willen zij de beste keuze zijn voor hun bestaande en nieuwe klanten. Dit alles doen

Bekijk vacature »

Front-End Developer

As a Front-End Developer at Coolblue you improve the user-friendliness of our webshop for millions of customers. How do I become a Front-End Developer at Coolblue? As a Front-End Developer you work on the user-friendliness of our webshop for millions of customers. You enjoy working with the UX Designer to pick up stories. You get energy from coming up with creative solutions and are happy to present these within the team. You also take pride in your work and welcome any feedback. Would you like to become a Front-End Developer at Coolblue? Read below if the job suits you. You

Bekijk vacature »

Randstad - Freelance Backend Developer/ Data Engin

Starting date: 10.05.2023 Salary range: €67,00 - €77,00 Duration: 6 months Hours: 40 Working model: Hybrid* MUST be NL based Job description: Our vision is to have a consistent and data driven experience for all sales across all our operating companies. Our mission is to enable our salespeople to be able to reach out to the right company at the right time. We do this by creating data driven micro services and solutions. We mainly focus on implementation in the Google Cloud but also integrate with local systems and other cloud solutions. A typical day: As a back-end developer you

Bekijk vacature »

Java Full Stack Developer

Java Full Stack developer What makes Cognizant a unique place to work? The combination of rapid growth and an international and innovative environment! This is creating a lot of opportunities for people like YOU — people with an entrepreneurial spirit who want to make a difference in this world. At Cognizant, together with your colleagues from all around the world, you will collaborate on creating solutions for the world's leading companies and help them become more flexible, more innovative and successful. And this is your chance to be part of the success story: we are looking for a (Senior) Java

Bekijk vacature »

Medior C# Developer

You'll build modern applications for Coolblue's back office. We have a lot of friends, and they crave well-structured data and user-friendly, task-focused applications. How do I become a Medior C# Developer at Coolblue? You regularly participate in brainstorm sessions about user experience, data, and task flow with the UX Designer, Product Owner, and Data Scientists in your team. Besides that you will create disconnected, highly congruent, and testable code that can easily be maintained and is future-proof. Want to become C# Developer at Coolblue? Read below if the job suits you. You enjoy doing this Working with various types of

Bekijk vacature »

Back end developer PHP, Laravel

Functie Jij komt te werken in ons webdevelopment team, wat bestaat uit 8 ervaren collega’s. Hiernaast hebben wij nog een team van 2 ontwikkelaars die aan native applicaties werken. Bij ons zijn er korte lijntjes en er hangt een gezellige informele werksfeer. Maar het belangrijkste is natuurlijk dat je aan geweldige applicaties zult gaan werken! Wij willen als organisatie niet te groot worden, we willen gewoon toffe dingen maken. Onze techstack bestaat momenteel uit: PHP, Laravel, Javascript, Typescript, Git, MySQL, Java, Kotlin, Xamarin. Samen met ons ga jij zorgen dat we puik werk leveren! Waarbij je bij elke fase in

Bekijk vacature »

Freelance Fullstack Java Developer

Functieomschrijving Voor een opdrachtgever in omgeving Rotterdam zijn wij op zoek naar ervaren Fullstack JAVA Developers die graag op projectbasis willen werken. Je komt terecht bij een informele developers club die mooie projecten uitvoeren voor grote klanten. Ben je een ervaren freelancer of werk je in loondienst en ben je toe aan een nieuwe uitdaging? Lees dan snel verder want wie weet is dit een leuke vacature voor jou! Het fijne van deze werkgever is dat je zelf mag beslissen hoe je te werk wilt gaan. Wil je als freelancer werken dan is dat OK. Wil je de zekerheid hebben

Bekijk vacature »

.Net Front-end Ontwikkelaar

Wij zoeken een .Net Front-end Ontwikkelaar! Omschrijving Kun jij snel schakelen en ben je stressbestendig? Dan zoeken wij jou! Als .Net Front-end Ontwikkelaar help je mee aan de webapplicatie die over de hele wereld door allerlei bedrijven wordt gebruikt. Je werkt daarnaast mee aan nieuwe en verbeterde functionaliteiten en helpt met het oplossen van bugs. Over de opdrachtgever Je komt te werken in een ambitieus team dat zich blijft ontwikkelen. Dit is alle informatie die we nu kunnen delen over de werkplek. Als jij de .Net Front-end Ontwikkelaar bent voor deze job, vertellen we je snel nóg meer. Eisen Heb

Bekijk vacature »

Medior Java developer (fullstack)

Wat je gaat doen: Of beter nog, wat wil jij doen? Binnen DPA GEOS zijn we dan ook op zoek naar enthousiaste Java developers om ons development team te versterken. Als Java developer werk je in Agile/Scrum teams bij onze klanten en daarbij kun je eventueel ook andere ontwikkelaars begeleiden in het softwareontwikkelproces. Verder draag je positief bij aan de teamgeest binnen een projectteam en je kijkt verder dan je eigen rol. Je gaat software maken voor verschillende opdrachtgevers in jouw regio. Je bent een professional die het IT-vak serieus neemt en kwaliteit levert. Je leert snel vanwege je diepgaande

Bekijk vacature »

Medior Java developer

Wat je gaat doen: Of beter nog, wat wil jij doen? Binnen DPA GEOS zijn we dan ook op zoek naar enthousiaste Java developers om ons development team te versterken. Als Java developer werk je in Agile/Scrum teams bij onze klanten en daarbij kun je eventueel ook andere ontwikkelaars begeleiden in het softwareontwikkelproces. Verder draag je positief bij aan de teamgeest binnen een projectteam en je kijkt verder dan je eigen rol. Je gaat software maken voor verschillende opdrachtgevers in jouw regio. Je bent een professional die het IT-vak serieus neemt en kwaliteit levert. Je leert snel vanwege je diepgaande

Bekijk vacature »

.NET developer

Functie As a .NET developer you work together in a multidisciplinary development team with 1-2 Senior .NET developers, two front-end developers, Data Scientists and one UX designer. As a team you work on developing a Cloud based application and making this application more stable. Unit testing will also become very important in your new position. Together with the Senior .NET developer you will be responsible for developing the API. You work with a lot of data and occasionally there will also be data issues and some queries will have to be run. This means that you will work a lot

Bekijk vacature »

Starter/junior Magento developer gezocht!

Functie Je komt te werken in een zelfsturend team waarin vertrouwen voorop staat en inbreng en ideeën worden gewaardeerd. Ook staat innovatie centraal. Ze bieden jou de mogelijkheid om jezelf door te ontwikkelen. Denk hierbij aan cursussen en een persoonlijk ontwikkelplan. Je komt terecht in het team van momenteel 4 (ervaren) collega’s en zal meewerken aan de doorontwikkeling en nieuwbouw van de Magento platformen van meerdere opdrachtgevers volgens Agile/Scrum. Denk hierbij aan nieuwe functionaliteiten, UX en koppelingen met verschillende back-end systemen. Als starter/junior developer zul je direct begeleid worden door een senior uit het team. Het is van belang dat

Bekijk vacature »

Java Developer bij een jonge groeiende organisatie

Bedrijfsomschrijving Vind jij het als Java developer ook zo belangrijk dat een bedrijf je de ruimte en tijd geeft voor persoonlijke ontwikkeling? Dan zit je hier helemaal goed. Deze jonge organisatie is opgericht in 2018 en is ondertussen uitgegroeid tot een club van ongeveer 30 medewerkers. Het gaat hier om een echte Java club, die vrijheid en verantwoordelijkheid erg belangrijk vinden. Het bedrijf heeft een informele sfeer en de teams zijn erg hecht met elkaar. Ze delen graag de kennis en ervaringen met anderen, maar vinden andermans mening ook zeer belangrijk. De organisatie zet zich in voor ontwikkeling en besteed

Bekijk vacature »

Back end Node.js developer

Functie Het ontwikkelteam bestaat momenteel uit 5 (back-end) Developers, 2 systeembeheerders, 1 DevOps engineer, 1 Tech Lead en 2 Scrum Masters. Samen wordt er doorontwikkeld aan twee SaaS-platformen die in een hoog tempo doorontwikkeld moeten worden. Omdat innovatie een belangrijk speerpunt binnen de organisatie is, wordt er ook continu naar snellere en slimmere oplossingen te bedenken en realiseren. Als Back-end Developer hou jij je dagelijks bezig met vraagstukken zoals: API-development, high volume datastromen, het ontwikkelen van Bots aan de hand van A.I. Daarnaast denk en werk jij mee aan de onlineapplicaties voor klanten. Er wordt zelfstandig en in teamverband gewerkt

Bekijk vacature »

Software Developer C# .NET

Functie omschrijving Software Developer C# .NET gezocht voor een dynamische organisatie! Ben jij net afgestudeerd of toe aan een volgende stap in je maatschappelijke carrière? Lees dan snel verder! Wij zijn op zoek naar een Software Developer die klaar is voor een nieuwe uitdaging en die een organisatie in de regio Houten wil versterken. Je werkt in deze functie aan verschillende projecten en gaat vaak op bezoek bij klanten. In deze functie kun je een grote mate van uitdaging, diversiteit en verantwoordelijkheid verwachten. Bedrijfsprofiel Waar kom je te werken? Je komt te werken bij een organisatie dat gespecialiseerd is in

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

19/04/2024 06:46:42
 
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.