====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.