Raspberry Pi

Sähkönkulutuksen ohjaus

Viime talvena (2022-2023) peloteltiin kuluttajia sähkön loppumisella ja korkeilla hinnoilla. Sähkön loppuminen ei sitten kuitenkaan toteutunut, mutta hinnat kylläkin kävivät ajoittain aika korkealla. Jotkut sähköyhtiöt jopa "pakottivat" silloin asiakkaitaan siirtymään pörssisähköön. Viime aikoina jotkut kuluttajat ovat havainneet, ihan omatoimisesti, pörssisähkön "ei niin huonoksi" vaihtoehdoksi. Tämä on tietenkin loogista: tottahan sähköyhtiöt hinnoittelevat kiinteähintaiset sopimukset heidän kannaltaan varman päälle kannattaviksi. Eli pörssisähkö tulee todennäköisesti halvemmaksi vaihtoehdoksi. Ainakin, jos on mahdollisuus minkään tason kulutuksen ajalliseen ohjaukseen.

On siis olemassa selkeä tarve sähkön kulutuksen ajalliseen ohjaukseen (pörssi)sähkön hinnan perusteella. Siinä taustaa ja perustelu tälle projektille.

Dokumentaatio

Toiminnallinen kuvaus

Tekninen määrittely

Ohjelmakoodin dokumentaatio (Doxygen)

Ohjelmakoodit (Github)


Sivun alkuun

Esineiden Internet (IoT)

Yritetään seurata hieman kehitystä vaikka (tälläkin kertaa) tukevasti jälkijunassa. Kaverit elvistelevät jo "äpin" kautta ohjattavilla valaisimilla ja meillä on vielä ihan perinteiset kytkimet. Miten vanhanaikaista!

Ei lähdetä kuitenkaan mukaan valokatkaisijakilpavarusteluun, mutta miten olisi Raspberry Pi? Niitä on edelleen muutamia "miljoonalaatikossa" odottamassa käyttöä ja ne kaipaavat varmaankin keskustelukumppania. Käynnistetään siis projekti: "Raspberry Pi matkalla esineiden Internetiin".

IoT-alusta

IoT-alustan vaatimuksia:

  • Alustalla siirretään mittaus-, valvonta- ja ohjaustietoa.
  • Viestit ovat tyypillisesti suhteellisen pieniä.
  • Laitteet eivät välttämättä ole jatkuvasti yhteydessä verkkoon.
  • Valokuvia ja videota ei siirretä.
Sopiva tiedonsiirtoprotokolla tämäntyyppiseen käyttöön on MQTT.

MQTT-välityspalvelimen (broker) voi asentaa paikallisestikin esim. Raspberry Pi:lle. IoT:n idea kuitenkin lienee, että viestit olisivat käytettävissä suunnilleen paikkariippumattomasti. Tarvitaan siis "pilvessä" toimiva välityspalvelin.

Valintana on AWS IoT Core, josta tiedot ovat helposti otettavissa jatkokäyttöön. Tärkeimpänä valintaperusteena on, että AWS:n kanssa on jo valmis asiakassuhde. Esim. tämä sivusto on AWS:n palvelimella.

AWS Free Tier

Seuraavana kaupallisia tiedotteita. Amazon Web Services (AWS) tarjoaa uusille Asiakkaille 12kk kokeilujakson: AWS Free Tier. Kokeilujaksoon kuuluu useista AWS:n tuotteista perustason paketti, joka yleensä on hyvinkin riittävä kotikäyttöön. Esim. AWS IoT Core:n kokeilujaksoon kuuluu: "500,000 Messages (published or delivered) per month 2,250,000 Minutes of connection per month". Luulisi riittävän pienimuotoiseen kokeiluun.

Eikä se kokeilujakson jälkeenkään aivan sikahintainen ole, esim. Tukholma: $0.096 (per million minutes of connection), $1.20 (per million messages). (Hinnat 11/2023, alv0)

IoT-laite, Raspberry Pi

Otetaan, ainakin alkuvaiheessa, IoT-laitteeksi Raspberry Pi, joka (toivottavasti) on suhteellisen helppo alusta.

Ominaisuuksia:

  • Verkkoliityntä,
  • riittävästi resursseja ja
  • sulautettu Linux.

IoT-laitteen käyttöjärjestelmä on siis Linux, jonka perusosaaminen olisi käyttöönotossa suotavaa. Laitteen hallinta on ssh-yhteydellä, joten käyttäjällä ei saa olla minkäänasteista komentoriviallergiaa.

Dokumentaatio

Tekninen määrittely

Demo-sovellus

Kun eo. teknisen määrittelyn mukainen MQTT-viestinvälitys on kunnossa, niin kokeillaan seuraavaksi "oikeiden" viestien lähetystä demo-sovelluksella.

Shellyplug tilatiedot

