Wirtualny licznik - różnica lub suma

User avatar
Lector
Posts: 1613
Joined: Fri Nov 17, 2017 2:26 pm
Location: Poznań

Post

Chciałem się podzielić w jaki sposób można zrobić różnice wskazań licznika wody i podlicznika ogrodowego w celu obliczenia ścieków. Można również zrobić sumę kilku liczników w celu obliczania łącznego zużycia energii elektrycznej.

Do pobierania aktualnych stanów z liczników rzeczywistych, będziemy potrzebować "Osobisty token dostępowy".
Wygenerować możemy go po zalogowaniu do cloud: konto -> bezpieczeństwo -> Osobiste tokeny dostępowe -> Generuj token.
Tu wybieramy tylko Kanał -> odczyt. Nadajemy nazwę i generujemy, zapisujemy token.

W kolejnym krokiem jest przygotowanie maliny (u mnie Rapberry Pi Zero W), nie będę opisywać jak przygotować kartę z systemem.

Aktualizujemy pikiety systemu:

Code: Select all

sudo apt update
sudo apt upgrade -y
Instalujemy git i przydatne mc:

Code: Select all

sudo apt install git mc -y
Instalujemy dodatkowe rzeczy:

Code: Select all

sudo apt install git libssl-dev build-essential libyaml-cpp-dev cmake -y
Instalujemy curl:

Code: Select all

sudo apt install curl
Instalujemy JQ

Code: Select all

sudo apt install jq -y
Klonujemy Supla Device z GitHuba:

Code: Select all

git clone https://github.com/SUPLA/supla-device.git
Kompilujemy:

Code: Select all

export SUPLA_DEVICE_PATH=~/supla-device
cd supla-device/extras/examples/linux
mkdir build
cd build
cmake ..
make
Po wszystkim zobaczymy:

Code: Select all

[100%] Linking CXX executable supla-device-linux
[100%] Built target supla-device-linux
Sprawdzamy wersję:

Code: Select all

./supla-device-linux -v
U mnie to aktualnie:

Code: Select all

./supla-device-linux version: 23.11.02
Wracamy do głównego folderu:

Code: Select all

cd ~
Należy przy wklejaniu zamieniać na swoje dane:
NASZ_SERWER -> numer naszego serwera
NASZ_EMAIL -> adres email do cloud
NASZ_TOKEN -> wygenerowany wcześniej token
ID_1 -> ID kanału głównego licznika wody - pierwszy licznik
ID_2 -> ID kanału licznika wody ogrodowe - drugi licznik
LOGIN_PI -> login jakim logujemy się Raspberry

Tworzymy nowy folder:

Code: Select all

mkdir Meter
Wchodzimy do nowego folderu:

Code: Select all

cd Meter
Tworzymy skrypt:

Code: Select all

nano meter.sh
Zawartość pliku do wklejenia dla różnicy:

Code: Select all

#!/bin/bash

id1=$(curl -X 'GET' \
  'https://NASZ_SERWER.supla.org/api/v3/channels/]ID_1]?include=state' \
  -H 'accept: application/json' \
  -H 'Authorization: Bearer NASZ_TOKEN' \
)
id1_meter=$(echo "$id1" | jq -r '.state .counter')

id2=$(curl -X 'GET' \
  'https://NASZ_SERWER.supla.org/api/v3/channels/ID_2?include=state' \
  -H 'accept: application/json' \
  -H 'Authorization: Bearer NASZ_TOKEN' \
)
id2_meter=$(echo "$id2" | jq -r '.state .counter')

let result=(id1_meter-id2_meter)

echo "$result" > /home/LOGIN_PI/Meter/meter.txt
Zawartość pliku do wklejenia dla sumy:

Code: Select all

#!/bin/bash

id1=$(curl -X 'GET' \
  'https://NASZ_SERWER.supla.org/api/v3/channels/ID_1?include=state' \
  -H 'accept: application/json' \
  -H 'Authorization: Bearer NASZ_TOKEN' \
)
id1_meter=$(echo "$id1" | jq -r '.state .counter')

id2=$(curl -X 'GET' \
  'https://NASZ_SERWER.supla.org/api/v3/channels/]ID_2?include=state' \
  -H 'accept: application/json' \
  -H 'Authorization: Bearer NASZ_TOKEN' \
)
id2_meter=$(echo "$id2" | jq -r '.state .counter')

let result=(id1_meter+id2_meter)

echo "$result" > /home/LOGIN_PI/Meter/meter.txt
Jak chcemy sumowac więcej liczników to powielamy:

Code: Select all

id1=$(curl -X 'GET' \
  'https://NASZ_SERWER.supla.org/api/v3/channels/ID_1?include=state' \
  -H 'accept: application/json' \
  -H 'Authorization: Bearer NASZ_TOKEN' \
)
id1_meter=$(echo "$id1" | jq -r '.state .counter')
zamieniając id1 na kolejny numer, oraz dodając wpis do sumy:

Code: Select all

let result=(id1_meter+id2_meter+id3_meter)
Ustawiamy prawa dostępu do skryptu:

Code: Select all

chmod +x meter.sh
Dodajemy wpis do CRONa:

Code: Select all

crontab -e
Wklejamy:

Code: Select all

* * * * * /home/LOGIN_PI/Meter/meter.sh
LOGIN_PI -> login jakim logujemy się Raspberry

Dodajemy kanał wirtualnego licznika:

Code: Select all

sudo nano /etc/supla-device.yaml
Wklejamy zawartość:

Code: Select all

name: Raspberry Pi Zero W
log_level: debug
state_files_path: "/home/LOGIN_PI"
security_level: 2

supla:
  server:  NASZ_SERWER.supla.org
  mail:  NASZ_EMAIL

channels:
  - type: ImpulseCounterParsed
    name: i1
    source:
      type: File
      file: "/home/LOGIN_PI/Meter/meter.txt"
    parser:
      type: Simple
      refresh_time_ms: 1000
    counter: 0
Włączamy rejestracje na cloud.

Przygotowujemy serwis dla Supla Device:

Code: Select all

sudo nano /etc/systemd/system/supla-device.service
Wklejamy:

Code: Select all

[Unit]
Description=Supla Device
After=network-online.target

[Service]
User=LOGIN_PI
ExecStart=/home/LOGIN_PI/supla-device/extras/examples/linux/build/supla-device-linux -s

[Install]
WantedBy=multi-user.target
Włączamy i uruchamiamy:

Code: Select all

sudo systemctl enable supla-device.service
sudo systemctl start supla-device.service
W cloud powinien pojawić się nam nowy licznik, który musimy sobie ustawić - typ licznika, ilość impulsów (1000), jednostkę i cenę.

Mam nadzieje ze komuś się przyda ten opis :)

Należy pamiętać o podmianie danych gdzie wklejamy zawartość plików.

Może da się to inaczej zrobić, ale u mnie to działa :p
Niespełniony automatyk. :mrgreen:
https://www.youtube.com/@3D_Lamp.Photos

Return to “FAQ / Jak to zrobić”