Advertisement
ottelo15

Fronius Gen24 Smart Meter Modbus TCP SunSpec Emulation mit ESP32 und Tasmota

Mar 14th, 2024 (edited)
740
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.24 KB | None | 0 0
  1. >D
  2. ; ottelo.jimdo.de
  3. ; Fronius Gen24 Smart Meter Modbus TCP SunSpec Emulation mit ESP32 und Tasmota.
  4. ; Das Script emuliert ein Fronius Smart Meter TCP (Primary Power Meter),
  5. ; indem es per SML den Stromzähler ausliest und die drei Messwerte aktuelle
  6. ; Leistung, total_WH_exp und total_Wh_Imp per Modbus TCP nach SunSpec Standard
  7. ; zur Verfügung stellt. Die Fronius MODBUS Register Referenz gibt es direkt bei
  8. ; Fronius zum Download. In dem .zip gibt es Smart_Meter_Register_Map_Float.xlsx,
  9. ; darin sind alle Register definiert. Die Reihenfolge und Gruppierung der Registerabfragen
  10. ; wurden nur für den Fronius Gen24 ermittelt und im Script emuliert, für andere Wechselrichter
  11. ; die auch den SunSpec Standard nutzen muss es wohl angepasst werden. Getestet mit einem
  12. ; Wechselrichter Fronius Gen24 mit aktueller Firmware 1.28.7-1.
  13. ; vom Leser CherAlban und gemu2015 (Tasmota Script Entwickler)
  14. ; Script mit dem externen Tasmota Script Editor übertragen oder Copy&Paste auf den ESP32 übertragen
  15. pcurr=0
  16.  
  17. ; variables Modbus
  18. res=0
  19. cnt=0
  20. xcnt=0
  21. reg=0
  22. nval=0
  23. dform=0
  24. ecnt=0
  25. ctime=0
  26.  
  27. vsml1=0
  28. vsml2=0
  29. vsml3=0
  30.  
  31. M:req=0 12
  32. M:resp=0 9
  33. M:data=0 66
  34.  
  35. >B
  36. =>sensor53 r
  37.  
  38. >BS
  39. ; start TCP server
  40. res=wso(502)
  41. print res=%res%
  42. ; create task 1 every 10ms on core1, priority 3, stack 8kb
  43. ct(1 10 1 3 8000)
  44.  
  45. ; set Modbus register values
  46. #dosel
  47. data[0]=0
  48. ; default = word
  49. dform=1
  50. switch reg
  51.   case 768
  52.         data={0}
  53.  
  54.     case 1706
  55.         data={0}
  56.  
  57.     case 40000
  58.         data={21365 28243}
  59.  
  60.     case 40002
  61.         data={1 65}
  62.  
  63.     case 40004
  64.         data={70 114 111 110 105 117 115 0 0 0 0 0 0 0 0 0}
  65.         data={83 109 97 114 116 32 77 101 116 101 114 32 54 51 65 0}
  66.         data={0 0 0 0 0 0 0 0}
  67.         data={0 0 0 0 0 0 0 0}
  68.         data={48 48 48 48 48 48 48 49 0 0 0 0 0 0 0 0}
  69.         data={240 213}
  70.  
  71.     case 40069
  72.         data={213 124}
  73.  
  74.     case 40071
  75.         data={0 0 0 0 0}
  76.         data={0 0 0 0 0}
  77.         data={0 0 0 vsml1 0}
  78.         data={0 0 0 0 0}
  79.         data={0 0 0 0 0}
  80.         data={0 0 0 0 0}
  81.         dform=3
  82.         nval=nval/2
  83.  
  84.     case 40129
  85.         data={vsml3 0 0 0 vsml2}
  86.         data={0 0 0 0 0}
  87.         data={0 0 0 0 0}
  88.         data={0}
  89.         dform=3
  90.         nval=nval/2
  91.  
  92.     case 40193
  93.         data={0 0}
  94.  
  95.     case 40195
  96.         data={65535 0}
  97.  
  98.     case 50000
  99.         data={0 0}
  100.  
  101. ;current power in W 40097 sml[1]
  102. ;total Wh exp 40129 sml[3]
  103. ;total Wh Imp 40137 sml[2]
  104.  
  105. ends
  106.  
  107.  
  108. >t1
  109. ; check incomming data
  110. xcnt =wsa()
  111. if xcnt>=12 {
  112.     ; check if sml values are valid, else discard request
  113.     if vsml2>0
  114.     and vsml3>0
  115.     and xcnt<=120 {
  116.         res=wsra(req)
  117.  
  118.         reg=(req[9]<<8)|req[10]
  119.         nval=req[12]
  120.         ; print register %reg%, count %nval%
  121.  
  122.         ; transaction id
  123.         resp[1]=req[1]
  124.         resp[2]=req[2]
  125.         ; protocol id
  126.         resp[3]=0
  127.         resp[4]=0
  128.         ; length
  129.         resp[5]=0
  130.         resp[6]=req[12]*2+3
  131.         ;device address
  132.         resp[7]=req[7]
  133.         ; function code
  134.         resp[8]=req[8]
  135.         ; payload len
  136.         resp[9]=req[12]*2
  137.  
  138.         ; write response header
  139.         wswa(resp 9)
  140.  
  141.         ; write response data
  142.         =#dosel
  143.         wswa(data nval dform)
  144.         ; next
  145.     } else {
  146.         ecnt=ecnt+1
  147.         print clear TCP buffer %xcnt% ecnt %ecnt%
  148.         wsf()
  149.     }
  150. }
  151.  
  152. >F
  153. vsml1=sml[1]
  154. vsml2=sml[2]*1000
  155. vsml3=sml[3]*1000
  156.  
  157. >R
  158. ; close server
  159. res=wsc()
  160.  
  161. >M 1
  162. +1,16,s,0,9600,SML
  163. 1,77070100100700ff@1,Leistung,W,Power_curr,0
  164. 1,77070100010800ff@1000,Verbrauch,kWh,Total_in,3
  165. 1,77070100020800ff@1000,Netzeinspeisung,kWh,Total_out,3
  166. #
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement