Bessere Firmware als Original

Moin zusammen,

ich bin hier durch ein Post auf eine Firmware aufmerksam geworden welche um einiges mehr kann als hier nur den Strom anzuzeigen.

Da sie noch nicht zu 100% zu diesem Leser passt, habe ich mich gestern Abend mal hingesetzt und die nötigen Schritte selbst erstellt und ihr könnt anhand der Screenshots sehen was sie alles kann.

Die Originale Webseite ist hier zu finden:

https://ottelo.jimdofree.com/stromzähler-auslesen-tasmota/

Das Image findet ihr hier

tasmota32c3_ottelo.zip

Das flashen macht ihr wie gewohnt. jetzt müsst ihr nur noch folgendes anpassen.

Euren Zähler wählen unter

Strömzähler konfigurieren

RX Pin auf 3

TX Pin auf 1

unter Tools

Manage Files die sml_meter.def anpassen auf:

>M 1
+1,%0rxpin%,s,16,9600,SML,%0txpin%
1,77070100100700ff@1,Verbrauch,W,Power_curr,0
1,77070100010800ff@1000,Gesamtverbrauch,KWh,Total_in,4
1,77070100020800ff@1000,Gesamteinspeisung,KWh,Total_out,4
1,77070100600100ff@#,Zählernummer,Meter_Id,0

dann auf edit Skript gehen und euch eure gewünschte Einstellung raussuchen.

Features:

- Visuelle Anzeige des Verbrauchs (Tages, Monats, Jahresansicht)

- Visuelle Anzeige der Einspeisung (Tages, Monats, Jahresansicht) „+PV“

- Gefilterter Leistungswert z.B. für Regelung Nulleinspeisung (openDTU-onbattery). Vergleich Leistung gefiltert und ungefiltert siehe Bild unten und FAQ Nr 9.

- Alle Daten können auch via MQTT übertragen werden! Siehe Kapitel 10.

- Im Skript sind optionale Inhalte deaktiviert (auskommentiert mit „;“ am Anfang der Zeile). Zum Aktivieren das Semikolon entfernen. Es gibt folgende Optionen:

> Werte (Leistung) im 4h/24h-Diagramm begrenzen. Optional auch über ein Schieberegler. Sucht im Skript nach „vn“ um die Stellen zu finden, die aktiviert werden müssen.

> Seite automatisch aktualisieren. Sucht nach „Auto reload“ im Skript.

> Schalte einen 2. ESP (Verbraucher) bei Netzeinspeisung. Suche nach „swesp“ im Skript.

> Tages, Monats, Jahreswerte via MQTT übertragen. Suche nach „publish“ im Skript.

> Einfacher Säulenchart darstellen. Suche nach „Säulenchart“ im Skript.

  • Tasmota Script Google Chart SML github
    Hinweis: Wenn ihr mein Script bearbeitet um eure SML Descriptor Zeilen einzufügen, denkt an die korrekte Reihenfolge: Die Zeile 1. ist die Leistung (sml[1]), 2. Energie vom Netz (sml[2]), 3. Energie ins Netz (sml[3]). Folgende weitere Scripte findet ihr hinter dem Link:
    Tasmota SML Script + Chart + PV (mit visuelle Anzeige der Netzeinspeisung, falls ihr eine PV Anlage habt)*
    Tasmota SML Script + Chart + PV - ohne 4h 24h Diagramm* (ich habe beide Diagramme und deren Variablen entfernt, spart Speicher)
    *Tasmota SML Script + Chart
    Tasmota SML Script + Chart für 1-Richtungszähler und PV (*Falls man ein BKW (Balkonkraftwerk) und einen rücklaufgesperrten Zähler hat, der aber die Leistung negativ anzeigt, wenn ins Netz gespeist wird. Anhand der aktuellen negativen Leistung wird die eingespeiste Energie errechnet, anstatt diesen Wert direkt vom Zähler zu bekommen. Man hat so einen virtuellen Einspeisezähler statt der Auslesung aus einem Zwei-Richtungszähler.)
    und noch mehr Scripte auf github …

Spass haben.

1 Like

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.9
power2)+((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 (day
month==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“)

Also bei mir fehlen die Tagesangaben und Grafiken.

Wo ist der Trick? Ich habe die Otello Firmware per OTA installiert

das du das richtige im drop down menu ausgewählt? es gibt mehrere einstellungen