>D 40 ; IP for external ScriptEditor IP=192.168.178.31 ; (1) Beschreibung: ; Skript Version ganz unten ; Tasmota SML Skript mit Google Chart (Diagramme) ; Diese Variante bietet im Gegensatz zum anderen Script ein sehr hoch aufgelöstes Diagramm für die Momentanleistung der letzten Stunde (alle 5s ein Wert) ; 2 Liniendiagramme: Leistung der letzten Stunde (sehr fein aufgelöst, 5s) und Leistung der letzten 24h (grob aufgelöst) ; Das 4h Diagramm wird nicht gespeichert und ist nach jedem Neustart neu befüllt ; Tabellen mit Anzeige des Netzbezugs bzw. Netzeinspeisung (bei PV) pro Tag und pro Monat ; Tasmota muss mit dem Internet verbunden sein um die aktuelle Uhrzeit via NTP zu erhalten. Ansonsten muss das Skript angepasst werden. ; Optional im Skript enthalten: (Op1) Schalte zweiten ESP (z.B. Poolpumpe) bei Netzeinspeisung (Op2) Daten an www.clever-pv.com senden. Zum Aktivieren nach (OpX) suchen und inkl ; entfernen. ; (2) Anleitung: ; http://ottelo.jimdo.de/ ; (a) Skript an euren Zähler anpassen: ; ganz unten >M Sektion anpassen ; https://tasmota.github.io/docs/Smart-Meter-Interface/ ; (b) Script übertragen ; Ich empfehle das Script mit dem ext. Editor zu "komprimieren" (Kommentare entfernen). Script laden -> Window -> Export to documents folder. Dann einfach in Tasmota einfügen. ; ScriptEditor runterladen um dieses Skript auf den ESP zu übertragen. Der Editor entfernt alle Kommentare und leere Zeilen ; https://tasmota.github.io/docs/Scripting-Language/#optional-external-editor ; IP eures ESPs oben im Script eingeben, damit der Editor das Skript korrekt senden kann ; Hinweis Dateiformat Scriptdatei: UTF8, LF (\n) als Zeilenende (Unix EOL), damit der ext. Editor keine doppelten Leerzeichen anzeigt. Einstellbar in Notepad++ (Edit->EOL->Unix). ; (c) Initialisieren ; Wenn die Werte vom Stromzähler korrekt angezeigt werden, muss das Script einmalig initialisiert werden. Folgendes in die Tasmota Console eingeben - Achtung alle Daten im Diagramm/Tabelle werden gelöscht! ; script>=#init ; Zählerstand beim Jahreswechsel: Falls ihr den Jahresverbrauch für das aktuelle Jahr korrekt anzeigen wollt, könnt ihr den Zählerstand (kWh) vom 1.1. via Console nachträglich setzen (danach speichern): ;backlog script>yval=Zählerstand-Bezug; script>yval2=Zählerstand-Einspeisung ; (d) Um später fehlende oder falsche Werte in den Tabellen zu ändern, können folgende Befehle in der Console eingegeben werden: ;script?var beliebige Variable auslesen z.B. script?dcon[1] (erster Tag in Monatstabelle lesen) ;script>var=1 beliebige Variable schreiben z.B. script >dcon[1]=10 (erster Tag in Monatstabelle = 10 kWh) ; (e) Um eure Diagrammdaten zu exportieren/sichern könnt ihr folgendes hintereinander eingeben. Die ausgegebenen Daten einfach markieren und in eine Textdatei kopieren: ;script?dval script?dval2 script?dcon script?dprod script?mval script?mval2 script?mcon script?yval script?yval2 ; Zum Importieren müssen sie dann mit z.B. script>dcon={x x x x ...} eingeben werden. Am Ende speichern. ; -- ARRAYS -- ; 24h power chart M:p:sday=0 288 ; Tagesnetzbezug Tabelle 1-31 M:p:dcon=0 31 ; Tagesnetzeinspeisung Tabelle 1-31 M:p:dprod=0 31 ; Monatsverbrauch Tabelle 1-12, Einspeisung 13-24 M:p:mcon=0 24 ; 1h Chart, Neuer Wert alle 5s M:s4h=0 721 ; -- VARS -- ; PermVars (max:1536bytes=384vars): Tages, Monats, Jahres Verbrauch / Einspeisung p:mval=0 p:dval=0 p:mval2=0 p:dval2=0 p:yval=0 p:yval2=0 p:da=1 ;p:vn=12000 optional um per Slider Y-Achse Werte zu begrenzen t:t1=3 t:t2=5 t:t3=60 tmp=0 m5=0 cstr="cnt0/12" cstr2="cnth0/720" utm="00d 00h 00m" avgv=0 avgv2=0 avgvc=0 avgvc2=0 hr=0 swesp=0 swespflg=0 power2=0 save=0 ; -- BOOT -- >B =>sensor53 r tmp=is(0 "Jan|Feb|Mär|Apr|Mai|Jun|Jul|Aug|Sep|Okt|Nov|Dez|") ;Deaktiviere MQTT beim Start, verhindert das falsche Werte gesendet werden smlj=0 ; -- SUBS -- #init dval=sml[2] dval2=sml[3] for tmp 1 dcon[-1] 1 dcon[tmp]=0 dprod[tmp]=0 next mval=sml[2] mval2=sml[3] for tmp 1 mcon[-1] 1 mcon[tmp]=0 next yval=sml[2] yval2=sml[3] for tmp 1 sday[-1] 1 sday[tmp]=0 next ->Backlog2 otaurl KEIN OTA UPGRADE VIA WEBSERVER! ->Backlog2 Timezone 99;TimeStd 0,0,10,1,3,60;TimeDst 0,0,3,1,2,120 svars ; Tagesverbrauch Tabelle #daysub if wm>0 { wcs
wcs } ; Tageseinspeisung PV Tabelle #dayprod if wm>0 { wcs wcs } ; Netzverbrauch und Einspeisung Monat Tabelle #monthsub if wm>0 { wcs wcs } ; -- JEDE SEKUNDE -- >S ; Daten sofort speichern Button if (save==1) { save=0 svars } ; Warte auf NTP und Zähler if ((year<2020) or (sml[2]==0)) { print auf NTP/Zähler warten break } ; Starte MQTT erst wenn Daten vom Stromzähler kommen smlj=1 ; alle 3s if (t1==0) { t1=3 ; Leistung aufsummieren 24h Diagramm avgv2+=sml[1] avgvc2+=1 ; Optional: gemittelte Leistung für z.B. opendtu-onbattery DPL: http://192.168.178.31/cm?user=admin&password=joke&cmnd=script?power2 power2=(0.9*power2)+((1-0.9)*sml[1]) ;=>publish stat/%topic%/script/power2 %power2% ; (Op1) Schalte anderen ESP bei Netzeinspeisung. Schaue in die >W Sektion. if (swesp==1) { if ((power2<-300) and (swespflg==0)) { ;->websend [192.168.0.50] power ON ;print power ON %power2%W swespflg=1 } if ((power2>100) and (swespflg==1)) { ;->websend [192.168.0.50] power OFF ;print power OFF %power2%W swespflg=0 } } ; (Op2) Siehe https://ottelo.jimdofree.com/stromz%C3%A4hler-auslesen-tasmota/#8 ;->WebQuery EURE-PUSH-API-URL POST [Content-Type:application/json] {"watt": %0sml[1]%} } ; alle 5s if (t2==0) { t2=5 ; 1h chart. idx wird automatisch gesetzt s4h=sml[1] ; Setze 1h Chart X-Achse alle 5s => /720 Werte pro Stunde. Arraygrösse = 720 ; 2880: 720 Werte pro Stunde * 24h => modulo ; (hours+23)*720: hours=0-23 * 720, da pro Stunde 720 Werte ; +23 = Offset, da das Diagramm 24-1h in die Vergangenheit reichen soll ; mins*2: (mins=0-59), *12 da pro Minute 12 Werte ; secs/5: (secs=0-59), /5 da pro 5s ein Wert cstr2="cnth"+s(1.0((((hours+23)*720)+(mins*12)+(int(secs/5)))%17280+1))+"/720" } ; alle 60s if (t3==0) { t3=60 hr=hours ;Zeit seit letztem Boot utm=s(2.0(int(uptime/1440)))+"d "+s(2.0(int(uptime/60)%24))+"h "+s(2.0(uptime%60))+"m" ; Tagesverbrauch [kWh] dcon[day]=sml[2]-dval ; Monatsverbrauch [kWh] mcon[month]=sml[2]-mval ; Tageseinspeisung [kWh] dprod[day]=sml[3]-dval2 ; Monatseinspeisung [kWh] mcon[month+12]=sml[3]-mval2 ;=>publish stat/%topic%/script/consday %2(dcon[day])% ;=>publish stat/%topic%/script/yieldday %2(dprod[day])% ;=>publish stat/%topic%/script/consmonth %2(mcon[month])% ;=>publish stat/%topic%/script/yieldmonth %2(mcon[month+12])% ;=>publish stat/%topic%/script/consyear %2(sml[2]-yval)% ;=>publish stat/%topic%/script/yielyear %2(sml[3]-yval2)% ; 24h Chart. Berechne Durschnittsleistung [W] der letzten 5min => ins 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 } ; Aktualisiere 24h Chart alle 5Min => Arraygröße 288 ; 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" ; Tagesverbrauch & Einspeisung Berechnung um Mitternacht if ((chg[hr]>0) and (hr==0)) { if (day>1) { da=day } else { ; Monatswechsel for tmp (da+1) 31 1 dcon[tmp]=0 dprod[tmp]=0 next ; monthly values mval=sml[2] mval2=sml[3] } if (day*month==1) { ; Jahreswechsel yval=sml[2] yval2=sml[3] } ; daily values dval=sml[2] dval2=sml[3] ; nur 1x um Mitternacht speichern svars } } ; WEB INTERFACE >W ; Auto reload ;$ ;Tasmota Buttons ausblenden. Um an die Menüs zu kommen z.B. http://tasmota-ip/mn? eingeben ; ; web button bu(save "gespeichert!" "Daten sofort speichern") ; (Op1) Schalte anderen ESP bei Netzeinspeisung. Schaue in die >S Sektion. ;bu(swesp "PV Steckdose aktivieren" "PV Steckdose deaktivieren") ; optional um per Slider Y-Achse Werte zu begrenzen, suche im Skript nach vn ;sl(4000 20000 vn "4 kW" "12 kW" "20 kW") ; Filtered power Leistung (gefiltert){m}%0power2% W ; Verbrauch Tagesverbrauch{m}%2(sml[2]-dval)% kWh Monatsverbrauch{m}%2(sml[2]-mval)% kWh Jahresverbrauch{m}%2(sml[2]-yval)% kWh ; Einspeisung (PV) Tageseinspeisung{m}%2(sml[3]-dval2)% kWh Monatseinspeisung{m}%2(sml[3]-mval2)% kWh Jahreseinspeisung{m}%2(sml[3]-yval2)% kWh ; Zeit Datum{m}%s(2.0day)%.%s(2.0month)%.%s(2.0year)% - %s(2.0hours)%:%s(2.0mins)%:%s(2.0secs)% Uptime{m}%utm% $