Netatmo Wetter Daten (MySQL) in eine Charts js oder PHP umwandeln

grillmeister87

Grünschnabel
Hallo zusammen, bin hier ein weilchen Angemeldet und dies ist mein erster Post. Habe schon einige Jahre Programmiert, sowie ein eigenes CMS rausgebracht -> ch-cms damals (http://cms.bilanovic.com/index.php?action=main)

Mein Problem ist es jetzt, dass ich ca. 4 Jahre nichts mehr gemacht habe und fast alles verpennt habe. :( ... Aber ich probiere mich rein zu schleichen ins neue PHP 7.0 und höher.

Mein neues Projekt ist eine Internetseite für die Bevölkerung zu erstellen. Einige Freunde haben eine Wetterstation von netatmo. Ich selbst speichere die Daten separat in meine Datenabnk. Da ich nicht weis wie ich direkt beim Hersteller auf die Daten Zugreifen kann wie bsp. diese Seite (http://plus.meteoware.com/netatmo/)

Bildschirmfoto 2018-08-12 um 22.06.26.png

Jetzt würde ich gerne eine Eigene Charts Seite erstellen mit dem Wetter.

Heute - Gestern - Aktuelle Woche - letzte Woche - Aktuelles Jahr - letztes Jahr ... Ich hoffe Ihr versteht mich bis jetzt.

Aktuelle Daten (http://wetter.bilanovic.com/netatmo/) die ich von meinem Gerät ablese. Aber dies würde ich wie schon oben gesagt, eine Charts erstellen wollen.
Ein Freund von mir aus Berlin hat schon mal angefangen dies zu erstellen, aber meldet sich seit einiger Zeit nicht mehr, was auch verständlich ist (Familie).
(http://wetter.bilanovic.com/charts/example1_marko.php)

Bevor Ihr jetzt kommt, ich solle google nutzen, dann lasst es gleich lieber. Denn ich hab jetzt bestimmt 1 Monat nach Lösung und Hilfe gesucht, leider nichts gefunden was mich anspricht.

so sieht jetzt die Infrastruktur aus

Bildschirmfoto 2018-08-12 um 22.05.05.png

PHP:
<?php

$link = null;
require_once('../netatmo/sqldata/connect.php');

/*
 * Array (
    [id] => 1                       - Internal Id
    [name_aus] => Balkon            - Description
    [temp_aus] => 6.3               - Actual temperature
    [time_aus] => 1493449616        - Timestamp when checked
    [temp_min_aus] => 2.7           - min temperature of the day
    [date_min_aus] => 1493440593    - Timestamp when it was recognized
    [temp_max_aus] => 6.6           - max temperature of the day
    [date_max_aus] => 1493448437    - Timestamp when it was recognized
    [luft_aus] => 73                - Humidity
    [message_aus] => 1493449674     -
    [batterie_aus] => 5818          - Battery ...
    [batterie_p_aus] => 92          - Battery in percentage
    [rf_aus] => 71                  - Unknown Status
    [firmware_aus] => 44            - Firmware
    [seen_aus] => 1493449667        -
)
 */


/**
 * Array
(
    [id] => 1
    [name_aus] => Balkon
    [temp_aus] => 6.3
    [time_aus] => 1493449616
    [temp_min_aus] => 2.7
    [date_min_aus] => 1493440593
    [temp_max_aus] => 6.6
    [date_max_aus] => 1493448437
    [luft_aus] => 73
    [message_aus] => 1493449674
    [batterie_aus] => 5818
    [batterie_p_aus] => 92
    [rf_aus] => 71
    [firmware_aus] => 44
    [seen_aus] => 1493449667
)
 *
 * @param $sBegin
 * @param $sEnd
 * @return array|null
 */
function fetchDateBetweenTimestamps($sBegin, $sEnd) {
    global $link;
    $aResult = array();
    $oResult = mysqli_query($link,'SELECT * FROM ntm_modul_1 WHERE time_aus BETWEEN '.$sBegin.' AND '.$sEnd.'');

    while ($aRow = mysqli_fetch_assoc($oResult)) {
        $aResult[] = $aRow;
    }

    return $aResult;
}

function flatTimeTo10Minutes($sTimeStamp) {
    $oDate = new DateTime();
    $oDate->setTimestamp($sTimeStamp);

    $sSecond = $oDate->format("s");
    if ($sSecond > 0) {
        $oDate->add(new DateInterval("PT".(60 - $sSecond)."S"));
    }

    $sMinute = $oDate->format("i");
    $sMinute = $sMinute % 60;

    if ($sMinute != 0) {
        // Count difference
        $sDiff = 60 - $sMinute;
        // Add difference
        $oDate->add(new DateInterval("PT".$sDiff."M"));
    }

    return $oDate->getTimestamp();
}

function fillEmptyEntriesDailyChart($aDates, $sStart, $sEnd) {
    $aMergeDates = array();
    foreach ($aDates as $aData) {
        $aMergeDates[flatTimeTo10Minutes($aData['time'])] = $aData['temp'];
    }

    // starting date
    $aBaseDates[] = $sStart;

    while ($sStart <= $sEnd) {
        $sStart = strtotime("+10 minutes", $sStart);
        $aBaseDates[] = $sStart;
    }

    $aReturn = array();
    foreach ($aBaseDates as $sTimeStamp) {
        $sTime = $sTimeStamp*1000;
        if (array_key_exists($sTimeStamp, $aMergeDates)) {
            $aReturn[] = array($sTime, $aMergeDates[$sTimeStamp]);
        } else {
            $aReturn[] = array($sTime, null);
        }
    }

    return $aReturn;
}

/**
 * @param null|string $sDate - in format Y-m-d
 * @return string
 */
function prepareDataForHighChart($sDate = null, $sFunction = null) {
    $aResult = array();
    if (empty($sDate)) {
        $sDate = date('Y-m-d');
    }

    $oDate = new DateTime($sDate);
    $oDate->setTime(0,0,0);
    $sStart = $oDate->getTimestamp();

    $oDate->modify('+1 day');
    $sEnd = $oDate->getTimestamp();

    $aDatabase = fetchDateBetweenTimestamps($sStart, $sEnd);

    foreach ($aDatabase as $aData) {
        $aResult[] = array(
            'time' => (int)$aData['time_aus'],
            'temp' => (float)$aData['temp_aus']
        );
    }

    if (!empty($sFunction) && function_exists($sFunction)) {
        $aResult = call_user_func($sFunction, $aResult, $sStart, $sEnd);
    }

    return json_encode($aResult);
}
?>

<div id="container"></div>

<script type="text/javascript">
    Highcharts.setOptions({
        global: {
            timezone: 'Europe/Berlin',
            timezoneOffset: -2 * 60
        }
    });
    Highcharts.chart('container', {

        title: {
            text: 'Temperatur Aussen'
        },

//        subtitle: {
//            text: 'Source: thesolarfoundation.com'
//        },

        xAxis: {
            type: 'datetime',
            //tickInterval: 600 * 1000,
            //min: Date.UTC(2017, 8, 3),
            //max: Date.UTC(2013, 8, 4),
        },

        yAxis: {
            title: {
                text: 'Temperatur'
            }
        },

        legend: {
            layout: 'vertical',
            align: 'right',
            verticalAlign: 'middle'
        },

        plotOptions: {
            series: {
                pointStart: 0
            }
        },

        series: [
            {
                name: 'Heute',
                data: <?php echo prepareDataForHighChart(null, 'fillEmptyEntriesDailyChart'); ?>
            },
            {
                name: 'Gestern',
                data: <?php echo prepareDataForHighChart(null, 'fillEmptyEntriesDailyChart'); ?>
            }
            
            
            
        ]

    });
</script>

Ich hoffe, es kann mir jemand weiterhelfen oder mit mir in Kontakt treten via skype. Bin leider am verzweifeln.

liebe grüsse aus der Schweiz
 
Interessantes Projekt. Was dein Freund da aufgebaut hat, ist doch schon ganz viel versprechend. Was fehlt denn jetzt noch? Möchtest Du umschalten zwischen Tag, Woche, Jahr oder alles gleichzeitig anzeigen?
 
genau, würde gerne umschalten können zwischen den Zeitpunkten etc.

Ich mag es so machen mit so einer Statistik

- Temparatur
- Temparatur Aussen
- Regenmenge
http://wetter.bilanovic.com/charts/examples/synchronized-charts/index.htm

<Aktuell> <Gestern><Aktuelle Woche><Letzte Woche><Aktueller Monat><Letzter Monat><Aktuelles Jahr><Letztes Jahr>

Hatte eine Demo irgend wo rumliegen und die versuchte ich abzuändern, aber finde die nicht mehr auf meinem Server. Wenn ichs finde, zeig ichs mal hier.

EDIT:

http://spin.webkom.co/graphs/highstock-dynamically-updated-data.html

In der Richtung möchte ich es Anzeigen lassen, wo jeder oberhalb der Statistik die Buttons anklicken kann, was er ansehen möchte.
 
Zuletzt bearbeitet:
Ich vermute, bei den synchronized charts handelt es sich um eine Demo von Highcharts?
Die drei Charts müssten sich relativ leicht auf Temp., Temp. außen und Regenmenge umstellen lassen.
Für die Umschaltung könntest Du z. B. Radiobuttons verwenden. Eine grundlegende Entscheidung ist, ob Du zum Umschalten die ganze Seite neu laden willst. Wenn nicht, müsstest Du die Daten jeweils mit Ajax laden.

Eine Sache ist mir noch unklar: Du schreibst, dass Du die Daten von deiner eigenen Wetterstation lädst. Aber auch, dass Du Freunde hast, ebenfalls mit Wetterstation. Möchtest Du deren Daten ebenfalls auf deiner Seite darstellen?
 
Die Seite heisst rheintal.click, auf deren Seite möchte ich die Aktuellen Veranstaltungen, News, Wetter etc Publizieren.

4 Freunde haben die Wetterstation in der Region. Werde dann von jedem die Daten auf meinen Server abspeichern in die MySQL Datenbank, so dass jeder Besucher das Wetter ansehen kann auf der Seite wie es war und wie es Aktuell ist.

Mit Ajax habe ich noch nie was gemacht :eek:. Wäre schon gut mit Ajax die Daten Preis geben ohne die Seite neu Laden zu müssen.

Ich könnte schon die Daten auslesen, aber wüsste nicht wie ich mit mysqli Arbeiten muss, ob es gleich ist wie mysql. Von der Aktuellen Zeit die letzten 12h Ergebnisse Anzeigen zu lassen oder 24h etc, wie ich die einzelne Daten abrufen soll. Ich hoffe du verstehst mich. Rein Logisch wäre es mir schon wie, aber im Praktischem wiederum nicht mehr :(
 
Ich könnte schon die Daten auslesen, aber wüsste nicht wie ich mit mysqli Arbeiten muss
Da hatte ich vor ein paar Tagen mal solch einen Crashkurs gefunden:
https://www.php-einfach.de/mysql-tutorial/crashkurs-mysqli/
Aber wenn Du früher schon programmiert hast, weißt Du ja sicher selbst, wie man solche Informationen findet.
Wie bekommst Du denn die Daten von deinen Freunden auf deinen eigenen Server? Das muss ja relativ zeitnah und live erfolgen?
 
Indem ich über deren API Zugang die Aktuellen Daten mit Cronjob abrufe und dies dann bei mir abspeichern :).

Bildschirmfoto 2018-08-13 um 21.06.36.png

Von meinem Server Anbieter habe ich unendliche Cronjobs zur verfügung. Habe den Busines Server bei Hostpoint.ch :)

Ja hatte das CMS aufgebaut, grössere Pause eingelegt etc, und danach nach paar Jahren hat sich so viel verändert in den PHP Versionen. Deswegen hat es mich angegurkt das CMS Up 2 Date zu halten mit Aktueller PHP Version, da es viel Arbeit ist/war.
 
Das ist natürlich optimal, wenn sie eine API haben, um die Daten zu lesen. Wie funktioniert denn das? Ist solch eine Wetterstation direkt am Netz, ähnlich wie eine IP-Kamera?
 
Genau, sie hängt am Netz per WLAN, mit der eigene Haus App Netatmo, kannst du deine Aktuellen Wetter Daten abrufen und die aus der Vergangenheit.
 
OK, ich möchte meine Frage wiederholen: In welcher Form brauchst Du nun Unterstützung? Wenn Du Programmiererfahrung von früher hast, kannst Du dir ja sicher Neues wie mysqli oder pdo erarbeiten. Hast Du punktuell Probleme, dass es an einer bestimmten Stelle hakt oder mehr global, dass Du nicht weißt, wie Du ein Problem generell angehst?
 
Zurück