Leuven-Template & Scripts

Installatie => PHP => Topic gestart door: heersje op 29 juli 2019, 14:15:15

Titel: Data weergeven uit een MySQL database
Bericht door: heersje op 29 juli 2019, 14:15:15
Hallo omdat ik het liefst niet afhankelijk ben van providers als WU sla ik mijn weerdata op in een MySQL database om de 10 minuten. Ik heb nu mijn eerste 2 scriptjes gemaakt om data toe te voegen aan het Ajax dashboard te weten het aantal regendagen dit jaar en het aantal dagen sinds de laatste regen. Dit zijn parameters die mijn Meteobridge niet automatisch genereert. Ik deel hieronder de code voor de ge├»nteresseerden, het veld DateTime is een timestamp en R de cumulatieve neerslag van die dag.  Je kunt het resultaat zien op https://weer.heerschap.net/

onder _my_texts heb ik 2 bestanden

db_lastrain.php

<?php
// version 0.1 
// calculate days since last rain
// weer.heerschap.net

$nu strtotime("now");
$conn mysqli_connect("server(meestal localhost)""gebruikersnaam""wachtwoord""database_naam");

if (!
$conn) {
    die(
"Connection failed: " mysqli_connect_error());
}

$sql "SELECT max(`DateTime`) as lastrain FROM `tabelnaam` WHERE `R` > 0";
$result mysqli_query($conn$sql);
$seconden 86400;

if (
mysqli_num_rows($result) > 0) {
    
// output data of each row
    
while($row mysqli_fetch_assoc($result)) {
        
$lr =  ($nu strtotime($row["lastrain"]));
        echo 
round($lr $seconden,0) ." " langtransstr("Day(s)");
          
    }
} else {
    echo 
"0 results";
}

mysqli_close($conn);
?>


en db_raindays.php

<?php
// version 0.1 
// calculate number of raindays since last rain
// weer.heerschap.net

$jaar date(Y);
$conn mysqli_connect("server(meestal localhost)""gebruikersnaam""wachtwoord""database_naam");

if (!
$conn) {
    die(
"Connection failed: " mysqli_connect_error());
}

$sql "SELECT count(DISTINCT(DATE_FORMAT(DateTime, \"%d%m\"))) as raindays FROM `tabelnaam` WHERE `R` > 0 and YEAR(DateTime)=$jaar";
$result mysqli_query($conn$sql);


if (
mysqli_num_rows($result) > 0) {
    
// output data of each row
    
while($row mysqli_fetch_assoc($result)) {
        
$rd =  $row["raindays"];
        echo 
$rd ." " langtransstr("Day(s)");
          
    }
} else {
    echo 
"0 results";
}

mysqli_close($conn);
?>


en vervolgens heb ik in ws_AjaxDashboard_v3.php de volgende regels toegevoegd in het neerslag blokje (rond regel 190)

<p><span class="lTxt"><?php echo langtransstr("Last rain").":";?></span><span class="rTxt"><span class="ajax" id="ajaxlastrain"><?php include "./_my_scripts/db_lastrain.php" ?></span></span></p>
<hr />
<p><span class="lTxt"><?php echo langtransstr("rain days this year").":";?></span><span class="rTxt"><span class="ajax" id="ajaxraindays"><?php include "./_my_scripts/db_raindays.php" ?></span></span></p>
<hr />

nog even de vertalingen aanpassen en het werkt.

Dit allemaal op eigen risico en zonder support  8)

groet Jean-Paul
Titel: Re: Data weergeven uit een MySQL database
Bericht door: WSParkstad op 01 augustus 2019, 23:40:06
Hallo Jean Paul,

Leuk gemaakt en leuke uitbreiding echter hoe maak je dan een MySQL database aan, dat is voor mij iets nieuws en een uitdaging.
Gebruik zelf ook een Metobridge maar niet de pro versie.

Leuke uirbreiding.

Gegroet,

Marcel.
Titel: Re: Data weergeven uit een MySQL database
Bericht door: heersje op 05 augustus 2019, 19:17:30
Hallo Marcel ik heb je eenPM gestuurd. K weet niet hoe je een mysql database aanmaakt, dat moet je met je provider bekijken. Meestal biedt deprovider een utility aan die phpmyadmin heet en je toegang geeft tot mysql en waar je databases en tabellen kunt aanmaken.

