Live weer uit logfiles weerstation

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Fullstack Software Developer

Bedrijfsomschrijving Functieomschrijving Java ontwerpen, bouwen en testen (T-shaped). Als senior ontwikkelaar ben je bekend in zowel de back-end als de frontend van een applicatie. Angular, Continious Delivery / Integration. Een ervaren iemand die de leiding kan nemen, een weg vindt in nieuwe situaties, en in oude applicaties. Initiatiefrijk, bekend met de (technische) omgevingen die we bij duo gebruiken, niet te beroerd om collega’s te helpen. Als senior programmeur in staat om op te treden als lead programmeur. Ondersteunt de testers bij de testautomatisering en minder ervaren programmeurs bij dagelijks werkzaamheden. Dit laatste met name op het gebied van Angular. Achtergrond

Bekijk vacature »

Front-end Developer Magento 2/Wordpress

Voor het aantrekkelijk houden en steeds vernieuwen van de huidige websites en webshops en het meedenken in de marketing zijn wij per direct op zoek naar een ervaren Front-end developer met gedegen kennis van Magento 2 (webshops) en Wordpress (websites). Wat bieden wij jou Mooi salaris! Meteen op contract bij de opdrachtgever! Gezellig, Kempisch bedrijf! 35 uur per week! Auto van de zaak! Wie ben jij Van een front-end developer verwachten wij: Een afgeronde Bachelor ICT opleiding met profiel ICT & Media Design. Dat je in het bezit bent van een Magento 2 professional front-end developer certificaat; Je hebt ruime

Bekijk vacature »

Laravel developer

Zie jij mogelijkheden om onze tooling technisch te verbeteren en uit te bouwen? Over Jobmatix Jobmatix is een innovatieve en internationale speler op het gebied van jobmarketing. Onze jobmarketing automation tool helpt organisaties bij het aantrekken van nieuw talent door vacatures digitaal, geautomatiseerd en op een efficiënte manier te adverteren en onder de aandacht te brengen bij de doelgroep op 25+ jobboards. Volledig performance-based, waarbij organisaties betalen op basis van cost per click of cost per applicant. Maandelijks wordt onze jobmarketing automation tool al gebruikt door vele directe werkgevers, intermediairs en mediabureaus, waaronder Picnic, Rijkswaterstaat, AdverOnline, Schiphol, DPA, Teleperformance en

Bekijk vacature »

Java (Java EE) Developer

In het kort Werken als Java developer betekent werken aan complexe IT projecten bij onder meer een internationaal containeroverslag bedrijf. Zo sturen we apparaten en eindgebruikers aan d.m.v. onze custom-made software oplossing, die dagelijkse vele duizenden containers verwerkt. Denk aan systemen die volautomatische kranen aansturen en op afstand bedienen, de volledige afhandeling van containernummerherkenning bij het laden en lossen van zeeschepen of het tonen van instructies aan de chauffeurs van ruim 300 straddle carriers. En dat allemaal redundant, robuust en in een dynamische 24/7 omgeving! Jij versterkt ons ontwikkelteam en gaat aan de slag met oa. Java i.c.m. Spring (Boot),

Bekijk vacature »

Back-end PHP Developer

Dit ga je doen Her- en uitbouwen van het inhouse softwareplatform dmv PHP; Onderhouden van bovengenoemd platform in PHP; Sparren met het team; Meedenken over nieuwe functionaliteiten, security etc; Jouw input leveren aan het proces door op de hoogte te blijven van nieuwe ontwikkelingen etc. Hier ga je werken Onze klant, gevestigd in de omgeving van Alkmaar, levert wereldwijd oplossingen op het gebied van IT. Dag in dag uit werken zij met veel passie aan hun product waarmee ze streven naar verbeteringen binnen zorg. Voor onze klant zijn we op zoek naar een medior PHP Developer. Je komt te werken

Bekijk vacature »

Implementatie specialist

Standplaats: Honselersdijk Aantal uren: 32 – 40 uur Opleidingsniveau: HBO werk- en denkniveau Ben jij de implementatie expert die onze klanten helpt bij het integreren van de Greencommerce software? Ben jij daarnaast communicatief sterk, denk jij graag in verbeteringen en heb je ervaring met ICT? Lees dan snel verder! Bedrijfsinformatie Jem-id is een grote speler op het gebied van software ontwikkeling. Zo zijn wij continu bezig met het ontwikkelen van de meest innovatieve software voor de AGF- en sierteeltsector. We creëren oplossingen die er toe doen en verbinden klanten niet alleen op technisch vlak, maar zoeken ook de verbinding in

Bekijk vacature »

Fullstack developer

