Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- D 40
- ; IP for external ScriptEditor
- IP=192.168.12.79
- ; Description:
- ; Version see >W section
- ; Tasmota SML Script with Google Chart Support
- ; 4h, 24h Consumption Line Charts
- ; Month and Year Consumption (from grid) Tables
- ; Month and Year PV Production (to grid) Table
- ; Optional: Switch second esp if enough energy flows to grid (e.g. pool pump)
- ; charts need 30/60s to show correctly after boot
- ; Tasmota needs correct working NTP (internet) otherwise script dont start
- ; HowTo:
- ; Download the ScriptEditor from Tasmota Script page or remove all comments manually
- ; https://www.dropbox.com/sh/0us18ohui4c3k82/AACcVmpZ4AfpdrWE_MPFGmbma?dl=0
- ; Change the IP
- ; change the -- SML -- script to your needs but dont change the order!
- ; search for websend and bu(swesp and uncomment this lines to switch second esp
- ; 4h chart are not permament, after restart data is lost
- ; 24h, month and year chart is permament and saved at midnight to flash
- ; First start, go to console and type:
- ;backlog script >dval=EnFrGrid; script >dval2=EnToGrid; script >dcon={0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0}; script >dprod={0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0};
- ;backlog script >mval=EnFrGrid; script >mval2=EnToGrid; script >mcon={0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0};
- ;script >=#rst24h
- ;script >svars
- ; to change some values enter e.g.: script >dcon[day]=xxx
- ; console commands:
- ; script?var = get variable
- ; script >var=1 = set variable
- ; script >svars = save all permament vars
- ; script >=#sub = run sub
- ; -- ARRAYS --
- ; 24h power chart
- M:p:sday=0 288
- ; daily energy from grid table day 1-31
- M:p:dcon=0 31
- ; daily energy to grid table day 1-31
- M:p:dprod=0 31
- ; monthly energy table
- ; from grid 1-12
- ; to grid 13-24
- M:p:mcon=0 24
- ; 4h power chart, value every 30s
- M:s4h=0 480
- ; -- VARS --
- ; energy from grid [kWh]
- EnFrGrid=0
- ; energy to grid [kWh]
- EnToGrid=0
- ; actual power from or to grid [W]
- power=0
- ; monthval and dayval
- p:mval=0
- p:dval=0
- p:mval2=0
- p:dval2=0
- tmp=0
- m5=0
- cstr="cnt0/12"
- cstr2="cnth0/120"
- utm="00d 00h 00m"
- avgv=0
- avgv2=0
- avgvc=0
- avgvc2=0
- PowerFrGridSum=0
- PowerToGridSum=0
- PowerToGridSumC=0
- p:EnToGridTotal=0
- hour=0
- da=1
- swesp=0
- swespflg=0
- ; -- BOOT --
- >B
- =>sensor53 r
- is(0 "Jan|Feb|Mär|Apr|Mai|Jun|Jul|Aug|Sep|Okt|Nov|Dez|")
- ;disable mqtt at boot prevents sending 0
- smlj=0
- ; -- SUBS --
- ; reset 24h chart
- #rst24h
- for tmp 1 sday[-1] 1
- sday[tmp]=0
- next
- ; daily consumption month table
- #daysub
- wcs <div id="day" style="text-align:center;width:400px"></div>
- wcs <script language="JavaScript">function drawChart(){
- wcs var cssc={'headerRow':'hRow','rowNumberCell':'hCol','tableCell':'tCell'};
- wcs var data=google.visualization.arrayToDataTable([['Tag','Energie [kWh]',{role: 'style'}],
- for tmp 1 dcon[-1] 1
- if (tmp==day)
- {
- wcs [%tmp%,%dcon[tmp]%,'red'],
- }
- if (tmp<day)
- {
- wcs [%tmp%,%dcon[tmp]%,'green'],
- }
- if (tmp>day)
- {
- wcs [%tmp%,%dcon[tmp]%,''],
- }
- next
- wcs ]);
- wcs var options={chartArea:{left:40,width:'86%%'},legend:'none',title:'Tagesverbräuche Monatsansicht',vAxis:{format:'# kWh'},hAxis:{title:'Tag',ticks:[1,5,10,15,20,25,30]}};
- wcs var chart=new google.visualization.ColumnChart(document.getElementById('day'));
- wcs chart.draw(data,options);}google.charts.setOnLoadCallback(drawChart);</script>
- ; daily production month table
- #dayprod
- wcs <div id="dayp" style="text-align:center;width:400px"></div>
- wcs <script language="JavaScript">function drawChart(){
- wcs var cssc={'headerRow':'hRow','rowNumberCell':'hCol','tableCell':'tCell'};
- wcs var data=google.visualization.arrayToDataTable([['Tag','Energie [kWh]',{role: 'style'}],
- for tmp 1 dprod[-1] 1
- if (tmp==day)
- {
- wcs [%tmp%,%dprod[tmp]%,'red'],
- }
- if (tmp<day)
- {
- wcs [%tmp%,%dprod[tmp]%,'green'],
- }
- if (tmp>day)
- {
- wcs [%tmp%,%dprod[tmp]%,''],
- }
- next
- wcs ]);
- wcs var options={chartArea:{left:40,width:'86%%'},legend:'none',title:'Tageseinspeisung Monatsansicht',vAxis:{format:'# kWh'},hAxis:{title:'Tag',ticks:[1,5,10,15,20,25,30]}};
- wcs var chart=new google.visualization.ColumnChart(document.getElementById('dayp'));
- wcs chart.draw(data,options);}google.charts.setOnLoadCallback(drawChart);</script>
- ; monthly consumption & production year table
- #monthsub
- wcs <div id="month" style="text-align:center;width:400px"></div>
- wcs <script language="JavaScript">function drawChart(){
- wcs var cssc={'headerRow':'hRow','rowNumberCell':'hCol','tableCell':'tCell'};
- wcs var data=google.visualization.arrayToDataTable([['Monat','Energie [kWh]',{role: 'style'}],
- for tmp 1 12 1
- if (tmp<month)
- {
- wcs ['%is[tmp]%',%mcon[tmp]%,'green'],
- wcs ['%is[tmp]% (PV)',%mcon[tmp+12]%,'green'],
- }
- if (tmp==month)
- {
- wcs ['%is[tmp]%',%mcon[tmp]%,'red'],
- wcs ['%is[tmp]% (PV)',%mcon[tmp+12]%,'red'],
- }
- if (tmp>month)
- {
- wcs ['%is[tmp]%',%mcon[tmp]%,''],
- wcs ['%is[tmp]% (PV)',%mcon[tmp+12]%,''],
- }
- next
- wcs ]);
- wcs var options={chartArea:{left:40,width:'86%%'},legend:'none',title:'Monatliche Verbräuche / Solareinspeisungen Jahresansicht',vAxis:{format:'# kWh'}};
- wcs var chart=new google.visualization.ColumnChart(document.getElementById('month'));
- wcs chart.draw(data,options);}google.charts.setOnLoadCallback(drawChart);</script>
- ;-- SML --
- >M 1
- ;1=meter1 3=GPIO3 s=SML 0=filterOff 16=filterOn 9600=baud MT631=Name
- +1,3,s,0,9600,MT631
- ;1. line = sml[1] (actual power W), 2. = sml[2] (energy from grid kWh)
- 1,77070100100700ff@1,Leistung,W,Power_curr,0
- 1,77070100010800ff@1000,Verbrauch,KWh,Total_in,3
- ;1,77070100020800ff@1000,Netzeinspeisung,KWh,Total_out,2
- ;optional - check if your smart meter support this
- ;1,77070100200700ff@1,Spannung,V,Volt,1
- ;1,770701001f0700ff@1,Strom,A,Current,2
- ;1,770701000e0700ff@1,Frequenz,Hz,Frequency,1
- ;DWS74 Bugfix
- ;1,=so2,1
- #
- ; -- EVERY SECOND --
- >S
- ;start mqtt if smartmeter is sending
- if (sml[2]>0)
- {
- smlj=1
- }
- ;check if NTP works, otherwise arrays can be corrupted
- if (year<2020)
- {
- print NTP not ready
- break
- }
- ; every 3s
- if (secs%3==0)
- {
- ; actual power [W]
- ;power=rnd(1000)-500 for google chart testing
- ; copy SML value
- power=sml[1]
- ; sum up power sml[1] for 4h and 24h chart
- avgv+=power
- avgv2+=power
- avgvc+=1
- avgvc2+=1
- ; for vitual PowerToGrid counter
- if (power>0)
- {
- PowerFrGridSum+=power
- }
- else
- {
- PowerToGridSumC=1
- PowerToGridSum-=power
- }
- ; switch second ESP if power flows to grid, see >W section
- if (swesp==1)
- {
- if ((power<-50 and (swespflg==0))
- {
- ;=>websend [192.168.0.50] power ON
- ;print power ON %power%W
- swespflg=1
- }
- if ((power>30) and (swespflg==1))
- {
- ;=>websend [192.168.0.50] power OFF
- ;print power OFF %power%W
- swespflg=0
- }
- }
- }
- ; every 30s
- if (secs%30==0)
- {
- ; 4h chart. idx is set automatically
- s4h=avgv/avgvc
- avgv=0
- avgvc=0
- ; Set 4h x-axis a 30s => /120 values per hour for 4h diagram. Arraysize = 480 (new function cnth)
- ; tasmota calc [hh:mm] via cnthX/Y. mm = X%Y * 60/Y. hh = X/Y
- cstr2="cnth"+s(1.0((((hours+20)*120)+(mins*2)+(int(secs/30)))%2880+1))+"/120"
- }
- ; every 60s
- if (secs%60==0)
- {
- hour=hours
- ;uptime in days hours minutes
- utm=s(2.0(int(uptime/1440)))+"d "+s(2.0(int(uptime/60)%24))+"h "+s(2.0(uptime%60))+"m"
- ; copy SML values
- ; energy from grid [kWh]
- EnFrGrid=sml[2]
- ; energy to grid [kWh]
- if ((PowerToGridSumC==1) and (PowerFrGridSum!=0))
- {
- EnToGrid=PowerToGridSum*(EnFrGrid-dval)/PowerFrGridSum
- ; EnToGridTotal=EnToGrid+dval2
- PowerToGridSumC=0
- }
- ; EnToGrid=sml[3]
- ; day consumption [kWh]
- dcon[day]=EnFrGrid-dval
- ; month consumption [kWh]
- mcon[month]=EnFrGrid-mval
- ; day production [kWh]
- dprod[day]=EnToGrid
- ; month production [kWh]
- mcon[month+12]=EnToGridTotal+EnToGrid-mval2
- ; 24h chart. calc avg power [W] for last 5min and put into array[1-288]
- m5=int((((hours*60)+mins)/5)+1)
- ; set idx (pointer starts from 0)
- sday[0]=m5
- if (chg[m5]>0)
- {
- sday[m5]=int(avgv2/avgvc2)
- avgv2=0
- avgvc2=0
- }
- ; Set 24h x-axis a 5m => /12 values per hour for 24h diagram. Arraysize = 288 (new function cnth)
- ; tasmota calc [hh:mm] via cnthX/Y. mm = X%Y * 60/Y. hh = X/Y
- cstr="cnth"+s(1.0(((hours)*12)+int(mins/5))+1)+"/12"
- ; day consumption & production calculation at midnight
- if ((chg[hour]>0) and (hour==0))
- {
- if (day>1)
- {
- da=day
- }
- else
- {
- ; change of month, set last days to 0 (Feb, Apr...)
- for tmp (da+1) 31 1
- dprod[tmp]=0
- dcon[tmp]=0
- next
- ; monthly values
- mval=EnFrGrid
- mval2=EnToGridTotal+EnToGrid
- }
- ; daily values
- dval=EnFrGrid
- dval2=EnToGridTotal+EnToGrid
- PowerFrGridSum=0
- PowerToGridSum=0
- PowerToGridSumC=0
- EnToGridTotal+=EnToGrid
- EnToGrid=0
- ; save only once at midnight
- svars
- }
- }
- ; WEB INTERFACE
- >W
- ; Auto reload
- ;$<script> setTimeout("location.reload(true);",5000); </script>
- ; web button
- ; switch second ESP if power flows to grid, see >S section
- ;bu(swesp "switch ESP ON" "switch ESP OFF")
- ; consumption
- Tagesverbrauch:{m}%2(EnFrGrid-dval)% kWh
- Monatsverbrauch:{m}%2(EnFrGrid-mval)% kWh
- ; production
- Tageseinspeisung:{m}%2(EnToGrid)% kWh
- Monatseinspeisung:{m}%2(EnToGridTotal+EnToGrid-mval2)% kWh
- FromSum:{m}%PowerFrGridSum%
- ToSum:{m}%PowerToGridSum%
- EnToGridTotal:{m}%(EnToGridTotal+EnToGrid)% kWh
- ; Time/Date
- Datum:{m}%s(2.0day)%.%s(2.0month)%.%s(2.0year)% - %s(2.0hours)%:%s(2.0mins)%:%s(2.0secs)%
- Uptime:{m}%0utm%
- $<div style="margin-left:-20px">
- ; 4h power chart - new value every 30s
- $<div id="chart1" style="text-align:center;width:400px"></div>
- $gc(lt s4h "wr" "Leistung [W]" cstr2)
- $var options = {
- $chartArea:{left:60,width:'83%%'},
- $legend:'none',
- $vAxis:{format:'# W'},
- $explorer:{actions:['dragToZoom', 'rightClickToReset']},
- $series: {0: {type: 'area'}},
- $title:'Verbrauch 4 Stunden [Watt]'
- $};
- $gc(e)
- ; 24h power chart
- $<div id="chart2" style="text-align:center;width:400px"></div>
- $gc(lt sday "wr" "Leistung [W]" cstr)
- $var options = {
- $chartArea:{left:60,width:'83%%'},
- $legend:'none',
- $vAxis:{format:'# W'},
- $explorer:{actions:['dragToZoom', 'rightClickToReset']},
- $series: {0: {type: 'area'}},
- $title:'Verbrauch 24 Stunden [Watt]'
- $};
- $gc(e)
- ; simply chart with 2 rows
- ;$<div id="chart3" style="text-align:center;width:400px"></div>
- ;$gc(c dprod "wr" "kWh" "cnt1" "Tägliche Einspeisung")
- ; daily energy consumption month chart
- %=#daysub
- %=#dayprod
- ; monthly energy consumption year chart
- %=#monthsub
- $<center><span style="font-size:10px;">
- $Version 2023.02.28 (PV) by ottelo.jimdo.de & Dennis<br>
- $Hinweis: Die Daten werden immer um Mitternacht gespeichert!<br>
- $Sofort speichern dies in Console eingeben: "script >svars"<br>
- $</span></center></div>
- ; -- END SCRIPT --
- #
Add Comment
Please, Sign In to add comment