Skip to content

Commit 3d7c0e4

Browse files
committed
feat: Add OCR_MAX_INCR flag
1 parent cbd28cb commit 3d7c0e4

3 files changed

Lines changed: 20 additions & 5 deletions

File tree

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ All options can be set via CLI flags or environment variables. Flags take preced
135135
| `--mqtt-device-model` | `MQTT_DEVICE_MODEL` | `Generic` | Model shown in Home Assistant |
136136
| `--meter-divisor` | `METER_DIVISOR` | `1000` | Divisor to convert raw reading to m³ (e.g. `000354225` / `1000` = `354.225`) |
137137
| `--ocr-incr-only` | `OCR_INCR_ONLY` | `false` | Only publish readings that are ≥ the previous value (after dividing by `meter-divisor`), discarding likely OCR errors |
138+
| `--ocr-max-incr` | `OCR_MAX_INCR` | `0` | Maximum allowed increase between consecutive readings (after `meter-divisor`); larger jumps are discarded as OCR errors (`0` = disabled) |
138139
139140
### MQTT / Home Assistant
140141

http.go

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -129,13 +129,20 @@ func processOCR(imageData []byte, batLevel, batVoltage int) {
129129

130130
divided := val / meterDivisor
131131

132-
if ocrIncrOnly {
132+
if ocrIncrOnly || ocrMaxIncr > 0 {
133133
lastReadingMu.Lock()
134134
prev := lastReading
135-
if !math.IsNaN(prev) && divided < prev {
136-
lastReadingMu.Unlock()
137-
log.Printf("OCR incr-only: discarding reading %.3f < previous %.3f", divided, prev)
138-
return
135+
if !math.IsNaN(prev) {
136+
if ocrIncrOnly && divided < prev {
137+
lastReadingMu.Unlock()
138+
log.Printf("OCR incr-only: discarding reading %.3f < previous %.3f", divided, prev)
139+
return
140+
}
141+
if ocrMaxIncr > 0 && divided-prev > ocrMaxIncr {
142+
lastReadingMu.Unlock()
143+
log.Printf("OCR max-incr: discarding reading %.3f, increase %.3f > max %.3f (previous %.3f)", divided, divided-prev, ocrMaxIncr, prev)
144+
return
145+
}
139146
}
140147
lastReading = divided
141148
lastReadingMu.Unlock()

main.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ var (
3131
mqttDeviceModel string
3232
meterDivisor float64
3333
ocrIncrOnly bool
34+
ocrMaxIncr float64
3435
ocrMergeTexts bool
3536
)
3637

@@ -143,6 +144,11 @@ func main() {
143144
Usage: "Only publish readings that are >= the previous reading (after dividing by meter-divisor), discarding likely OCR errors",
144145
Sources: cli.EnvVars("OCR_INCR_ONLY"),
145146
},
147+
&cli.FloatFlag{
148+
Name: "ocr-max-incr",
149+
Usage: "Maximum allowed increase between consecutive readings (after dividing by meter-divisor); larger jumps are discarded as OCR errors (0 = disabled)",
150+
Sources: cli.EnvVars("OCR_MAX_INCR"),
151+
},
146152
},
147153
Action: run,
148154
}
@@ -171,6 +177,7 @@ func run(_ context.Context, cmd *cli.Command) error {
171177
mqttDeviceModel = cmd.String("mqtt-device-model")
172178
meterDivisor = cmd.Float("meter-divisor")
173179
ocrIncrOnly = cmd.Bool("ocr-incr-only")
180+
ocrMaxIncr = cmd.Float("ocr-max-incr")
174181
ocrMergeTexts = cmd.Bool("ocr-merge-texts")
175182

176183
if mqttBroker != "" {

0 commit comments

Comments
 (0)