Functie omschrijving We are looking for a dutch native speaker Wil jij werken als Senior Developer en werken aan een applicatie die duizenden marketingcampagnes automatisch aanstuurt? Dit is je kans! Kom werken voor onze opdrachtgever en in deze rol zul je veel vrijheid en verantwoordelijkheid krijgen om gezamenlijk de applicatie naar een hoger plan te tillen. Wat ga je verder doen: Optimaliseren, beheren en uitbreiden van onze applicatie; Het bouwen van aansluitingen op de systemen van partners middels API’s; Meedenken over de technische/ontwikkel-standaarden; Proactief verbeterpunten voorstellen. Bedrijfsprofiel Het is een organisatie die met een team van verschillende developers én marketeers

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 »

Back-end ontwikkelaar

Functie omschrijving Wil jij meebouwen aan diverse databasesystemen in een klein bedrijf met een platte organisatie? In een team van ruim 10 ontwikkelaars wordt er aan diverse ICT oplossingen gewerkt. Jouw taken hierbij zullen bestaan uit: Het onderhouden en door-ontwikkelen van bestaande databases. Denk hierbij aan schema verbeteringen en performance-tuning. Bij nieuwe ontwikkelingen ga jij ook bezig met het bouwen van het databaseschema. Omdat je in een klein team werkt zal je ook de C# routine verder uitbouwen en ontwikkelen. Ook kan je meedraaien in algemene refactory-, ontwikkel- of testwerkzaamheden. Je zal voornamelijk gebruik maken van de volgende technieken: .NET

Bekijk vacature »

Belastingdienst - Freelance Senior Cobol Applicati

Startdatum: 01.06.2023 Richttarief: €65,00 - €75,00 Duur van de opdracht: 7 maanden Uren per week: 36 Taal: Nederlands vereist! Gelieve in het Nederlands te solliciteren. Functieomschrijving: In de applicatie ETM zijn nu de inningsvoorzieningen voor ongeveer 25 aangifte- en aanslagmiddelen opgenomen. ETM is een extern aangeschafte service en het huidige contract met leverancier Oracle loopt af op 31-12-2022. Het programma uitfaseren ETM heeft als doel om vervanging te realiseren waarmee alle nu in gebruik zijnde ETM ondersteuning wordt overgenomen in nieuwe Inningsvoorzieningen om de continuïteit van de inningsprocessen te waarborgen. Eén van de inningsvoorzieningen die voor het einde van 31-12-2022

Bekijk vacature »

Software Developer

Longship.io gaat de wereld veroveren met baanbrekende software en legendarische... pizza-avonden! Lees hier de vacature van Software Developer! Bij Longship werken we met een team van 5 mensen aan software voor laadpaal operators. Longship is ontstaan in 2020 met als doel om de elektrische mobiliteitstransitie aan te jagen. We zijn nu al een wereldwijde speler doordat we continu voorop lopen in innovatie. Ons platform helpt het versneld elektrificeren van wagenparken, internationaal! Wij zijn een startup met grote ambities die we willen bereiken met een relatief klein en efficiënt team. Je krijg de kans om ontzettend veel te leren van ervaren

Bekijk vacature »

Front-End React Developer

As a Front-End React Developer you improve the user-experience of our web applications for your colleagues in Coolblue. How do I become a Front-End React Developer at Coolblue? As a Front-End React Developer you are responsible for developing user interface components and implementing them using React.js concepts and workflows. You work with the UX Designer and get energy from coming up with creative solutions and present these within the team. During the day you gather and welcome feedback on your technical and soft skills. Would you like to become a Front-End React Developer at Coolblue? Read below if the job

Bekijk vacature »

Oracle Apex Developer

Dit ga je doen Jouw taken bestaan uit: Het bouwen maatwerk Oracle applicaties voor Europese business units; Het implementeren van de nieuwste technieken om te blijven innoveren; Actief meedenken en aandragen van verbetervoorstellen. Hier ga je werken Deze organisatie in de regio Veenendaal is een van wereld grootste retailers met ruim 16.000 winkels in 27 markten en jaarlijks ruim 5,3 miljard klanten die winkelen bij een van hun welbekende retailmerken. Binnen de organisatie is er een IT Group actief die dient als IT Service Provider voor de hele organisatie en waar dagelijks IT'ers werken aan state-of-the-art IT oplossingen. Dit doen

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 »

Node.js developer looking for a challenging consul

Functie Under the guidance of 3 account managers, one of whom will be your point of contact within your expertise, you will start working for various clients. He or she will help you find a suitable and challenging assignment. Naturally, they will take your situation, experience and (technical) ambitions into account. The assignments last one to two years on average. This allows you to really commit to a project and make an impact as a consultant. Besides the assignment, you will regularly meet your colleagues from the IT department to share knowledge or discuss new trends, for example. Master classes

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

23/11/2024 14:22:06
 
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.