Tasmota-laitteiden sähkötietojen loggaamista (med MQTT, Node-RED, InfluxDB, Grafana)

Liittynyt
30.10.2016
Viestejä
2 012
Tässä artikkelissa kuvataan, miten Tasmota-firmwarella varustettujen laitteiden lähettämän tiedon voi tallentaa InfluxDB-tietokantaan, niin että historiatietoa pystyy seuraamaan graafisesti.


Itselläni on Nous A8T-pistorasia-adaptereita, joissa on Tasmota-yhteensopiva firmware valmiina. Liitä laite ohjeen mukaan 2,4 GHz wlan-verkkoon, jonka jälkeen sen hallintasivulle pääsee selaimella. Laite saa ip-osoitteen dhcp:llä, niin sen selvittää kaikista helpoimmin oman palomuurin/reitittimen dhcp-listalta katsomalla. Toinen vaihtoehto on käyttää Windowsissa vaikka Angry IP Scanneria tai Advanced IP Scanneria. Linux-puolella voi skannata oman verkon läpi vaikka nmapilla komennolla nmap xx.xx.xx.0/24.

Kun olet löytänyt laitteen verkosta, aseta Configuration valikosta MQTT Message Brokerin (asennus jäljempänä) ip-osoite ja käytettävä portti (oletusportti 1883 on yleensä ok) sekä käyttäjätunnus ja salasana, jos niitä haluaa käyttää. Omassa sisäverkossa voi toki Message Brokeria ajaa ilman kirjautumisvaatimustakin.



Huomioi myös, että laite saattaa vaatia kalibrointia ohjeen mukaan
Kalibroinnin saanee tehtyä riittävällä tarkkuudella esim. vedenkeittimellä, lämpöpuhaltimella tai vaikkapa sähköautolla, jos ei ole minkäänlaista sähkömittaria kotona. Yleismittarin omistava voi myös mitata jännitteen pistorasiasta.

Ainakin näissä laitteissa laite lähettää MQTT-sanoman oletuksena 300 sekunnin välein. Muuta halutessasi laitteen Tools-valikon consolesta aikaa lyhyemmäksi komennolla TelePeriod *aika sekunneissa*. Itse asetin lähetysvälin minuuttiin komennolla TelePeriod 60

Ohje on tehty Debianilla, joten Rasbianilla, Ubuntulla ja muilla Debian-johdannaisilla asennus kaiketi menee samalla tavalla.

Asenna ensin Mosquitto MQTT Message Broker asentamalla paketit mosquitto ja mosquitto-clients.
Varmista tämän jälkeen komennolla sudo systemctl status mosquitto että Message Broker käynnistyi ja käynnistyy jatkossa bootissa. Loaded-rivillä pitää olla enabled ja Active rivillä active (running)

Muokkaa Mosquitton asetustiedostoa /etc/mosquitto/mosquitto.conf lisäämällä siihen "listener 1883" (käytettävä portti) ja "allow_anonymous true" sekä kommentoimalla rivi conf.d-kansion käyttö pois, koska sitä ei nyt tarvita.
Koodi:
# Place your local configuration in /etc/mosquitto/conf.d/
#
# A full description of the configuration file is at
# /usr/share/doc/mosquitto/examples/mosquitto.conf.example

pid_file /run/mosquitto/mosquitto.pid

persistence true
persistence_location /var/lib/mosquitto/

log_dest file /var/log/mosquitto/mosquitto.log

#include_dir /etc/mosquitto/conf.d
listener 1883
allow_anonymous true
Käynnistä tämän jälkeen Message Broker uusiksi komennolla sudo service mosquitto restart

Viestiliikennettä voi shellistä seurata komennolla mosquitto_sub -h localhost -t \# -d
Ylläolevalla komennolla shelliin kirjautuu kaikki viestiliikenne, joka Message Brokerille lähetetään. Seurannan ovi keskeyttää painamalla Ctrl+C

