Moin zusammen,
hier jetzt das Skript noch einmal. Allerdings nun mit ModBus TCP auf Port 502. Somit kann man den Stromleser direkt per Modbus auslesen.
Das Skript stammt nicht von mir sondern direkt von:
https://ottelo.jimdofree.com/stromzähler-auslesen-tasmota/
D 100
;2_SML_Script_Chart_PV.tas
M:s4h=0 481
M:s4hf=0 6
M:s24h=0 1441
M:s24hf=0 12
M:dcon=0 31
M:dprod=0 31
M:mcon=0 24
M:mbrx=0 12
M:mbtx=0 9
p:mval=0
p:dval=0
p:mval2=0
p:dval2=0
p:yval=0
p:yval2=0
p:da=1
p:rxind=1
p:txind=1
p:sel=0
t:t1=5
t:t2=60
rxpin=0
txpin=0
tmp=0
idx4=0
idx24=0
cstr=„cnth0/120“
cstr2=„cnth0/30“
utm=„00d 00h 00m“
hr=0
swesp=0
swespflg=0
power2=0
fr=0
B
rxpin=rxind-1
txpin=txind-1
->sensor53 r
tmp=is(0 „Jan|Feb|Mär|Apr|Mai|Jun|Jul|Aug|Sep|Okt|Nov|Dez|“)
smlj=0
=#load
; start modbus server
wso(502)
#save
print saving arrays
dp2
fr=fo(„data.csv“ w)
if fr>=0 {
fwa(s4h fr)
fwa(s24h fr)
fwa(dcon fr)
fwa(dprod fr)
fwa(mcon fr)
fc(fr)
} else {
print file error: %fr%
}
svars
#load
print loading arrays
dp2
fr=fo(„data.csv“ r)
fra(s4h fr)
fra(s24h fr)
fra(dcon fr)
fra(dprod fr)
fra(mcon fr)
fc(fr)
#init
dval=sml[2]
dval2=sml[3]
mval=sml[2]
mval2=sml[3]
yval=sml[2]
yval2=sml[3]
acp(s4h 0)
acp(s24h 0)
dcon[day]=dval
dprod[day]=dval2
mcon[month]=mval
mcon[12+month]=mval2
->Backlog2 otaurl KEIN OTA UPGRADE VIA WEBSERVER!
->Backlog2 Timezone 99;TimeStd 0,0,10,1,3,60;TimeDst 0,0,3,1,2,120
=#save
#daysub
if wm>0 {
wcs
wcs 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,right:30,height:‚75%%‘},legend:‚none‘,title:‚Tagesverbräuche (Monat %is[month]%)‘,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);
}
#dayprod
if wm>0 {
wcs
wcs 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,right:30,height:‚75%%‘},legend:‚none‘,title:‚Tageseinspeisung (Monat %is[month]%)‘,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);
}
#monthsub
if wm>0 {
wcs
wcs function drawChart(){
wcs var cssc={‚headerRow‘:‚hRow‘,‚rowNumberCell‘:‚hCol‘,‚tableCell‘:‚tCell‘};
wcs var data=google.visualization.arrayToDataTable([[‚Monat‘,‚Verbrauch [kWh]‘,‚Einspeisung[kWh]‘],
for tmp 1 12 1
if (tmp<month) {
wcs [‚%is[tmp]%‘,%mcon[tmp]%,%mcon[tmp+12]%],
}
if (tmp==month) {
wcs [‚%is[tmp]%‘,%mcon[tmp]%,%mcon[tmp+12]%],
}
if (tmp>month) {
wcs [‚%is[tmp]%‘,%mcon[tmp]%,%mcon[tmp+12]%],
}
next
wcs ]);
wcs var options={series:{0:{targetAxisIndex:0},1:{targetAxisIndex:1}},chartArea:{left:40,right:40,height:‚75%%‘},legend:‚none‘,title:‚Verbräuche / Einspeisungen (Jahr %0(year-1)%/%0year%)‘,vAxes:{0:{format:‚# kWh‘},1:{format:‚# kWh‘}}};
wcs var chart=new google.visualization.ColumnChart(document.getElementById(‚month‘));
wcs chart.draw(data,options);}google.charts.setOnLoadCallback(drawChart);
}
C
if eres==1 {
->sensor53 r
svars
eres=0
}
F
tmp=fe(„sml_ftask.tas“)
S
tmp=fe(„sml_stask.tas“)
if (year<2020) {
print auf NTP warten
break
}
if ((chg[rxind]>0) or (chg[txind]>0)) {
rxpin=rxind-1
->sensor53 r
=#save
}
if (sml[2]==0) {
break
}
smlj=1
if (t1==0) {
t1=5
s4hf=sml[1]
s24hf=sml[1]
tmp=hours-4
if (tmp<0) {
tmp+=24
}
idx4=tmp120+(mins2)+int(secs/30)
idx24=(hours60+mins)
s4h[0]=idx4%s4h[-1]
s4h=int(s4hf)
s24h[0]=idx24
s24h=int(s24hf)
cstr=„cnth“+s(0idx4)+„/120“
cstr2=„cnth“+s(0idx24)+„/60“
power2=(0.9power2)+((1-0.9)sml[1])
;=>publish stat/%topic%/script/power2 %power2%
if (swesp==1) {
if ((power2<-300) and (swespflg==0)) {
swespflg=1
}
if ((power2>100) and (swespflg==1)) {
swespflg=0
}
}
}
if (t2==0) {
t2=60
hr=hours
utm=s(2.0(int(uptime/1440)))+"d "+s(2.0(int(uptime/60)%24))+"h "+s(2.0(uptime%60))+„m“
dcon[day]=sml[2]-dval
mcon[month]=sml[2]-mval
dprod[day]=sml[3]-dval2
mcon[month+12]=sml[3]-mval2
if ((chg[hr]>0) and (hr==0)) {
if (day>1) {
da=day
} else {
for tmp (da+1) 31 1
dcon[tmp]=0
dprod[tmp]=0
next
mval=sml[2]
mval2=sml[3]
}
if (daymonth==1) {
yval=sml[2]
yval2=sml[3]
}
dval=sml[2]
dval2=sml[3]
=#save
}
}
; MODBUS TCP SERVER
tmp=wsa()
;print TCP Stream data: %0tmp%
if (tmp==12) {
;read tcp stream into array
wsra(mbrx)
if ((mbrx[8]==3) and (mbrx[12]<=6) and (mbrx[10]<3)) {
print reg: 4000%0mbrx[10]%, cnt: %0mbrx[12]%, fc: %0mbrx[8]%
; transaction id
mbtx[1]=mbrx[1]
mbtx[2]=mbrx[2]
; protocol id
mbtx[3]=0
mbtx[4]=0
; length
mbtx[5]=0
mbtx[6]=mbrx[12]*2+3
; device address
mbtx[7]=mbrx[7]
; function code
mbtx[8]=mbrx[8]
; payload len
mbtx[9]=mbrx[12]*2
; write response header
wswa(mbtx 9)
; write data, 0=uint8, 1=uint16, 2=sint16, 3=float
mbtx[1]=sml[1]
mbtx[2]=sml[2]
mbtx[3]=sml[3]
wswa(mbtx 3 3)
}
}
if (tmp>12) {
wsf()
}
W
Leistung (gefiltert){m}%0power2% W
Tagesverbrauch{m}%2(sml[2]-dval)% kWh
Monatsverbrauch{m}%2(sml[2]-mval)% kWh
Jahresverbrauch{m}%2(sml[2]-yval)% kWh
Tageseinspeisung{m}%2(sml[3]-dval2)% kWh
Monatseinspeisung{m}%2(sml[3]-mval2)% kWh
Jahreseinspeisung{m}%2(sml[3]-yval2)% kWh
Datum{m}%s(2.0day)%.%s(2.0month)%.%s(2.0year)% - %s(2.0hours)%:%s(2.0mins)%:%s(2.0secs)%
Uptime{m}%utm%
$
$
$gc(lt s4h „wr“ „Leistung [W]“ cstr)
$var options = {
$chartArea:{left:60,right:20,height:‚75%%‘},
$legend:‚none‘,
$vAxis:{format:‚# W‘},
$hAxis:{slantedTextAngle:45},
$explorer:{actions:[‚dragToZoom‘,‚rightClickToReset‘]},
$series: {0: {type: ‚area‘}},
$title:‚Leistung 4 Stunden [Watt]‘
$};
$gc(e)
$
$gc(lt s24h „wr“ „Leistung [W]“ cstr2)
$var options = {
$chartArea:{left:60,right:20,height:‚75%%‘},
$legend:‚none‘,
$vAxis:{format:‚# W‘},
$hAxis:{slantedTextAngle:45},
$explorer:{actions:[‚dragToZoom‘, ‚rightClickToReset‘]},
$series: {0: {type: ‚area‘}},
$title:‚Leistung 24 Stunden [Watt]‘
$};
$gc(e)
%=#daysub
%=#dayprod
%=#monthsub
$
$Version 31.12.2025 (PV+MB) by ottelo.jimdo.de & gemu2015 (ScriptEngine V%vers%)
$Hinweis: Alle Werte werden um Mitternacht gespeichert!
$4h Diagramm aktualisiert sich alle 30s, 24h Diagramm alle 60s.
$
w Stromzähler konfigurieren / Daten sichern
$Zurück
$
$Zählerwerte initialisieren
$Diagrammdaten speichern
so(17)
smlpd(„https://raw.githubusercontent.com/ottelo9/tasmota-sml-script/main/script-list-menu/meters“ „Stromzählerauswahl (Probleme?)“ sel)
pd(rxind "RX Pin: " 50 „#g“)
pd(txind "TX Pin: " 50 „#g“)