stromdao-bo-mpo
Version:
Operation of an Energy Meter Point using StromDAO Business Object for Energy Blockchain. Abstraction for storage connection as crossed meter point.
1,354 lines (1,232 loc) • 50.5 kB
JavaScript
var sko_sc="0x19BF166624F485f191d82900a5B7bc22Be569895";
var xferkto="0x5856b2AE31ed0FCf82F02a4090502DC5CCEec93E";
var pers_sc="";
var history_length=15;
var last_block=0;
var account_interval=0;
var chart_data=[];
function nameLookup(address) {
if(node.storage.getItemSync("rl_name_"+address)==null) {
node.roleLookup().then(function(rl) {
rl.getName(address).then(function(tx) {
$('.'+address).html(tx);
node.storage.setItemSync("rl_name_"+address,tx);
});
});
} else {
$('.'+address).html(node.storage.getItemSync("rl_name_"+address));
}
}
function lookup(address) {
name=address;
if(window.localStorage.getItem("address_"+address.toLowerCase())!=null) {
name=window.localStorage.getItem("address_"+address.toLowerCase());
}
if(name.length<1) name=address;
return name;
}
function getBlockTime(blocknr,cb) {
if(typeof window.localStorage.getItem("block_"+blocknr)!="undefined")
{
$.ajax({
url: "https://fury.network/rpc",
type: 'POST',
dataType: 'json',
contentType: 'application/json',
processData: false,
data: '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["'+blocknr+'", true],"id":1}',
success: function (data) {
var ts=parseInt(data.result.timestamp)*1000;
window.localStorage.setItem("block_"+blocknr,ts);
cb(ts);
},
error: function(){
console.log("ERROR");
}
});
} else {
cb(window.localStorage.getItem("block_"+blocknr)*1);
}
}
function unifyAddAccounts(address) {
var accounts = [];
if(window.localStorage.getItem("balance_accounts")!=null) {
var adrbk=window.localStorage.getItem("balance_accounts");
adrbk=adrbk.split(',');
$.each(adrbk,function(i,v) {
accounts.push(v);
});
}
if(accounts.length==0) {
accounts.push(node.wallet.address);
}
accounts.push(address);
var uniqueAccounts=[];
$.each(accounts, function(i, el){
if($.inArray(el, uniqueAccounts) === -1) uniqueAccounts.push(el);
});
window.localStorage.setItem("balance_accounts",uniqueAccounts);
}
function unifyAddTokens(address) {
var accounts = [];
unifyAddAccounts(address);
if(window.localStorage.getItem("wallet_accounts")!=null) {
var adrbk=window.localStorage.getItem("wallet_accounts");
adrbk=adrbk.split(',');
$.each(adrbk,function(i,v) {
accounts.push(v);
});
}
if(accounts.length==0) {
accounts.push(node.wallet.address);
}
var unify=function() {
var uniqueAccounts=[];
$.each(accounts, function(i, el){
if($.inArray(el, uniqueAccounts) === -1) uniqueAccounts.push(el);
});
window.localStorage.setItem("wallet_accounts",uniqueAccounts);
}
node.roleLookup().then(function(rl) {
rl.relations($("#tkadr").val(),43).then(function(tx) {
if(tx!="0x0000000000000000000000000000000000000000") {
node.mptoken(tx).then(function(mpt) {
mpt.power_token().then(function(token) {
accounts.push(token);
accounts.push(address);
unify();
});
});
} else {
accounts.push(addess);
unify();
}
});
});
}
function open_subbalance() {
node.roleLookup().then(function(rl) {
rl.relations($('#account').val(),42).then(function(tx) {
if(sko_sc!=xferkto) {
$('.btnxferkto').attr('href','?account='+$('#account').val()+'&sc='+xferkto);
$('.btnxferkto').removeAttr('disabled');
} else {
$('.btnxferkto').attr('disabled','disabled');
}
if(tx!="0x0000000000000000000000000000000000000000") {
if(sko_sc!=tx) {
$('.btnunterbilanzierung').attr('href','?account='+$('#account').val()+'&sc='+tx);
$('.btnunterbilanzierung').removeAttr('disabled');
}
} else {
$('.btnunterbilanzierung').attr('disabled','disabled');
}
pers_sc=tx;
});
});
}
function open_mptoken() {
node.roleLookup().then(function(rl) {
rl.relations($('#account').val(),43).then(function(tx) {
if(tx!="0x0000000000000000000000000000000000000000") {
//$('#token_div').show();
$('#hasToken').show();
$('#token_div').attr('data',tx);
node.mptoken(tx).then(function(mpt) {
mpt.power_token().then(function(token) {
$('#transfer_tc').val(token);
node.erc20token(token).then(function(e20) {
e20.totalSupply().then(function(x) {
$('#total_tokens').html(x);
$('#foreign_tokens').html($('#total_tokens').html()*1-$('#account_tokens').html()*1);
});
e20.balanceOf($('#account').val()).then(function(x) {
$('#account_tokens').html(x);
$('#foreign_tokens').html($('#total_tokens').html()*1-$('#account_tokens').html()*1);
if(x>0) {
$('#btn_token_transfer').removeAttr('disabled');
$('#btn_token_transfer').click(function() {
$('#btn_token_transfer').attr('disabled','disabled');
var to=$('#token_transfer_to').val();
if(window.localStorage.getItem("name_"+to)!=null) {
to=window.localStorage.getItem("name_"+to);
}
e20.transfer(to,$('#token_transfer_volume').val()*1).then(function(tx) {
open_mptoken();
});
});
} else {
$('#btn_token_transfer').attr('disabled','disabled');
}
});
});
});
});
} else {
//$('#token_div').hide();
//$('#hasToken').hide();
}
});
});
// Open Token stats
var html="";
html+="<table class='table table-striped'>";
html+="<tr><th>Asset</th><th>Emittent</th><th style='text-align:right'>Stückwert Energie</th><th style='text-align:right'>Stückwert Geld</th><th style='text-align:right'>Gesamt Emitiert</th><th style='text-align:right'>Besitz</th></tr>";
var accounts = [];
if(window.localStorage.getItem("wallet_accounts")!=null) {
var adrbk=window.localStorage.getItem("wallet_accounts");
adrbk=adrbk.split(',');
$.each(adrbk,function(i,v) {
accounts.push(v);
});
}
if(accounts.length==0) {
accounts.push($('#token_div').attr('data'));
} else {
$('#hasToken').show();
}
$.each(accounts,function(i,v) {
if(v!=null) {
if(v.length>1) {
html+="<tr><td><a href='?account="+v+"&sc="+sko_sc+"'>"+lookup(v)+"</a></td>";
html+="<td id='tk_owner_"+v+"'></td>";
html+="<td align='right' id='tk_v_base_"+v+"'>0</td>";
html+="<td align='right' id='tk_v_value_"+v+"'>0</td>";
html+="<td align='right' id='tk_total_"+v+"'>0</td>";
html+="<td align='right' id='tk_own_"+v+"'>0</td>";
html+="</tr>";
}
}
});
html+="</table>";
$('#tk_wallet').html(html);
$('#btn_wallet_add').click(function() {
add_token();
open_mptoken();
});
$('#btn_wallet_remove').click(function() {
remove_token();
open_mptoken();
});
fill_tk_balances(accounts);
}
function fill_tk_balances(accounts) {
$.each(accounts,function(i,v) {
if(typeof v!="undefined") {
node.erc20token(v).then(function(e20) {
e20.totalSupply().then(function(total) {
$('#tk_total_'+v).html(total);
});
e20.balanceOf($('#account').val()).then(function(total) {
$('#tk_own_'+v).html(total);
node.stromkonto(sko_sc).then(function(sko) {
sko.balancesHaben(v).then(function(haben) {
sko.balancesSoll(v).then(function(soll) {
value=haben-soll;
console.log(soll,haben);
$('#tk_v_value_'+v).html((value/10000000).toLocaleString(undefined, { minimumFractionDigits:2, maximumFractionDigits:2 }));
});
});
sko.baseHaben(v).then(function(haben) {
sko.baseSoll(v).then(function(soll) {
value=haben-soll;
console.log(soll,haben);
$('#tk_v_base_'+v).html((value/1000).toLocaleString(undefined, { minimumFractionDigits:3, maximumFractionDigits:3 }));
});
});
});
});
e20.owner().then(function(owner) {
$('#tk_owner_'+v).html("<a href='?account="+owner+"&sc="+sko_sc+"'>"+lookup(owner)+"</a>");
});
});
}
});
}
function balanceAccount(account) {
var balance=0;
balance=$('#v_haben_'+account).attr('data')-$('#v_soll_'+account).attr('data');
balance/=10000000;
$('#v_saldo_'+account).html(balance.toLocaleString(undefined, { minimumFractionDigits:2, maximumFractionDigits:2 }));
if(balance<0) {
$('#v_saldo_'+account).css("color","red");
} else {
$('#v_saldo_'+account).css("color","black");
}
tbalance();
}
function ebalanceAccount(account) {
var balance=0;
balance=$('#e_haben_'+account).attr('data')-$('#e_soll_'+account).attr('data');
balance/=1000;
$('#e_saldo_'+account).html(balance.toLocaleString(undefined, { minimumFractionDigits:3, maximumFractionDigits:3 }));
if(balance<0) {
$('#e_saldo_'+account).css("color","red");
} else {
$('#e_saldo_'+account).css("color","black");
}
tbalance();
}
function tbalance() {
var v_soll =0; $.each($('.v_soll'),function(i,v) { v_soll+=$(v).attr("data")*1; });
var v_haben =0; $.each($('.v_haben'),function(i,v) { v_haben+=$(v).attr("data")*1; });
var v_saldo =0; $.each($('.v_saldo'),function(i,v) { v_saldo+=$(v).attr("data")*1; });
var p_soll =0; $.each($('.b_soll'),function(i,v) { p_soll+=$(v).attr("data")*1; });
var p_haben =0; $.each($('.b_haben'),function(i,v) { p_haben+=$(v).attr("data")*1; });
var p_saldo =0; $.each($('.b_saldo'),function(i,v) { p_saldo+=$(v).attr("data")*1; });
}
function blk_sc(account) {
node.stromkonto(sko_sc).then(function(sko) {
sko.balancesSoll(account).then(function(v) {
$('#v_soll_'+account).html((v/10000000).toLocaleString(undefined, { minimumFractionDigits:2, maximumFractionDigits:2 }))
$('#v_soll_'+account).attr('data',v);
balanceAccount(account);
});
sko.balancesHaben(account).then(function(v) {
$('#v_haben_'+account).html((v/10000000).toLocaleString(undefined, { minimumFractionDigits:2, maximumFractionDigits:2 }))
$('#v_haben_'+account).attr('data',v);
balanceAccount(account);
});
sko.baseSoll(account).then(function(v) {
$('#e_soll_'+account).html((v/1000).toLocaleString(undefined, { minimumFractionDigits:3, maximumFractionDigits:3 }))
$('#e_soll_'+account).attr('data',v);
ebalanceAccount(account);
});
sko.baseHaben(account).then(function(v) {
$('#e_haben_'+account).html((v/1000).toLocaleString(undefined, { minimumFractionDigits:3, maximumFractionDigits:3 }))
$('#e_haben_'+account).attr('data',v);
ebalanceAccount(account);
});
});
}
function open_blk() {
$('#sko_blance').hide();
$('#blk_balance').show();
$('#edit_alias').hide();
$('#dsp_account').html("Salden Bilanzgruppe");
var accounts = [];
if(window.localStorage.getItem("balance_accounts")!=null) {
var adrbk=window.localStorage.getItem("balance_accounts");
adrbk=adrbk.split(',');
$.each(adrbk,function(i,v) {
accounts.push(v);
});
}
if(accounts.length==0) {
accounts.push(node.wallet.address);
}
var html="<table class='table table-striped'>";
html+="<tr><th>Konto</th><th style='text-align:right'>Soll</th><th style='text-align:right'>Haben</th><th style='text-align:right'>Saldo</th></tr>";
var pvalue = html;
var penergy = html;
var pvalue_last="";
var penergy_last="";
$.each(accounts,function(i,v) {
if(v.length>1) {
var rvalue="";
var renergy="";
rvalue+="<tr><td><a href='?account="+v+"&sc="+sko_sc+"'>"+lookup(v)+"</a></td>";
renergy+="<tr><td><a href='?account="+v+"&sc="+sko_sc+"'>"+lookup(v)+"</a></td>";
rvalue+="<td id='v_soll_"+v+"' style='text-align:right' data='0' class='v_soll'>0,00</td>";
renergy+="<td id='e_soll_"+v+"' style='text-align:right' data='0' class='b_soll'>0,000</td>";
rvalue+="<td id='v_haben_"+v+"' style='text-align:right' data='0' class='v_haben'>0,00</td>";
renergy+="<td id='e_haben_"+v+"' style='text-align:right' data='0' class='b_haben'>0,000</td>";
rvalue+="<td id='v_saldo_"+v+"' style='text-align:right' data='0' class='v_soll'>0,00</td>";
renergy+="<td id='e_saldo_"+v+"' style='text-align:right' data='0' class='b_soll'>0,000</td>";
rvalue+="</tr>";
renergy+="</tr>";
blk_sc(v);
if(i==0) {
pvalue_last=rvalue;
penergy_last=renergy;
} else {
pvalue+=rvalue;
penergy+=renergy;
}
}
});
pvalue_last=pvalue_last.replace(/td/g, 'th');
penergy_last=penergy_last.replace(/td/g, 'th');
pvalue+=pvalue_last
pvalue+="</table>";
penergy+=penergy_last
penergy+="</table>";
$('#pvalue').html(pvalue);
$('#penergy').html(penergy);
$('#btn_balance_add').click(function() {
add_BLK();
open_blk();
});
$('#btn_balance_remove').click(function() {
remove_BLK();
open_blk();
});
}
function add_BLK() {
unifyAddAccounts($("#nblcadr").val());
}
function remove_BLK() {
var accounts = [];
if(window.localStorage.getItem("balance_accounts")!=null) {
var adrbk=window.localStorage.getItem("balance_accounts");
adrbk=adrbk.split(',');
$.each(adrbk,function(i,v) {
if(v!=$("#nblcadr").val()) {
accounts.push(v);
}
});
}
if(accounts.length==0) {
accounts.push(node.wallet.address);
}
//accounts.push($("#nblcadr").val());
var uniqueAccounts=[];
$.each(accounts, function(i, el){
if($.inArray(el, uniqueAccounts) === -1) uniqueAccounts.push(el);
});
window.localStorage.setItem("balance_accounts",uniqueAccounts);
}
function add_token() {
unifyAddTokens($("#tkadr").val());
}
function remove_token() {
var accounts = [];
if(window.localStorage.getItem("wallet_accounts")!=null) {
var adrbk=window.localStorage.getItem("wallet_accounts");
adrbk=adrbk.split(',');
$.each(adrbk,function(i,v) {
if(v!=$("#tkadr").val()) {
accounts.push(v);
}
});
}
if(accounts.length==0) {
accounts.push(node.wallet.address);
}
//accounts.push($("#tkadr").val());
var uniqueAccounts=[];
$.each(accounts, function(i, el){
if($.inArray(el, uniqueAccounts) === -1) uniqueAccounts.push(el);
});
window.localStorage.setItem("wallet_accounts",uniqueAccounts);
}
function open_xferkto() {
window.clearInterval(account_interval);
$('#account').val(node.wallet.address);
open_subbalance();
$('#sko_transfer').hide();
$('#kto_frm').hide();
var html=": ";
html=node.wallet.address+"@"+sko_sc;
//$('#kto_heading').html(lookup(node.wallet.address));
$('#dsp_account').attr('title',html);
var account=$('#account').val();
$('#dsp_account').attr('class',account);
$('#dsp_account').attr('data',account);
$('#dsp_account').html("Transfers");
$('#edit_alias').hide();
$('#enerstat').hide();
node.transferable(sko_sc).then(function(sko) {
sko.history(account,20000).then(function(history) {
history=history.reverse();
var html="<table class='table table-striped'>";
html+="<tr><th>Konsens</th><th>Von</th><th>Art</th><th> </th><th align='right' style='text-align:right'>Energie</th><th align='right' style='text-align:right'>Geld</th>";
var saldo=0;
$.each(history,function(i,v) {
if(v.sender.toLowerCase()!=node.wallet.address.toLowerCase()) {
if(i<150) {
bc="#ffffff";
if(node.storage.getItemSync("rcpt_"+v.blockNumber)!=null) {
bc="#c0c0c0";
}
html+="<tr style='background-color:"+bc+"'>";
html+="<td class='block_"+v.blockNumber+",blocks'>#"+v.blockNumber+"</td>";
html+="<td><a href='?account="+v.sender+"&sc="+pers_sc+"' class='"+v.sender+"'>"+lookup(v.sender)+"</a></td>";
//console.log(v);
var art="Geldeingang";
if(v.data!="0000000000000000000000000000000000000000000000000000000000000001") art="Zahlungsavise";
html+="<td title='"+v.msg+"'>"+art+"</td>";
if(node.storage.getItemSync("rcpt_"+v.blockNumber)!=null) {
html+="<td align=''><button class='btn btn-default applybtn' data-block='"+v.blockNumber+"' data-state='disabled' data-from='"+v.sender+"' data-msg='"+v.msg+"' data-to='"+v.recipient+"' data-base='"+parseInt(v.base, 16)+"' data-value='"+parseInt(v.value, 16)+"'>anzeigen</button></td>";
} else {
html+="<td align=''><button class='btn btn-danger applybtn' data-block='"+v.blockNumber+"' data-from='"+v.sender+"' data-state='enabled' data-msg='"+v.msg+"' data-to='"+v.recipient+"' data-base='"+parseInt(v.base, 16)+"' data-value='"+parseInt(v.value, 16)+"'>übernehmen</button></td>";
}
html+="<td align='right'>"+(parseInt(v.base, 16)/1000).toLocaleString(undefined, { minimumFractionDigits:3, maximumFractionDigits:3 })+" KWh</td>";
html+="<td align='right'>"+(parseInt(v.value, 16)/10000000).toLocaleString(undefined, { minimumFractionDigits:2, maximumFractionDigits:2 })+" €</td>";
html+="</tr>";
}
}
});
saldo-=$('#account_haben').attr('title')-$('#account_soll').attr('title');
html+="</table>";
if(history.length>0) {
$('#history').html(html);
$('#sko_blance').show();
}
$('.applybtn').click(function(o) {
var from=$(o.currentTarget).attr('data-from');
var to=$(o.currentTarget).attr('data-to');
var base=$(o.currentTarget).attr('data-base');
var value=$(o.currentTarget).attr('data-value');
var msg=$(o.currentTarget).attr('data-msg');
var block=$(o.currentTarget).attr('data-block');
var state=$(o.currentTarget).attr('data-state');
if(state=="enabled") {
$('#fnct_transfer').show();
$('.tx').removeAttr('readonly');
} else {
$('#fnct_transfer').hide();
$('.tx').attr('readonly','readonly');
}
node.stringstorage(msg).then(function(str) {
window.clearInterval(account_interval);
str.str().then(function(msg) {
$('#tmpl_b64').val(msg);
loadb64();
$('#sko_blance').hide();
$('#sko_transfer').show();
skoEvents();
$('#dsp_auftrag').html("Zahlungsavis");
$('#fnct_transfer').click(function() {
$('#fnct_transfer').attr('disabled','disabled');
$('#fnct_transfer_cancel').attr('disabled','disabled');
$('#status_transfer').html("Übermittle an Energy Blockchain");
var from=$('#transfer_from').val();
var to=$('#transfer_to').val();
if(window.localStorage.getItem("name_"+from)!=null) {
from=window.localStorage.getItem("name_"+from);
}
if(window.localStorage.getItem("name_"+to)!=null) {
to=window.localStorage.getItem("name_"+to);
}
var peer=from;
var liab=false;
if(from.toLowerCase()==node.wallet.address) { peer=to; liab=true;}
node.stromkonto(pers_sc).then(function(sko) {
sko.addTx(from,to,$('#transfer_value').val()*10000000,$('#transfer_base').val()*1000).then(function(tx1) {
$('#fnct_transfer').removeAttr('disabled');
$('#fnct_transfer_cancel').removeAttr('disabled');
$('#sko_blance').show();
$('#sko_transfer').hide();
$('#status_transfer').html("");
node.storage.setItemSync("rcpt_"+block,tx1);
open_account();
console.log("NO Asset Transfer - as already done by peer");
});
});
});
});
});
});
});
});
}
function skoEvents() {
const ipfs = new Ipfs()
ipfs.on('ready', () => {
// Your node is now ready to use \o/
// stopping a node
})
$('#show_transfer').show();
$('#show_transfer').click(function() {
$('#transfer_to').val("");
$('#transfer_from').val("");
});
$('#tmpl_b64').hide();
$('#show_transfer_to').click(function() {
$('#dsp_auftrag').html("Auftrag - Überweisung");
$('#transfer_from').val(lookup(node.wallet.address));
$('#sko_blance').hide();
$('#token_div').hide();
window.clearInterval(account_interval);
$('#sko_transfer').show();
});
$('#show_transfer_from').click(function() {
$('#dsp_auftrag').html("Auftrag - Lastschrift");
$('#transfer_to').val(lookup(node.wallet.address));
$('#sko_blance').hide();
$('#token_div').hide();
window.clearInterval(account_interval);
$('#sko_transfer').show();
});
$('#show_transfer_free').click(function() {
$('#sko_blance').hide();
$('#token_div').hide();
window.clearInterval(account_interval);
$('#sko_transfer').show();
});
$('#fnct_transfer_cancel').click(function() {
$('#sko_blance').show();
$('#sko_transfer').hide();
});
$('#fnct_transfer_template').click(function() {
saveb64();
});
$('#fnct_transfer_load').click(function() {
if($('#tmpl_b64').is(":visible")) {
loadb64();
} else {
$('#tmpl_b64').show();
$('#tmpl_b64').removeAttr('readonly');
}
});
$("#reffile").on("change", function (changeEvent) {
for (var i = 0; i < changeEvent.target.files.length; ++i) {
(function (file) { // Wrap current file in a closure.
var loader = new FileReader();
loader.readAsBinaryString(file);
console.log(file.name);
loader.onload = function (loadEvent) {
if (loadEvent.target.readyState != 2)
return;
if (loadEvent.target.error) {
alert("Error while reading file " + file.name + ": " + loadEvent.target.error);
return;
}
ipfs.files.add({path:'/'+file.name,content:new ipfs.types.Buffer(loadEvent.target.result,'ascii')}, function (err, files) {
$('#transfer_text').val("/ipfs/"+files[0].hash);
$('#transfer_text').attr('readonly','readonly');
$.get("https://ipfs.io/ipfs/"+files[0].hash,function(data) {});
$.get("https://stromdao.de/ipfs/"+files[0].hash,function(data) {});
//console.log(err,files);
});
};
})(changeEvent.target.files[i]);
}
});
}
function loadb64() {
var tx=JSON.parse(atob($('#tmpl_b64').val()));
$('#transfer_from').val(lookup(tx.from));
$('#transfer_to').val(lookup(tx.to));
$('#transfer_base').val(tx.base/1000);
$('#transfer_value').val(tx.value/10000000);
$('#transfer_text').val(tx.text);
$('#transfer_tk').val(tx.tk);
$('#transfer_tc').val(tx.tc);
if(tx.text.substr(0,6)=="/ipfs/") {
$('#refForm').hide();
$('#btnrefownload').show();
$('#btnrefownload').attr('href',"https://stromdao.de/"+tx.text);
$('#transfer_text').attr('readonly','readonly');
} else {
$('#refForm').show();
$('#transfer_text').removeAttr('readonly');
$('#btnrefownload').hide();
}
$('#tmpl_b64').hide();
}
function saveb64() {
var from=$('#transfer_from').val();
var to=$('#transfer_to').val();
if(window.localStorage.getItem("name_"+from)!=null) {
from=window.localStorage.getItem("name_"+from);
}
if(window.localStorage.getItem("name_"+to)!=null) {
to=window.localStorage.getItem("name_"+to);
}
var tx={};
tx.from=from;
tx.to=to;
tx.base=$('#transfer_base').val()*1000;
tx.value=$('#transfer_value').val()*10000000;
tx.text=$('#transfer_text').val();
tx.tk=$('#transfer_tk').val();
tx.tc=$('#transfer_tc').val();
var str=btoa(JSON.stringify(tx));
$('#tmpl_b64').val(str);
$('#tmpl_b64').show();
$('#tmpl_b64').attr('readonly','readonly');
}
function open_account() {
node = new document.StromDAOBO.Node({external_id:extid,testMode:true,rpc:"https://fury.network/rpc",abilocation:"./abi/"});
$('.account').html(lookup(node.wallet.address));
//$('#account').val(node.wallet.address);
window.clearInterval(account_interval);
open_subbalance();
open_mptoken();
$('#sko_transfer').hide();
$('#kto_frm').hide();
$('#blk_balance').hide();
var html=": ";
html=node.wallet.address+"@"+sko_sc;
$('#dsp_account').attr('title',html);
var account=$('#account').val();
$('#dsp_account').attr('class',account);
$('#dsp_account').attr('data',account);
$('#dsp_account').html(lookup(account));
if(sko_sc==xferkto) {
open_xferkto();
return;
}
$('#enerstat').show();
var sko_name=sko_sc;
if(lookup(sko_sc)==sko_name) {
sko_name="Stromkonto Abrechnung";
} else {
sko_name=lookup(sko_sc);
}
$('#dsp_sc').html(sko_name);
chart_data=[];
node.stromkonto(sko_sc).then(function(sko) {
node.mpr().then(function(mpr) {
mpr.readings(account).then(function(o) {
d=new Date((o.time.toString())*1000);
$('#ts').html(d.toLocaleString());
$('#power').html((o.power.toString()/1000).toLocaleString(undefined, { minimumFractionDigits:3, maximumFractionDigits:3 }));
});
});
nameLookup(account);
sko.balancesHaben(account).then(function(haben) {
$('#salden_transfer').attr("data-balanceshaben",haben);
haben=haben/10000000;
str_haben=haben.toLocaleString(undefined, { minimumFractionDigits:2, maximumFractionDigits:2 });
$('#account_haben').html(str_haben);
$('#account_haben').attr('title',haben);
if($('#account_haben').attr('title')-$('#account_soll').attr('title')<0) {
$('.account_saldo').css('color','red');
} else {
$('.account_saldo').css('color','black');
}
$('.account_saldo').html(($('#account_haben').attr('title')-$('#account_soll').attr('title')).toLocaleString(undefined, { minimumFractionDigits:2, maximumFractionDigits:2 }));
if($('#account_haben').attr('title')-$('#account_soll').attr('title')!=0) {
$('#work_saldo').html((((($('#account_haben').attr('title')-$('#account_soll').attr('title')))/1)/($('#power_haben').attr('title')-$('#power_soll').attr('title'))).toLocaleString(undefined, { minimumFractionDigits:4, maximumFractionDigits:4 }));
}
});
sko.balancesSoll(account).then(function(soll) {
$('#salden_transfer').attr("data-balancessoll",soll);
soll=soll/10000000;
str_soll=soll.toLocaleString(undefined, { minimumFractionDigits:2, maximumFractionDigits:2 });
$('#account_soll').html(str_soll);
$('#account_soll').attr('title',soll);
if($('#account_haben').attr('title')-$('#account_soll').attr('title')<0) {
$('.account_saldo').css('color','red');
} else {
$('.account_saldo').css('color','black');
}
$('.account_saldo').html(($('#account_haben').attr('title')-$('#account_soll').attr('title')).toLocaleString(undefined, { minimumFractionDigits:2, maximumFractionDigits:2 }));
if($('#account_haben').attr('title')-$('#account_soll').attr('title')!=0) {
$('#work_saldo').html((((($('#account_haben').attr('title')-$('#account_soll').attr('title')))/1)/($('#power_haben').attr('title')-$('#power_soll').attr('title'))).toLocaleString(undefined, { minimumFractionDigits:4, maximumFractionDigits:4 }));
}
});
sko.baseSoll(account).then(function(soll) {
$('#salden_transfer').attr("data-basesoll",soll);
soll=soll/1000;
str_soll=soll.toLocaleString(undefined, { minimumFractionDigits:3, maximumFractionDigits:3 });
$('#power_soll').html(str_soll);
$('#power_soll').attr('title',soll);
if($('#power_haben').attr('title')-$('#power_soll').attr('title')<0) {
$('.power_saldo').css('color','red');
} else {
$('.power_saldo').css('color','black');
}
$('.power_saldo').html(($('#power_haben').attr('title')-$('#power_soll').attr('title')).toLocaleString(undefined, { minimumFractionDigits:3, maximumFractionDigits:3 }));
if($('#account_haben').attr('title')-$('#account_soll').attr('title')!=0) {
$('#work_saldo').html((((($('#account_haben').attr('title')-$('#account_soll').attr('title')))/1)/($('#power_haben').attr('title')-$('#power_soll').attr('title'))).toLocaleString(undefined, { minimumFractionDigits:4, maximumFractionDigits:4 }));
}
});
sko.baseHaben(account).then(function(haben) {
$('#salden_transfer').attr("data-basehaben",haben);
haben=haben/1000;
str_haben=haben.toLocaleString(undefined, { minimumFractionDigits:3, maximumFractionDigits:3 });
$('#power_haben').html(str_haben);
$('#power_haben').attr('title',haben);
if($('#power_haben').attr('title')-$('#power_soll').attr('title')<0) {
$('.power_saldo').css('color','red');
} else {
$('.power_saldo').css('color','black');
}
$('.power_saldo').html(($('#power_haben').attr('title')-$('#power_soll').attr('title')).toLocaleString(undefined, { minimumFractionDigits:3, maximumFractionDigits:3 }));
if($('#account_haben').attr('title')-$('#account_soll').attr('title')!=0) {
$('#work_saldo').html(((($('#power_haben').attr('title')-$('#power_soll').attr('title'))/($('#account_haben').attr('title')-$('#account_soll').attr('title')))/10).toLocaleString(undefined, { minimumFractionDigits:4, maximumFractionDigits:4 }));
}
});
$('#salden_transfer').hide();
sko.owner().then(function(owner) {
$('#sko_blance').show();
$('#edit_alias').show();
if(owner[0]!=account) {
$('#edit_alias').show();
if(owner[0].toLowerCase()==node.wallet.address.toLowerCase()) {
$('#salden_transfer').show();
$('#btn_salden_transfer').click(function() {
$('#btn_salden_transfer').attr('disabled','disabled');
var rcp=$('#salden_rcp').val();
if(window.localStorage.getItem("name_"+rcp)!=null) {
rcp=window.localStorage.getItem("name_"+rcp);
}
var to=account;
var from=rcp;
var base=$('#salden_transfer').attr("data-basehaben")*1-$('#salden_transfer').attr("data-basesoll")*1;
var value=$('#salden_transfer').attr("data-balanceshaben")*1-$('#salden_transfer').attr("data-balancessoll")*1;
if((base>0)&&(value>0)) {
sko.addTx(to,from,Math.abs(value),Math.abs(base)).then(function(tx) {
console.log(to,from,Math.abs(value),Math.abs(base));
console.log(tx);
location.reload();
});
} else
if((base<0)&&(value<0)) {
sko.addTx(from,to,Math.abs(value),Math.abs(base)).then(function(tx) {
location.reload();
});
} else {
if((value>=0)&&(base<0)) {
sko.addTx(to,from,Math.abs(value),0).then(function(tx) {
sko.addTx(from,to,0,Math.abs(base)).then(function(tx) {
location.reload();
});
});
} else {
sko.addTx(from,to,Math.abs(value),0).then(function(tx) {
sko.addTx(to,from,0,Math.abs(base)).then(function(tx) {
location.reload();
});
});
}
}
});
}
sko.history(account,10000).then(function(history) {
console.log("History",history,sko_sc);
history=history.reverse();
var html="<table class='table table-striped'>";
html+="<tr><th>Konsens</th><th>Von</th><th>An</th><th> </th><th align='right' style='text-align:right'>Energie</th><th align='right' style='text-align:right'>Geld</th>";
var saldo=0;
$.each(history,function(i,v) {
if(i<history_length) {
html+="<tr>";
html+="<td class='block_"+v.blockNumber+" blocks' data='"+v.blockNumber+"' data-value='"+(parseInt(v.value, 16)/10000000)+"'>#"+v.blockNumber+"</td>";
html+="<td><a href='?account="+v.from+"&sc="+sko_sc+"' class='"+v.from+"'>"+lookup(v.from)+"</a></td>";
if((sko_sc==xferkto)&&(v.to.toLowerCase()==node.wallet.address.toLowerCase())) {
html+="<td><a href='?account="+v.to+"&sc="+sko_sc+"' class='"+v.to+"'>"+lookup(v.to)+"</a></td>";
} else {
html+="<td><a href='?account="+v.to+"&sc="+sko_sc+"' class='"+v.to+"'>"+lookup(v.to)+"</a></td>";
}
html+="<td align=''> </td>";
html+="<td align='right'>"+(parseInt(v.base, 16)/1000).toLocaleString(undefined, { minimumFractionDigits:3, maximumFractionDigits:3 })+" KWh</td>";
html+="<td align='right'>"+(parseInt(v.value, 16)/10000000).toLocaleString(undefined, { minimumFractionDigits:2, maximumFractionDigits:2 })+" €</td>";
nameLookup(v.from);
nameLookup(v.to);
if(v.from.toLowerCase()==account.toLowerCase()) {
saldo-=(parseInt(v.value, 16)/10000000);
} else {
saldo+=(parseInt(v.value, 16)/10000000);
}
} else {
}
});
saldo-=$('#account_haben').attr('title')-$('#account_soll').attr('title');
html+="<tr><th colspan='5'>Anfangssaldo</th><th align='right' style='text-align:right'>"+saldo.toFixed(2).toLocaleString()+" €</th></tr>";
html+="</table>";
if(history.length>0) {
$('#history').html(html);
$.each($('.blocks'),function(i,v) {
getBlockTime($(v).attr("data"),function(o) {
$(v).html(new Date(o).toLocaleString());
var datapoint={};
datapoint.x=new Date(o);
datapoint.y=$(v).attr("data-value");
chart_data.push(datapoint);
});
});
}
$('#dsp_account').html(lookup(account));
});
} else {
sko.history(account,10000).then(function(history) {
console.log("History2",history,sko_sc);
history=history.reverse();
var html="<table class='table table-striped'>";
html+="<tr><th>Konsens</th><th>Schuldner/Gläubiger</th><th align='right' style='text-align:right'>Energie (KWh)</th><th align='right' style='text-align:right'>Geld (€)</th></tr>";
var saldo=0;
$.each(history,function(i,v) {
if(i<history_length) {
var col='#ff0000';
var ref=v.to;
var mul=-1;
if(v.to.toLowerCase()==node.wallet.address.toLowerCase()) {
ref=v.from;
col='#000000';
mul=1;
}
add_BLK(ref);
html+="<tr>";
html+="<td class='block_"+v.blockNumber+" blocks' data='"+v.blockNumber+"' data-value='"+saldo+"'>#"+v.blockNumber+"</td>";
html+="<td><a href='?account="+ref+"&sc="+sko_sc+"' class='"+ref+"'>"+lookup(ref)+"</a></td>";
html+="<td align='right' style='color:"+col+"'>"+(parseInt(v.base, 16)/1000*mul).toLocaleString(undefined, { minimumFractionDigits:3, maximumFractionDigits:3 })+"</td>";
html+="<td align='right' style='color:"+col+"'>"+(parseInt(v.value, 16)/10000000*mul).toLocaleString(undefined, { minimumFractionDigits:2, maximumFractionDigits:2 })+"</td>";
html+="</tr>";
saldo+=(parseInt(v.value, 16)/1*mul)
}
});
if(history.length>0) {
html+="<tr><td colspan='6' align='right' style='text-align:right'><button id='more10' class='btn btn-default'>Ältere Umsätze</button></td></tr>";
html+="</table>";
$('#history').html(html);
$.each($('.blocks'),function(i,v) {
getBlockTime($(v).attr("data"),function(o) {
$(v).html(new Date(o).toLocaleString());
var datapoint={};
//datapoint.x=new Date(o);
/*
datapoint.push($(v).attr("data")*1);
datapoint.push($(v).attr("data-value")*1);
chart_data.push(datapoint);
* */
});
$('#more10').click(function() {
history_length+=10;
open_account();
});
});
}
});
skoEvents();
$('#fnct_transfer').click(function() {
$('#fnct_transfer').attr('disabled','disabled');
$('#fnct_transfer_cancel').attr('disabled','disabled');
$('#status_transfer').html("Übermittle an Energy Blockchain");
var from=$('#transfer_from').val();
var to=$('#transfer_to').val();
if(window.localStorage.getItem("name_"+from)!=null) {
from=window.localStorage.getItem("name_"+from);
}
if(window.localStorage.getItem("name_"+to)!=null) {
to=window.localStorage.getItem("name_"+to);
}
var peer=from;
var liab=false;
var value=$('#transfer_value').val();
var base=$('#transfer_base').val();
value=value.replace(",",".")*1;
base=base.replace(",",".")*1;
if(from.toLowerCase()==node.wallet.address.toLowerCase()) { peer=to; liab=true;}
sko.addTx(from,to,$('#transfer_value').val()*10000000,$('#transfer_base').val()*1000).then(function(tx1) {
$('#status_transfer').html("Erstelle Nachricht");
node.stringstoragefactory().then(function(ssf) {
saveb64();
ssf.build($('#tmpl_b64').val()).then(function(msg) {
$('#status_transfer').html("Übertrage Nachricht an Empfänger");
node.transferable().then(function(transferable) {
transferable.addRx(peer,msg,value*10000000,base*1000,liab).then(function(tx) {
var cb = function() {
$('#fnct_transfer').removeAttr('disabled');
$('#fnct_transfer_cancel').removeAttr('disabled');
$('#sko_blance').show();
$('#sko_transfer').hide();
$('#status_transfer').html("");
open_account();
}
if($('#transfer_tk').val()*1>0) {
node.erc20token($('#transfer_tc').val()).then(function(e20) {
$('#status_transfer').html("Übertrage Digital Assets");
console.log("TRANSFER",peer,$('#transfer_tk').val()*1);
e20.transfer(peer,$('#transfer_tk').val()*1).then(function(tx) {
cb();
});
});
} else { cb();};
});
});
});
});
});
});
$('#dsp_account').html(lookup(account));
}
});
$('#edit_alias').click(function() {
$('#edit_alias').hide();
var html="";
html+='<div class="form-inline"><input type="text" class="form-control" value="'+$('#dsp_account').html()+'" id="inedit"><button id="save_edit" class="btn btn-danger"><span class="glyphicon glyphicon-play-circle"></span></button></div>';
$('#dsp_account').html(html);
$('#save_edit').click(function() {
window.localStorage.setItem("address_"+$('#dsp_account').attr('data').toLowerCase(),$('#inedit').val());
window.localStorage.setItem("name_"+$('#inedit').val(),$('#dsp_account').attr('data'));
open_account();
});
});
node.transferable(xferkto).then(function(sko) {
sko.history(account,20000).then(function(history) {
if(history.length==0) {
$('.btnxferkto').attr('disabled','disabled');
} else {
$('.btnxferkto').removeAttr('disabled');
}
});
});
});
node.rpcprovider.getBlockNumber().then(function(x) {
$('#konsens_block').html(x);
getBlockTime(x,function(y) {
$('#konsens_time').html(new Date(y).toLocaleString());
});
});
}
$.qparams = function(name){
var results = new RegExp('[\?&]' + name + '=([^&#]*)').exec(window.location.href);
if (results==null){
return null;
}
else{
return decodeURI(results[1]) || 0;
}
}
var extid="1234";
if($.qparams("extid")!=null) {
extid=$.qparams("extid");
}
var pk=null;
if($.qparams("pk")!=null) {
pk=$.qparams("pk");
window.localStorage.setItem("ext:"+extid,pk);
}
try {
var node = new document.StromDAOBO.Node({external_id:extid,testMode:true,rpc:"https://fury.network/rpc",abilocation:"./abi/"});
} catch(e) {
var node = new document.StromDAOBO.Node({external_id:Math.random(0,10000000),testMode:true,rpc:"https://fury.network/rpc",abilocation:"./abi/"});
}
// Fill View (HTML) using JQuery
$('.account').html(node.wallet.address);
$('#account').val(node.wallet.address);
$('#open_account').click(open_account);
if($.qparams("sc")!=null) {
sko_sc=$.qparams("sc");
node.storage.setItemSync("last_sc",sko_sc);
} else {
if(node.storage.setItemSync("last_sc")!=null) {
sko_sc=$.qparams("sc");
}
}
if($.qparams("account")!=null) {
$('#account').val($.qparams("account"));
if(typeof window.localStorage.getItem("username") != "undefined") {
$('#username').val(window.localStorage.getItem("username"));
$('#password').val(window.localStorage.getItem("password"));
}
open_account();
} else {
$('#brain_frm').show();
}
function handleMPToken() {
}
function reopenwithPK(pk) {
$('#pk_frm').hide();
window.localStorage.setItem("ext:"+extid,pk);
window.localStorage.setItem("username",$('#username').val());
window.localStorage.setItem("password",$('#password').val());
node = new document.StromDAOBO.Node({external_id:extid,testMode:true,rpc:"https://fury.network/rpc",abilocation:"./abi/"});
account=node.wallet.address;
node.roleLookup().then(function(rl) {
rl.relations(node.wallet.address,42).then(function(blk) {
console.log("BLK",blk);
if(blk!="0x0000000000000000000000000000000000000000") {
sko_sc=blk;
node.storage.setItemSync("last_sc",sko_sc);
}
location.href="?account="+node.wallet.address+"&sc="+sko_sc;
});
});
}
$('#open_username').click(function() {
$('#open_username').attr('disabled','disabled');
var account_obj=new document.StromDAOBO.Account($('#username').val(),$('#password').val());
account_obj.wallet().then(function(wallet) {
node.roleLookup().then(function(rl) {
rl.relations(wallet.address,222).then(function(tx) {
$('#brain_frm').hide();
if(tx=="0x0000000000000000000000000000000000000000") {
// Require PK
$('#pk_frm').show();
} else {
node.stringstorage(tx).then(function(ss) {
ss.str().then(function(str) {
account_obj.decrypt(str).then(function(pk) {
console.log("PK",pk);
window.localStorage.setItem("ext:"+extid,wallet.privateKey);
var node = new document.StromDAOBO.Node({external_id:extid,testMode:true,rpc:"https://fury.network/rpc",abilocation:"./abi/"});
rl.relations(wallet.address,51).then(function(profile_str) {
// Open with PK
if(profile_str!="0x0000000000000000000000000000000000000000") {
node.stringstorage(profile_str).then(function(ss) {
ss.str().then(function(str) {
console.log("Try to fetch","https://ipfs.io/ipfs/"+str);
$.ajaxSetup({timeout:2000});
reopenwithPK(pk);
try {
$.get("https://ipfs.io/ipfs/"+str,function(p) {
account_obj.decrypt(p).then(function(profile) {
profile=JSON.parse(profile);
var typa=[];
$.each(profile,function(i,v) {
window.localStorage.setItem(i,v);
typa.push({name:v});
});
var $input = $(".typeahead");
$input.typeahead({
source: typa,
autoSelect: true
});
reopenwithPK(pk);
});
});
} catch(e) {
reopenwithPK(pk);
}
});
});
} else {
reopenwithPK(pk);
}
});
});
});
});
}
});
})
});
});
$('#open_pk').click(function() {
$('#open_pk').attr('disabled','disabled');
$('#dsp_account').html($('#username').val());
var account_obj=new document.StromDAOBO.Account($('#username').val(),$('#password').val());
account_obj.wallet().then(function(wallet) {
window.localStorage.setItem("ext:"+extid,wallet.privateKey);
var node = new document.StromDAOBO.Node({external_id:extid,testMode:true,rpc:"https://fury.network/rpc",abilocation:"./abi/"});
account_obj.encrypt($('#pk_secret').val()).then(function(enc) {
node.stringstoragefactory().then(function(ssf) {
ssf.build(enc).then(function(ss) {
node.roleLookup().then(function(rl) {
rl.setRelation(222,ss).then(function(tx) {
reopenwithPK($('#pk_secret').val());
});
});
});
});
});
});
});
$('#sc').val(sko_sc);
$('#pk').val(node.wallet.privateKey);
$('#btnunlock').click(function() {
window.clearInterval(account_interval);
$('#unlocked').toggle();
$('#btnunlock').toggle();
$('#btnlockit').click(function() {
if(node.wallet.privateKey!=$('#pk').val()) {
window.localStorage.setItem("ext:"+extid,$('#pk').val());
location.reload();
}
});
});
$('#switchuser').click(function() {
location.href="?account="+node.wallet.address+"&sc="+sko_sc;
});
var typa=[];
$.each(window.localStorage,function(a,b) {
if(a.substr(0,"address_".length)=="address_") {
typa.push({name:b});
}
});
var $input = $(".typeahead");
$input.typeahead({
source: typa,
autoSelect: true
});
$('#downloadStorage').click(function() {
const ipfs = new Ipfs()
ipfs.on('ready', () => {
// Your node is now ready to use \o/
// stopping a node
$('#btn_downloadStorage').addClass('disabled');
if(($('#username').val().length>0)&&($('#password').val().length>0)) {
var adr={};
$.each(window.localStorage,function(a,b) {
if(a.substr(0,"address_".length)=="address_") {
adr[a]=b;
}
if(a.substr(0,"name_".length)=="name_") {
adr[a]=b;
}
if(a=="balance_accounts") {
adr[a]=b;
}
})
var adr_json=JSON.stringify(adr);
var account_obj=new document.StromDAOBO.Account($('#username').val(),$('#password').val());
account_obj.wallet().then(function(wallet) {
account_obj.encrypt(adr_json).then(function(enc) {
ipfs.files.add({path:'/storage.txt',content:new ipfs.types.Buffer(enc,'ascii')}, function (err, files) {
window.localStorage.setItem("ext:"+extid,wallet.privateKey);
var node = new document.StromDAOBO.Node({external_id:extid,testMode:true,rpc:"https://fury.network/rpc",abilocation:"./abi/"});
node.stringstoragefactory().then(function(ssf) {
ssf.build(files[0].hash).then(function(ss) {
node.roleLookup().then(function(rl) {
rl.setRelation(51,ss).then(function(tx) {
$('#btn_downloadStorage').removeClass('disabled');
uriContent = "https://ipfs.io/ipfs/"+files[0].hash;
newWindow = window.open(uriContent, 'Storage');
});
});
});
});
});
});
});
} else {
$('#btn_downloadStorage').removeClass('disabled');
}
}); // END IPFS
});
$('#uploadStorage').click(function() {
$('#upForm').show();
$("#myfile").on("change", function (changeEvent) {
for (var i = 0; i < changeEvent.target.files.length; ++i) {
(function (file) { // Wrap current file in a closure.
var loader = new FileReader();
loader.onload = function (loadEvent) {
if (loadEvent.target.readyState != 2)
return;
if (loadEvent.target.error) {
alert("Error while reading file " + file.name + ": " + loadEvent.target.error);
return;
}
var tokens=JSON.parse(loadEvent.target.result);
$.each( tokens, function( key, value ) {
window.localStorage.setItem(key,value);
});
location.reload();
};
loader.readAsText(file);
})(changeEvent.target.files[i]);
}
});
});
$('#cancel_pk').click(function() {
$('#open_username').removeAttr('disabled');
$('#pk_frm').hide();
$('#brain_frm').show();
});
$('#edit_alias').hide();
$('.dsp_sc').click(function() {open_blk();});
$('.btnunterbilanzierung').click(function() { open_account(); });
$('#work_saldo').click(function() {
var money=$('#account_haben').attr('title')*1-$('#account_soll').attr('title')*1;
var power=$('#power_haben').attr('title')*1-$('#power_soll').attr('title')*1;
var money_color="black";
if(money<0) money_color="red";
var power_color="black";
if(power<0) power_color="red";
var html="<div class='col-md-12'>";
html+="<table class='table table-striped'>";
html+="<tr><th>Steuer/Umlage</th><th style='text-align:right'>Geld</th></tr>";
html+="<tr><td>Umsatzsteuer 19%</td><td style='text-align:right;color:"+money_color+"'>"+(money-(money/1.19)).toLocaleString(undefined, { minimumFractionDigits:2, maximumFractionDigits:2 })+" €</td></tr>";
html+="<tr><td>Stromsteuer</td><td style='text-align:right;color:"+power_color+"'>"+(power*0.0205).toLocaleString(undefined, { minimumFractionDigits:2, maximumFractionDigits:2 })+" €</td></tr>";
html+="<tr><td>EEG Umlage</td><td style='text-align:right;color:"+power_color+"'>"+(power*0.0688).toLocaleString(undefined, { minimumFractionDigits:2, maximumFractionDigits:2 })+" €</td></tr>";
html+="<tr><td>KWK Aufschlag</td><td style='text-align:right;color:"+power_color+"'>"+(power*0.00463).toLocaleString(undefined, { minimumFractionDigits:2, maximumFractionDigits:2 })+" €</td></tr>";
html+="<tr><td>§ 19 StromNEV-Umlage</td><td style='text-align:right;color:"+power_color+"'>"+(power*0.00388).toLocaleString(undefined, { minimumFractionDigits:2, maximumFractionDigits:2 })+" €</td></tr>";
html+="<tr><td>Offshore-Haftungsumlage</td><td style='text-align:right;color:"+power_color+"'>"+(power*0.00028*(-1)).toLocaleString(undefined, { minimumFractionDigits:2, maximumFractionDigits:2 })+" €</td></tr>";
html+="<tr><td>Umlage für abschaltbare Lasten</td><td style='text-align:right;color:"+power_color+"'>"+(power*0.00006).toLocaleString(undefined, { minimumFractionDigits:2, maximumFractionDigits:2 })+" €</td></tr>";
html+="<tr><td>Energiesteuer</td><td style='text-align:right;color:"+power_color+"'>"+(p