Jos asetit jo Message Broker-koneen ip-osoitteen Tasmota-laitteeseen, shellissä pitäisi nyt juosta esim. seuraavaa:
Koodi:
Client (null) sending PINGREQ
Client (null) received PINGRESP
Client (null) received PUBLISH (d0, q0, r0, m0, 'tele/tasmota_4AE9F4/STATE', ... (336 bytes))
{"Time":"2025-07-18T14:01:28","Uptime":"0T00:01:08","UptimeSec":68,"Heap":141,"SleepMode":"Dynamic","Sleep":50,"LoadAvg":20,"MqttCount":1,"Berry":{"HeapUsed":4,"Objects":46},"POWER":"ON","Wifi":{"AP":2,"SSId":"aurinko","BSSId":"18:D6:C7:61:88:23","Channel":11,"Mode":"HT40","RSSI":74,"Signal":-63,"LinkCount":1,"Downtime":"0T00:00:04"}}
Client (null) received PUBLISH (d0, q0, r0, m0, 'tele/tasmota_4AE9F4/SENSOR', ... (230 bytes))
{"Time":"2025-07-18T14:01:29","ENERGY":{"TotalStartTime":"2025-01-13T19:50:25","Total":2.084,"Yesterday":0.504,"Today":0.312,"Period":0,"Power":23,"ApparentPower":26,"ReactivePower":12,"Factor":0.89,"Voltage":234,"Current":0.109}}
Client (null) sending PINGREQ
Client (null) received PINGRESP
Viestiväli riippuu laitteeseen asetetusta lähetysvälistä.

Asenna tämän jälkeen paketit build-essential, git, ja curl joita voidaan tarvita. Asenna tämän jälkeen Node-RED komennolla
Koodi:
bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)

Are you really sure you want to do this ? [y/N] ? y
Would you like to install the Pi-specific nodes ? [y/N] ? n

Vastaa ensimmäiseen kysymykseen y ja jälkimmäiseen n, mikäli käytät jotakin muuta järjestelmää kuin Raspbian. En tosin tiedä, mitä nuo Pi-specific nodes olisivat.

Komennolla sudo service nodered status voit tarkastaa, onko palvelu käynnissä. Todennäköisesti ei ole, eikä myöskään aktivoituna, joten käynnistä palvelu ja aktivoi se komennoilla sudo systemctl enable nodered ja sudo systemctl start nodered, jolloin palvelu käynnistyy jatkossa bootissa.

Nyt Node-REDin käyttöliittymään pääsee selaimella kiinni palvelimen ip-osoitteella portilla 1880.

Asenna seuraavaksi InfluxDB asentamalla paketit influxdb ja influxdb-client. Käynnistä sen jälkeen InfluxDB-client komennolla influx ja luo Tasmota-laitetta varten tasmota-niminen tietokanta sekä käyttäjä tasmota salasanalla tasmota 2025# seuraavilla komennoilla
create database tasmota
use tasmota
create user tasmota with password 'tasmota2025#' with all privileges
grant all privileges on tasmota to tasmota

Poistu clientista komennolla exit

Asenna tämän jälkeen paketit apt-transport-https, software-properties-common ja wget joita voidaan tarvita Grananan asentamisessa.

Lisää tämän jälkeen Grafana-repositoryn GPG-avain ja itse repository komennoilla:
Koodi:
sudo mkdir -p /etc/apt/keyrings/

wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/grafana.gpg > /dev/null

echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list

Aja sudo apt update ja asenna sen jälkeen paketti grafana. Käynnistä ja aktivoi tämän jälkeen Grafana komennoilla sudo systemctl start grafana-server ja sudo systemctl enable grafana-server. Grafanan käyttöliittymään pääsee tämän jälkeen selaimella portilla 3000. Oletustunnukset ovat admin/admin ja Grafana pyytää vaihtamaan salasanan ensimmäisellä kirjautumisella.

Tämän jälkeen luodaan Node-REDillä flow, joka ottaa vastaan MQTT-sanoman, muokkaa sen InfluxDB:n vaatimaan muotoon ja tallentaa InfluxDB-tietokantaan, josta tiedot voi visualisoida Grafanaan. Mqtt in ja Influxdb out -osien konffiin voi halutessaan katsoa ohjetta linkkilistan Youtubevideosta.

Avaa Node-RED-käyttöliittymä, valitse ensin oikean ylänurkan valikosta Manage Palette, Install ja asenna moduuli node-red-contrib-influxdb.

