Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- >D
- ; ottelo.jimdo.de
- ; Fronius Gen24 Smart Meter Modbus TCP SunSpec Emulation mit ESP32 und Tasmota.
- ; Das Script emuliert ein Fronius Smart Meter TCP (Primary Power Meter),
- ; indem es per SML den Stromzähler ausliest und die drei Messwerte aktuelle
- ; Leistung, total_WH_exp und total_Wh_Imp per Modbus TCP nach SunSpec Standard
- ; zur Verfügung stellt. Die Fronius MODBUS Register Referenz gibt es direkt bei
- ; Fronius zum Download. In dem .zip gibt es Smart_Meter_Register_Map_Float.xlsx,
- ; darin sind alle Register definiert. Die Reihenfolge und Gruppierung der Registerabfragen
- ; wurden nur für den Fronius Gen24 ermittelt und im Script emuliert, für andere Wechselrichter
- ; die auch den SunSpec Standard nutzen muss es wohl angepasst werden. Getestet mit einem
- ; Wechselrichter Fronius Gen24 mit aktueller Firmware 1.28.7-1.
- ; vom Leser CherAlban und gemu2015 (Tasmota Script Entwickler)
- ; Script mit dem externen Tasmota Script Editor übertragen oder Copy&Paste auf den ESP32 übertragen
- pcurr=0
- ; variables Modbus
- res=0
- cnt=0
- xcnt=0
- reg=0
- nval=0
- dform=0
- ecnt=0
- ctime=0
- vsml1=0
- vsml2=0
- vsml3=0
- M:req=0 12
- M:resp=0 9
- M:data=0 66
- >B
- =>sensor53 r
- >BS
- ; start TCP server
- res=wso(502)
- print res=%res%
- ; create task 1 every 10ms on core1, priority 3, stack 8kb
- ct(1 10 1 3 8000)
- ; set Modbus register values
- #dosel
- data[0]=0
- ; default = word
- dform=1
- switch reg
- case 768
- data={0}
- case 1706
- data={0}
- case 40000
- data={21365 28243}
- case 40002
- data={1 65}
- case 40004
- data={70 114 111 110 105 117 115 0 0 0 0 0 0 0 0 0}
- data={83 109 97 114 116 32 77 101 116 101 114 32 54 51 65 0}
- data={0 0 0 0 0 0 0 0}
- data={0 0 0 0 0 0 0 0}
- data={48 48 48 48 48 48 48 49 0 0 0 0 0 0 0 0}
- data={240 213}
- case 40069
- data={213 124}
- case 40071
- data={0 0 0 0 0}
- data={0 0 0 0 0}
- data={0 0 0 vsml1 0}
- data={0 0 0 0 0}
- data={0 0 0 0 0}
- data={0 0 0 0 0}
- dform=3
- nval=nval/2
- case 40129
- data={vsml3 0 0 0 vsml2}
- data={0 0 0 0 0}
- data={0 0 0 0 0}
- data={0}
- dform=3
- nval=nval/2
- case 40193
- data={0 0}
- case 40195
- data={65535 0}
- case 50000
- data={0 0}
- ;current power in W 40097 sml[1]
- ;total Wh exp 40129 sml[3]
- ;total Wh Imp 40137 sml[2]
- ends
- >t1
- ; check incomming data
- xcnt =wsa()
- if xcnt>=12 {
- ; check if sml values are valid, else discard request
- if vsml2>0
- and vsml3>0
- and xcnt<=120 {
- res=wsra(req)
- reg=(req[9]<<8)|req[10]
- nval=req[12]
- ; print register %reg%, count %nval%
- ; transaction id
- resp[1]=req[1]
- resp[2]=req[2]
- ; protocol id
- resp[3]=0
- resp[4]=0
- ; length
- resp[5]=0
- resp[6]=req[12]*2+3
- ;device address
- resp[7]=req[7]
- ; function code
- resp[8]=req[8]
- ; payload len
- resp[9]=req[12]*2
- ; write response header
- wswa(resp 9)
- ; write response data
- =#dosel
- wswa(data nval dform)
- ; next
- } else {
- ecnt=ecnt+1
- print clear TCP buffer %xcnt% ecnt %ecnt%
- wsf()
- }
- }
- >F
- vsml1=sml[1]
- vsml2=sml[2]*1000
- vsml3=sml[3]*1000
- >R
- ; close server
- res=wsc()
- >M 1
- +1,16,s,0,9600,SML
- 1,77070100100700ff@1,Leistung,W,Power_curr,0
- 1,77070100010800ff@1000,Verbrauch,kWh,Total_in,3
- 1,77070100020800ff@1000,Netzeinspeisung,kWh,Total_out,3
- #
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement