Live weer uit logfiles weerstation

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ontwikkelaar MS Dynamics 365 Projecten

Samengevat: Deze werkgever is de kwaliteitsdienst in de tuinbouwsector. Ben jij een ervaren ontwikkelaar? Heb jij ervaring met Ms Dynamics 365 BC? Vaste baan: Ontwikkelaar Ms Dynamics 365 BC ICT MBO 3.500 - 5.000 Ontwikkelaar Ms Dynamics 365 BC Ons bedrijf bewaakt en bevordert de kwaliteit van producten, processen en ketens in de tuinbouw. Wij kenmerken zich door openheid, ruimte voor initiatief, collegialiteit en zelfontplooiing. Deze werkgever is een veelzijdige organisatie. Je werkt voor de eigen IT organisatie. Zij werken met moderne technologie en staan open voor innovatie. Functie: Voor de vacature als Ontwikkelaar Ms Dynamics 365 BC Roelofarendsveen MBO

Bekijk vacature »

.NET developer WO niveau voor predictive software

Bedrijfsomschrijving Dit bedrijf uit Den Bosch is om precies te zijn 15 medewerkers groot en ze ontwikkelen (predicitve) planning software. Dit doen zij voor allerlei mooie en bekende organisaties (bierbrouwerijen, gemeentes, oliemaatschappijen en diverse multinationals). Wegens meer en grotere vraag vanuit de klanten komen er nu posities vrij voor onder andere een .NET developer. Het bedrijf is goed met openbaar vervoer te bereiken. Functieomschrijving Je komt hier te werken in een team van 3 .NET developers en bent betrokken bij het gehele ontwikkelproces. Dus van idee naar ontwerp en van ontwikkeling tot testen en implementatie. Bij voorkeur ben je niet

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 »

Junior .NET developer

Functie Om half 9 kom jij binnen en pak jij als eerst natuurlijk een bakje koffie of thee. Vervolgens ga jij je voorbereiden op de stand-up van kwart voor 9. Zijn er bijvoorbeeld dingen waar jij nog tegen aan loopt? Of is er nog code die getest of gereviewd moet worden? Vervolgens starten jullie met de stand up en na de stand up zoeken jullie elkaar op en gaan jullie aan de slag. Als team met 6 developers werken jullie in drie wekelijkse sprints. Het einde van een sprint is altijd op een donderdag zodat jullie op vrijdag de demo

Bekijk vacature »

Front-end Developer

Do you want to work with the latest technologies on the development of new systems and applications? Create elegant interfaces using VueJS for thousands of users? Get moving and strengthen Nederlandse Loterij as a Front-end Developer. Thanks to your efforts, our services are always presented in style. As a Front-end Developer you are responsible for website development and improving customer experience based on data analyze. In this way, you directly contribute to a happy, healthy and sporty Netherlands. As a Front-end Developer you score by: Writing elegant, testable components without side-effects to provide functionality to the users Website development, adding

Bekijk vacature »

.NET developer

Wat ga je doen als Full stack .NET developer Microsoft 365? Je stelt je op als sparringpartner voor het team en PO over toekomstige functionaliteiten, architectuur en mogelijke nieuwe producten. Je bent mede-verantwoordelijk voor het vertalen en omzetten van een user story in een passend technisch design. Je implementeert functionaliteiten op basis van een technisch design en user story. Je bent mede-verantwoordelijk voor het beheer van Azure DevOps, waaronder het beheer van GIT, Build Pipelines, Release Pipelines en geautomatiseerde testen. Hier herken jij jezelf in Hbo werk- en denkniveau of hoger aangevuld met relevante certificeringen en/of cursussen; Minimaal 3 jaar

Bekijk vacature »

Front-end developer (React)

Functie Het frontend team bestaat momenteel uit 4 dedicated front-enders en is hard aan het groeien! Ook werken er diverse designers waar je veel mee schakelt. Samen leveren jullie een essentiële bijdrage aan de applicaties die ze voor hun klanten realiseren, jij bent hierin de schakel tussen de eindgebruiker en de slimme backend. Je werkt in het frontend team samen met de backend teams en product owners om te zorgen dat onze applicaties een fijne gebruikerservaring opleveren. Ze werken o.a. met: React, Atomic design, Styled components, JavaScript / TypeScript, NPM, Webpack Blade templates, HTML, SCSS, Git flow. Eisen • HBO

Bekijk vacature »

Traineeship Full Stack Java developer

Dit ga je doen Start jij op 7 augustus bij de Experis Academy dan kickstart jij jouw IT-carrière! We leiden je op tot een gewilde Full Stack Java Developer met alle kennis en vaardigheden die nodig zijn om de arbeidsmarkt te betreden. Wat kun je verwachten, hoe zit een dag in het leven van een Trainee eruit? Periode 1 Als Full Stack Java Developer Trainee volg je vanuit huis een op maat gemaakte onlinetraining die in het Engels wordt gegeven. De tijd die je kwijt bent aan het volgen van de training kun je vergelijken met een fulltime werkweek. In