Vedä tämän jälkeen vasemman reunan nodevalikosta alustalle nodet mqtt in, function ja influxdb out

Konfiguroi ensin mqtt in -node. Tuplaklikkaa nodea, jolloin valikko aukeaa. Paina server-riviltä plus-nappia ja kirjoita avautuvaan valikkoon connection-kohtaan localhost tai ip-osoite, mikäli MQTT Message Broker on asennettu jollekin muulle koneelle. Katso että connect automatically on valittuna. Anna nimeksi esim. Tasmota MQTT in ja paina lopuksi add.

Nyt auki olevassa valikossa aseta ja name-kohtiin sen topicin polku, jolla haluttu laite tietonsa lähettää. Löydät topicin seuraamalla MQTT-viestiliikennettä shellillä aiemmin kerrotun ohjeen mukaan. Tässä tapauksessa topic on tele/tasmota_4AE9F4/SENSOR

Paina lopuksi Done ja sen jälkeen oikeasta yläkulmasta Deploy. Koska function ja influxdb out -nodeja ei ole vielä konfiguroitu, Node-RED huomauttaa niistä. Nyt mqtt in -noden alle pitäisi tulla vihreä neliö ja teksti connected merkiksi että yhteys Message Brokeriin toimii.

Tuplaklikkaa tämän jälkeen function 1 -nodea. On message -kohtaan on syötettävä koodi, jolla Node-RED muuttaa mqtt-viestin InfluxDB:n haluamaan muotoon. Tässä kannattaa tarvittaessa hyödyntää esim. ChatGPT:tä, jotta koodin saa oikein.

MQTT in-node syöttää Function-nodelle viestin, joka tämän ohjeen mukaisella laitteella on:
Koodi:
{"Time":"2025-07-18T14:01:29","ENERGY":{"TotalStartTime":"2025-01-13T19:50:25","Total":2.084,"Yesterday":0.504,"Today":0.312,"Period":0,"Power":23,"ApparentPower":26,"ReactivePower":12,"Factor":0.89,"Voltage":234,"Current":0.109}}

Tämä on muutettava niin, että viestistä poistetaan ulommat aaltosulkeet ja niiden sisällä oleva sisältö. Lopputuloksen on siis oltava:
Koodi:
{
  "Time": "2025-07-17T15:27:10",
  "TotalStartTime": "2025-01-13T19:50:25",
  "Total": 1.568,
  "Yesterday": 0.538,
  "Today": 0.300,
  "Period": 0,
  "Power": 26,
  "ApparentPower": 27,
  "ReactivePower": 8,
  "Factor": 0.95,
  "Voltage": 229,
  "Current": 0.118
}
Tämä tapahtuu syöttämällä function-nodeen seuraava koodi. Tyhjennä koodikenttä ensin kokonaan.

Koodi:
let input = msg.payload;

msg.payload = {
  Time: input.Time,
  TotalStartTime: input.ENERGY.TotalStartTime,
  Total: input.ENERGY.Total,
  Yesterday: input.ENERGY.Yesterday,
  Today: input.ENERGY.Today,
  Period: input.ENERGY.Period,
  Power: input.ENERGY.Power,
  ApparentPower: input.ENERGY.ApparentPower,
  ReactivePower: input.ENERGY.ReactivePower,
  Factor: input.ENERGY.Factor,
  Voltage: input.ENERGY.Voltage,
  Current: input.ENERGY.Current
};

return msg;

Kyseinen koodi siis ottaa muuttujaan "msg.payload tuon mqtt-viestin ja muuttaa sen sitten alla olevasti niin, että ulompien aaltosulkeiden sisältä se ottaa input.Time-komennolla kellonajan talteen ja tallentaa sen kenttään "Time". Muut tiedot se ottaa sisempien "ENERGY"-aaltosulkeiden sisältä komennolla input.ENERGY.*kenttä* ja tallentaa samalla nimellä. Lopputuloksena kaikki arvot ovat yksien aaltosulkeiden sisällä omissa kentissään, kuten InfluxDB vaatii. Paina tämän jälkeen Done ja yhdistä viivalla mqtt in ja function.

