>D 40 ; IP for external ScriptEditor (Hichi Lesekopf) IP=192.168.1.76 ; 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 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
wcs ; daily production month table #dayprod wcs
wcs ; monthly consumption & production year table #monthsub wcs
wcs ;-- SML -- >D >B =>sensor53 r >M 1 ;1=meter1 14=GPIO14 s=SML 0=filterOff 16=filterOn 9600=baud MT175=Name +1,3,s,0,9600,STROM,13,30,2F3F210D0A,063030300D0A ;1. line = sml[1] (actual power W), 2. = sml[2] (energy from grid kWh), 3. = sml[3] (energy to grid kWh) 1,77070100100700ff@1,Leistung,W,power,16 1,77070100010800ff@1000,Energie gesamt,kWh,energy_sum,3 1,77070100020800ff@1000,Einspeisung,kWh,energy_supply,3 ;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 ; 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] EnToGrid=sml[3] ; day consumption [kWh] dcon[day]=EnFrGrid-dval ; month consumption [kWh] mcon[month]=EnFrGrid-mval ; day production [kWh] dprod[day]=EnToGrid-dval2 ; month production [kWh] mcon[month+12]=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=EnToGrid } ; daily values dval=EnFrGrid dval2=EnToGrid ; save only once at midnight svars } } ; WEB INTERFACE >W ; Auto reload ;$ ; 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-dval2)% kWh Monatseinspeisung:{m}%2(EnToGrid-mval2)% 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% $
; 4h power chart - new value every 30s $
$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 $
$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 ;$
;$gc(c dprod "wr" "kWh" "cnt1" "Tägliche Einspeisung") ; daily energy consumption month chart %=#daysub %=#dayprod ; monthly energy consumption year chart %=#monthsub $
$Version 2023.02.28 (PV) by ottelo.jimdo.de & Dennis
$Hinweis: Die Daten werden immer um Mitternacht gespeichert!
$Sofort speichern dies in Console eingeben: "script >svars"
$
; -- END SCRIPT -- #