Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Organized the API

  • Loading branch information...
commit 49a685bbdbbcee0252c85fe78ea30d811f7a5932 1 parent c1da217
@robrighter authored
View
3  .gitmodules
@@ -0,0 +1,3 @@
+[submodule "lib/node-xml"]
+ path = lib/node-xml
+ url = git@github.com:robrighter/node-xml.git
View
2  README.md
@@ -0,0 +1,2 @@
+node-currentcost provides an easy way to pull data from current cost home energy devices. For more information about CurrentCost devices go to:
+http://www.currentcost.com
View
23 currentcost.js
@@ -0,0 +1,23 @@
+(function(){
+ events = require('events');
+ var spawn = require("child_process").spawn;
+ var xml = require('./lib/xml2json');
+ var device = '';
+ var CurrentCost = exports.CurrentCost = function(dev){device = dev};
+ CurrentCost.prototype = new events.EventEmitter();
+ CurrentCost.prototype.begin = function(){
+ var that = this;
+ var dataprocess = spawn("python", ["./python/tailserial.py", device]);
+ dataprocess.stdout.on('data', function (data) {
+ that.emit('data', formatData(xml.parse(new String(data), "", false)));
+ });
+ dataprocess.stderr.on('data', function (data) {
+ that.emit('error', data+"");
+ });
+ };
+ function formatData(data){
+ if(data.hasOwnProperty('msg')){
+ return data['msg'];
+ }
+ }
+})();
View
14 example.js
@@ -0,0 +1,14 @@
+CurrentCost = require('./currentcost').CurrentCost;
+sys = require('sys');
+
+var tryit = new CurrentCost('/dev/tty.usbserial');
+
+tryit.on('data', function(data){
+ console.log(sys.inspect(data));
+});
+
+tryit.on('error', function(data){
+ console.log('ERROR: ' + data);
+});
+
+tryit.begin();
1  lib/node-xml
@@ -0,0 +1 @@
+Subproject commit 4aee901b997ef784716c8de799d27292eb18e099
View
160 lib/xml2json.js
@@ -0,0 +1,160 @@
+/*
+xml2json v 1.1
+copyright 2005-2007 Thomas Frank
+
+This program is free software under the terms of the
+GNU General Public License version 2 as published by the Free
+Software Foundation. It is distributed without any warranty.
+*/
+(function(){
+ var xml2json={
+ parser:function(xmlcode,ignoretags,debug){
+ if(!ignoretags){ignoretags=""};
+ xmlcode=xmlcode.replace(/\s*\/>/g,'/>');
+ xmlcode=xmlcode.replace(/<\?[^>]*>/g,"").replace(/<\![^>]*>/g,"");
+ if (!ignoretags.sort){ignoretags=ignoretags.split(",")};
+ var x=this.no_fast_endings(xmlcode);
+ x=this.attris_to_tags(x);
+ x=escape(x);
+ x=x.split("%3C").join("<").split("%3E").join(">").split("%3D").join("=").split("%22").join("\"");
+ for (var i=0;i<ignoretags.length;i++){
+ x=x.replace(new RegExp("<"+ignoretags[i]+">","g"),"*$**"+ignoretags[i]+"**$*");
+ x=x.replace(new RegExp("</"+ignoretags[i]+">","g"),"*$***"+ignoretags[i]+"**$*")
+ };
+ x='<JSONTAGWRAPPER>'+x+'</JSONTAGWRAPPER>';
+ this.xmlobject={};
+ var y=this.xml_to_object(x).jsontagwrapper;
+ if(debug){y=this.show_json_structure(y,debug)};
+ return y
+ },
+ xml_to_object:function(xmlcode){
+ var x=xmlcode.replace(/<\//g,"§");
+ x=x.split("<");
+ var y=[];
+ var level=0;
+ var opentags=[];
+ for (var i=1;i<x.length;i++){
+ var tagname=x[i].split(">")[0];
+ opentags.push(tagname);
+ level++
+ y.push(level+"<"+x[i].split("§")[0]);
+ while(x[i].indexOf("§"+opentags[opentags.length-1]+">")>=0){level--;opentags.pop()}
+ };
+ var oldniva=-1;
+ var objname="this.xmlobject";
+ for (var i=0;i<y.length;i++){
+ var preeval="";
+ var niva=y[i].split("<")[0];
+ var tagnamn=y[i].split("<")[1].split(">")[0];
+ tagnamn=tagnamn.toLowerCase();
+ var rest=y[i].split(">")[1];
+ if(niva<=oldniva){
+ var tabort=oldniva-niva+1;
+ for (var j=0;j<tabort;j++){objname=objname.substring(0,objname.lastIndexOf("."))}
+ };
+ objname+="."+tagnamn;
+ var pobject=objname.substring(0,objname.lastIndexOf("."));
+ if (eval("typeof "+pobject) != "object"){preeval+=pobject+"={value:"+pobject+"};\n"};
+ var objlast=objname.substring(objname.lastIndexOf(".")+1);
+ var already=false;
+ for (k in eval(pobject)){if(k==objlast){already=true}};
+ var onlywhites=true;
+ for(var s=0;s<rest.length;s+=3){
+ if(rest.charAt(s)!="%"){onlywhites=false}
+ };
+ if (rest!="" && !onlywhites){
+ if(rest/1!=rest){
+ rest="'"+rest.replace(/\'/g,"\\'")+"'";
+ rest=rest.replace(/\*\$\*\*\*/g,"</");
+ rest=rest.replace(/\*\$\*\*/g,"<");
+ rest=rest.replace(/\*\*\$\*/g,">")
+ }
+ }
+ else {rest="{}"};
+ if(rest.charAt(0)=="'"){rest='unescape('+rest+')'};
+ if (already && !eval(objname+".sort")){preeval+=objname+"=["+objname+"];\n"};
+ var before="=";after="";
+ if (already){before=".push(";after=")"};
+ var toeval=preeval+objname+before+rest+after;
+ eval(toeval);
+ if(eval(objname+".sort")){objname+="["+eval(objname+".length-1")+"]"};
+ oldniva=niva
+ };
+ return this.xmlobject
+ },
+ show_json_structure:function(obj,debug,l){
+ var x='';
+ if (obj.sort){x+="[\n"} else {x+="{\n"};
+ for (var i in obj){
+ if (!obj.sort){x+=i+":"};
+ if (typeof obj[i] == "object"){
+ x+=this.show_json_structure(obj[i],false,1)
+ }
+ else {
+ if(typeof obj[i]=="function"){
+ var v=obj[i]+"";
+ //v=v.replace(/\t/g,"");
+ x+=v
+ }
+ else if(typeof obj[i]!="string"){x+=obj[i]+",\n"}
+ else {x+="'"+obj[i].replace(/\'/g,"\\'").replace(/\n/g,"\\n").replace(/\t/g,"\\t").replace(/\r/g,"\\r")+"',\n"}
+ }
+ };
+ if (obj.sort){x+="],\n"} else {x+="},\n"};
+ if (!l){
+ x=x.substring(0,x.lastIndexOf(","));
+ x=x.replace(new RegExp(",\n}","g"),"\n}");
+ x=x.replace(new RegExp(",\n]","g"),"\n]");
+ var y=x.split("\n");x="";
+ var lvl=0;
+ for (var i=0;i<y.length;i++){
+ if(y[i].indexOf("}")>=0 || y[i].indexOf("]")>=0){lvl--};
+ tabs="";for(var j=0;j<lvl;j++){tabs+="\t"};
+ x+=tabs+y[i]+"\n";
+ if(y[i].indexOf("{")>=0 || y[i].indexOf("[")>=0){lvl++}
+ };
+ if(debug=="html"){
+ x=x.replace(/</g,"&lt;").replace(/>/g,"&gt;");
+ x=x.replace(/\n/g,"<BR>").replace(/\t/g,"&nbsp;&nbsp;&nbsp;&nbsp;")
+ };
+ if (debug=="compact"){x=x.replace(/\n/g,"").replace(/\t/g,"")}
+ };
+ return x
+ },
+ no_fast_endings:function(x){
+ x=x.split("/>");
+ for (var i=1;i<x.length;i++){
+ var t=x[i-1].substring(x[i-1].lastIndexOf("<")+1).split(" ")[0];
+ x[i]="></"+t+">"+x[i]
+ } ;
+ x=x.join("");
+ return x
+ },
+ attris_to_tags: function(x){
+ var d=' ="\''.split("");
+ x=x.split(">");
+ for (var i=0;i<x.length;i++){
+ var temp=x[i].split("<");
+ for (var r=0;r<4;r++){temp[0]=temp[0].replace(new RegExp(d[r],"g"),"_jsonconvtemp"+r+"_")};
+ if(temp[1]){
+ temp[1]=temp[1].replace(/'/g,'"');
+ temp[1]=temp[1].split('"');
+ for (var j=1;j<temp[1].length;j+=2){
+ for (var r=0;r<4;r++){temp[1][j]=temp[1][j].replace(new RegExp(d[r],"g"),"_jsonconvtemp"+r+"_")}
+ };
+ temp[1]=temp[1].join('"')
+ };
+ x[i]=temp.join("<")
+ };
+ x=x.join(">");
+ x=x.replace(/ ([^=]*)=([^ |>]*)/g,"><$1>$2</$1");
+ x=x.replace(/>"/g,">").replace(/"</g,"<");
+ for (var r=0;r<4;r++){x=x.replace(new RegExp("_jsonconvtemp"+r+"_","g"),d[r])} ;
+ return x
+ }
+ };
+
+ exports.parse = function(xmlcode, ignoretags, debug) {
+ return xml2json.parser(xmlcode, ignoretags, debug);
+ }
+})();
View
20 python/tailserial.py
@@ -1,4 +1,18 @@
import serial
-ser = serial.Serial('/dev/tty.usbserial', 57600)
-while 1:
- print( ser.readline() ),
+import time
+import sys
+
+try:
+ if len(sys.argv) == 2:
+ # ser = serial.Serial(sys.argv[1], 57600)
+ hour=1
+ while 1:
+ hour=hour+1
+ print("<msg><src>CC128-v0.15</src><dsb>00001</dsb><time>"+str(hour)+":06:52</time><tmprF>79.3</tmprF><sensor>0</sensor><id>02143</id><type>1</type><ch1><watts>03275</watts></ch1><ch2><watts>00349</watts></ch2></msg>\n"),
+ #print( ser.readline() ),
+ sys.stdout.flush()
+ time.sleep( 1 )
+ else:
+ sys.stderr.write('No Device Provided')
+except:
+ sys.stderr.write('Invalid CurrentCost Device')
View
0  startapp.js
No changes.
Please sign in to comment.
Something went wrong with that request. Please try again.