Vaihda ikkunan oikesta ylänurkasta näkyviin "debug all", jotta oikean reunan kaistaleeseen tulostuvat debut-tiedot. Listassa näkyy aiempia virheilmoituksia, koska Deploy-nappia on painettu ilman että kaikkia nodeja on konfiguroitu. Vedä tämän jälkeen alustalle debug-node ja yhdistä viivalla function-noden ulostuloon ja paina Deploy. Paina tämän jälkeen debug-noden oikeasta reunasta, jolloin tulee ilmoitus successfully activated tai deactivated, riippuen siitä, oliko debuggaus jo päällä.

Nyt ikkunan oikeaan reunaan pitäisi tulostua siististi mqtt-viestit käsiteltynä ja nuolesta painamalla voit avata ja katsoa, että arvot ovat rivittäin object-taulukon alla.

Laita seuraavaksi asetukset influxdb out -nodeen. Paina plus-napista Add new InfluxDB server ja syötä palvelimen osoite, tietokanta, käyttäjätunnus ja salasana sen mukaisesti, mitä ylempänä luotiin. Paina lopuksi add. Syötä auki olevaan ikkunaan Measurement-kenttään esim. tasmota_measurements, joka on sen tietueen nimi, jolla tiedot tallennetaan tietokantaan. Samaan tietokantaan voi siis tallentaa eri laitteiden tietoja. Paina lopuksi Done.

Tämän jälkeen voit poistaa debug-noden ja yhdistää function noden influxdb out -nodeen ja painaa Deploy. Nyt debug-ikkunaan ei pitäisi tulla enää lisää rivejä. Mikäli InfluxDB-noden asetuksissa olisi jokin pielessä tai function-noden syöttämä tieto ei kelpaisi InfluxDB:lle, debug-ikkunaan tulisi virheilmoituksia.



Avaa nyt shellissä InfluxDB Client ja kirjoita komennot:
use tasmota ja show measurements, jolloin näytölle pitäisi tulla name: tasmota_measurements. Komennolla select * from tasmota_measurements client-tulostaa ko. mittausten sisällön ja tuloksen pitäisi olla seuraavanlainen:

Koodi:
 name: tasmota_measurements
time                ApparentPower Current Factor Period Power ReactivePower Time                Today Total TotalStartTime      Voltage Yesterday
----                ------------- ------- ------ ------ ----- ------------- ----                ----- ----- --------------      ------- ---------
1752853830183978439 26            0.109   0.88   0      22    12            2025-07-18T16:50:30 0.375 2.147 2025-01-13T19:50:25 234     0.504
1752853890179395477 25            0.108   0.9    0      23    11            2025-07-18T16:51:30 0.375 2.147 2025-01-13T19:50:25 233     0.504
1752853950173608297 25            0.108   0.89   0      22    11            2025-07-18T16:52:30 0.375 2.148 2025-01-13T19:50:25 233     0.504
1752854010181336823 25            0.108   0.89   0      22    12            2025-07-18T16:53:30 0.376 2.148 2025-01-13T19:50:25 233     0.504
Tiedot tallentuvat siis oikein. Poistu komennolla exit.

Nyt voit lisätä InfluxDB-tietokannan Grafanaan. Mikäli ajat Grafanaa ja InfluxDB:tä samalla koneella, palvelimen osoite voi olla http://localhost:8086

Täytyä lisäksi tietokannan tiedot, eli Database tasmota, User tasmota ja salasana tasmota2025# ja paina Save % test, jolloin Grafanan pitäisi ilmoittaa "datasource is working. 1 measurements found.

Nyt voit lisätä uuden Dashboardin ja visualisoida mittauksen. Valitse Add visualization ja datasource InfluxDB. Itselläni tässä vaiheessa Grafana jostakin syystä ilmoittaa "InfluxDB returned error: error parsing query: found FROM, expected identifier, string, number, bool at line 1, char 9" ja kun Group By -valinnan poistaa, sen jälkeen tulee ilmoitus invalid measurement. Kun FROM-riviltä select measurementsin alta tasmota virhe poistuu. Tämän jälkeen valitse Select-riviltä field (value) -valikosta haluttu mittausarvo niin paneeliin ilmestyy näkyviin käyrän alku, jossa näkyvät siihen asti tietokantaan tallentuneet tiedot. Lopuksi voit kustomoida paneelin haluamallasi tavalla.



