• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

ApexCharts setInterval updateOptions jak połączyć z php, aby dynamicznie odświeżał dane z bazy

VPS Starter Arubacloud
0 głosów
207 wizyt
pytanie zadane 27 sierpnia 2023 w PHP przez gatka84 Bywalec (2,150 p.)

Witajcie, natrafiłam na problem i nie potrafię, tego przeskoczyć mianowicie dostaje do bazy dane z czujnika temp, prądu itp. i chciałam, żeby dane były dynamicznie wyświetlane w ApexCharts i po wielu poszukiwaniach i próbach utknęłam jak przekazać pobrane dane do apex, mam obecnie tak:

var widgetChart1 = function() {
                        var options = {
                            series: [{
                                name: "",
                                data: []
                            }],
                            chart: {
                                id: 'realtime',
                                height: 400,
                                type: 'line',
                                animations: {
                                    enabled: true,
                                    easing: 'linear',
                                    dynamicAnimation: {
                                        speed: 1000
                                    }
                                },
                                toolbar: {
                                    show: false,
                                },
                                zoom: {
                                    enabled: false
                                },
                                toolbar: {
                                    show: false
                                },
                                // sparkline: {
                                //     enabled: true
                                // }
                            },
                            dataLabels: {
                                enabled: false
                            },
                            stroke: {
                                show: true,
                                width: 4,
                                curve: 'smooth',
                                colors: ['#43DC80'],
                            },
                            colors: ['#43DC80'],
                            title: {
                                text: undefined,
                                align: 'left'
                            },
                            grid: {
                                strokeDashArray: 5,
                                row: {
                                    colors: ['#f3f3f3', 'transparent'], // takes an array which will be repeated on columns
                                    opacity: 0
                                },


                            },
                            yaxis: {
                                show: true,
                            },
                            xaxis: {

                                categories: [],
                                axisBorder: {
                                    show: false
                                },
                                axisTicks: {
                                    show: false
                                },

                                labels: {

                                    show: false
                                },
                                tooltip: {
                                    enabled: false
                                }

                            },
                            tooltip: {
                                style: {
                                    fontSize: '16px',
                                },
                                y: {
                                    formatter: function(val) {
                                        return val + " Kwh"
                                    }
                                }
                            }

                        };

                        var chart = new ApexCharts(document.querySelector("#widgetChart1"), options);
                        chart.render();

                        setInterval(() => {
                            chart.updateOptions({
                                xaxis: {
                                    categories: <?php echo json_encode($data); ?>,
                                },
                                series: [{
                                    data: <?php echo json_encode($Wh); ?>,
                                }],
                            });                            
                        }, 2000)
                    }

i teraz tak jak na sztywno sobie sprawdzam chart.updateOptions wszystko działa tj aktualizuje teraz jedynie nie potrafię sobie poradzić, jak pobrać dane z bazy co np. 2 sek i przekazać je do zmiennych, mam tak

$sql = "SELECT `napiecie`, `ampery`, `temp`, `Wh`, `data` FROM `dom_czasowy` GROUP BY data ORDER BY data LIMIT 40;";
$result = mysqli_query($con, $sql);
$napiecie=[];
$ampery=[];
$temp=[];
$Wh=[];
$data=[];
while ($row = mysqli_fetch_array($result)) {
    $napiecie[] = $row['napiecie'];
    $ampery[] = $row['ampery'];
    $temp[] = $row['temp'];
    $Wh[] = $row['Wh'];
    $data[] = $row['data'];
}
echo print_r($Wh);

i ładnie mi wszystko wyciąga jak sprawdziłam np: echo print_r($Wh);

A żeby pobierał w interwale czasowym to zrobiłam tak

 $(document).ready(function() {
            setInterval(function() {
                $("#testowy").load("testowy.php");
refresh();
            }, 1000);
        });

w pliku testowy.php mam

<?php

include('db.php');

$sql = "SELECT `napiecie`, `ampery`, `temp`, `Wh`, `data` FROM `dom_czasowy` GROUP BY data ORDER BY data LIMIT 40;";
$result = mysqli_query($con, $sql);
$napiecie=[];
$ampery=[];
$temp=[];
$Wh=[];
$data=[];
while ($row = mysqli_fetch_array($result)) {
    $napiecie[] = $row['napiecie'];
    $ampery[] = $row['ampery'];
    $temp[] = $row['temp'];
    $Wh[] = $row['Wh'];
    $data[] = $row['data'];
}

?>

i teraz nie wiem czemu pomimo tego, że co 1 sek są odbierane dane nie, są przekazywane do <?php echo json_encode($Wh); ?>  oraz <?php echo json_encode($data); ?> w chart.updateOptions

 

<body>
<div id="testowy"></div>

<div id="widgetChart1" class="timeline-chart"></div>
</body>

Jak to powinnam zrobić??

Jak zawsze będę wdzięczna za podpowiedzi i sugestie.

1 odpowiedź

+1 głos
odpowiedź 28 sierpnia 2023 przez neo1020 Dyskutant (8,690 p.)
wybrane 28 sierpnia 2023 przez gatka84
 
Najlepsza

co robi funkcja refresh()  ?  po co ładujesz dane do div?

problem chyba polega na tym że co 2 sekundy próbujesz aktualizować wykres danymi których nie ma, a co 1 sek. wywołujesz load do div z danymi.

Użyj AJAX to lepsze podejście IMO niż load

 

 Może spróbuj tak że w testowy.php zakoduj dane do JSON: 

echo json_encode(array(
    'data' => $data,
    'Wh' => $Wh
));

zamiast load użyj ajax

$(document).ready(function() {
    setInterval(function() {
        $.ajax({
            url: "testowy.php",
            method: "GET",
            dataType: "json",
            success: function(response) {
                chart.updateOptions({
                    xaxis: {
                        categories: response.data,
                    },
                    series: [{
                        data: response.Wh,
                    }],
                });
            }
        });
    }, 2000);
});

 

komentarz 28 sierpnia 2023 przez gatka84 Bywalec (2,150 p.)
Dzięki wielkie za podpowiedz tego szukałam :)

Podobne pytania

0 głosów
2 odpowiedzi 176 wizyt
0 głosów
1 odpowiedź 541 wizyt
pytanie zadane 23 grudnia 2016 w HTML i CSS przez Wojciech Zgodziński Nowicjusz (160 p.)
0 głosów
3 odpowiedzi 345 wizyt
pytanie zadane 17 października 2016 w HTML i CSS przez Sebastian Westfal Obywatel (1,020 p.)

92,970 zapytań

141,934 odpowiedzi

321,168 komentarzy

62,299 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...