Bekijk vacature »

Magento developer

Functie E-commerce is een ‘’snelle’’ wereld. Om hierin continu voorop te blijven omarmen ze in een vroeg stadium nieuwe technieken. Een webshop is nooit af en kan altijd beter, sneller en efficiënter. Tegelijkertijd hebben ze vanaf hun oprichting altijd vastgehouden aan kwaliteit boven snelheid, en dit loont. Als back-end developer fungeer je als het verlengstuk van hun klanten. Technisch complexe zaken pak je met liefde op, en hierin werk je samen met o.a. front-end developers en designers. Klanten verwacht hierin kwaliteit van het hoogste niveau en een proactieve, meedenkende rol bij het maken van zowel technische als strategische keuzes. Ga

Bekijk vacature »

Digital Agency is looking for PHP developers!

Functie The team currently has 20 colleagues, consisting of developers (front and backend) and the operations team, which also includes management and two scrum masters. They are looking for a PHP developer who is able to work independently. You will work in one of the three scrum teams and start working on a project for the customer. The interesting thing about this is that you do have variety in terms of work, but at the same time continuously work for existing customers. This also gives you the opportunity to really go into depth and develop innovative technical solutions. In terms

Bekijk vacature »

Front-end Developer - Juniorfunctie

Functie omschrijving Ben jij op zoek naar een uitdagende baan als front-end developer, in een informele werksfeer, waar jij echt het verschil kan maken? Wil jij graag werken voor een bedrijf dat sportiviteit en een open communicatie, hoog in het vaandel heeft staan? Dan hebben wij de perfecte vacature voor je! Voor een klein bedrijf in Rijen dat gespecialiseerd is in het omzetten van digitale woningtekeningen naar managementinformatie, zijn wij per direct op zoek naar een allround front-end developer. Jouw werkzaamheden zien er als volgt uit: Ja gaat nauw samenwerken met de back-end developer. De database structuur is volledig gebouwd

Bekijk vacature »

.NET Developer

Dit ga je doen Binnen het team bouw je aan een applicatie met andere .Net Developers, testers een Product Owner en een Business Analyst. Met het team wordt de backlog besproken. In overleg claim jij jouw deel en zorgt ervoor dat onderhoud en innovatie wordt gerealiseerd. Het project dat momenteel draait is het opgraden van de omgeving. Doorontwikkelen van de huidige applicatie; Overleggen met teamleden om de backlog te verdelen; Onderhouden van de huidige omgeving; Sparren met de business en het ophalen van nieuwe requirements. Hier ga je werken De organisatie is een van de grootste landelijke aanbieder van diverse

Bekijk vacature »

C#.NET ontwikkelaar

Functie omschrijving Voor een softwarebedrijf in de omgeving van Veghel zijn we op zoek naar een C# developer. Word jij blij van ontwikkelen in C# en .NET? Lees dan snel verder! Jouw werkzaamheden zullen er als volgt uit gaan zien: Op basis van de wensen van de klant ga je samen met je collega's ga je op zoek naar de juiste oplossingen en je gaat dit uitwerken tot een mooi eindproduct. Je bouwt webshops, webapplicaties en websites, dit doe je door middel van ASP.NET, MVC Framework en C#. Je zorgt voor de optimalisering van bestaande software en de automatisering van

Bekijk vacature »

.NET developer

Functie Als .NET developer start jij in een development team met één Senior .NET developer en één junior .NET developer. Als team zijn jullie verantwoordelijk voor het schrijven van software voor onze toonaangevende Automatiseringssystemen. Jij gaat aan de slag met de onderhoud van de kernsoftware, ondersteund de software van derden door het gebruik van onze webservices en als team zijn jullie verantwoordelijk voor het ontwikkelen van onze backend oplossingen. Wij maken op dit moment veel gebruik van .NET met ASP.NET. Komend kwartaal gaan wij wel gedeeltelijk overstappen naar .NET Core. Verder werken wij ook met SOAP, REST, JSON, HTML5, CSS3

Bekijk vacature »

.NET developer

Functie The position we have for you As a .NET developer you will work for one of our customers active in the High Tech Industry. Our customers are mainly located in the Eindhoven area. We are very selective when it comes to the projects we accept and therefore only focus on innovative and complex projects. Because our customers are mainly specialized in machine construction, you often work close to the machines. Our team currently consists of Embedded engineers, IOT developers and Cloud engineers. We mainly work on Microsoft projects where WPF, UWP, .NET Core and Microsoft Azure are used. Eisen

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

24/12/2024 18:09:56
 
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.