NEWS
[FRAGE]Verbrauchsdaten aus Basis der Daten aus History Adapter
-
Hallo,
pünktlich zum Jahreswechsel will ich es endlich angehen, meine Verbrauchsdaten lieber aus den Daten des History-Adapters zu errechnen, statt selbst eine eigenen Objekt mit Daten mitlaufen zu lassen.
Ich habe in Github die Anleitung für das Auslesen der Daten gesehen: https://github.com/ioBroker/ioBroker.hi … pt-adapter
Meine Frage:
Hat jemand vielleicht schon ein Skript erstellt, das ich freundlicherweise nutzen kann und welches die Daten vom ersten des Monats 0:00 Uhr oder ersten des Jahres 0:00 Uhr oder heute 0:00 Uhr abfragt? Es geht nur um einen Datensatz (den frühesten des Tages), nicht um eine Reihe.
Ich bauen dann damit weiter.
Viele Grüße, guten Rutsch...
Pix
-
Wenn das auch mit einer Sql-Datenbank auf einer Synology funktioniert, würde mich dass auch brennend interessieren
Gesendet von meinem HUAWEI RIO-L01 mit Tapatalk
-
Hi,
ich htte mal 'ne Sammlung von SQL Statements angeregt und ein Beispiel gepostet:
http://forum.iobroker.net/viewtopic.php … 112#p98112
Gab aber wenig Feedback und ist im Sande verlaufen.
Ich nutze momentan dieses Skript
bin in Java Script nicht zuhause - es ist deshalb sicherlich nicht elegant - erfüllt aber seinen Zweck.
Es erstellt unter der benutzen JavaScript einen Objektbaum (heisst das so ??) für einige Statistiken.
@pix: Denke das ist nicht 100% das was du wolltest, aber ggf kannst du dir das benötigte ja rauspicken ...
Es werden keine Umrechnungen vorgenommen, da ich meine Counter-Werte immer auf kWh normiere wird alles in kWh
erwartet und angegeben.
Die Counter und deren Beschgreibung werden oben in zwei Arrays eingetragen
`// // Berechnet counter differenzen // var logging=true; // instanz und pfad var instanz="javascript."+instance+".Statistiken."; // wrapper Objekt für aktuellen Zaehlerstand // sind alle in kWh var wrapperobj='wrapper.1.Counter.'; var counter=[]; counter[0] ='pv-eigenverbrauch'; counter[1] ='pv-gesamtproduktion'; counter[2] ='hausnaschluss-abgabe'; counter[3] ='wallbox'; counter[4] ='hausnaschluss-bezug'; counter[5] ='waschmaschine'; counter[6] ='trockner'; counter[7] ='gasanschluss-bezug'; counter[8] ='gasbrenner-laufzeit'; counter[9] ='gasbrenner-starts'; var label=[]; label[0]='PV Eigenverbr.'; label[1]='PV Produktion'; label[2]='PV Einspeisung'; label[3]='Wallbox'; label[4]='Bezug aus Netz'; label[5]='Waschmaschine'; label[6]='Trockner'; label[7]='Gas'; label[8]='Brenner Laufzeit'; label[9]='Brenner Starts'; // // 12 Monats Statistik // var statistik12monate="12_Monate."; var namebez="12 Monate."; counter.forEach(function(element) { createState(instanz+statistik12monate+element, { name: namebez+' '+element, type: 'string', unit: 'kWh', }); }); // // 7 Tage Statistik // var statistik7tage="7_Tage."; var namebez="7 Tage"; counter.forEach(function(element) { log("7 Tage->"+element); createState(instanz+statistik7tage+element, { name: namebez+' '+element, type: 'string', unit: 'kWh', }); }); // seit Tagesanfang var statistik_anfangTag="seitTagesbeginn."; var namebez="seit Tagesbeginn"; counter.forEach(function(element) { createState(instanz+statistik_anfangTag+element, { name: namebez+' '+element, type: 'string', unit: 'kWh', }); }); var statistik_anfangWoche="seitWochenbeginn."; var namebez="seit Wochenbeginn"; counter.forEach(function(element) { createState(instanz+statistik_anfangWoche+element, { name: namebez+' '+element, type: 'string', unit: 'kWh', }); }); var statistik_anfangMonat="seitMonatsbeginn."; var namebez="seit Monatsbeginn"; counter.forEach(function(element) { createState(instanz+statistik_anfangMonat+element, { name: namebez+' '+element, type: 'string', unit: 'kWh', }); }); var statistik_anfangJahr="seitJahresbeginn."; var namebez="seit Jahresbeginn"; counter.forEach(function(element) { createState(instanz+statistik_anfangJahr+element, { name: namebez+' '+element, type: 'string', unit: 'kWh', }); }); createState(instanz+statistik_anfangTag+"pv-gesamtproduktion_proz", {name: "PV Anteil eigenverbrauch Tag", type: 'number', unit: '%'}); createState(instanz+statistik_anfangWoche+"pv-gesamtproduktion_proz", {name: "PV Anteil eigenverbrauch Woche", type: 'number', unit: '%'}); createState(instanz+statistik_anfangMonat+"pv-gesamtproduktion_proz", {name: "PV Anteil eigenverbrauch Monat", type: 'number', unit: '%'}); createState(instanz+statistik_anfangJahr+"pv-gesamtproduktion_proz", {name: "PV Anteil eigenverbrauch Jahr", type: 'number', unit: '%'}); schedule("23 * * * *", function () { counter.forEach(function(element) { var id=wrapperobj+element; // letzten 12 Monate var id_ergebnis=instanz+statistik12monate+element; tolog(logging,id+" -> "+id_ergebnis); statistiken_counter_12_monate(id,id_ergebnis); // letzten 7 Tage id_ergebnis=instanz+statistik7tage+element; tolog(logging,id+" -> "+id_ergebnis); statistiken_counter_7_tage(id,id_ergebnis); }); // 12 Monate Jan-Dez var count=0; counter.forEach(function(element) { var id=wrapperobj+element; statistiken_counter_jan_dez(id,count); count++; }); }); schedule("*/15 * * * *", function () { counter.forEach(function(element) { var id=wrapperobj+element; // seit Jahresanfang var jahresanfang=datum_jahresanfang(new Date()); id_ergebnis=instanz+statistik_anfangJahr+element; tolog(logging,id+" -> "+id_ergebnis); statistiken_differenz_seit_datum(id,id_ergebnis,jahresanfang); var eigen=getState("javascript."+instance+".Statistiken.seitJahresbeginn.pv-eigenverbrauch").val; var gesamt=getState("javascript."+instance+".Statistiken.seitJahresbeginn.pv-gesamtproduktion").val; var eigen_proz=round(Number((eigen/gesamt)*100),1); setState(instanz+statistik_anfangJahr+"pv-gesamtproduktion_proz",eigen_proz,true); // seit Monatsanfang var monatsanfang=datum_monatsanfang(new Date()); id_ergebnis=instanz+statistik_anfangMonat+element; tolog(logging,id+" -> "+id_ergebnis); statistiken_differenz_seit_datum(id,id_ergebnis,monatsanfang); eigen=getState("javascript."+instance+".Statistiken.seitMonatsbeginn.pv-eigenverbrauch").val; gesamt=getState("javascript."+instance+".Statistiken.seitMonatsbeginn.pv-gesamtproduktion").val; eigen_proz=round(Number((eigen/gesamt)*100),1); setState(instanz+statistik_anfangMonat+"pv-gesamtproduktion_proz",eigen_proz,true); // seit Wochenanfang var wochenanfang=datum_wochenanfang(new Date()); id_ergebnis=instanz+statistik_anfangWoche+element; tolog(logging,id+" -> "+id_ergebnis); statistiken_differenz_seit_datum(id,id_ergebnis,wochenanfang); eigen=getState("javascript."+instance+".Statistiken.seitWochenbeginn.pv-eigenverbrauch").val; gesamt=getState("javascript."+instance+".Statistiken.seitWochenbeginn.pv-gesamtproduktion").val; eigen_proz=round(Number((eigen/gesamt)*100),1); setState(instanz+statistik_anfangWoche+"pv-gesamtproduktion_proz",eigen_proz,true); // seit Tagesanfang var tagesanfang=datum_tagesanfang(new Date()); id_ergebnis=instanz+statistik_anfangTag+element; tolog(logging,id+" -> "+id_ergebnis); statistiken_differenz_seit_datum(id,id_ergebnis,tagesanfang); eigen=getState("javascript."+instance+".Statistiken.seitTagesbeginn.pv-eigenverbrauch").val; gesamt=getState("javascript."+instance+".Statistiken.seitTagesbeginn.pv-gesamtproduktion").val; eigen_proz=round(Number((eigen/gesamt)*100),1); setState(instanz+statistik_anfangTag+"pv-gesamtproduktion_proz",eigen_proz,true); }); }); function statistiken_differenz_seit_datum (id,id_ergebnis,datum) { var ergebnis; var myQuery="SELECT round((max(val)-min(val)),0) as delta \ FROM iobroker.ts_number WHERE id=(select id from iobroker.datapoints where name='"+id+"') \ AND (FROM_UNIXTIME(substring(ts,1,10)) >= '"+datum+"');"; //log(myQuery); sendTo('sql.0', 'query', myQuery, function (result) { if (result.error) { //log(result.error); } else { ergebnis=String(result.result[0].delta); tolog(logging,id_ergebnis+" -> "+ergebnis); setState(id_ergebnis,ergebnis,true); } }); } function statistiken_counter_7_tage (id,id_ergebnis) { var myQuery="SELECT CONCAT(MONTH(FROM_UNIXTIME(substring(ts,1,10))),'-', DAY(FROM_UNIXTIME(substring(ts,1,10)))) AS Tag, round(max(val)-min(val),0) AS Verbrauch \ FROM iobroker.ts_number WHERE id=(select id from iobroker.datapoints where name='"+id+"') \ AND FROM_UNIXTIME(substring(ts,1,10)) BETWEEN DATE_SUB(CURRENT_DATE(),INTERVAL 7 day) \ AND CURRENT_DATE() \ GROUP BY MONTH(FROM_UNIXTIME(substring(ts,1,10))),DAY(FROM_UNIXTIME(substring(ts,1,10))) \ ORDER BY MONTH(FROM_UNIXTIME(substring(ts,1,10))) , DAY(FROM_UNIXTIME(substring(ts,1,10))) ;"; sendTo('sql.0', 'query', myQuery, function (result) { if (result.error) { //log(result.error); } else { // show result setState(id_ergebnis,JSON.stringify(result.result),true); } }); } function statistiken_counter_12_monate (id,id_ergebnis) { var myQuery="SELECT CONCAT(YEAR(FROM_UNIXTIME(substring(ts,1,10))),'-', MONTH(FROM_UNIXTIME(substring(ts,1,10)))) AS Monat, round(max(val)-min(val),0) AS Verbrauch \ FROM iobroker.ts_number WHERE id=(select id from iobroker.datapoints where name='"+id+"') \ AND FROM_UNIXTIME(substring(ts,1,10)) BETWEEN DATE_SUB(CURRENT_DATE(),INTERVAL 12 month) \ AND CURRENT_DATE() \ GROUP BY YEAR(FROM_UNIXTIME(substring(ts,1,10))),MONTH(FROM_UNIXTIME(substring(ts,1,10))) \ ORDER BY YEAR(FROM_UNIXTIME(substring(ts,1,10))) , MONTH(FROM_UNIXTIME(substring(ts,1,10))) ;"; myQuery="SELECT DATE_FORMAT(FROM_UNIXTIME(substring(ts,1,10)),'%b') AS Monat, round(max(val)-min(val),0) AS Verbrauch \ FROM iobroker.ts_number WHERE id=(select id from iobroker.datapoints where name='"+id+"') \ AND FROM_UNIXTIME(substring(ts,1,10)) BETWEEN DATE_SUB(CURRENT_DATE(),INTERVAL 12 month) \ AND CURRENT_DATE() \ GROUP BY YEAR(FROM_UNIXTIME(substring(ts,1,10))),MONTH(FROM_UNIXTIME(substring(ts,1,10))) \ ORDER BY YEAR(FROM_UNIXTIME(substring(ts,1,10))) , MONTH(FROM_UNIXTIME(substring(ts,1,10))) ;"; //log("**"+myQuery); sendTo('sql.0', 'query', myQuery, function (result) { if (result.error) { log(result.error); } else { // show result setState(id_ergebnis,JSON.stringify(result.result),true); } }); } function statistiken_counter_jan_dez (id,count) { // // Jahr von Jan - Dez // var date=new Date(); var jahr=(date).getFullYear(); var statistik12monate_jan_dez="Monatswerte."+jahr+"."; var id_ergebnis=instanz+statistik12monate_jan_dez+counter[count]+"_json"; var namebez="monatliche Werte"; createState(id_ergebnis, { name: 'monatl. Werte '+label[count], type: 'string', unit: 'kWh', }); log("**"+id_ergebnis); var myQuery="SELECT YEAR(FROM_UNIXTIME(substring(ts,1,10))) AS Jahr, MONTH(FROM_UNIXTIME(substring(ts,1,10))) AS Monat, max(val)-min(val) AS Zaehlerdifferenz \ FROM iobroker.ts_number WHERE \ id=(select id from iobroker.datapoints where name='"+id+"') and \ YEAR(FROM_UNIXTIME(substring(ts,1,10)))=YEAR(Now()) GROUP BY Jahr,Monat ORDER BY Jahr, Monat ;"; myQuery="SELECT MONTH(FROM_UNIXTIME(substring(ts,1,10))) AS Monat, \ ROUND(max(val)-min(val),2) AS Zaehlerdifferenz FROM iobroker.ts_number \ WHERE id=(select id from iobroker.datapoints where name='"+id+"') \ and YEAR(FROM_UNIXTIME(substring(ts,1,10)))=YEAR(Now()) GROUP BY Monat ORDER BY Monat"; // log(myQuery); sendTo('sql.0', 'query', myQuery, function (result) { if (result.error) { //log(result.error); } else { // show result //log("**"+result.result); setState(id_ergebnis,JSON.stringify(result.result),true); } }); } // // Transformation der json für grafische auswertungen oder tabellen in vis // function werteAlsArray (id,id_ergebnis) { heute=new Date(); hJahr=heute.getFullYear(); hMonat=heute.getMonth() + 1; var ergebnis=[]; var werte=JSON.parse(id); var monate=[]; for (i=1; i<=12; i++) { datum=minusNmonate(hJahr,hMonat,1,i); var lMonat=datum.getMonth() + 1; var lJahr=datum.getFullYear(); var verbrauchszeitraum=lJahr+"-"+lMonat; var verbrauch=get_data_from_json(verbrauchszeitraum,id); monate.push("'"+verbrauchszeitraum+"'"); if (typeof verbrauch === "undefined") { verbrauch=0 ; } ergebnis.push(verbrauch); //log("**Verbrauch "+verbrauchszeitraum+":"+verbrauch); } ergebnis="["+String(ergebnis)+"]"; zeitraum="["+String(monate)+"]"; //log(zeitraum); //log(ergebnis); } function minusNmonate(year, month, day,diff){ var d = new Date(year, month - 1, day + 1); if (d.getMonth() + 1 != month){ d.setMonth(d.getMonth() - diff); d.setDate(0); } else{ d.setDate(1); d.setMonth(d.getMonth() - diff); var m = d.getMonth(); d.setDate(day); if(d.getMonth() != m) d.setDate(0); } return d; } function get_data_from_json (verbrauchszeitraum,json){ var werte=JSON.parse(json); for(var i = 0; i < werte.length; i++) { if(werte[i].Monat == verbrauchszeitraum) { verbrauch = werte[i].Verbrauch; return(verbrauch); } } }********` ******[/i][/i]******
-
Danke, ehome, ich sehe es mir an.
Pix
-
mir ist noch eingefallen, dass mein Skript ein paar, bei mir als global, definierte Funktionen nutzt:
function datum_jahresanfang (date) { return (date).getFullYear()+"-01-01"; } function datum_monatsanfang (date) { var monat=1+date.getMonth(); return (date).getFullYear()+"-"+monat+"-01"; } function datum_tagesanfang (date) { var jahr=(date).getFullYear(); var monat=1+date.getMonth(); var tag = date.getDate(); return jahr+"-"+monat+"-"+tag; } function datum_wochenanfang(date){ var iDayOfWeek = date.getDay(); var iDifference = date.getDate() - iDayOfWeek + (iDayOfWeek === 0 ? -6:1); var woa=new Date(date.setDate(iDifference)); return woa.toISOString().slice(0,10); } function datum_gestern(datum){ var yesterday = new Date(datum.valueOf() - 1000*60*60*24); return yesterday.toISOString().slice(0,10); } function kalenderwoche (d){ // Copy date so don't modify original d = new Date(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate())); // Set to nearest Thursday: current date + 4 - current day number // Make Sunday's day number 7 d.setUTCDate(d.getUTCDate() + 4 - (d.getUTCDay()||7)); // Get first day of year var yearStart = new Date(Date.UTC(d.getUTCFullYear(),0,1)); // Calculate full weeks to nearest Thursday var weekNo = Math.ceil(( ( (d - yearStart) / 86400000) + 1)/7); // Return array of year and week number return weekNo; } function currentDate2() { var d = new Date(); return new Date(d.getFullYear(), d.getMonth(), d.getDate()); } function addDate(strDate) { var date = strDate.split('.'); var d = currentDate2(); d.setDate(date[0]); d.setMonth(date[1]-1); d.setFullYear(date[2]); return d; } function isDateInRange(strLower, strUpper) { var now = new Date(); var lower = addDate(strLower); var upper = addDate(strUpper); var inRange = false; if (upper > lower) inRange = (now >= lower && now <= upper) ? true : false; else log('isDateInRange meldet Fehler! "von"-Datum ist nicht früher als "bis"-Datum', 'error'); return inRange; }
damit sollte das Skript dann auch funktionieren …..