tiistai 3. joulukuuta 2013

Raspberry Pi + lämpö+kosteus

Onhan siitä jo taas tovi kun tuli jotain kirjoiteltua. Vaikka laitearvosteluita nyt onkin odottamassa julkaisua, että kirjoittamista, niin päätin kuitenkin kuluttaa aikaa Raspberry Pi:n kanssa.

Olen omistanut jo pidemmän aikaa kyseisen laitteen mutta en ole tälle keksinyt mitään järkevää käyttöä kunnes nyt. Sain kyseisen laitteen valjastettua johonkin ns. järkevään käyttöön. Kytkin kyseiseen laitteeseen muutaman sensorin, jonka avulla saan tiedot sisä-, että ulkotiloista. Tiedot jotka saan DHT22-sensoreiden kautta ovat lämpö ja kosteus. Kyseisiä sensoreita saa Ebaysta todella halvalla. Sensoreita on moneen lähtöön ja osa tarjoaa vain tietyn arvon kuten esim. lämpötilan.

Jos sinua kiinnostaa tämä asia, niin tässä hiukan vinkkiä. Ohje on suuntaa antava ja olenkin saattanut unohtaa siitä jotain mutta en usko, että kovin tärkeää. Googlella yleensä siihenkin löytyy ratkaisu.

Tarvittavat osat:
- Raspberry Pi + virta + muistikortti
- Sensori esim. DHT22
- Wlan (Optio)

Sitten on aika aloittaa.

Aluksi on hyvä tutustua seuraavaan artikkeliin Raspberry Pi Temperature and Humidity Project Construction. Kyseisessä artikkelissa käsittellään itse Raspberry Pi:tä ja DHT22 -sensoria. Raspberry Pi:ssä tulee olla muistikortilla jokin tarjolla oleva Linux-pohjainen käyttöjärjestelmä esim. Raspbian. Jonka voit ladata täältä.

Kun sinulla on tämä paketti koossa, voitkin kokeilla sensorin toimivuutta. Artikkelissa mainituilla ohjeilla. Bcm2835-kirjastosta löytyy uudempi versio itse tekijän sivuilta, joten lataa se sieltä. Toki voit käyttää ohjeissa mainittua versiota, jos haluat. Kun näet, että sensori toimii, niin voit viedä asian astetta pidemmälle. Kytkin tässä vaiheessa toisen sensorin ensimmäisen ns. rinnalle tietenkin omaan pinniinsä mistä data otetaan sisään. Virrat tulevat samoista pinneistä.


Tämän jälkeen löysin mielenkiintoisen sivuston nimeltä Adafruit, jonka mukavan oppaan miten saat lisättyä halutut arvot suoraan Google Docsin taulukkoon. DHT Humidity Sensing on Raspberry Pi with GDocs Logging

Toki asian olisi voinut tuohonkin jättää mutta kuitenkin halu saada käyriä oli ylitsepääsemätön. Joten aloin tutkimaan tätä. Löysin sivuston Xively, joka tarjoaa API:n kautta tämän mahdollisuuden.

Sitten pitikin löytää tapa millä saada data tuonne asti. Aluksi en huomioinut kyseisen sivuston hienoa tutoriaalia miten homman kanssa pääsee alkuun. Tästä syystä tutuistuin ensin seuraavaan artikkeliin Raspberry Pi with Xively. Kyseisessä artikkelissa tulostetaan Xivelyn tarjoamaan palveluun Raspberry Pi:stä tietoja. Kun olin tuota koittanut käyttää pohjana sensorin datan lähettämiseen, niin pongasinkin sitten Xivelyn oman tutoriaalin, jonka kautta homma alkoikin jo raksuttamaan. Tämän tutoriaalin kautta sainkin homman toimimaan halutulla tapaa. Homma ei kuitenkaan jäänyt tähän vaan nyt alettiin tutkimaan sensorin datan lähetystä tarkemmin.

Tähän asiaan löysin Googlen kautta seuraavan sivuston Rspberry Pi + DHT22 + Xively. Hyödyntämällä tätä kyseistä koodia, sain datan lähtemään yhdestä sensorista. Jonka jälkeen muokkasin tätä halutuksi, jotta sain toisestakin datan eteenpäin. Toki nämä voi yhdistää jos haluaa mutta päädyin kuitenkin erilliseen ratkaisuun kun tämä toimi.

Tuota kyseistä koodia käyttäessä törmäsin ongelmaan, että MySQLdb -kirjastoa ei vaan saanut toimimaan oikein. Tähän kuitenkin löysin ratkaisun komennolla sudo apt-get install python-mysqldb. Tämän lisäksi ongelmana oli myös itse sensorin lukeminen alkuun, koska olin jättänyt siirtämättä kyseisen koodinpätkän kanssa Adafruit_DHT_Driver -kansion sisällön. Tämä kansio sisältää itse ohjelman sensorin lukemiseen.

Nyt kyseinen koodi juoksikin jo ongelmitta. Kyseisessä koodissa on muutama kohta, jotka määrittävät millä nimellä itse data lähetetään Xivelyyn.

def get_datastream(feed):
  try:
    temp_datastream = feed.datastreams.get("temperature")
    if DEBUG:
      print "Found existing temperature datastream"
  except:
    if DEBUG:
      print "Creating new temperature datastream"
    temp_datastream = feed.datastreams.create("temperature", tags="temperature")

  try:
    humidity_datastream = feed.datastreams.get("humidity")
    if DEBUG:
      print "Found existing humidity datastream"
  except:
    if DEBUG:
      print "Creating new humidity datastream"
    humidity_datastream = feed.datastreams.create("humidity", tags="humidity")

  return {'tempds':temp_datastream, 'humidityds':humidity_datastream}

Ensimmäisessä boldatussa kohdassa määritellään feedin nimi, toisessa kohtaan määritellään se, että jos kyseisen nimistä feediä ei löydy luodaan seuraavan niminen ja annetaan sille haluttu tagi. Tämä sama toistuu kosteuden kanssa.

Lopuksi vielä piti saada luku käynnistymään bootissa. Tähän tein hiukan purkkaa...

Aluksi scripti mikä ajaa sensori 1:n lukemisen.

#!/bin/bash
cd /home/coder/temperature/ && source .envs/venv/bin/activate && python pi-temp.py

Sitten tämä pitää toki ajaa omassa screenissään

screen -dmS sensor01 /home/coder/temperature/scripts/./sensori01.sh

Tämän purkan monistin toiseen otteeseen ja nyt luku toimi molemmilla sensoreilla automaattisesti. Käytän tämän ajamiseen ihan crontabia.

Toivottavasti tästä oli jotain hyötyä tai mahdollisesti innostuksen lähde. Tästä itselläni todennäköisin seuraava aste on AirPi.

Lopuksi muutama hassu kuva itse projektista.



Päivitys 4.12.2013
Huomasin pienen bugin tuossa koodissa, jolla luetaan data ja lähetetään eteenpäin Xivelyyn.

Seuraavalla rivillä määritetään lämpötilojen arvot: 

matches = re.search("Temp =\s+([0-9.]+)", output) 

Tästä pätkästä johtuen lämmöt jäivät nollaan. Kun tähän muuttaa esim. -30 päästään alle nollan.

matches = re.search("Temp =\s+([-30-9.]+)", output)

Ei kommentteja:

Lähetä kommentti