Groet
Titel: Re: Data weergeven uit een MySQL database
Bericht door: WSParkstad op 06 augustus 2019, 08:54:24
Hallo Marcel ik heb je eenPM gestuurd. K weet niet hoe je een mysql database aanmaakt, dat moet je met je provider bekijken. Meestal biedt deprovider een utility aan die phpmyadmin heet en je toegang geeft tot mysql en waar je databases en tabellen kunt aanmaken.

Groet


Ok Heesje, toch bedankt voor de info en ja eigen VPS dus geen provider die mij kan helpen hahahaha.
Had daar inderdaad al een file aangemaakt echter nog niet het resultaat ;-)
We blijven zoeken ;-)

Maar in Meteobridge moet men toch ook iets instellen bij Service, heb daar dus ook aangemaakt maar wat heb jij dan bij Query staan?

Groetjes en bedankt.

Marcel.
Titel: Re: Data weergeven uit een MySQL database
Bericht door: heersje op 06 augustus 2019, 10:38:16
Hallo Marcel,

Ik begrijp je belangstelling want het is niet leuk om afhankelijk te zijn van een wispelturige partij als wunderground. Data=king dus om zelf je gegevens te beheren in een eigen database vind ik zelf de enige oplossing. Om te beginnen ik ben geen specialist of software ontwikkelaar maar een hobbymatige knutselaar. Ik denk  dat bij jou het probleem is dat je de database en tabel nog niet gedefinieerd hebt, dan kan MB er ook niet naar schrijven. Met een VPS zul je waarschijnlijk eerst zelf MySQL moeten opzetten (je ISP zal daar vast uitleg over hebben)

Als dat gelukt is heb je een database nodig met daarin een tabel met de velden voor de verschillende gegevens

