Mein Stromzähler ist ein Elster AS1440. Das ist ein Zweitarifzähler der den Verbrauch wie auch die Einspeisung getrennt anzeigt.
Ist es damit möglich einen Shelly oder EcoTracker zu emulieren? Der zeigt ja die Einspeisung nicht mit einem "-" an.
>D 250
; this script emulates a shelly pro, with small modifications may also emulate an ecotracker
; proven to work an marstek Venus, Jupiter and B2500
scnt=0
res=0
c1p=0
c2p=0
c3p=0
c1c=0
c2c=0
c3c=0
cpwr=0
str=""
tstr=""
cstr=""
mstr1=""
mstr2=""
mstr3=""
header=""
once=0
>B
=>sensor53 r
; if you modify this section you must restart tasmota
>ah
; http rpc handler
res=won(1 "/rpc/*")
; http status
res=won(2 "/status")
; http status
res=won(3 "/v1/json")
>on1
;print here comes http rpc request
str=warg
res=ins(str "EM.GetStatus")
if res>=0 {
wcs so(4)
=#htph
wcs %mstr1%
=#getsrc
wcs %header%
=#getstat
wcs %mstr1%
wcs %mstr2%
wcf
break
}
res=ins(str "Shelly.GetDeviceInfo")
if res>=0 {
wcs so(4)
=#htph
wcs %mstr1%
=#getsrc
=#getdefi
wcs %header%
wcs %mstr1%
wcs %mstr2%
wcf
break
}
res=ins(str "EM.GetConfig")
if res>=0 {
wcs so(4)
=#htph
wcs %mstr1%
=#getsrc
=#getcfg
wcs %header%
wcs %mstr1%
wcf
break
}
res=ins(str "EMData.GetStatus")
if res>=0 {
wcs so(4)
=#htph
wcs %mstr1%
=#getsrc
=#egetstat
wcs %header%
wcs %mstr1%
wcf
break
}
print unknown http equest: %str%
>on2
;print here comes the status request
wcs so(4)
=#htph
wcs %mstr1%
dp(0 2)
wcs {"Power": %cpwr%,"E_in":%sml[2]%,"E_out":%sml[5]%}
wcf
>on3
;print here comes the v1/json for ecotracker
wcs so(4)
=#htph
wcs %mstr1%
dp(0 2)
wcs {"energyCounterIn":0,"energyCounterOut":%sml[5]%,"powerAvg":%cpwr%,"energyCounterInT1":%sml[2]%,
wcs "energyCounterInT2":%sml[3]%,"power":%cpwr%}
wcf
#htph
mstr1="HTTP/1.1 200 OK\r\nContent-type: application/json\r\n\r\n"
#getcfg
mstr1="{\"id\":0,\"name\":null,\"blink_mode_selector\":\"active_energy\",\"phase_selector\":\"a\",\"monitor_phase_sequence\":true,\"ct_type\":\"120A\"}}"
#getdefi
mstr1="{\"name\":\""+tstr+"\",\"id\":\""+tstr+"\",\"mac\":\""+maca+"\",\"slot\":1,\"model\":\"SPEM-003CEBEU\","
mstr2="\"gen\":2,\"fw_id\":\"20241011-114455/1.4.4-g6d2a586\","
mstr2+="\"ver\":\"1.4.4\",\"app\":\"Pro3EM\",\"auth_en\":0,\"profile\":\"triphase\"}}"
#getstat
dp(0 2)
mstr1="{\"id\":0,\"a_current\":"+s(c1c)+",\"a_voltage\":230,\"a_act_power\":"+s(c1p)+",\"a_aprt_power\":"+s(c1p)+",\"a_pf\":1,\"a_freq\":50,"
mstr1+="\"b_current\":"+s(c2c)+",\"b_voltage\":230,\"b_act_power\":"+s(c2p)+",\"b_aprt_power\":"+s(c2p)+",\"b_pf\":1,\"b_freq\":50,"
mstr2="\"c_current\":"+s(c3c)+",\"c_voltage\":230,\"c_act_power\":"+s(c3p)+",\"c_aprt_power\":"+s(c3p)+",\"c_pf\":1,\"c_freq\":50,"
mstr2+="\"total_current\":"+s(c1c+c2c+c3c)+",\"total_act_power\":"+s(cpwr)+",\"total_aprt_power\":"+s(cpwr)+"}}"
#egetstat
dp(0 2)
mstr1="{\"id\":0,\"a_total_act_energy\":"+s(c1p)+",\"a_total_act_ret_energy\":"+s(c1p)+",\"b_total_act_energy\":"+s(c2p)+",\"b_total_act_ret_energy\":"+s(c2p)+",\"c_total_act_energy\":"+s(c3p)+",\"c_total_act_ret_energy\":"+s(c3p)+",\"total_act\":"+s(cpwr)+",\"total_act_ret\":"+s(cpwr)+"}}"
#getsrc
tstr="shellypro3em-"+maca
header="{\"id\":0,\"src\":\""+tstr+"\",\"result\":"
>S
if year<2000 {
break
}
; adapt this to your meter
; update every 3 seconds
if upsecs%3==0 {
cpwr=sml[4]
c1p=sml[4]
c2p=sml[5]
c3p=sml[6]
}
; use this if you only have only one phase meter values
;c1p=cpwr/3
;c2p=cpwr/3
;c3p=cpwr/3
; calculate phase currents
c1c=c1p/230
c2c=c2p/230
c3c=c3p/230
if once==0 {
; start mdns for Shelly second parameter "-" means use device mac
res=mdns("shellypro3em-" "-" "shelly")
; start udp rpc handler on port 1010 or on port 2220 (for b2500)
res=udp(0 1010)
;res=udp(0 2220)
once=1
}
; evaluate udp input
str=udp(1)
if str!="" {
;print udp rpc payload=%str%
res=ins(str "EM.GetStatus")
if res>=0 {
=#getsrc
=#getstat
udp(2 header mstr1 mstr2)
;print >> %header%
;print >> %mstr1%
;print >> %mstr2%
break
}
res=ins(str "Shelly.GetDeviceInfo")
if res>=0 {
=#getsrc
=#getdefi
udp(2 header mstr1 mstr2)
;print >> 1 %mstr1%
;print >> 2 %mstr2%
break
}
res=ins(str "EM.GetConfig")
if res>=0 {
=#getsrc
=#getcfg
udp(2 header mstr1)
;print >> 1 %mstr1%
break
}
res=ins(str "EMData.GetStatus")
if res>=0 {
=#getsrc
=#egetstat
udp(2 header mstr1)
;print >> 1 %mstr1%
break
}
}
; adapt your own meter descriptor here
>F
; count 100ms
scnt+=1
switch scnt
;300ms after start: set sml driver to 300 baud and send /?! as HEX to trigger the Meter
case 3
res=sml(1 0 300)
res=sml(1 1 "2F3F210D0A")
;1700ms later: Ack and ask for switching to 9600 baud
case 20
res=sml(1 1 "063035300D0A")
;300ms later: switch sml driver to 9600 baud
case 23
res=sml(1 0 9600)
;6000ms after start: Restart sequence
case 60
scnt=0
ends
>M 1
+1,5,o,0,9600,AS1440,4
1,1-1:1.7.0(@0.001,Power In,W,power_in,16
1,1-1:1.8.2(@1,Total_HT In,KWh,Total_in_HT,1
1,1-1:1.8.1(@1,Total_NT In,KWh,Total_in_NT,1
1,1-1:2.7.0(@0.001,Power Out,W,power_out,16
1,1-1:2.8.0(@1,Total Out,KWh,Total_out,1
#
Alles anzeigen
Ich nutze zur Zeit den "power_out" Wert per "status" in OpenDTU-OnBattery um die Einspeisung etwas einzudämmen. Dort lässt sich das "-" ja hinzufügen, so das OpenDTU-OnBattery diesen Wert als Einspeisung erkennt.
Der Powerwert ist der für die Einspeisung. Diesem Wert müsste man ja irgendwie noch ein "-" hinzufügen um ihn nutzen zu können.