monitorowanie napięcia ładowania - wykres

katowicecentrum
Posty: 152
https://www.homebook.pl/profil/1295630/meble-kuchenne-warszawa/
Rejestracja: 06 lutego 2022, 21:45
Lokalizacja: Katowice
Kontakt:

monitorowanie napięcia ładowania - wykres

Post autor: katowicecentrum »

co chcemy osiągnąć
Celem opisanych tu czynności jest stworzenie skryptów i serwerów, których współdziałanie ma na celu rysować nam wykresy stopnia naładowania naszych stacji. Takie wykresy możemy sobie oglądać w sieci lokalnej lub (jeśli mamy zewnętrzny/publiczny oraz statyczny adres IP) to możemy również dać zewnętrzny dostęp do naszych wykresów. Wykres możesz obejrzeć pod adresem "http://195.93.250.233/" ale nie obiecuję, że będzie on jeszcze tam dostępny.

Obrazek
Obrazek

co potrzebujemy
- Jeden z naszych urządzeń z modułem radiowym LoRa musi być podłączony do naszego serwera przewodem USB.
- System operacyjny linux
- Maszynę na której wykonamy wszystkie operacje. Maszyna nie musi być mocna, wystarczy np. zwykłe Raspberry PI ZERO.

Podłączamy do naszej maszyny LoRę, czyli np. naszą płytkę LILYGO z modułem radiowym LoRa. Wszystko mamy oczywiście zaprogramowane projektem meshtastic i ustawione tak jak ma być. Nasza LoRa widzi pozostałe urządzenia w sieci.

Gdzieś na naszej maszynie tworzymy skrypt bash dajmy na to o nazwie skrypt.sh np.:
skrypt.sh

Kod: Zaznacz cały

#!/bin/bash
meshtastic --nodes > /home/[b]user[/b]/nodes
zakładam, że wykonanie programu "meshtastic --nodes" daje prawidłowe wyniki i jest pobierana lista urządzeń z naszej LoRy, jeśli tak nie jest to wykonujemy listę poleceń celem instalacji kilku narzędzi:

Kod: Zaznacz cały

sudo apt-get update
sudo apt-get upgrade

sudo apt install python3-pip
pip3 install --upgrade pytap2
sudo usermod -a -G dialout user
sudo pip install esptool
sudo apt-get install esptool
sudo apt -y install python3-pip
sudo apt install python2
pip3 install --upgrade "meshtastic>=1.2.0"

sudo reboot
Ale wracając do naszego jakże skomplikowanego skryptu skrypt.sh. Pobiera on listę urządzeń z LoRy i wysyła tą listę do pliku "/home/user/nodes". Po utworzeniu tego skryptu zwróć uwagę abyś był właścicielem pliku Ty, a nie root, czyli wykonaj:

Kod: Zaznacz cały

chown [b]user.user[/b] skrypt.sh
oraz nadaj prawo wykonywalności dla Twojego skryptu:

Kod: Zaznacz cały

chmod a+x skrypt.sh
Teraz przechodzimy do edycji pliku crontab:

Kod: Zaznacz cały

sudo nano /etc/crontab
w którym na końcu dopisujemy:

Kod: Zaznacz cały

0 */1 * * * [b]user [/b]/home/[b]user[/b]/skrypt.sh
Czyli co godzinę będziemy wykonywać nasz skrypt. Oczywiście zamiast user wpisujemy swoją nazwę użytkownika, to chyba jasne?

Kolejne czynności będą wymagały od nas instalacji serwera WWW apache + PHP. Gdy dokonasz instalacji, możemy przejść dalej. Przejdź z powrotem do edycji naszego skryptu skrypt.sh i dopisz do niego takie oto polecenia:

Kod: Zaznacz cały

sleep 15
czas=$(date '+%d.%m %H:%M')
a=`grep da9e4154 /home/user/nodes | tr -s "│" "+" | tr -d " " | cut -d + -f 15 | cut -d % -f 1`
b=`grep 6d003784 /home/user/nodes | tr -s "│" "+" | tr -d " " | cut -d + -f 15 | cut -d % -f 1`
c=`grep da9e5348 /home/user/nodes | tr -s "│" "+" | tr -d " " | cut -d + -f 15 | cut -d % -f 1`
d=`grep da9e34e4 /home/user/nodes | tr -s "│" "+" | tr -d " " | cut -d + -f 15 | cut -d % -f 1`

echo ",['$czas','$a','$b','$c','$d']" >> /var/www/html/dane.csv

echo $a
echo $b
echo $c
echo $d
Powyżej wykonujemy czynności związane z wyciąganiem 4 danych z pliku /home/user/nodes. Wyszukiwania "grep" dokonuje poprzez identyfikatory urządzeń LoRa da9e4154, 6d003784 , da9e5348 oraz da9e34e4 . Później musze dokonać pewnego manewru poprzez polecenie "tr -s". Operacja polega na zamianie znaku "|" na znak "+". Następnie poprzez "tr -d" kasuje białe znaki. Operacja "cut -d" powoduje, że wyświetlam tylko dane pomiędzy znakami "+", ale musimy określić dokładnie za którym znakiem "+". W tym przypadku mamy wpisaną liczbę 15, ale możliwe, że będzie potrzeba pobawić się tą liczbą. W moim przypadku pomiędzy tymi znakami "+" jest informacja o stanie naładowania akumulatora, ale możliwe, że u Ciebie będzie to na pozycji 14stej lub 16stej. Może to zależeć od okoliczności, których nigdy nie poznam ale tak już jest i tyle :) Ostatni zabieg "cut -d %" to skasowanie znaku procenta, gdyż nam rozchodzi się o wyciągnięcie samej liczby. Gdy w pliku dane.csv będą dodatkowe znaki prócz liczb to wykres się nie zbuduje.