In Meteobridge kun je dan een query  hebben als
INSERT INTO `mijn_weer_tabel` (`DateTime`, `Temp`, etc... ) VALUES ( '[YYYY]-[MM]-[DD] [hh]:[mm]:[ss]', '[th0temp-act]', '[etc]') uiteraard moet je dan ook je server, database, wachtwoord, gebruikersnaam en MySQL poort op de server (meestal 3306) instellen (ook hier kan je ISP je weer adviseren, bijvoorbeeld of je kan schrijven naar een database vanaf een andere computer (je meteobridge). In het tabblad Livedata van je MB zie je eventuele foutmeldingen.

Een alternatief is om middels PHP scripts te maken die data in de database zetten (weather34 template doet zo iets maar delete data aan einde van de dag). In Meteobridge gebruik je dan niet de mySQL verbinding maar roep je periodiek dit script bestand aan.

Als je niet zo goed thuis bent in MySQL dan raad ik aan om meteotemplate.com (http://meteotemplate.com) te gebruiken. In deze template is MySQL ingebouwd omdat op basis van database queries gegevens worden weergegeven. Meteotemplate kun je in MB kiezen bij een van de weer netwerken dus je hoeft verder niet handmatig queries in te voeren. Neemt niet weg dat je dan nog steeds eerst een werkende database moet hebben.

Hoop dat je hier iets mee kunt, veel meer heb ik er niet over te melden ;-)

groet Jean-Paul



Titel: Re: Data weergeven uit een MySQL database
Bericht door: heersje op 09 mei 2020, 21:25:45
Ik heb wat functionaliteit aan het dashboard toegevoegd zie https://weer.heerschap.net/ (https://weer.heerschap.net/). Dit omdat ik geen Wunderground gegevens meer opsla en in dus bijvoorbeeld als minimum temperatuur vorig jaar -999 C krijg. Ik haal de temperatuur (min en max) van vorig jaar vandaag en normaal (dwz het gemiddelde max/min van alle dagen vandaag die ik opgeslagen heb) nu ook op uit mijn mysql database. Ik deel het hier voor de liefhebber. Enige kennis van PHP en MySQL is vereist, anders don't try this at home

Ik heb daarvoor de code in het ajaxdashboardv3 als volgt aangepast

# volgende blok in comments is originele code daaronder aanpassing tot aan eerste #

/*
if (isset ($ws['last_year_low']) && isset ($ws['last_year_high'])){
echo '
<tr>    <td class="dashTempsDesc">'.langtransstr('Last year').':</td>
<td class="dashTempsHigh">'.wsNumber($ws['last_year_high'],$decTemp).$uomTemp;
if (isset($ws['last_year_highT']) ) {echo '&nbsp;<small>('.string_date($ws['last_year_highT'],$SITE['timeOnlyFormat']).')</small>';}
echo '</td>
<td class="dashTempsLow">'.wsNumber($ws['last_year_low'],$decTemp).$uomTemp;
if (isset($ws['last_year_lowT']) ) {echo '&nbsp;<small>('.string_date($ws['last_year_lowT'],$SITE['timeOnlyFormat']).')</small>';}
echo '</td>
</tr>';
} // eo lastyear
*/
#

# nieuwe code uit mysql database- vandaag vorig jaar

echo '
<tr><td class="dashTempsDesc">'.langtransstr('Last year').':</td>
<td class="dashTempsHigh">'; include('./_my_scripts/db_lastyearmax.php');echo $uomTemp;
echo '&nbsp;<small></small>';
echo '</td>
<td class="dashTempsLow">'; include('./_my_scripts/db_lastyearmin.php'); echo $uomTemp;
echo '&nbsp;<small></small>';
echo '</td>
</tr>';


# nieuwe code uit mysql database -average

echo '
<tr><td class="dashTempsDesc">'.langtransstr('Normals/today').':</td>
<td class="dashTempsHigh">'; include('./_my_scripts/db_avgdaymax.php');echo $uomTemp;
echo '&nbsp;<small></small>';
echo '</td>
<td class="dashTempsLow">'; include('./_my_scripts/db_avgdaymin.php'); echo $uomTemp;
echo '&nbsp;<small></small>';
echo '</td>
</tr>';

// eo lastyear

 #

En dan vervolgens 4 scriptjes in _my_scripts als eerste de Max temperatuur vorig jaar vandaag:

<?php
// version 0.1 
// calculate max temp today last year
// weer.heerschap.net

$vorigjaar date(Y)-1;
$maand =  date(m);
$dag date(d);

$conn mysqli_connect("localhost""gebruiker""wachtwoord""database");


if (!
$conn) {
    die(
"Connection failed: " mysqli_connect_error());
}

$sql "SELECT Max(Tmax) as MT FROM alldata WHERE YEAR(DateTime)=$vorigjaar and MONTH(DateTime)=$maand and DAY(DateTime)=$dag";
$result mysqli_query($conn$sql);


if (
mysqli_num_rows($result) > 0) {
    
// output data of each row
    
while($row mysqli_fetch_assoc($result)) {
        echo 
$row["MT"];
          
    }
} else {
    echo 
"no data";
}



mysqli_close($conn);
?>

Met enige aanpassingen is dit identiek aan de Min temperatuur vorig jaar.

Dan de normaal waarde, hier het gemiddelde van de minimale temperatuur van alle gemeten min temperatuur op de dag en maand van vandaag. Ook deze is weer met enige aanpassing om te zetten in de Max T

<?php
// version 0.1 
// calculate avg min temp today all years
// weer.heerschap.net

$maand =  date(m);
$dag date(d);

$conn mysqli_connect("localhost""gebruiker""wachtwoord""database");


if (!
$conn) {
    die(
"Connection failed: " mysqli_connect_error());
}

$sql "SELECT ROUND(AVG(MiT),1) as AvmT from (select MIN(A.Tmin)as MiT, YEAR(A.DateTime) as jaar FROM alldata as A WHERE MONTH(DateTime)=$maand and DAY(DateTime)=$dag group by jaar) as B";
$result mysqli_query($conn$sql);


if (
mysqli_num_rows($result) > 0) {
    
// output data of each row
    
while($row mysqli_fetch_assoc($result)) {
        echo 
$row["AvmT"];
          
    }
} else {
    echo 
"no data...";
}



mysqli_close($conn);
?>
Titel: Re: Data weergeven uit een MySQL database
Bericht door: heersje op 11 mei 2020, 11:40:15
Ik heb ook nog een query gemaakt die de gemiddelde regenval van voorgaande jaren en het huidige jaar tot vandaag (dus voor ieder jaar van 1 januari tot bijvoorbeeld 11 mei). weergeeft. Ik heb die hier gepost : https://www.wxforum.net/index.php?topic=39423.0 (https://www.wxforum.net/index.php?topic=39423.0)