ottelo15

ottelo.jimdo.de Script by Andreas

Jul 14th, 2023 (edited)
206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
YAML 10.88 KB | None | 0 0
  1. D 40
  2. ; IP for external ScriptEditor
  3. IP=192.168.12.79
  4.  
  5.  
  6. ; Description:
  7. ; Version see >W section
  8. ; Tasmota SML Script with Google Chart Support
  9. ; 4h, 24h Consumption Line Charts
  10. ; Month and Year Consumption (from grid) Tables
  11. ; Month and Year PV Production (to grid) Table
  12. ; Optional: Switch second esp if enough energy flows to grid (e.g. pool pump)
  13. ; charts need 30/60s to show correctly after boot
  14. ; Tasmota needs correct working NTP (internet) otherwise script dont start
  15.  
  16. ; HowTo:
  17. ; Download the ScriptEditor from Tasmota Script page or remove all comments manually
  18. ; https://www.dropbox.com/sh/0us18ohui4c3k82/AACcVmpZ4AfpdrWE_MPFGmbma?dl=0
  19. ; Change the IP
  20. ; change the -- SML -- script to your needs but dont change the order!
  21. ; search for websend and bu(swesp and uncomment this lines to switch second esp
  22. ; 4h chart are not permament, after restart data is lost
  23. ; 24h, month and year chart is permament and saved at midnight to flash
  24. ; First start, go to console and type:
  25. ;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};
  26. ;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};
  27. ;script >=#rst24h
  28. ;script >svars
  29.  
  30. ; to change some values enter e.g.: script >dcon[day]=xxx
  31. ; console commands:
  32. ; script?var = get variable
  33. ; script >var=1 = set variable
  34. ; script >svars = save all permament vars
  35. ; script >=#sub = run sub
  36.  
  37.  
  38. ; -- ARRAYS --
  39. ; 24h power chart
  40. M:p:sday=0 288
  41. ; daily energy from grid table day 1-31
  42. M:p:dcon=0 31
  43. ; daily energy to grid table day 1-31
  44. M:p:dprod=0 31  
  45. ; monthly energy table
  46. ; from grid 1-12
  47. ; to grid 13-24
  48. M:p:mcon=0 24
  49. ; 4h power chart, value every 30s
  50. M:s4h=0 480
  51.  
  52. ; -- VARS --
  53. ; energy from grid [kWh]
  54. EnFrGrid=0
  55. ; energy to grid [kWh]
  56. EnToGrid=0
  57. ; actual power from or to grid [W]
  58. power=0
  59. ; monthval and dayval
  60. p:mval=0
  61. p:dval=0
  62. p:mval2=0
  63. p:dval2=0  
  64. tmp=0
  65. m5=0
  66. cstr="cnt0/12"
  67. cstr2="cnth0/120"
  68. utm="00d 00h 00m"
  69. avgv=0
  70. avgv2=0
  71. avgvc=0
  72. avgvc2=0
  73. PowerFrGridSum=0
  74. PowerToGridSum=0
  75. PowerToGridSumC=0
  76. p:EnToGridTotal=0
  77.  
  78. hour=0
  79. da=1
  80. swesp=0
  81. swespflg=0
  82.  
  83.  
  84. ; -- BOOT --
  85. >B
  86. =>sensor53 r
  87. is(0 "Jan|Feb|Mär|Apr|Mai|Jun|Jul|Aug|Sep|Okt|Nov|Dez|")
  88. ;disable mqtt at boot prevents sending 0
  89. smlj=0
  90.  
  91.  
  92. ; -- SUBS --
  93. ; reset 24h chart
  94. #rst24h
  95. for tmp 1 sday[-1] 1
  96.     sday[tmp]=0
  97. next
  98.  
  99. ; daily consumption month table
  100. #daysub
  101. wcs <div id="day" style="text-align:center;width:400px"></div>
  102. wcs <script language="JavaScript">function drawChart(){
  103. wcs var cssc={'headerRow':'hRow','rowNumberCell':'hCol','tableCell':'tCell'};
  104. wcs var data=google.visualization.arrayToDataTable([['Tag','Energie [kWh]',{role: 'style'}],
  105. for tmp 1 dcon[-1] 1
  106.     if (tmp==day)
  107.     {
  108.         wcs [%tmp%,%dcon[tmp]%,'red'],
  109.     }
  110.     if (tmp<day)
  111.     {
  112.         wcs [%tmp%,%dcon[tmp]%,'green'],
  113.     }
  114.     if (tmp>day)
  115.     {
  116.         wcs [%tmp%,%dcon[tmp]%,''],
  117.     }
  118. next
  119. wcs ]);
  120. 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]}};
  121. wcs var chart=new google.visualization.ColumnChart(document.getElementById('day'));
  122. wcs chart.draw(data,options);}google.charts.setOnLoadCallback(drawChart);</script>
  123. ; daily production month table
  124. #dayprod
  125. wcs <div id="dayp" style="text-align:center;width:400px"></div>
  126. wcs <script language="JavaScript">function drawChart(){
  127. wcs var cssc={'headerRow':'hRow','rowNumberCell':'hCol','tableCell':'tCell'};
  128. wcs var data=google.visualization.arrayToDataTable([['Tag','Energie [kWh]',{role: 'style'}],
  129. for tmp 1 dprod[-1] 1
  130.     if (tmp==day)
  131.     {
  132.         wcs [%tmp%,%dprod[tmp]%,'red'],
  133.     }
  134.     if (tmp<day)
  135.     {
  136.         wcs [%tmp%,%dprod[tmp]%,'green'],
  137.     }
  138.     if (tmp>day)
  139.     {
  140.         wcs [%tmp%,%dprod[tmp]%,''],
  141.     }
  142. next
  143. wcs ]);
  144. 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]}};
  145. wcs var chart=new google.visualization.ColumnChart(document.getElementById('dayp'));
  146. wcs chart.draw(data,options);}google.charts.setOnLoadCallback(drawChart);</script>
  147. ; monthly consumption & production year table
  148. #monthsub
  149. wcs <div id="month" style="text-align:center;width:400px"></div>
  150. wcs <script language="JavaScript">function drawChart(){
  151. wcs var cssc={'headerRow':'hRow','rowNumberCell':'hCol','tableCell':'tCell'};
  152. wcs var data=google.visualization.arrayToDataTable([['Monat','Energie [kWh]',{role: 'style'}],
  153. for tmp 1 12 1
  154.     if (tmp<month)
  155.     {
  156.         wcs ['%is[tmp]%',%mcon[tmp]%,'green'],
  157.         wcs ['%is[tmp]% (PV)',%mcon[tmp+12]%,'green'],
  158.     }
  159.     if (tmp==month)
  160.     {
  161.         wcs ['%is[tmp]%',%mcon[tmp]%,'red'],
  162.         wcs ['%is[tmp]% (PV)',%mcon[tmp+12]%,'red'],
  163.     }
  164.     if (tmp>month)
  165.     {
  166.         wcs ['%is[tmp]%',%mcon[tmp]%,''],
  167.         wcs ['%is[tmp]% (PV)',%mcon[tmp+12]%,''],
  168.     }
  169. next
  170. wcs ]);
  171. wcs var options={chartArea:{left:40,width:'86%%'},legend:'none',title:'Monatliche Verbräuche / Solareinspeisungen Jahresansicht',vAxis:{format:'# kWh'}};
  172. wcs var chart=new google.visualization.ColumnChart(document.getElementById('month'));
  173. wcs chart.draw(data,options);}google.charts.setOnLoadCallback(drawChart);</script>
  174.  
  175. ;-- SML --
  176. >M 1
  177. ;1=meter1 3=GPIO3 s=SML 0=filterOff 16=filterOn 9600=baud MT631=Name
  178. +1,3,s,0,9600,MT631
  179. ;1. line = sml[1] (actual power W), 2. = sml[2] (energy from grid kWh)
  180. 1,77070100100700ff@1,Leistung,W,Power_curr,0
  181. 1,77070100010800ff@1000,Verbrauch,KWh,Total_in,3
  182. ;1,77070100020800ff@1000,Netzeinspeisung,KWh,Total_out,2
  183. ;optional - check if your smart meter support this
  184. ;1,77070100200700ff@1,Spannung,V,Volt,1
  185. ;1,770701001f0700ff@1,Strom,A,Current,2
  186. ;1,770701000e0700ff@1,Frequenz,Hz,Frequency,1
  187. ;DWS74 Bugfix
  188. ;1,=so2,1
  189. #
  190.  
  191.  
  192. ; -- EVERY SECOND --
  193. >S
  194. ;start mqtt if smartmeter is sending
  195. if (sml[2]>0)
  196. {
  197.     smlj=1
  198. }
  199.  
  200. ;check if NTP works, otherwise arrays can be corrupted
  201. if (year<2020)
  202. {
  203.     print NTP not ready
  204.     break
  205. }
  206.  
  207. ; every 3s
  208. if (secs%3==0)
  209. {
  210.     ; actual power [W]
  211.     ;power=rnd(1000)-500 for google chart testing
  212.     ; copy SML value
  213.     power=sml[1]   
  214.     ; sum up power sml[1] for 4h and 24h chart
  215.     avgv+=power
  216.     avgv2+=power
  217.     avgvc+=1
  218.     avgvc2+=1  
  219.  
  220. ; for vitual PowerToGrid counter
  221.         if (power>0)
  222.         {
  223.             PowerFrGridSum+=power
  224.         }  
  225.         else
  226.         {
  227.             PowerToGridSumC=1
  228.             PowerToGridSum-=power
  229.         }  
  230.  
  231.     ; switch second ESP if power flows to grid, see >W section
  232.     if (swesp==1)
  233.     {
  234.         if ((power<-50 and (swespflg==0))
  235.         {
  236.             ;=>websend [192.168.0.50] power ON
  237.             ;print power ON %power%W
  238.             swespflg=1
  239.         }
  240.         if ((power>30) and (swespflg==1))
  241.         {
  242.             ;=>websend [192.168.0.50] power OFF
  243.             ;print power OFF %power%W
  244.             swespflg=0
  245.         }
  246.     }
  247. }
  248.  
  249. ; every 30s
  250. if (secs%30==0)
  251. {
  252.     ; 4h chart. idx is set automatically
  253.     s4h=avgv/avgvc
  254.     avgv=0
  255.     avgvc=0
  256.  
  257.     ; Set 4h x-axis a 30s => /120 values per hour for 4h diagram. Arraysize = 480 (new function cnth)
  258.     ; tasmota calc [hh:mm] via cnthX/Y. mm = X%Y * 60/Y. hh = X/Y
  259.     cstr2="cnth"+s(1.0((((hours+20)*120)+(mins*2)+(int(secs/30)))%2880+1))+"/120"
  260. }
  261.  
  262. ; every 60s
  263. if (secs%60==0)
  264. {
  265.     hour=hours
  266.     ;uptime in days hours minutes
  267.     utm=s(2.0(int(uptime/1440)))+"d "+s(2.0(int(uptime/60)%24))+"h "+s(2.0(uptime%60))+"m"
  268.  
  269.     ; copy SML values
  270.     ; energy from grid [kWh]
  271.     EnFrGrid=sml[2]
  272.     ; energy to grid [kWh]
  273.  
  274.         if ((PowerToGridSumC==1) and (PowerFrGridSum!=0))
  275.         {
  276.         EnToGrid=PowerToGridSum*(EnFrGrid-dval)/PowerFrGridSum
  277. ;        EnToGridTotal=EnToGrid+dval2
  278.         PowerToGridSumC=0
  279.         }
  280.  
  281. ;   EnToGrid=sml[3]
  282.     ; day consumption [kWh]
  283.     dcon[day]=EnFrGrid-dval
  284.     ; month consumption [kWh]
  285.     mcon[month]=EnFrGrid-mval
  286.     ; day production [kWh]
  287.     dprod[day]=EnToGrid
  288.     ; month production [kWh]
  289.     mcon[month+12]=EnToGridTotal+EnToGrid-mval2
  290.  
  291.     ; 24h chart. calc avg power [W] for last 5min and put into array[1-288]
  292.     m5=int((((hours*60)+mins)/5)+1)
  293.     ; set idx (pointer starts from 0)
  294.     sday[0]=m5
  295.     if (chg[m5]>0)
  296.     {
  297.         sday[m5]=int(avgv2/avgvc2)
  298.         avgv2=0
  299.         avgvc2=0
  300.     }
  301.  
  302.     ; Set 24h x-axis a 5m => /12 values per hour for 24h diagram. Arraysize = 288 (new function cnth)
  303.     ; tasmota calc [hh:mm] via cnthX/Y. mm = X%Y * 60/Y. hh = X/Y
  304.     cstr="cnth"+s(1.0(((hours)*12)+int(mins/5))+1)+"/12"
  305.  
  306.     ; day consumption & production calculation at midnight
  307.     if ((chg[hour]>0) and (hour==0))
  308.     {
  309.         if (day>1)
  310.         {
  311.             da=day
  312.         }
  313.         else
  314.         {
  315.             ; change of month, set last days to 0 (Feb, Apr...)
  316.             for tmp (da+1) 31 1
  317.                 dprod[tmp]=0
  318.                 dcon[tmp]=0
  319.             next
  320.             ; monthly values
  321.             mval=EnFrGrid
  322.             mval2=EnToGridTotal+EnToGrid
  323.         }
  324.         ; daily values
  325.         dval=EnFrGrid
  326.         dval2=EnToGridTotal+EnToGrid
  327.                 PowerFrGridSum=0
  328.                 PowerToGridSum=0
  329.                 PowerToGridSumC=0
  330.                 EnToGridTotal+=EnToGrid
  331.                 EnToGrid=0
  332.         ; save only once at midnight
  333.         svars
  334.     }
  335. }
  336.  
  337.  
  338. ; WEB INTERFACE
  339. >W
  340. ; Auto reload
  341. ;$<script> setTimeout("location.reload(true);",5000); </script>
  342. ; web button
  343. ; switch second ESP if power flows to grid, see >S section
  344. ;bu(swesp "switch ESP ON" "switch ESP OFF")
  345.  
  346. ; consumption
  347. Tagesverbrauch:{m}%2(EnFrGrid-dval)% kWh
  348. Monatsverbrauch:{m}%2(EnFrGrid-mval)% kWh
  349.  
  350. ; production    
  351. Tageseinspeisung:{m}%2(EnToGrid)% kWh
  352. Monatseinspeisung:{m}%2(EnToGridTotal+EnToGrid-mval2)% kWh
  353.  
  354. FromSum:{m}%PowerFrGridSum%
  355. ToSum:{m}%PowerToGridSum%
  356. EnToGridTotal:{m}%(EnToGridTotal+EnToGrid)% kWh
  357.  
  358. ; Time/Date
  359. Datum:{m}%s(2.0day)%.%s(2.0month)%.%s(2.0year)% - %s(2.0hours)%:%s(2.0mins)%:%s(2.0secs)%
  360. Uptime:{m}%0utm%
  361. $<div style="margin-left:-20px">
  362. ; 4h power chart - new value every 30s
  363. $<div id="chart1" style="text-align:center;width:400px"></div>
  364. $gc(lt s4h "wr" "Leistung [W]" cstr2)
  365. $var options = {
  366. $chartArea:{left:60,width:'83%%'},
  367. $legend:'none',
  368. $vAxis:{format:'# W'},
  369. $explorer:{actions:['dragToZoom', 'rightClickToReset']},
  370. $series: {0: {type: 'area'}},              
  371. $title:'Verbrauch 4 Stunden [Watt]'
  372. $};
  373. $gc(e)
  374.  
  375. ; 24h power chart
  376. $<div id="chart2" style="text-align:center;width:400px"></div>
  377. $gc(lt sday "wr" "Leistung [W]" cstr)
  378. $var options = {
  379. $chartArea:{left:60,width:'83%%'},
  380. $legend:'none',
  381. $vAxis:{format:'# W'},
  382. $explorer:{actions:['dragToZoom', 'rightClickToReset']},
  383. $series: {0: {type: 'area'}},            
  384. $title:'Verbrauch 24 Stunden [Watt]'
  385. $};
  386. $gc(e)
  387.  
  388. ; simply chart with 2 rows
  389. ;$<div id="chart3" style="text-align:center;width:400px"></div>
  390. ;$gc(c dprod "wr" "kWh" "cnt1" "Tägliche Einspeisung")
  391.  
  392. ; daily energy consumption month chart
  393. %=#daysub
  394. %=#dayprod
  395.  
  396. ; monthly energy consumption year chart
  397. %=#monthsub
  398.  
  399. $<center><span style="font-size:10px;">
  400. $Version 2023.02.28 (PV) by ottelo.jimdo.de & Dennis<br>
  401. $Hinweis: Die Daten werden immer um Mitternacht gespeichert!<br>
  402. $Sofort speichern dies in Console eingeben: "script >svars"<br>
  403. $</span></center></div>
  404. ; -- END SCRIPT --
  405. #
Tags: tasmota
Add Comment
Please, Sign In to add comment