As promised, a long list of resources I’ve found useful while starting off with HouseMon:
JavaScript – The core of what I’m building now is centered entirely around “JS”, the language behind many sites on the web nowadays. There’s no way around it: you have to get to grips with JS first. I spent several hours watching most of the videos on Douglas Crockford’s site. The big drawback is the time it takes…
Best book on the subject, IMO, if you know the basics of JavaScript, is “JavaScript: The Good Parts” by the same author, ISBN 0596517742. Understanding what the essence of a language is, is the fastest way to mastery, and his book does exactly that.
CoffeeScript – It’s just a dialect of JS, really – and the way HouseMon uses it, “CS” automatically gets compiled (more like “expanded”, if you ask me) to JS on the server, by SocketStream.
The most obvious resource, http://coffeescript.org/, is also one of the best ways to understand it. Make sure you are comfortable with JS, even if not in practice, before reading that home page top to bottom. For an intruiging glimpse of how CS code can be documented, see this example from the CS compiler itself (pretty advanced stuff!).
But the impact of CS goes considerably deeper. To understand how Scheme-like functional programming plays a role in CS, there is an entertaining (but fairly advanced) book called CoffeeScript Ristretto by Reginald Braithwaite. I’ve read it front-to-back, and intend to re-read it in its entirety in the coming days. IMO, this is the book that cuts to the core of how functions and objects work together, and how CS lets you write on a high conceptual level. It’s a delightful read, but be prepared to scratch your head at times…
For a much simpler introduction, see The Little Book on CoffeeScript by Alex MacCaw, ISBN 1449321046. Also available on GitHub.
Node.js – I found the Node.js in Action book by Mike Cantelon, TJ Holowaychuk and Nathan Rajlich to be immensely useful, because of how it puts everything in context and introduces all the main concepts and libraries one tends to use in combination with “Node”. It doesn’t hurt that one of the most prolific Node programmers also happens to be one of the authors…
Another useful resource is the API documentation of Node itself.
SocketStream – This is what takes care of client-server communication, deployment, and it comes with many development conveniences and conventions. It’s also the least mature of the bunch, although I’ve not really encountered any problems with it. I expect “SS” to evolve a bit more than the rest, over time.
There’s a “what it is and what it does” type of demo tour, and there is a collection on what I’d call tech notes, describing a wide range of design docs. As with the code, these pages are bound to change and get extended further over time.
Redis – This a little database package which handles a few tasks for HouseMon. I haven’t had to do much to get it going, so the README plus Command Summary were all I’ve needed, for now.
AngularJS – This is the most framework-like component used in HouseMon, by far. It does a lot, but the challenge is to understand how it wants you to do things, and altough “NG” is not really an opinionated piece of software, there is simply no other way to get to grips with it, than to take the dive and learn, learn, learn… Let me just add that I really think it’s worth it – NG can be magic on the client side, and once you get the hang of it, it’s in fact an extremely expressive way to create a responsive app in the browser, IMO.
There’s an elaborate tutorial on the NG site. It covers a lot of ground, and left me a bit overwhelmed – probably because I was trying to learn too much as quickly as possible…
There’s also a video, which gives a very clear idea of NG, what it is, how it is used, etc. Only downside is that it’s over an hour long. Oh, and BTW, the NG FAQ is excellent.
For a broader background on this sort of JS frameworks, see Rich JavaScript Applications by Steven Sanderson. An eye opener, if you’ve not looked into RIA’s before.
Arduino – Does this need any introduction on this weblog? Let me just link to the Reference and the Tutorial here.
JeeNode – Again, not really much point in listing much here, given that this entire weblog is more or less dedicated to that topic. Here’s a big picture and the link to the hardware page, just for completeness.
RF12 – This is the driver used for HopeRF’s wireless radio modules, I’ll just mention the internals weblog posts, and the reference documentation page.
Vim – My editor of choice, lately. After many years of using TextMate (which I still use as code browser), I’ve decided to go back to MacVim, because of the way it can be off-loaded to your spine, so to speak.
There’s a lot of personal preference involved in this type of choice, and there are dozens of blog posts and debates on the web about the pro’s and con’s. This one by Steve Losh sort of matches the process I am going through, in case you’re interested.
Best way to get into vim? Install it, and type “vimtutor
“. Best way to learn more?
Type “:h<CR>
” in vim. Seriously. And don’t try to learn it all at once – the goal is
to gradually migrate vim knowledge into your muscle memory. Just learn the base
concepts, and if you’re serious about it: learn a few new commands each week. See
what sticks.
To get an idea of what’s possible, watch some videos – such as the vim entries on the DAS site by Gary Bernhardt (paid subscription). And while you’re at it: take the opportunity to see what Behaviour Driven Design is like, he has many fascinating videos on the subject.
For a book, I very much recommend Practical Vim by Drew Neil. He covers a wide range of topics, and suggests reading up on them in whatever order is most useful to you.
While learning, this cheatsheet and wallpaper may come in handy.
Raspberry Pi – The little “RPi” Linux board is getting a lot of attention lately. It makes a nice setup for HouseMon. Here are some links for the hardware and the software.
Linux – Getting around on the command line in Linux is also something I get asked about from time to time. This is important when running Linux as a server – the RPi, for example.
I found the linuxcommand.org resource which appears to do a good job of explaining all the basic and intermediate concepts. It’s also available as a book, called “The Linux Command Line” by William E. Shotts, Jr. (PDF).
There… the above list ought to get you a long way with all the technologies I’m currently messing around with. Please feel free to add pointers and tips in the comments, if you think of other resource which can be of use to fellow readers in this context.
Jcw,
did you already made a decision around long(er) time data storage for the historical sensor data? I understood that Redis is used for the storage of the latest state of an sensor, but it is unclear where you plan on storing all the hisorical sensor data?
My thoughts …. How about implementing the same logic that is used in RRD tools/MRTG on top of Redis ? So implement a Round Robin Database inside redis using key/value pairs. I noticed that there are various implementation of this already floating around on the internet:
https://github.com/igrigorik/RRRDTool https://github.com/dsander/RReDis
I did not check these, or used them … Just trying to find possible solution directions.
Hein
Still undecided… I was thinking of storing up to a week of raw data in Redis, using sorted sets (one per parameter). Enough for basic graphing needs. For very long-term storage, I have the current log file format (some 5 years of it), which is quite compact (79 MB for 2012, gzipped per day with millisecond UTC timestamps).
For everything in between, I can’t make up my mind. Perhaps RRD-like in Redis would indeed be a good idea for now, since it’s already running anyway. Caching RRD-style values for data older than a week would be an option, say hourly for last month and daily for everything else. Given that the raw data is available to redo things any time, it’s actually a bit silly to drag my feet on this – even if a better solution comes up, picking something (anything!) usable now would be ok.
I’ll review the RRD-in-Redis links, thanks.
Don’t forget that Redis keeps all data in memory all the time. So I’m not sure if storing RRD-like data in Redis is such a great idea when targeting an RPi as plattform.
Yes, understand. Let’s see what sort of overhead Redis has…