Ich würde das wie folgt machen (bezogen auf die Datenbank):
-
nach dem "Erwachen" des ESP sucht er in der Datenbank nach "offenen Tickets" (s.unten) und löscht oder schließt es (das sind fehlerhafte Einträge)
-
er legt (per SQL) in der Spalte "counter" ein "offenes Ticket" an, z.B. den Wert -1 und setzt einen internen Counter auf Null, der per Timer inkrementiert wird
-
wenn das Ausschalten erkannt wird (Elko/Komparator) wird in der Tabelle nach der Anzahl der Einträge gesucht ("update table set counter=(select count(*) from table) where counter = -1") und diese an Stelle der -1 geschrieben. In die Spalte "time" kommt dann noch der interne Zählerstand vom Timer ...
Es geht auch anders herum: Man setzt gleich den Counter auf die aktuelle Anzahl und die Zeit zunächst auf Null. Beim Abknicken wird dann schnell noch die Zeit auf einen Wert ungleich Null gesetzt ...
Da kollidiert übrigens garnix mit den Normalformen. Ob allerdings das Auslesen mit "select max(counter) from table" tatsächlich schneller sein sollte als "select count(*) from table" würde ich bezweifeln, eher umgekehrt ...
Ich würde eher darauf achten, dass für die Spalte "counter" ein Index angelegt wird, sonst gibts jedesmal einen full table scan, das wird dann tatsächlich langsam. Allerdings ist "langsam" hier seeeehr relativ. Eine gut optimierte Datenbank-Engine, wie z.B. MariaDB (auf einem potenten Server) zeigt da erst bei einigen hunderttausend Datensätzen einen signifikanten Unterschied.