Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
c1da217
commit 49a685b
Showing
8 changed files
with
220 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -0,0 +1,3 @@ | |||
[submodule "lib/node-xml"] | |||
path = lib/node-xml | |||
url = git@github.com:robrighter/node-xml.git |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -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']; | |||
} | |||
} | |||
})(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -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(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -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,"<").replace(/>/g,">"); | |||
x=x.replace(/\n/g,"<BR>").replace(/\t/g," ") | |||
}; | |||
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); | |||
} | |||
})(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -1,4 +1,18 @@ | |||
import serial | import serial | ||
ser = serial.Serial('/dev/tty.usbserial', 57600) | import time | ||
while 1: | import sys | ||
print( ser.readline() ), |
|
||
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') |
Empty file.