Verkossa on valmiina sähkönkulutuksen ohjauksessa käytetty ShellyPlugS, hyödynnetään sitä. Luetaan ShellyPlugS:n tilatiedot ja lähetään ne "pilvessä" olevalle MQTT-viestinvälittäjälle. Sieltä ne ovat sitten tilattavissa luettavaksi ja/tai jatkokäyttöön.

Toiminta:

  • Luetaan tilatiedot ShellyPlugS:n REST API:sta tiedostoon.
  • Muutetaan tiedoston oikeudet välitysohjelmalle sopivaksi.
  • Kopioidaan tiedosto välitysohjelman julkaisutiedostoksi, joka on asetettu lähtemään automaattisesti tiedoston muuttuessa.

Kirjoitetaan em. toiminnot bash-ohjelmaksi.

#!/bin/bash
# Luetaan ShellyPlugS:n tilatieto
wget --timeout=5 --tries=1 [IP-osoite]/status -O status.txt -o /dev/null
# Muutetaan tiedoston oikeudet
chmod 600 status.txt
# Kopioidaan tiedosto lähetettäväksi
cp status.txt /home/[user]/IoT_DeviceClient/mailbox/publish-file.txt

Tallennetaan tiedosto (kotihakemistoon) nimellä sendStatus.sh ja annetaan sille suoritusoikeus.

chmod +x sendStatus.sh

ShellyPlugS:n tilatietojen julkaisu voidaan ajastaa crontab:illa tapahtuvaksi esim. kerran tunnissa. Otetaan crontab muokattavaksi:

crontab -e
ja lisätään sinne rivi.
10 * * * * /home/[user]/sendStatus.sh

Lämpötilan loggaus

"Miljoonalaatikosta" löytyi one-wire-lämpötila-antureita DS18B20 ja sille on linuxissa valmis kernel-moduuli. Tehdään niillä lämpötilan loggaus "pilveen".

One-wire-väylän käyttöönottamiseksi pitää tiedoston /boot/config.txt loppuun lisätä rivi:

dtoverlay=w1-gpio

Muutoksen jälkeen Raspberry Pi pitää vielä uudelleenkäynnistää, että tehty muutos tulee käyttöön:

sudo shutdown -r now

Tehdään Python-ohjelma, joka:

  • lukee lämpötila-anturi(e)n tiedot,
  • tallentaa ne json-tiedostoon ja
  • kopioi tiedoston lähetettäväksi "pilveen".

Python ohjelma temp_ds18b20.py:

# Luetaan lämpötilat Raspberry Pi:n one-wire-väylään kytketyistä DS18B20-antureista.

import os, json
import glob
import time
import re

# /boot/config.txt loppuun pitää lisätä:
#   dtoverlay=w1-gpio
# Oletuksena one-wire-väylä on pinnissä GPIO4 (pin 7).

# Ladataan one-wire-väylän moduulit.
os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')

# Haetaan one-wire-väylässä olevat anturit. 
base_dir = '/sys/bus/w1/devices/'
device_folders = glob.glob(base_dir + '28*')

# Luetaan lämpötila-anturin tiedot.
def read_temp_raw(dev):
    f = open(dev, 'r')
    lines = f.readlines()
    f.close()
    return lines

# Haetaan lämpötila / astC.
def read_temp(dev):
    lines = read_temp_raw(dev)
    while lines[0].strip()[-3:] != 'YES':
        time.sleep(0.2)
        lines = read_temp_raw(dev)
    equals_pos = lines[1].find('t=')
    if equals_pos != -1:
        temp_string = lines[1][equals_pos+2:]
        temp_c = float(temp_string) / 1000.0
        return temp_c

# Pääohjelma
meas = {} # Mittaustulokset
for device in device_folders:
    dev = device + '/w1_slave' # Tiedoston nimi
    name = re.findall("28-.*", device)[0] # Anturin nimi
    temp = read_temp(dev) # Lämpötila / astC
    meas[name] = str(temp)

outp = \
    {
        "Loc": "Tampere", \
        "Time": time.asctime(), \
        "Temps": meas \
    }

with open("outp.json", "w", encoding="utf-8") as f:
    f.write(json.dumps(outp, indent=4))

os.system('chmod 600 outp.json')
os.system('cp outp.json ~/IoT_DeviceClient/mailbox/publish-file.txt')

Eo. python-ohjelman voi ajastaa crontab:illa ajettavaksi esim. 15min välein. Lisätään crontab:iin rivi:

*/15 * * * * cd [workdir] && python temp_ds18b20.py

MQTT-välittäjälle lähetettävä viesti, esim:

{
    "Loc": "Tampere",
    "Time": "Mon Dec 11 12:21:00 2023",
    "Temps": {
        "28-000003601030": "20.375",
        "28-0000035fdc08": "20.125"
    }
}

AWS:n IoT Core:ssa voi sitten määrittää ohjeen (rule), joka tallentaa MQTT-viestit esim. AWS DynamoDB-tietokantaan.


Sivun alkuun