Hi, ich habe nun doch noch ein paar Fragen.
Ich versuche unseren Gaszähler mit einem Hall-Sensor (49e) zu erfassen. Das funktioniert schon deutlich besser als mit meinem reed-Kontakt (der blieb nach einer Weile immer hängen), doch ich habe das Problem, dass immer wieder ein paar Durchläufe nicht erfasst werden - immer wenn hier im Haus ordentlich gefeuert wird, dann ist eine Änderung max. 3s lang.
Ich habe nun viel experimentiert und mein Script einige Mal geändert.
Doch egal was ich mache, mein Problem ist, dass die Übernahme des Analog-Wertes in der teleperiod recht träge ist. Ich habe mir testweise den Wert in die console printen lassen und teilweise dauert es >5s bis der Wert dem entspricht, der auf der Startseite für analog1 ausgegeben wird. Laut der Doku wird der >T Bereich min. alle 100ms durchlaufen, doch das sehe ich einfach nicht.
Ich bin mit der Logik nun in den >S Teil gegangen und habe das Gefühl, dass es etwas besser läuft. Trotzdem rutscht immer wieder ein Messpunkt durch.
Wie kann ich das Script optimieren, dass die Änderungen zügiger erfasst werden?
Hier ist mein komplettes Script. Den Zähler für Gas nutze ich im Prinzip nur virtuell. Ich erhöhe ihn, wenn eine analoge Änderung wahrgenommen wurde. Der ist auf einen ungenutzten GPIO konfiguriert.
Als Board ist ein esp32-s2 mini im Einsatz.
>D
;Gas Memory
p:g_mem=0
;Strom Memory
p:s_mem=0
;Strom Out Memory
p:so_mem=0
;Gas Gesamt
g_val=0
;Gas Gestern
gy=0
;Gas Heute
gt=0
; interner Zähler der Umdrehungen / Tag
cnt=0
; analog Hilfsvariable
an1=9999
; Gas Temp: Gas Gesamt * 10 | Wird zum setzen von c1 genutzt
g_temp=0
; flag ob gezählt werden soll
do=0
; Strom Gestern
sy=0
; Strom Heute
st=0
; Strom In (durch SML)
s_in=0
; Strom Out (durch SML)
s_out=0
; Strom Out Heute
sot=0
; Strom Out Gestern
soy=0
;Zeit
hr=99
>B
=>sensor53 r
>S
gt=g_val-g_mem
st=s_in-s_mem
sot=s_out-so_mem
hr=hours
if an1<2030
and do==1
then
do=0
g_temp=g_val*10+1
cnt+=1
;g_temp+=1
->Sensor53 c1 %g_temp%
endif
if an1>2080
and do==0
then
do=1
endif
; zaehler zurücksetzen
if chg[hr]>0
and hours==0
then
s_mem=s_in
sy=st
st=0
so_mem=s_out
soy=sot
g_mem=g_val
gy=gt
cnt=0
svars
=>Publish tele/energy/zaehler/reset {"Time":"%tstamp%","Memory":{"Gas":%1g_mem%,"Strom_in":%4s_mem%, "Strom_out":%4so_mem%}}
endif
; alle 10 Sekunden Status ausgeben
if upsecs%10==0{
+>status 10
svars
}
>T
g_val=Gas#Gesamt
s_in=SML#Total_in
s_out=SML#Total_out
an1=ANALOG#A1
>W
Gas heute/gestern: {m} <p style="color:#ffa600;">%1gt% / %1gy% m³</p>
<span style="color:#cacaca;">__________________</span>
Strom heute/gestern: {m} <p style="color:#FF0000;">%2st% / %2sy% kWh</p>
Eingespeist heute/gestern: {m} <p style="color:#06cf06;">%2sot% / %2soy% kWh</p>
<span style="color:#cacaca;">__________________</span>
Analog/Zähler/doCount: {m} <p style="color:#00d6e9;">%0an1%/%0cnt%/%0do%</p>
>M 2
+1,4,s,0,9600,SML
1,77070100010800ff@1000,Verbraucht,KWh,Total_in,4
1,77070100020800ff@1000,Eingespeist,KWh,Total_out,4
1,77070100100700ff@1,Power,W,Power_curr,1
2,=h====================
+2,39,c,1,-25,Gas
2,1-0:1.8.0*255(@10,Gesamt,m3,Gesamt,1
Alles anzeigen