BBLamp is a lamp that is easily programmable with the visual and drag and drop language Blockly. This project aims at teach programming to childs and people who are a priori not interested in that. Blockly makes programming easy and intuitive, and the lamp (with leds and sensors) make it attractive !
The BBLamp it self is a Raspberry Pi with a strip of RGB leds, a bunch of sensors and buttons. It is connected to your local network and is programmable throw a modern and intuitive web interface.
Warning : This project is not yet fully usable !
This project is very young but in (active) development. Feel free to contact me for any question, comments, typo correction or whatever...
install depencies:
$ sudo apt-get install python-pip python-dev
$ sudo pip insall gevent # need gevent >= 1.0
$ sudo pip insall flask
$ sudo pip insall requests
Note: python-dev are needed to install gevent.
$ git clone https://github.com/enavarro222/bblamp.git
$ cd bblamp
$ make get-ace
$ make install-ace
$ make get-bootstrap
$ make install-bootstrap
$ run webserver.py
activate SPI on rPy:
$ sudo vim /etc/modprobe.d/raspi-blacklist.conf
# add a '#' before line "blacklist spi-bcm2708"
- install it on a std linux computer without any special hardware
- install it on a rPi with led strip and sensors...
for the wimote:
- bluez
- python-cwiid
- flask
- gevent >= 1.0 (https://pypi.python.org/pypi/gevent)
- requests
- sseclient (https://pypi.python.org/pypi/sseclient)
- jquery
- underscore.js
- i18next.js (internationalization)
- backbone.js
- backbone-layoutmanager
- twitter bootstrap
- bootboxjs (for confirmation/alert box)
- toastr (for notifications)
- moment.js (for date/time management)
- mousetrap (for shortcuts)
- ace.js (source code editor)
- blockly
More comming soon on the prototype hardawre. For now it is:
- Raspberry Pi
- string of 25 12mm RGB led pixels controlled by WS2801 (SPI)
Warning. you need led drive by WS2801 and not WS2811. WS2801 strips have 4 wires and can easily be driven by a rPi, whereas WS2811 strips have 3 wires and can not be driven by a rPi. You can find it on ebay.
We aim to add :
- light sensor (i3c)
- humidity and temp sensor (DHT22/AM2302)
- push button
- PIR sensor
- small mic
- small speakers
- wimote
The BBLamp software is organise in three parts :
- the lamp aplications (or "lapp"):
- created by the users,
- coded in python,
- stored in "user_apps/",
- based on python modules (hardware drivers ...) which are un "lampapp/".
- edition app:
- coded in javascript,
- use Blockly for lamp app creation
- use ACE for python editing
- mainly in "static/" and in "templates"
- the webserver:
- serve the "edition app"
- manage lapps (Create, Read, Update, Delete, and also: Run, Stop, Status)
- manage a lamp hardware simulator
- written in python (with Flask)
The main directories are:
.
├── blockly # modified version of Blockly
│ ├── ...
│ ├── blocks # contains blocks description
│ ├── ...
│ ├── generators # contains blockscode generator
│ ├── ...
│ ├── msg # contains blockly i18n files
│ └── ...
├── lampapp # python files for lamp app creation, hardware drivers
├── lapp_output # contains lamp app outputs file (used to communicate with the webserver)
├── static # webapp static files
│ ├── blockly -> ../blockly # link to blockly
│ ├── jslib # bunch of std JS libs
│ └── locales # webapp i18n files (use i18next)
├── templates # web app templates (flask templates)
├── tests # ...
└── user_apps # contains application created by users
The web server python code is mainly at root level :
.
├── api.py # flask API to manage lapps
├── errors.py # common lapps management errors
├── simulate.py # lamp hardware simulator API
├── static # static files (ie JS edition app)
├── templates # templates, ie JS edition app main page
├── utils.py # some helpers
└── webserver.py # webserer main program
The lapp are based on python modules that are in "lampapp"~: TODO: description of these files
- autonomous python program
- could be written using blockly
- only one running at a time
- is run as a service
- metadata :
- modification date
- creation date
- author
- comment / description
#-*- coding:utf-8 -*-
from lapp import LampApp
app = LampApp()
@app.setup()
def setup():
global on
on = False
@app.every(1)
def loop():
global on
# blink
if on:
app.lamp.turn_off()
else:
app.lamp.turn_on()
on = not on
if __name__ == "__main__":
app.run()
Here is the description of BBLamp specific blocks.
- setup: run the action when application is run, before everything else.
- every: periodically perform an action.
- wait: make a pause of a given time
- on
For the WiMote:
- start rumble
- stop rumble
- on button {1, 2, A, B, HAUT, BAS, GAUCHE, DROITE} push
- create a new lapp
- edit a lapp directly in python
- edit a lapp with blockly
- delete a lapp (with confirmation)
- run a lapp
- stop the running lapp
- view which lapp is running (if any)
- view running lapp log (std+err), in live
- view last run(s) log (std+err)
- set a lapp to be run on startup
- no "database": all metadata are in a .info file
- stdout/stderr/status are redirected in files in the dir : "lapp_out"
- UI: bug on chrome (at least) short cut don't work after "some time"
- hard: cleaner power plugs
- hard: manage DHT22
- UI: manage loading
- UI: template JS dans un fichier static ?
- H UI: new lapp (popup with form to choose the name)
- H UI: prevent quit without save
- UI: indicate short cut in UI
- UI: make lang change view
- UI: menu to switch to python/blocly
- UI: rename (popup with form to choose the name) => create delete (if delete fail, then delate new)
- UI: blockly: add "lapp_every_ms"
- UI: blockly: add "pause of TIME milliseconds"
- UI: blockly: make "block bags"
- UI: blockly: add an HSV color builder
- UI: blockly: add a block "number of leds"
- UI: blockly: i18n automatic load good i18n js file
- UI: blockly: variables blocs and trunon/turnoff have same color
- UI: run/stop/etc... check ajax call error
- UI: remove an app (with confirmation)
- UI: discard changes (with confirmation)
- UI: (BUG) event may deconect
- UI: (BUG) when no lapps
- UI: remaster the layout : editor full width, except when simulator on right
- UI: clean simulator model (and view)
- UI: front page: list of apps in full width
- UI: unified run/status menu View (with both model = status, collection = lapp_collection)
- UI: unactivate run when already running ...
- server: integration with nginx (http://salem.harrache.info/application-wsgi-avec-gevent-et-nginx.html)
- server: use Flask-Classy ClassView to simplify the API blueprint http://pythonhosted.org/Flask-Classy/
- server: clean start/stop/status responses (API)
- server: (BUG) monitoring of msg is not the same than log...
- server: lapp list alpha order by default
- H lapp: add a push button (simu first)
- lapp: better error message when invalid "lnum"
- lapp: add push button (GPIO)
- lapp: fix issue with GPIO not as root
- lapp: GPIO how to do with interupt ?
- lapp: add kill signal catch to lapp, log it correctly before to quit
- lapp: add i2c sensors
- lapp: add DHT22 sensors
- lapp: rPy system sensor ? temperature... http://raspberrypi.stackexchange.com/questions/357/how-do-i-monitor-and-or-control-the-temperature-of-the-soc http://raspberrypi.stackexchange.com/questions/9105/raspberry-pi-onboard-temp-sensors-in-raspbianwheezy
- server: add the number of connected client in status
- server: add the names of connected client in status
- server: manage (simply) concurrent edition
- server: get lapp SyntaxError back to UI
- UI: manage lapp metadata (author, comment)
- UI: log & output: manage the history, list, clear
- UI: use require.js
- server: store lapp in a local git repo (so store history)
- lapp/server: manage hardware (what present, what needed)
- install a demo version on a public server (with pswd)
- lapp: check color correction
- hard: how many amp for led ? ==> up to 60mA per LED => 1500 mA for 25 leds
- UI: add ctrl-* shortcuts http://craig.is/killing/mice
- UI: editor ace: autocompletion
- lapp: move to event based ! (every k sec, on button pressed, etc...)
- lapp: reset led on exit
- lapp: lamp start led id at 1 not at 0
- UI: blockly: add a "wait" bloc
- UI: blockly: i18n custom blocks
- UI: blockly: add "setup" block
- UI: blockly: fork => svn export & git add
- UI: update run time in status view
- UI: BUG fix VagueTime 1h hour diff !
- UI: i18n avec i18next
- UI: lapp started time "since" : https://github.com/philbooth/vagueTime.js
- UI: change editor style when readonly
- UI: log & outout popup
- UI: switch between two editors
- UI: change app mode (from_blockly)
- UI: confirmation and error msg with http://bootboxjs.com/
- UI: blockly: BUG allow more than one "every" block
- UI: blockly: change all code generation for colors
- UI: blockly: auto-resize
- UI: blockly: first integration (no translation, no save/load)
- UI: blockly: save/load
- UI: blockly: python translation (python read-only)
- UI: blockly: Lapp basic custom block
- UI: blockly: add "count for "i" in ..."
- UI: blockly: change blocks color (more saturation) -> same than bootstrap (cf core/blockly.js:79)
- UI: blockly: add "trun on light ID to color COLOR", "trun off light ID"
- UI: use twitter bootstrap
- UI: (BUG) ace editor: height error when open a lapp
- UI: reorganise views in a different js file
- UI: integrate backbone-layout in the git repo
- UI: JS lib in a subdir
- UI: add lapp button in a proper View
- UI: make LappPythonCodeEditor view
- UI: make a LappSaveView
- UI: close a lapp
- UI: make a LappView use sub views (and manage leaks)
- UI: test backbone layout manager plugin
- server: (BUG) on read log file
- server: manage save
- server: manage .info file
- server: isolate lapp management API in a blueprint, with separete url with version
- server: manage list/new/get/update for lamp app (API)
- UI: basic HTML/JS interface (backbone)x
- UI: add python editor on interface