Kesän koodausprojekti sai jatkoa ja käyttämättömänä lojunut Raspberry Pi pääsi vihdoin oikeisiin töihin. Nyt Raspi skannaa Ruuvitageja ja minä voin etänä lukea anturien lukemia Telegramin avustuksella. Kuinkas tähän päädyttiin? Siitä seuraavaksi.
Raspberry Pi käyttöönotto
Raspberry Pi (RPi) tarvitsee sisälleen käyttöjärjestelmän ja se asennetaan microSD -kortille. Käytössäni on RPi 3 Model B+. Sen käyttöönotto lyhykäisyydessään seuraavasti:
- muistikortin alustus SD Card Formatter -ohjelmalla
https://www.sdcard.org/downloads/formatter/ - Raspbian käyttöjärjestelmän imagen lataus
https://www.raspberrypi.org/downloads/raspbian/ - Raspbian imagen laitto formatoidulle muistikortille Balena Etcherillä
https://www.balena.io/etcher/ - Muistikortti kiinni RPi:hin ja bootti sekä normaalit käyttöönottorutiinit
- SSH:n aktivointi ja laitteen uudelleennimeäminen
Ruuvitag-sensor – Python -kirjasto
Githubista löytyy Pythonilla tehty kirjasto Ruuvitagien kanssa tehtävään tietoliikenteeseen.
https://github.com/ttu/ruuvitag-sensor
Siellä on myös kirjaston asennusohje RPi:lle.
Sain opetella hiukan Pythonin alkeita, jotta pärjäsin minulle vieraan ohjelmointikielen kanssa. Hidasta, mutta ei ylivoimaista 😉
Ko. kirjaston examples -kansion esimerkeistä löysin itselleni sopivan skriptin, post_to_server.py, jota hieman muokkaamalla sain toteutettua sensorien datan skannauksen ja sen lähettämisen eteenpäin internettiin. Jonkin verran meni aikaa etsiessä RPi:lle sopivaa fyysistä paikkaa, josta se pystyy onnistuneesti skannaamaan eri puolilla asuntoa olevat Ruuvitagit.
#!/usr/bin/env python3
"""
Get data from sensors and post it to specified url in json-format
Requires:
Requests - pip install requests
"""
import requests
from ruuvitag_sensor.ruuvi import RuuviTagSensor
macs = [
'pilkulla',
'erotettu',
'lista',
'sensorien',
'MAC-osoitteita',
'ZZ:XX:YY:11:AA:BB'
]
# This should be enough that we find at least one result for each
timeout_in_sec = 60
url = 'https://munserveri/data/ruuvitag-data-receiver.php'
datas = RuuviTagSensor.get_data_for_sensors(macs, timeout_in_sec)
# Use Requests to POST datas in json-format
requests.post(url,json=datas)
#print (datas)
exit()
Web -sivustolla on simppeli PHP -skripti odottamassa Python -skriptin lähettämää dataa. Se tallentaa pythonin lähettämän JSON -datan tekstitiedostoon palvelimelle.
<?php
file_put_contents('dataa-ruuvitageista.txt', file_get_contents('php://input'));
?>
Testauksen jälkeen Python -skriptin ajastus RPi:hin 10 minuutin välein. Ajastus Cronilla. Apua Cronin asettamiseksi sain täältä https://crontab.guru/
Nyt RPi puskee 10 minuutin välein uusimmat sensorilukemat PHP -skriptille, joka taas tallettaa datan tekstitiedostoon sivustolleni jatkokäsittelyä varten.
Telegram Bot
Koekäytettyäni muutaman päivän RPi:tä ja sen python -skriptiä, toteutin vielä tekstitiedoston datan lukemisen etänä TG botin ja PHP:n avulla. TG Botin tekemisestä kirjoitinkin aikaisemmin. Ohessa pala koodia, jolla toteutin datan ujuttamisen botin vastaukseen. MAC -osoite esimerkkikoodissa on keksitty.
switch($message) {
case "/terassi":
// JSON -tiedoston käsittely
$strJsonFileContents = file_get_contents("dataa-ruuvitageista.txt");
$arrayKaikki= json_decode($strJsonFileContents, true);
#var_dump($array); // print array
if (preg_match("/EE:BB:99:BD:22:A1/", $strJsonFileContents))
{
$msgT = $msgT."Terassi: \r\n".
" Lämpötila: ".$arrayKaikki["EE:BB:99:BD:22:A1"]["temperature"]." °C\r\n".
" Kosteus: ".$arrayKaikki["EE:BB:99:BD:22:A1"]["humidity"]." %\r\n".
" Ilmanpaine: ".$arrayKaikki["EE:BB:99:BD:22:A1"]["pressure"]." hPa\r\n\r\n".
" Aikaleima: ".date("Y-m-d H:i:s.",filemtime("dataa-ruuvitageista.txt"));
} else
{
$msgT = "Terassille ei ole yhteyttä.";
}
#echo $terassimsg;
sendMessage($chatId, $msgT);
break;
case "/olohuone":
ja niin edelleen
Ja tältä se näyttää puhelimen TG:ssä

Hyvin toimii, nyt jo muutaman viikon data rullannut itsekseen ja botilla voin etänä tarkistaa tilanteen.
Jatkokehittelyä
Botti on nyt julkinen, joten kuka vaan voi lukea sensorilukemia omalla TG:llään, jos tietää bottini nimen. Tämä täytyy jatkossa suojata, tulen jossain vaiheessa siirtämään botin toimimaan vain TG -ryhmässä, jotta voin valvoa pääsyn sensorien dataan.
Samalla aioin toteuttaa hälytykset eli esim. jos kitarakotelossa tulee liian kuivaa, botti lähettää siitä minulle erikseen viestin.
Sain ajatuksen rakentaa oma Telegram Bot PHP:lla, ihan vain oppimismielessä, kesän verryttelykoodauksena ? . Se olikin kohtuullisen helppoa, sillä osaan jotenkin PHP:n alkeet ja internet on pullollaan esimerkkejä. Olen käyttänyt Telegram Messengeriä tähän asti pääasiassa yhteydenpitoon Ingress -peliyhteisön jäsenten kanssa. Telegramin käytön yhteydessä olen oppinut käyttämään toisten tekemiä botteja, ne ovat näppäriä ja hauskojakin apureita. Nyt opettelin tekemään oman Telegram botin.(Mikä on bot eli botti?)
Mikä on Telegram?
Telegram Messenger eli lyhyesti TG, on Whatsappin kaltainen pikaviestinsovellus, mutta ilman Facebookin seuranta- / vakoilukytkentöjä ? Sitä käytetään joko maksuttomilla mobiilisovelluksilla ( Android, iOS, WP), tietokonesovelluksilla (Windows, Mac, Linux) tai selaimella webissä (Chrome -sovellus), sovellukset löytyvät täältä: https://telegram.org/apps . Sovellusta käyttöönotettaessa luodaan oma käyttäjätunnus.
Telegram Botin luominen
Seuraavaksi botin tekemisen vaiheet. Omien TG -tunnuksien myötä siirrytään ko. palveluun jollain TG -sovelluksella ja etsitään palvelusta käyttäjää @BotFather (se on bot itsekin). Annetaan @BotFather’ille viestikentässä komento /help se listaa kaikki komennot, joita voi käyttää oman botin luomisessa ja interaktiossa @BotFather’in kanssa.
Oman botin luomisen aloitus komennolla /newbot ja seurataan @BotFather’in ohjeita.
Oma bot luodaan ”keskustelussa” @BotFather’in kanssa
Telegram botin luomisen vaiheet on opastettu englanniksi selkeästi TG:n sivuilla https://core.telegram.org/bots#6-botfather . Botin luomisen yhteydessä saadaan botille oma token, pieni tunnuskoodi, jota tarvitaan botin ohjelmoinnissa myöhemmin, se siis talteen!
Omat komennot botille
Omalle botille voi määrittää @BotFather’in avulla komentoja, joihin sitten omassa PHP:ssa reagoidaan. Tässä tarvitaan apuna siis web -sivustoa, jossa PHP -koodi, tuo itse tehty botin toimintalogiikka asustaa. Sivustolla tulee olla SSL -suojaus, muuten kaikki Telegran APIn toiminnallisuudet eivät ole käytössä. Ohjelmointirajapintaan voi tutustua täällä https://core.telegram.org/bots/api
Botin tottelemat komennot määritetään @BotFather’ille keskustellen samaan tapaan kuin itse botin luominenkin. Aloitus komennolla /setcommands , jonka jälkeen määritetään omat komennot. Määrittämisen jälkeen ne näkyvät oman botin kanssa keskustellessa kirjoittamalla kauttaviiva [ / ] viestikenttään tai painamalla kauttaviivapainiketta.
Kauttaviiva viestikenttään tai kauttaviivapainike
Vielä nuo omalle botille itse tehdyt komennot eivät varsinaisesti tee mitään, sitä varten tarvitaan sitä PHP -koodia, jossa tehtyjen komentojen toiminnallisuus määritetään. Löysin Youtubesta hyvän tutoriaalin, jonka pohjalta itse valmistin oman bottini keskustelukoodin, kaikki kunnia siis Patrick Lemken v. 2015 tekemille videoille, jotka löytyvät Youtubesta täältä.
PHP -koodin on siis oltava palvelimella avoimessa internetissä, esim.:
https://munserveri.fi/kansio/munbottikoodini.php
Tässä minun palvelimellani asuva esimerkkibotin PHP -koodini:
<?php
$botToken = "SAAMASI_BOT_TOKEN_TULEE_TÄHÄN";
# tänne laitetaan siis botin luomisessa saatu token
$tgApi = "https://api.telegram.org/bot".$botToken;
# tässä osoite TG APIin ja sen perään konkatenoitu token
$update = file_get_contents('php://input');
# napataan TG:stä lähetetty viestidata, se tulee palvelusta JSON -formaatissa
# tallennetaan palautuva data muuttujaan
$updateArray = json_decode($update, TRUE);
# muunnetaan APIlta saatu JSON -muotoinen data Arrayksi
# https://api.telegram.org/botSAAMASI_BOT_TOKEN_TULEE_TÄHÄN/getupdates
# palautuvan datan rakennetta voi tutkia yo. komennon avulla selaimessa
$chatId = $updateArray["message"]["chat"]["id"];
# tallennetaan id, jotta botti osaa vastata oikealle viestin lähettäjälle
$message = $updateArray["message"]["text"];
# napataan arraysta haluttu tieto eli komento, jonka botin käyttäjä lähetti TG:llä
# alla komentoihin vastaaminen, komennot määritetään siis TG:ssä @BotFather'in kanssa
switch($message) {
case "/elamantarkoitus":
sendMessage($chatId, "Olisiko se 42?");
break;
case "/moi":
sendMessage($chatId, "Moido!");
break;
default:
# kaikki muut tilanteet paitsi nuo caset
sendMessage($chatId, "Hei, olen botti ja tottelen vain / kauttaviivalla alkavia komentoja!");
}
function sendMessage ($chatId, $message) {
$url = $GLOBALS['tgApi']."/sendmessage?chat_id=".$chatId."&text=".urlencode($message);
file_get_contents($url);
# tämä on viestin lähettämisen funktio
}
# webhook pitää laittaa päälle osoittamaan tämän PHP:n sijaintiin palvelimella
?>
Jotta botti ”toimisi” eli jatkuvasti kuuntelisi sille mahdollisesti syötettyjä komentoja, on vielä asetettava ns. Webhook. Webhookin avulla Telegram -palvelu osaa välittää käytetyt komennot itse tehtyyn PHP -koodiin palvelimella. Webhookin asettaminen tapahtuu selaimen avulla kirjoitettamalla alla oleva komento selaimen osoitekenttään ja siirtymällä osoitteeseen, muistetaan tietty laittaa se oma token ja oman PHP:n sijainti tuohon ao. ritirampsuun.
https://api.telegram.org/botSAAMASI_BOT_TOKEN_TULEE_TÄHÄN/setwebhook?url=https://munserveri.fi/kansio/munbottikoodini.php
Palvelun asettamisesta saa selainikkunassa hyväksynnän, botti on toiminnassa.
{"ok":true,"result":true,"description":"Webhook was set"}
Bottia vaan testaamaan seuraavaksi.
Oma Telegram Bot
Jatkokehittelyä
Mitä botin voi laittaa tekemään / vastaamaan tehtyihin komentoihin? Periaatteessa vaikka mitä, kannattaa tutustua aiemmin mainittuun TG:n ohjelmointirajapintaan.
Itselläni on ajatuksena etälukea kotona olevia Ruuvitag -antureita, olenkin kirjoittanut siitä eri tarinan: Ruuvitag, Raspberry Pi ja Telegram Bot
Botin rakentelussa voi käyttää myös valmiita kirjastoja kuten esimerkiksi Githubista löytyvä PHP Telegram Bot, https://github.com/php-telegram-bot. Ehkä tutustun tuohonkin jossain vaiheessa.
Hommasin kesällä aluksi kolme Ruuvitag -sensoria, sillä olen aina haaveillut omasta sääasemasta sekä ollut kiinnostunut antureista. Ruuvitag on kotimainen avoimen lähdekoodin sensorilaite, johon on saatavana maksuton mobiilisovellus (Android ja iOS). Sovelluksella voi lukea bluetoothin avulla sensorien jatkuvasti lähettämää dataa, kuten lämpötilaa, ilmankosteutta, ilmanpainetta sekä liikettä. Ruuvitag toimii käyttöönotettaessa sellaisenaan yksinkertaisena sääasemana.
Ruuvitag sensoriRuuvitag on tikkuaskia pienempi
Ruuvitagit tulivat tilauksen jälkeen nopeasti postin avustuksella. https://ruuvi.com/
Kännykkäsovellus Ruuvi Station sitten seuraavaksi lataukseen https://play.google.com/store/apps/details?id=com.ruuvi.station&hl=fi
Sovellus löytää ”kuuloetäisyydellä” olevat anturit ja ne lisätään sovellukseen. Anturit voi nimetä haluamallaan nimellä. Androidin Ruuvi Station -sovellus on merkittävästi monipuolisempi kuin iOS -versio (kuvakaappaukset Androidista).
Ruuvi Station datan historianäyttöRuuvi Station voi skannata antureita taustallaRuuvi Station voi hälyttää kun anturien lukemissa tapahtuu jotain merkittävääSaat asetettua taustakuvanMonta anturia samalla näytöllä
Kännykkäsovellus toimii vain lähietäisyydellä, mutta yllättävän hyvin sovellus pystyy lukemaan eri anturien dataa, vaikka ne ovat betoniseinien takanakin. Avoimessa maastossa signaali kantaa satoja metrejä, hyvissä olosuhteissa jopa yli kilometrin, ei siis mikään ihan pilipali bluetooth. Katso video kuuluvuustestistä. Sensorin pariston luvataan kestävän pitkään, jopa toista vuotta.
Jos haluaa kauempaa, oikeasti etänä lukea antureiden lukemia, täytyy hieman koodailla. Alkuun pääsee helposti kännykän avulla, sillä jokainen anturi on mahdollista asettaa puskemaan dataa suoraan nettiin käyttämällä asetuksista löytyvää Gateway -asetusta sekä ajastusta. Puhelin puskee gateway -osoitteeseen anturin datan JSON -muodossa. Se täytyy sitten itse osata Webissä ottaa talteen ja manipuloida haluamallaan tavalla.
Kaiken kaikkiaan anturit toimivat moitteetta, ostinkin kolme lisää, yksi sujahti kitarakoteloon tarkkailemaan kosteutta. Jouduinkin hankkimaan kitaralle kosteuttimen, jotta optimisäilytysolosuhteet olisivat säilytyksessä kunnossa.
Tein kokeeksi Telegram Botin, jonka avulla pystyn etänä lukemaan gatewayn välittämää anturien dataa. Siinä ongelmana on vain se, että pitää olla yksi ”ylimääräinen” kännykkä kokona koko ajan skannaamassa antureita. Alkukokeilujen jälkeen korvasinkin sitten kännykän myöhemmin Raspberry Pi -korttitietokoneella, siitä kirjoitinkin myöhemmin: Ruuvitag, Raspberry Pi ja Telegram Bot.