Wyciągnięte przez nas dane wysyłamy do pliku "/var/www/html/dane.csv". Możemy uruchomić X razy nasz skrypt skrypt.sh aby przekonać się, czy dane w ogóle są wyciągane. W skrypcie mamy podgląd wyciągniętych danych "echo $a" więc od razu zobaczymy, czy coś udało się wyciągnąć.

Zobaczmy jak powinien wyglądać nasz cały skrypt:

Kod: Zaznacz cały

#!/bin/bash
meshtastic --nodes > /home/[b]user[/b]/nodes
sleep 15
czas=$(date '+%d.%m %H:%M')
a=`grep da9e4154 /home/user/nodes | tr -s "│" "+" | tr -d " " | cut -d + -f 15 | cut -d % -f 1`
b=`grep 6d003784 /home/user/nodes | tr -s "│" "+" | tr -d " " | cut -d + -f 15 | cut -d % -f 1`
c=`grep da9e5348 /home/user/nodes | tr -s "│" "+" | tr -d " " | cut -d + -f 15 | cut -d % -f 1`
d=`grep da9e34e4 /home/user/nodes | tr -s "│" "+" | tr -d " " | cut -d + -f 15 | cut -d % -f 1`

echo ",['$czas','$a','$b','$c','$d']" >> /var/www/html/dane.csv

echo $a
echo $b
echo $c
echo $d
Nie trudno się domyślić, że to właśnie z tego pliku dane.csv jest rysowany wykres. Dane w tym wykresie wyglądają np. tak:
,['04.02 00:05','85','48','93','94']
Teraz w lokalizacji /var/www/html/ tworzymy plik:

Kod: Zaznacz cały

sudo nano index.php
do którego wklejamy takie treści:

Kod: Zaznacz cały

  <html>
  <head><!DOCTYPE HTML>
<html lang="pl-PL">
<head>
   <meta charset="UTF-8">
    <script type="text/javascript" src="loader.js"></script>
    <script type="text/javascript">
      google.charts.load('current', {'packages':['corechart']});
      google.charts.setOnLoadCallback(drawChart);

      function drawChart() {
var data = google.visualization.arrayToDataTable([
  ['data', 'KCE_centrum', 'KCE_Wełnowiec', 'KCE_Piotrowice', 'SIE_Bytków'],

  ['data i godzina',0,0,0,0]
<?PHP include('dane.csv'); ?>

]);

        var options = {
          title: 'stacje niezależne / procent naładowania [ Katowice / Siemianowice ]',
          curveType: 'function',
          legend: { position: 'bottom' }
        };

        var chart = new google.visualization.AreaChart(document.getElementById('curve_chart'));

        chart.draw(data, options);
      }
    </script>
  </head>
  <body>

    <div id="curve_chart" style="width: 100%; height: 95%"></div>

</body>
</html>

Mamy tutaj podpisane 4 lokalizacje, jako:
['data', 'KCE_centrum', 'KCE_Wełnowiec', 'KCE_Piotrowice', 'SIE_Bytków'],
Według powyższego wycinka z pliku "dane.csv" stacja KCE_centrum ma 85% naładowania, stacja KCE_Wełnowiec ma 48% naładowania itd. według kolejności, ale nic nie stoi na przeszkodzie aby zmniejszyć / zwiększyć ilość wyświetlanych danych. Np. dla 8śmiu stacji powyższą linijkę:

Kod: Zaznacz cały

  ['data', 'KCE_centrum', 'KCE_Wełnowiec', 'KCE_Piotrowice', 'SIE_Bytków'],
trzeba by zmodyfikować w ten sposób:

Kod: Zaznacz cały

  ['data', 'stacja_1', 'stacja_2', 'stacja_3', 'stacja_4', 'stacja_5', 'stacja_6', 'stacja_7', 'stacja_8'],
poniżej jeszcze mamy linijkę:

Kod: Zaznacz cały

  ['data i godzina',0,0,0,0]
którą również przerabiamy analogicznie:

Kod: Zaznacz cały

  ['data i godzina',0,0,0,0,0,0,0,0]
Oczywiście wcześniejszy skrypt skrypt.sh też musimy odpowiednio zmodyfikować, aby dane w pliku dane.csv zostały tak samo zmienione ale to jest raczej oczywiste?

W powyższym skrypcie w pliku index.php jest skrypt JS o nazwie "loader.js". Należy go pobrać stąd:
https://lora.waw.pl/wspolne/loader.js
i umieścić w tej samej lokalizacji, czyli "/var/www/html".
StaCh47
MODERATOR
Posty: 352
Rejestracja: 11 września 2024, 10:03
Kontakt:

Re: monitorowanie napięcia ładowania - wykres

Post autor: StaCh47 »

Mozna pominac ten dosc skomplikowany proces korzystajac z aplikacji Meshtastic. Majac na ekranie jakas stacje naciskamy na jej nazwe w kolorowym okienku i wciskamy "wiecej". Uzyskujemy dostep do wielu ciekawych informacji miedzy innymi do zmian stanu baterii, telemetrii itd.
Myslenie nie boli. :) Zaslyszane: Suma inteligencji na planecie jest stala a populacja rosnie :D
ODPOWIEDZ