• 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

Object Storage Arubacloud
0 głosów
136 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,430 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 163 wizyt
0 głosów
1 odpowiedź 462 wizyt
pytanie zadane 23 grudnia 2016 w HTML i CSS przez Wojciech Zgodziński Nowicjusz (160 p.)
0 głosów
3 odpowiedzi 322 wizyt
pytanie zadane 17 października 2016 w HTML i CSS przez Sebastian Westfal Obywatel (1,020 p.)

92,583 zapytań

141,434 odpowiedzi

319,668 komentarzy

61,966 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...