Sivut, joita tämän ohjeen kasaamiseen on käytetty:

ChatGPT:llä pyörittelin pitkään tuota Node-REDissä tehtävää konversiota, ennenkuin ymmärsin, miten se menee.

En ole koodari, niin termit voi olla mitä sattuu. Korjaillaan jos ohjeessa on virheitä. Täytyy ehkä jossain välissä myös mielenkiinnosta harjoitella, miten tämä onnistuu Telegrafilla Node-REDin sijaan.

Katso myös vastaavanlainen opas lämpötilojen loggaamista koskien
 
Viimeksi muokattu:
Muutamia kommentteja:
1) Myös linuxille löytyy Angry IP Scanner, itsekin käytän sitä tietyissä tilanteissa kun on aikalailla kätevämpi kuin nmap monissa jutuissa.

2) Vaikka onkin sisäverkossa niin AINA kannattaa varautua pahimpaan eli käyttää jonkinlaista salasanaa tai muuta autentikointia, tietoturva tehdään kerroksittain. Eli jos joku pääsee jostain suojauksesta läpi niin hakkerille on seuraava kerros esteenä/hidasteena. Missään nimessä ei kannata tuudittautua yhden suojauskerroksen (esim palomuuri) varaan.

3) Miksi kaikki laittavat nuo antureiden pollaamiset hirveän tiukalle? Onko minuutin välein päivittyvästä lämpötilatiedosta tms oikeasti hyötyä? Tuosta syntyy vain turhaa verkkoliikennettä ja turhaan dataa tietokantaan. Toki varmaan jotain käyttötarkoituksia löytyy mutta esimerkiksi tavalliseen huonelämpötilan seurantaa riittää 5min tai jopa 15min näytteenottotaajuus, harvemmin se lämpötila ihan salamana pomppii edestakaisin.

4) PI-specific nodes taitaa olla RaspberryPi:n GPIO-asioihin ja järjestelmäarvoihin liittyviä asioita, muilla alustoilla tuota kysymystä ei taida edes tulla. Ja Homeassistantiinhan tuon Node-Redin saa asennettua suoraan addoneistakin.

5) Influxin (tai minkään muunkaan) salasanaa ei kannata mistään ohjeesta katsoa vaan määritellä itse turvallinen salasana ja sen mukaan muualla lisätä salasana tarvittaessa. Juuri tuollainen "Laita salasanaksi tasmota2025#" altistaa kaikenlaisille tietomurroille kun verkossa onkin helposti arvattavia salasanoja jotka on julkaistu jossain ohjeessa.

En sinänsä mollaa millään tavalla, itseäni vaan aina hirvittää kun on tietoturvattomia ohjeita joita joku mahdollisesti asiasta mitään ymmärtämätön noudattaa ja aiheuttaa mahdollisen tietoturvareiän. Itse työskentelen tietoverkkojen ja tietoturvankin parissa joten oma ajatusmaailma on muodostunut sellaiseksi että heti jos tulee jotain tietoturvatonta (ennaltamääriteltyjä salasanoja tms) vastaan niin rupeaa hirvittämään. Itsellänikin on Zabbix, Grafana, HomeAssistant, Node-Red, MQTT sun muita tässäkin mainittuja asioita ajossa. Nuo ovat varsin laajasti käytössä sekä yrityksillä sekä yksityishenkilöillä ja noihin kohdistuu kohtalaisen paljon kaikenlaisia verkkoskannauksia joten kannattaa tosiaan huolehtia tietoturvasta ja vaihtaa oletustunnarit, jos esimerkiksi oma palomuuri pääsee jostain syystä vuotamaan tavalla tai toisella ettei hakkeri pääse ihan koko verkkoon riehumaan.
 

Statistiikka

Viestiketjuista
282 400
Viestejä
4 851 752
Jäsenet
78 397
Uusin jäsen
BsNyvi

Hinta.fi

Back
Ylös Bottom