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
-
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]****** -
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 …..
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden