====Raspberry Pi LCD Display med meny för Nexa====
//Av: Johan.S & Micke.K//
//"Vi frånsäger oss allt ansvar och skador detta script kan ge.
Har ingen support,och har ingen Garanti. men hjälper gärna till i mån av tid.
Detta script är fortfarande under utveckling och versionen idag är: **V.15.1.15** \\
Du får gärna dela med dig av scriptet om du hänvisar hit, modifiera det (dela gärna med dig av förbättringar). Men inte sälja det eller någon del av det. //
====Behov====
Vi sökte efter en basstation för Nexa enheterna och något som skulle vara den centrala styrenheten.
Även om primära funktionen med Rasberry Pi'n och Tellstick duo'n är att den ska styras via mobilen så eftersöktes en basstation som kan släcka / tända allt utan behov av wifi som mobilen är i behov av för kommunicera med Raspberryn.
Även ha en enhet i hallen som visade tid, datum, temperatur, mm.
====Funktion====
Detta är ett skript som främsta egenskap är ett meny system för styra nexa eneheter med 4st knappar.
Vi har använt oss av [[https://www.modmypi.com/raspberry-pi-blue-and-white-16x2-LCD-kit?filter_name=lcd%20display|Adafruit lcd kit]] med 5st knappar. Vi har även lagt in lite fler funktioner.
Scriptet söker igenom tillagda enheter och sorterar bort temperaturgivare mm.
För att få in temperatur givarna måste man lägga till id på dom (mer om det nedan).
__Knappar i grund menyn__
|Viloläge:|Displayen visar datum & tid med bakgrundsbelysning av.|
|Knapp upp:|Displayen visar datum & tid med bakgrundsbelysning på.|
|Knapp höger:|Displayen visar Ip adress etho och wifi om det finns.|
|Knapp ner:|Dispalayen visar Data från 2st temperatur sensorer (ute&inne).|
|Knapp vänster:|Tar en bild med [[https://www.modmypi.com/raspberry-pi-camera-board?filter_name=kamera|Rasberri Pi Camera]]|
|Knapp vänster2:|Tar en in i Nexa meny för styra nexa enheterna.|
__Knappar i nexa menyn__
|Upp & ner|Bläddrar bland enheterna|
|Höger| Stänger av|
|Vänster| Startar|
|Vänster2|Går ur nexa menyn|
**Bonus funktioner**
När vi endå hade en enhet på väggen valde vi lägga till några funktioner:
* Tid / Datum
* Ip adress
* Temperatur
* Starta Kamra
====Fördberedelser====
**Hårdvara**
* Rasberry pi (b/b+)
* Tellstick Duo (([[http://www.telldus.se/products/tellstick_duo]]))
* Ada Fruit 16X2 Lcd Kit (([[https://www.modmypi.com/raspberry-pi-blue-and-white-16x2-LCD-kit?filter_name=lcd%20display]]))
* Tillval: Raspberry Pi Camra (([[https://www.modmypi.com/raspberry-pi-camera-board?filter_name=kamera]]))
* Tillval: Wifiadapter, kan vara skönt att komma åt den lät från datorn.
**Installera och konfigurera**
- Raspberry Pi installerad med Raspbian.
- Ha helst en fast ip adress och systemet konfigurerat som du vill ha det.
- Telldus-core (([[http://developer.telldus.se/doxygen/]])) [[http://elinux.org/R-Pi_Tellstick_core|installationsguide]]
- Konfigurera Telldus-core och lägg till alla enheter (([[http://developer.telldus.com/wiki/TellStick_conf]])) (([[http://developer.telldus.se/doxygen/]])).
- Notera ner ID på Temperatur sensorerna.
- Installera LCD kitet (([[https://learn.adafruit.com/adafruit-16x2-character-lcd-plus-keypad-for-raspberry-pi]]))
- Tillval: Installera Raspberry Pi Kamran (([[https://www.modmypi.com/blog/installing-the-raspberry-pi-camera-board]]))
====Filerna====
Det är 5(4)st filer som behövs, den 5e är enbart för Kamran.
Har du inte tänkt använda den kan du skippa den filen.
Första 3st är från Adafruit och är för Lcd kitet. Har du kört deras tuturial har du säkert redan dom annar ladda ner dom här:
* [[http://3korre.se/download/Adafruit_CharLCDPlate.pyc|Adafruit_CharLCDPlate.pyc]]
* [[http://3korre.se/download/Adafruit_I2C.pyc|Adafruit_I2C.pyc]]
* [[http://3korre.se/download/Adafruit_MCP230xx.pyc|Adafruit_MCP230xx.pyc]]
**Huvudscripet**
Sök efter xx och byt ut värderna där.
Om jag inte missat nåt så är det 2 ställen:
* Tempgivarna
* Sökvägen till camera scriptet
#!/usr/bin/python
import subprocess
import smbus
import socket
import os
from time import sleep, strftime
from Adafruit_I2C import Adafruit_I2C
from Adafruit_MCP230xx import Adafruit_MCP230XX
from Adafruit_CharLCDPlate import Adafruit_CharLCDPlate
from datetime import datetime
from subprocess import *
def run_cmd(cmd):
p = Popen(cmd, shell=True, stdout=PIPE)
output = p.communicate()[0]
return output
#Definera temperatur sensorerm
otempid = "xx"
itempid = "xx"
# use busnum = 0 for raspi version 1 (256MB) and busnum = 1 for version 2
lcd = Adafruit_CharLCDPlate(busnum = 1)
# clear display
lcd.clear()
rakna = 0 #Variabel for halla reda pa tiden for backlight mm
huvudtid1 = 30 # =3 sekunder. Tiden hududmeny ska lysa och hur lange submenyerna ska visas.
huvudtid2 = 60 # tiden till huvudmeny slacks
hitta_ipadress_e = "ip addr show eth0 | grep inet | awk '{print $2}' | cut -d/ -f1" #kollar ipadressen
ipadress_e = run_cmd(hitta_ipadress_e) #kollar ip
hitta_ipadress_w = "ip addr show wlan0 | grep inet | awk '{print $2}' | cut -d/ -f1" #kollar ipadressen
ipadress_w = run_cmd(hitta_ipadress_w) #kollar ip
select_enabled = 0 # aktivera select valet for nexa menyn
select_lista = []
select_list_val = 0
#funktion for att lasa in data till selectmenyn:
def run_command(command):
p = subprocess.Popen(command,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
return iter(p.stdout.readline, b'')
#kommando for att hamta listan fran tdtool
command = 'tdtool --list'
#kor en for-loop for att skapa en lista
for line in run_command(command.split()):
first = line.find('\t') + 1 #hitta forsta \t <- tab
second = line.rfind('\t') #hitta andra \t <- tab
#hoppa over allt som innehaller temperature
if(line.find("temperature",first,second) > -1 ):
continue
#hoppa over allt som innehaller MODEL
if(line.find("MODEL",first,second) > -1 ):
continue
if (first > 0):
select_lista.append(line[first:second]) #spara endast namnet i en lista
##AVSLUT
##HITTA ETT OBJEKT I LISTAN
print select_lista
print len(select_lista)
#SKRIV UT ETT NAMN UR LISTAN
while 1:
sleep(0.1)
#tar den till top sidan och lange top sidan i vilolaget
rakna = rakna + 1
if (rakna > huvudtid1 and rakna < huvudtid2):
lcd.clear()
lcd.message(datetime.now().strftime('%b %d %H:%M:%S\n'))
if (rakna >= huvudtid2):
#lcd.backlight(lcd.OFF)
lcd.clear()
lcd.backlight(lcd.OFF)
lcd.message(datetime.now().strftime('%b %d %H:%M:%S\n'))
# vanster knapp
if (lcd.buttonPressed(lcd.LEFT)):
lcd.clear()
lcd.message("SELFIE INC!")
command2 = "xx/sökväg/xxselfie.sh"
#testa run_cmd istallet
run_cmd(command2)
#run_command(command2.split())
lcd.backlight(lcd.ON)
rakna = 0
sleep(5)
# uppat knapp
if (lcd.buttonPressed(lcd.UP)):
lcd.clear()
lcd.message(datetime.now().strftime('%b %d %H:%M:%S\n'))
lcd.backlight(lcd.ON)
rakna = 0
# nerat knapp
if (lcd.buttonPressed(lcd.DOWN)):
lcd.clear()
lcd.message("UPPDATERAR")
indoor = "" #temperatur inne
outdoor = "" #temperatur ute
for line in run_command(command.split()):
first = line.find('\t') + 1 #hitta forsta \t <- tab
second = line.rfind('\t') #hitta andra \t <- tab
#hoppa over allt som innehaller temperature
if(line.find("temperaturehumidity",first,second) > -1 ):
temp_variabel = line[first:second]
first = temp_variabel.find('\t') + 1 #hitta forsta \t <- tab
second = temp_variabel.rfind('\t') #hitta andra \t <- tab
temp_variabel = temp_variabel[first:(second-2)]
if(temp_variabel.find(itempid) > -1 ):
first = temp_variabel.find('\t') + 1
indoor = temp_variabel[first:(len(temp_variabel))]
elif(temp_variabel.find(otempid) > -1 ):
first = temp_variabel.find('\t') + 1
outdoor = temp_variabel[first:(len(temp_variabel))]
#continue
#hoppa over allt som innehaller MODEL
#if (first > 0):
# select_lista.append(line[first:second]) #spara endast namnet i en lista
##AVSLUT
lcd.clear()
lcd.message("Indoor : " + indoor + "\noutdoor: " + outdoor)
lcd.backlight(lcd.ON)
rakna = 0
# hoger knapp
if (lcd.buttonPressed(lcd.RIGHT)):
lcd.clear()
lcd.message('E' + ipadress_e + '\nW' + ipadress_w)
lcd.backlight(lcd.ON)
rakna = 0
if (lcd.buttonPressed(lcd.SELECT)):
lcd.backlight(lcd.ON)
select_enabled = 1
select_list_val = 0
sleep (0.5)
lcd.clear()
lcd.message("Enhet: %s\n V=on H=off" %(select_lista[select_list_val]))
while select_enabled:
if (lcd.buttonPressed(lcd.SELECT)):
select_enabled = 0
lcd.clear()
lcd.message("Lamnar nu Nexa\nmenyn")
sleep(1)
sleep(0.15)
if (lcd.buttonPressed(lcd.UP)):
#print select_list_val #for debug
#print len(select_lista) #for debug
lcd.clear()
select_list_val = select_list_val - 1 #oka menyval med ett
#om listan e slut borja om fran borjan.
#print select_list_val
if(select_list_val < 0 ):
select_list_val = len(select_lista) - 1
#print "komhit"
lcd.message("Enhet: %s\n V=on H=Off" %(select_lista[select_list_val])) #valj menyitem
sleep(0.05)
if (lcd.buttonPressed(lcd.DOWN)):
print select_list_val
#print select_list_val #for debug
#print len(select_lista) #for debug
lcd.clear()
select_list_val = select_list_val + 1 #oka menyval med ett
#om listan e slut borja om fran borjan.
if(len(select_lista) < (select_list_val)+1):
select_list_val = 0
#print "komhit"
lcd.message("Enhet: %s\n V=on H=Off" %(select_lista[select_list_val])) #valj menyitem
sleep(0.05)
if (lcd.buttonPressed(lcd.RIGHT)):
run_cmd("tdtool --off " + (select_lista[select_list_val]) )
if (lcd.buttonPressed(lcd.LEFT)):
run_cmd("tdtool --on " + (select_lista[select_list_val]) )
rakna = 0
**Kamera scriptet**
Det den gör är ta en bild med "raspistill" (alla variablar kan läsa i scriptet) och lägger bilden på en nätverks utdelning. Vill man så kan man ändra det till usbdisk, mapp etc. Sök efter xx och byt ut.
#!/bin/bash
PICTURE=$(date +"%Y-%m-%d_%H%M").jpg
SOURCE=/tmp
DESTINATION=/mnt
GETCOUNT=$(ps aux | grep raspistill | grep -v grep | wc -l)
if [ "$GETCOUNT" -eq 0 ]
then
echo inga raspistill processer kors.. fortsatter...
raspistill -vf -hf -w 640 -h 480 -q 75 -o $SOURCE/$PICTURE
mount -t cifs -o "username=xx,password=xx" //xxdisk/xxshare $DESTINATION
cp $SOURCE/$PICTURE $DESTINATION/$PICTURE
rm $SOURCE/$PICTURE
sync;sync
umount /mnt
echo allt verkar i sin ordning...
else
echo RASPISTILL ALREADY RUNNING!
fi
====Problem====
Det största problemen vi stött på är att Kamerafunktionen hänger hela Raspberryn.\\
Men den senaste versionen v15.1.15 så har det inte uppstått än.\\
====Utveckling====
Inga större ändringar är planerade i dagsläget.\\
Det enda är att vi ska få den att köras som en service, just nu körs den manuellt med screen.\\
Göra någon form av larm finns i tankarna också, men blir nog separat projekt.