ArduCounter Support und neue Versionen (war: Stromzähler mit S0 Schnitt...)

Begonnen von StefanStrobel, 26 Januar 2014, 12:08:13

Vorheriges Thema - Nächstes Thema

birdy

Hallo Stefan

Vielen Dank für Deine Erklärungen.
Ich denke wenn Interpolation, dann mach sie so Sinn.
Ich habe vor im Keller neben dem Strom- auch den Ölzähler mit den Arducounter auszuwerten. Da ist mir wichtig, dass beim Ölzähler während den Sommermonaten, wenn die Heizung abgeschaltet ist, nicht irgendetwas interpoliert wird was es gar nicht gibt. Dabei soll egal sein wie oft ich restarte. Mit deiner Implementation der Interpolation scheint mir dies nun ideal gelöst zu sein (zumindest konnte ich noch nichts Gegenteiliges feststellen).

Ein Attribut um die Interpolation ein oder ausschalten zu können ist sicher eine gute Idee. Ich würde aber eher eine Lösung mit einem zweiten LongCounter priorisieren. So hätte man beide Werte zur Verfügung (mit und ohne Interpolation) und könnte den der besser passt auswählen. Aber notwendig ist dies nicht, ich denke ich komme mit der aktuellen Lösung ganz gut zurecht.

Besten Dank und Gruss
birdy
FHEM  @Debian bullseye @Proxmox VE 8.1.3
@intelNUC's  (i5)
CUL 433(a-culfw), CUL 868(SlowRF), Max-Cube CUN geflash, HM-CFG-USB-2 (HMALND)

birdy

Hallo Stefan

Noch eine Frage: Ist bei besonders langen Impulsen mit Problemen zu rechnen?

Mein Durchlaufzähler in der Ölleitung hat ein Reedkontakt, welcher pro 0.1L ein Impuls gibt. Das bedeutet der Kontakt ist ca. 0.05L lang geöffnet und bleibt dann 0.05L lang geschlossen. Was eine Impulsdauer von gefühlten 2-3 Minuten ergibt. Stell die Heizung, ab dauert ein begonnener Impuls u.U. ewig.

Gruss birdy
FHEM  @Debian bullseye @Proxmox VE 8.1.3
@intelNUC's  (i5)
CUL 433(a-culfw), CUL 868(SlowRF), Max-Cube CUN geflash, HM-CFG-USB-2 (HMALND)

StefanStrobel

hallo birdy,

eigentlich sollte ein so langer Impuls kein Problem sein.
Der Arduino zählt ja über die pin change interrupts und merkt sich dort den vorherigen Zustand je Pin in Variablen.
Einen Timeout habe ich da nicht eingebaut. Wenn sich der Status an einem Pin nicht ändert, passiert einfach nichts weiter.

Anbei habe ich nochmal eine neue Version.
Ich habe Deine Idee aufgegriffen, einen long counter mit und ohne Interpolation einzubauen.
Der longX interpoliert jetzt nicht mehr, dafür gibt es noch ein zusätzliches Reading interpolatedLongX.
Beide Reading-Namen kann man wie üblich per Attribut ändern.
Die Firmware bleibt gleich, nur das Fhem-Modul hat ein paar Zeile Code dazu bekommen.

Ich komme jetzt leider auch in den nächsten Tagen nicht mehr zum Testen oder Programmieren.
Wenn also jemand bei Testen helfen möchte, wäre das schön.

Gruss
   Stefan

birdy

Hallo Stefan

Nach den Breadbord habe ich nun mein Arduino im Keller in Betrieb genommen. Dort ist er mit den Strom- und dem Durchflusszähler (Öl) verbunden.
Die langen Impulse/Pausen des Durchflusszähler scheinen für den ArduCounter problematisch zu sein. Da fehlen mir täglich einige Impulse. Ich konnte aber bis jetzt noch keine genaueren Beobachtungen anstellen.
Hast Du zufällig eine Idee woran dies liegen könnte?

Noch eine Frage zum Intervall. Kann man dies auch pro Pin separat definieren?
(Den Faktor kann man, obwohl in der Commandref nicht explizit beschrieben, auch pro Pin separat angeben.


Danke und Gruss
birdy

FHEM  @Debian bullseye @Proxmox VE 8.1.3
@intelNUC's  (i5)
CUL 433(a-culfw), CUL 868(SlowRF), Max-Cube CUN geflash, HM-CFG-USB-2 (HMALND)

StefanStrobel

Hallo birdy,

Die Reporting–Intervalle sind nicht je Pin vorgesehen. Das minimale Intervall für die Überwachung der Puls-Länge wird aber je Pin angegeben.
Für die Fehlersuche solltest Du auf jeden Fall verbose auf 5 stellen und im Log die Meldungen vom Arduino an Fhem ansehen. Ich habe keine Ideen, wie noch Impulse übersehen werden könnten, es sei denn, sie sind so kurz, dass der Arduino sie in der Interrupt-Routine nicht sehen kann.

Wie viele Impulse am Tag hast Du denn, wie viele fehlen Dir und mit was vergleichst Du sie denn?
Wie lange sind die Impulse typischerweise?

Gruss
     Stefan

birdy

Hallo Stefan

Zitat von: StefanStrobel am 30 Oktober 2017, 08:49:25
Die Reporting–Intervalle sind nicht je Pin vorgesehen.
Kein Problem, habe auch keinen direkten Bedarf dafür. Ich wollte nur nachfragen.

Zitat von: StefanStrobel am 30 Oktober 2017, 08:49:25
.... sie sind so kurz, dass der Arduino sie in der Interrupt-Routine nicht sehen kann.
So gut wie ausgeschlossen.

Momentan benötige ich ca. 5-6 Liter Öl pro Tag. Der mechanische Durchlaufzähler zählt mit 1 ,,Impuls" pro 0.1 L was also 50 -60 Impulse pro Tag ergeben sollte. Heute fehlen mir im Vergleich zu Gestern 23 Impulse bzw. 2.3L was in etwa 50% entspricht.
Wenn die Heizung läuft ist das Relais jeweils ca. 0.06 L lang offen und danach wieder 0.04L geschlossen. Es dauert zwischen 3 und 5 Minuten bis 0.1L verbraucht sind, abhängig von der aktuellen Leistung (modellierender Brenner). Eine konkrete Messung mit den DMM bei eher hoher Leistung hat ergeben 1:40 offen/ 1:34 geschlossen (Pin 4 wird auf 0 gezogen).
Wenn die Heizung ausschaltet fliest natürlich kein Öl mehr. Dann bleibt das Relais u.U. mehrere Stunden in der momentanen Position stehen.

Anmerkung: Auch beim Stromzähler scheint es so, als ob nicht alle Impulse gezählt würden. Das werde ich aber noch genauer beobachten.

Internals:
   DEF        /dev/ttyUSB0@38400
   DeviceName /dev/ttyUSB0@38400
   FD         4
   Initialized 1
   NAME       AC
   NOTIFYDEV  global
   NR         21
   NTFY_ORDER 50-AC
   PARTIAL
   STATE      opened
   TYPE       ArduCounter
   VersionFirmware 1.9
   VersionModule 5.1 - 17.10.2017
   buffer
   CounterInterpolated:
   READINGS:
     2017-10-30 22:53:08   OelVorrat       1223
     2017-10-30 22:53:08   OelZaehler      231
     2017-10-30 22:53:08   OelZaehlerI     231
     2017-10-30 22:49:08   countDiff4      0
     2017-10-30 22:53:08   countDiff6      1
     2017-10-30 22:49:08   interpolatedLong4 2310
     2017-10-30 22:53:08   interpolatedLong6 2334236
     2017-10-30 22:49:08   lastMsg4        R4 C92 D0 R0 T360000 N175800520 X0

     2017-10-30 22:53:08   lastMsg6        R6 C2871 D1 R1 T87200 N176040520 X0 F87200 L87200 A101

     2017-10-30 22:49:08   long4           2310
     2017-10-30 22:53:08   long6           2334236
     2017-10-30 22:49:08   pin4            92
     2017-10-30 22:53:08   pin6            2871
     2017-10-30 22:49:08   power4          0.000
     2017-10-30 22:53:08   power6          0.413
     2017-10-30 22:49:08   reject4         0
     2017-10-30 22:53:08   reject6         0
     2017-10-29 11:11:02   state           opened
     2017-10-30 22:49:08   timeDiff4       360000
     2017-10-30 22:53:08   timeDiff6       87200
Attributes:
   flashCommand avrdude -p atmega328P -c arduino -P [PORT] -D -U flash:w:[HEXFILE] 2>[LOGFILE]
   interval   60 360
   pin4       falling pullup 3000
   pin6       falling pullup 90
   readingFactor6 10000
   userReadings OelZaehler {ReadingsVal("AC","long4",0)/10},OelZaehlerI {ReadingsVal("AC","interpolatedLong4",0)/10},OelVorrat {1454-ReadingsVal("AC","OelZaehlerI",0)}
   userattr   pin4 pin6 readingFactor6 verboseReadings4 verboseReadings6
   verbose    5
   verboseReadings4 1
   verboseReadings6 1


Log:
2017.10.30 21:52:10 5: AC: Parse line: R6 C2821 D1 R1 T49629 N172380520 X0 F49629 L49629 A99
2017.10.30 21:52:10 4: AC: adding 1 to long count 2334185 and interpolated count 2334185
2017.10.30 21:52:10 4: AC: Pin 6 (pin6) count 2821 longCount 2334186 interpCount 2334186 (diff 1) in 49.629s, reject 0, Avg Len 99ms, result 0.725
2017.10.30 21:52:10 5: AC: interval 21:51:20 until 21:52:10, First at 49629, Last at 49629
2017.10.30 21:52:10 5: AC: set readings power6 to 0.725, timeDiff6 to 49629 and countDiff6 to 1
2017.10.30 21:52:10 5: AC: Device Time 172380.52, Drift -68.009s in 124851.991s, -0.05%
2017.10.30 21:53:10 5: AC: Parse line: R6 C2822 D1 R1 T43997 N172440520 X0 F43997 L43997 A100
2017.10.30 21:53:10 4: AC: adding 1 to long count 2334186 and interpolated count 2334186
2017.10.30 21:53:10 4: AC: Pin 6 (pin6) count 2822 longCount 2334187 interpCount 2334187 (diff 1) in 43.997s, reject 0, Avg Len 100ms, result 0.818
2017.10.30 21:53:10 5: AC: interval 21:52:26 until 21:53:10, First at 43997, Last at 43997
2017.10.30 21:53:10 5: AC: set readings power6 to 0.818, timeDiff6 to 43997 and countDiff6 to 1
2017.10.30 21:53:10 5: AC: Device Time 172440.52, Drift -68.044s in 124911.956s, -0.05%
2017.10.30 21:54:09 5: AC: Parse line: R6 C2824 D2 R2 T90113 N172500520 X0 F45066 L90113 A99
2017.10.30 21:54:09 4: AC: adding 2 to long count 2334187 and interpolated count 2334187
2017.10.30 21:54:09 4: AC: Pin 6 (pin6) count 2824 longCount 2334189 interpCount 2334189 (diff 2) in 90.113s, reject 0, Avg Len 99ms, result 0.799
2017.10.30 21:54:09 5: AC: interval 21:52:39 until 21:54:09, First at 45066, Last at 90113
2017.10.30 21:54:09 5: AC: set readings power6 to 0.799, timeDiff6 to 90113 and countDiff6 to 2
2017.10.30 21:54:10 5: AC: Device Time 172500.52, Drift -68.080s in 124971.920s, -0.05%
2017.10.30 21:55:09 5: AC: Parse line: R4 C92 D2 R2 T194955 N172560520 X0 F699 L194955 A109219
2017.10.30 21:55:09 4: AC: adding 2 to long count 2282 and interpolated count 2282
2017.10.30 21:55:09 4: AC: Pin 4 (pin4) count 92 longCount 2284 interpCount 2284 (diff 2) in 194.955s, reject 0, Avg Len 109219ms, result 0.037
2017.10.30 21:55:09 5: AC: interval 21:51:55 until 21:55:09, First at 699, Last at 194955
2017.10.30 21:55:09 5: AC: set readings power4 to 0.037, timeDiff4 to 194955 and countDiff4 to 2
2017.10.30 21:55:09 5: AC: Device Time 172560.52, Drift -68.097s in 125031.903s, -0.05%
2017.10.30 21:55:09 5: AC: Parse line: R6 C2825 D1 R1 T44973 N172560520 X0 F44973 L44973 A99
2017.10.30 21:55:09 4: AC: adding 1 to long count 2334189 and interpolated count 2334189
2017.10.30 21:55:09 4: AC: Pin 6 (pin6) count 2825 longCount 2334190 interpCount 2334190 (diff 1) in 44.973s, reject 0, Avg Len 99ms, result 0.800
2017.10.30 21:55:09 5: AC: interval 21:54:25 until 21:55:09, First at 44973, Last at 44973
2017.10.30 21:55:09 5: AC: set readings power6 to 0.800, timeDiff6 to 44973 and countDiff6 to 1
2017.10.30 21:55:09 5: AC: Device Time 172560.52, Drift -68.097s in 125031.903s, -0.05%
2017.10.30 21:56:09 5: AC: Parse line: R6 C2826 D1 R1 T46564 N172620520 X0 F46564 L46564 A101
2017.10.30 21:56:09 4: AC: adding 1 to long count 2334190 and interpolated count 2334190
2017.10.30 21:56:09 4: AC: Pin 6 (pin6) count 2826 longCount 2334191 interpCount 2334191 (diff 1) in 46.564s, reject 0, Avg Len 101ms, result 0.773
2017.10.30 21:56:09 5: AC: interval 21:55:23 until 21:56:09, First at 46564, Last at 46564
2017.10.30 21:56:09 5: AC: set readings power6 to 0.773, timeDiff6 to 46564 and countDiff6 to 1
2017.10.30 21:56:09 5: AC: Device Time 172620.52, Drift -68.149s in 125091.851s, -0.05%
2017.10.30 21:57:09 5: AC: Parse line: R6 C2827 D1 R1 T48386 N172680520 X0 F48386 L48386 A100
2017.10.30 21:57:09 4: AC: adding 1 to long count 2334191 and interpolated count 2334191
2017.10.30 21:57:09 4: AC: Pin 6 (pin6) count 2827 longCount 2334192 interpCount 2334192 (diff 1) in 48.386s, reject 0, Avg Len 100ms, result 0.744
2017.10.30 21:57:09 5: AC: interval 21:56:21 until 21:57:09, First at 48386, Last at 48386
2017.10.30 21:57:09 5: AC: set readings power6 to 0.744, timeDiff6 to 48386 and countDiff6 to 1
2017.10.30 21:57:09 5: AC: Device Time 172680.52, Drift -68.184s in 125151.816s, -0.05%
2017.10.30 21:58:09 5: AC: Parse line: R6 C2828 D1 R1 T54457 N172740520 X0 F54457 L54457 A99
2017.10.30 21:58:09 4: AC: adding 1 to long count 2334192 and interpolated count 2334192
2017.10.30 21:58:09 4: AC: Pin 6 (pin6) count 2828 longCount 2334193 interpCount 2334193 (diff 1) in 54.457s, reject 0, Avg Len 99ms, result 0.661
2017.10.30 21:58:09 5: AC: interval 21:57:15 until 21:58:09, First at 54457, Last at 54457
2017.10.30 21:58:09 5: AC: set readings power6 to 0.661, timeDiff6 to 54457 and countDiff6 to 1
2017.10.30 21:58:09 5: AC: Device Time 172740.52, Drift -68.203s in 125211.797s, -0.05%
2017.10.30 21:59:09 5: AC: Parse line: R6 C2829 D1 R1 T56942 N172800520 X0 F56942 L56942 A100
2017.10.30 21:59:09 4: AC: adding 1 to long count 2334193 and interpolated count 2334193
2017.10.30 21:59:09 4: AC: Pin 6 (pin6) count 2829 longCount 2334194 interpCount 2334194 (diff 1) in 56.942s, reject 0, Avg Len 100ms, result 0.632
2017.10.30 21:59:09 5: AC: interval 21:58:12 until 21:59:09, First at 56942, Last at 56942
2017.10.30 21:59:09 5: AC: set readings power6 to 0.632, timeDiff6 to 56942 and countDiff6 to 1
2017.10.30 21:59:09 5: AC: Device Time 172800.52, Drift -68.238s in 125271.762s, -0.05%
2017.10.30 22:00:09 5: AC: Parse line: R6 C2830 D1 R1 T61125 N172860520 X0 F61125 L61125 A99
2017.10.30 22:00:09 4: AC: adding 1 to long count 2334194 and interpolated count 2334194
2017.10.30 22:00:09 4: AC: Pin 6 (pin6) count 2830 longCount 2334195 interpCount 2334195 (diff 1) in 61.125s, reject 0, Avg Len 99ms, result 0.589
2017.10.30 22:00:09 5: AC: interval 21:59:08 until 22:00:09, First at 61125, Last at 61125
2017.10.30 22:00:09 5: AC: set readings power6 to 0.589, timeDiff6 to 61125 and countDiff6 to 1
2017.10.30 22:00:09 5: AC: Device Time 172860.52, Drift -68.273s in 125331.727s, -0.05%
2017.10.30 22:01:09 5: AC: Parse line: R4 C92 D0 R0 T405045 N172920520 X0
2017.10.30 22:01:09 4: AC: adding 0 to long count 2284 and interpolated count 2284
2017.10.30 22:01:09 4: AC: Pin 4 (pin4) count 92 longCount 2284 interpCount 2284 (diff 0) in 405.045s, reject 0, Avg Len ms, result 0.000
2017.10.30 22:01:09 5: AC: interval 21:54:24 until 22:01:09, First at , Last at
2017.10.30 22:01:09 5: AC: set readings power4 to 0.000, timeDiff4 to 405045 and countDiff4 to 0
2017.10.30 22:01:09 5: AC: Device Time 172920.52, Drift -68.290s in 125391.710s, -0.05%
2017.10.30 22:01:09 5: AC: Parse line: R6 C2831 D1 R1 T62282 N172920520 X0 F62282 L62282 A100
2017.10.30 22:01:09 4: AC: adding 1 to long count 2334195 and interpolated count 2334195
2017.10.30 22:01:09 4: AC: Pin 6 (pin6) count 2831 longCount 2334196 interpCount 2334196 (diff 1) in 62.282s, reject 0, Avg Len 100ms, result 0.578
2017.10.30 22:01:09 5: AC: interval 22:00:07 until 22:01:09, First at 62282, Last at 62282
2017.10.30 22:01:09 5: AC: set readings power6 to 0.578, timeDiff6 to 62282 and countDiff6 to 1
2017.10.30 22:01:09 5: AC: Device Time 172920.52, Drift -68.290s in 125391.710s, -0.05%
2017.10.30 22:01:10 3: VCONTROL300: USB connection opened


Gruss
birdy
FHEM  @Debian bullseye @Proxmox VE 8.1.3
@intelNUC's  (i5)
CUL 433(a-culfw), CUL 868(SlowRF), Max-Cube CUN geflash, HM-CFG-USB-2 (HMALND)

birdy

#216
Eine Verständnisfrage

Die Ausganslage: Ein Relais / S0 Schnittstelle welche zwischen Pin X und GND liegt, und den Pin währen dem Impuls von 5V auf 0 zieht.
Auf dem ArduCounter gibt es die folgende Definition (pin4 falling pullup 3000).

Ist dann ,,falling" relativ (invers) oder absolut gemeint?
Konkret, wann sollte gezählt werden. Wenn der Pin von 5V auf 0 fällt, oder wenn der von 0 wieder auf 5V geht?

Gruss birdy



Nachtrag:

Ist es gewollt, dass der interpolatedLongX kleiner als die LongX ist?
Ich dachte der sei vorgesehen, um möglicherweise verpasste Impulse zu interpolieren.
Hier werden real existiere Impulse unterdrückt.
Szenario: Arduino resetet, alle Zähler mit setreading auf 0 gestellt, 3 Impulse manuell abgesetzt.

Resultat :

  • pin4                           3
  • long4                           3
  • interpolatedLong4   1

017.10.31 22:51:52 5: AC: ReadAnswer called
2017.10.31 22:51:53 5: AC: Parse line: M Status: ArduCounter V1.9
2017.10.31 22:51:53 4: AC: device reported firmware 1.9
2017.10.31 22:51:53 5: AC: Parse line: M normal interval 60000
2017.10.31 22:51:53 3: AC: device: normal interval 60000
2017.10.31 22:51:53 5: AC: Parse line: M max interval 360000
2017.10.31 22:51:53 3: AC: device: max interval 360000
2017.10.31 22:51:53 5: AC: Parse line: M min interval 2000
2017.10.31 22:51:53 3: AC: device: min interval 2000
2017.10.31 22:51:53 5: AC: Parse line: M min count 1
2017.10.31 22:51:53 3: AC: device: min count 1
2017.10.31 22:51:53 5: AC: Parse line: M pin 4 PCInt pin 20, iMode change, min len 2000 ms falling, count 3 (+2) in 13163 ms Rej 1
2017.10.31 22:51:53 3: AC: device: pin 4 PCInt pin 20, iMode change, min len 2000 ms falling, count 3 (+2) in 13163 ms Rej 1
2017.10.31 22:51:53 5: AC: Parse line: M   first at 97509, last at 110672, avg len 6458
2017.10.31 22:51:53 3: AC: device:   first at 97509, last at 110672, avg len 6458
2017.10.31 22:51:53 5: AC: Parse line: M pin 5 PCInt pin 21, iMode change, min len 2000 ms falling, count 0 (+0) in 112735 ms Rej 0
2017.10.31 22:51:53 3: AC: device: pin 5 PCInt pin 21, iMode change, min len 2000 ms falling, count 0 (+0) in 112735 ms Rej 0
2017.10.31 22:51:53 5: AC: Parse line: M pin 6 PCInt pin 22, iMode change, min len 90 ms falling, count 0 (+0) in 112743 ms Rej 0
2017.10.31 22:51:53 3: AC: device: pin 6 PCInt pin 22, iMode change, min len 90 ms falling, count 0 (+0) in 112743 ms Rej 0
2017.10.31 22:51:53 5: AC: Parse line: M Next report in 7197 Milliseconds
2017.10.31 22:51:53 3: AC: device: Next report in 7197 Milliseconds
2017.10.31 22:51:53 5: AC: ReadAnswer matched Next report in [0-9]+ Milliseconds
2017.10.31 22:52:00 5: AC: Parse line: R4 C3 D2 R3 T13163 N6129504 X1 F0 L13163 A6458
2017.10.31 22:52:00 4: AC: arduino was restarted so some impulses might have got lost for 4 (pin4)
2017.10.31 22:52:00 3: AC: interpolation after counter reset for pin 4 (pin4): offline -43.73 secs, -2 estimated pulses (before 0 in 310355 ms, now 2 in 13163 ms, avg ratio 0.0759705234369065 p/s)
2017.10.31 22:52:00 4: AC: adding interpolated -2 to interpolated count 0
2017.10.31 22:52:00 4: AC: adding 3 to long count 0 and interpolated count -2
2017.10.31 22:52:00 4: AC: Pin 4 (pin4) count 3 longCount 3 interpCount 1 (diff 2) in 13.163s, reject 1, Avg Len 6458ms, result 0.547
2017.10.31 22:52:00 5: AC: interval 22:51:47 until 22:52:00, First at 0, Last at 13163
2017.10.31 22:52:00 5: AC: set readings power4 to 0.547, timeDiff4 to 13163 and countDiff4 to 2
2017.10.31 22:52:00 5: AC: Device Time 6129.504, Drift -2.999s in 5640.268s, -0.05%
FHEM  @Debian bullseye @Proxmox VE 8.1.3
@intelNUC's  (i5)
CUL 433(a-culfw), CUL 868(SlowRF), Max-Cube CUN geflash, HM-CFG-USB-2 (HMALND)

birdy

Hallo Stefan

Kannst Du mir verraten ob die folgenden Definition für (m)ein Relais geeignet ist und wann genau (welche Flanke) damit der Zähler im ArduCounter erhöht werden sollte?
Danke
pin4       falling pullup 3000

Gruss birdy
FHEM  @Debian bullseye @Proxmox VE 8.1.3
@intelNUC's  (i5)
CUL 433(a-culfw), CUL 868(SlowRF), Max-Cube CUN geflash, HM-CFG-USB-2 (HMALND)

StefanStrobel

#218
Hallo Birdy,

sorry für die späte Antwort, ich habe Deine vorletzte Frage erst jetzt bemerkt.

Zitat
Auf dem ArduCounter gibt es die folgende Definition (pin4 falling pullup 3000).
Ist dann ,,falling" relativ (invers) oder absolut gemeint?
Konkret, wann sollte gezählt werden. Wenn der Pin von 5V auf 0 fällt, oder wenn der von 0 wieder auf 5V geht?

sobald Du die Pulslängen-Kontrolle aktivierst (3000 setzt die minimale Pulslänge auf 3 Sekunden und aktiviert damit die Pulslängen-Kontrolle), ändert sich das Verhalten des Arducounters.
Um die Pulslänge zu ermitteln, wird bei jeder Flanke ein Interrupt ausgelöst um Beginn und Ende des Impulses zu erfassen. "falling" gibt dann an, dass die Impulse mit einer fallenden Flanke (1->0) beginnen. Erst am Ende des Impulses (wieder steigende Flanke) kann dann ausgewertet werden, ob der Impuls die Mindestlänge erreicht hat. Somit wird auch erst beim Ende des Impulses, in diesem Fall also bei der steigenden Flanke der Impuls gezählt. Wenn er zu kurz war, wird er nicht als gültiger Impuls gezählt sondern der Reject-Counter erhöht.

Zitat
Ist es gewollt, dass der interpolatedLongX kleiner als die LongX ist?
Ich dachte der sei vorgesehen, um möglicherweise verpasste Impulse zu interpolieren.
Hier werden real existiere Impulse unterdrückt.
Szenario: Arduino resetet, alle Zähler mit setreading auf 0 gestellt, 3 Impulse manuell abgesetzt.

Es ist nicht gewollt, dass interpolatedLongX kleiner als LongX ist.
Ich interpretiere das Log so:

Vor dem Beginn Deines Log-Auszugs müsste der Arduino neu gestartet worden sein. Dort sollte im Log eine entsprechende Meldung stehen.
Das Fhem-Modul setzt in diesem Moment auch das Internal CounterResetTime auf die aktuelle Zeit. Zudem wird das Flag gelöscht, an dem das Modul erkennt, dass eine Interpolation bereits gemacht wurde.

Durch Dein anschließendes Löschen aller Readings ziehst Du dem Modul die Zeit der letzten Meldung vom Arduino quasi "unter dem Hintern weg". Diese Zeit wird aber später für die Ermittlung der "Offline-Zeit" benötigt...

ca 13 Sekunden nach dem Reset des Arduino hast Du offenbar get info eingegeben:
Zitat
017.10.31 22:51:52 5: AC: ReadAnswer called
2017.10.31 22:51:53 5: AC: Parse line: M Status: ArduCounter V1.9
2017.10.31 22:51:53 4: AC: device reported firmware 1.9
2017.10.31 22:51:53 5: AC: Parse line: M normal interval 60000
2017.10.31 22:51:53 3: AC: device: normal interval 60000
2017.10.31 22:51:53 5: AC: Parse line: M max interval 360000
2017.10.31 22:51:53 3: AC: device: max interval 360000
2017.10.31 22:51:53 5: AC: Parse line: M min interval 2000
2017.10.31 22:51:53 3: AC: device: min interval 2000
2017.10.31 22:51:53 5: AC: Parse line: M min count 1
2017.10.31 22:51:53 3: AC: device: min count 1
2017.10.31 22:51:53 5: AC: Parse line: M pin 4 PCInt pin 20, iMode change, min len 2000 ms falling, count 3 (+2) in 13163 ms Rej 1
2017.10.31 22:51:53 3: AC: device: pin 4 PCInt pin 20, iMode change, min len 2000 ms falling, count 3 (+2) in 13163 ms Rej 1
2017.10.31 22:51:53 5: AC: Parse line: M   first at 97509, last at 110672, avg len 6458
2017.10.31 22:51:53 3: AC: device:   first at 97509, last at 110672, avg len 6458
2017.10.31 22:51:53 5: AC: Parse line: M pin 5 PCInt pin 21, iMode change, min len 2000 ms falling, count 0 (+0) in 112735 ms Rej 0
2017.10.31 22:51:53 3: AC: device: pin 5 PCInt pin 21, iMode change, min len 2000 ms falling, count 0 (+0) in 112735 ms Rej 0
2017.10.31 22:51:53 5: AC: Parse line: M pin 6 PCInt pin 22, iMode change, min len 90 ms falling, count 0 (+0) in 112743 ms Rej 0
2017.10.31 22:51:53 3: AC: device: pin 6 PCInt pin 22, iMode change, min len 90 ms falling, count 0 (+0) in 112743 ms Rej 0
2017.10.31 22:51:53 5: AC: Parse line: M Next report in 7197 Milliseconds
2017.10.31 22:51:53 3: AC: device: Next report in 7197 Milliseconds
2017.10.31 22:51:53 5: AC: ReadAnswer matched Next report in [0-9]+ Milliseconds
Dann meldet sich der Arducounter mit dem Zwischenergebnis:
Zitat
2017.10.31 22:52:00 5: AC: Parse line: R4 C3 D2 R3 T13163 N6129504 X1 F0 L13163 A6458
Das bedeutet:
Report für Pin 4, Count 3, verwertbare neue Impulse (Differenz) 2, Real Count (tatsächlich gezählte Impulse für LongCount): 3 (da wird auch der erste Impuls mitgezählt, bei dem die Intervall-Messung beginnt), Time: 13 Sekunden,
Now: 6129504, Rejected: 1, First after 0 ms, Last at 13 sec, average 6 sec.

Dann bemerkt das Modul, dass dies die erste Meldung des Arduino seit einem Neustart ist.
Das Modul berechnet die Zeit zwischen der letzten Meldung und dem Neustart des Arduino. Diese Subtraktion geht schief und liefert ein negatives Ergebnis, da Du zum genau richtigen Zeitpunkt die Readings gelöscht hast (da muss ich noch eine Prüfung einbauen, die so etwas erkennt / verhindert ...)

entsprechend interpoliert das Modul eine negative Zahl von Impulsen:
Zitat
2017.10.31 22:52:00 4: AC: arduino was restarted so some impulses might have got lost for 4 (pin4)
2017.10.31 22:52:00 3: AC: interpolation after counter reset for pin 4 (pin4): offline -43.73 secs, -2 estimated pulses (before 0 in 310355 ms, now 2 in 13163 ms, avg ratio 0.0759705234369065 p/s)
2017.10.31 22:52:00 4: AC: adding interpolated -2 to interpolated count 0
2017.10.31 22:52:00 4: AC: adding 3 to long count 0 and interpolated count -2
2017.10.31 22:52:00 4: AC: Pin 4 (pin4) count 3 longCount 3 interpCount 1 (diff 2) in 13.163s, reject 1, Avg Len 6458ms, result 0.547
2017.10.31 22:52:00 5: AC: interval 22:51:47 until 22:52:00, First at 0, Last at 13163
2017.10.31 22:52:00 5: AC: set readings power4 to 0.547, timeDiff4 to 13163 and countDiff4 to 2
2017.10.31 22:52:00 5: AC: Device Time 6129.504, Drift -2.999s in 5640.268s, -0.05%

Gruss
  Stefan

EDIT: Detailformulierung konkretisiert / korrigiert

StefanStrobel

Hallo,

anbei eine neue Version zum Testen, die zusätzlich Prüfungen zur Plausibilität der berechneten Offline-Zeit bei der Interpolation enthält.
Falls die benötigten Readings oder die Timestamps der benötigten Readings fehlen oder falls die Zeit negativ wird, wird nichts interpoliert.
@Birdy: Falls Du es schaffst, damit einen ähnlichen Zustand zu reproduzieren, würde ich noch weitere Log-Meldungen einbauen um zu verstehen, wie das genau passiert...

Gruss / vielen Dank fürs Testen
   Stefan

birdy

Hallo Stefan

Zitat von: StefanStrobel am 13 November 2017, 21:30:31
sorry für die späte Antwort,
Kein Problem es gibt (zum Glück) neben FHEM noch andere interessante Dinge im Leben

Gerne teste ich die neue Version. Doch zuvor möchte ich sicher sein, dass ich eine geeignete Pin Definition verwende. Was kannst Du beim mir empfehlen?

Zitat von: StefanStrobel am 13 November 2017, 21:30:31
sobald Du die Pulslängen-Kontrolle aktivierst (3000 setzt die minimale Pulslänge auf 3 Sekunden und aktiviert damit die Pulslängen-Kontrolle), ändert sich das Verhalten des Arducounters.
Wenn ich richtig verstanden habe, wird ohne Pulslängen-Kontrolle zu Beginn des Impulses (5>0) gezählt. Mit Pulslängen-Kontrolle erst am Ende des Impulses (0>5) sofern der Impuls genügend lange gedauert hat. Es muss also die Dauer gezählt werden.
Könnte es sein, dass es hier zu einem Zählerüberlauf kommt, Da bei mir einzelne Impulse mehrere Stunden dauern können. Dieser Impuls in der Folge dann ins schwarze Loch fällt und nicht gezählt wird?
Soll ich mal ohne Pulslängen-Kontrolle weiter testen. Was ist Deine Empfehlung?

Vielen Dank für Deine aktive Unterstützung.

Gruss birdy
FHEM  @Debian bullseye @Proxmox VE 8.1.3
@intelNUC's  (i5)
CUL 433(a-culfw), CUL 868(SlowRF), Max-Cube CUN geflash, HM-CFG-USB-2 (HMALND)

StefanStrobel

hallo Birdy,

die Zeitwerte werden im Sketch als Millisekunden in einem unsigned long (32 Bit) gespeichert. Das sollte erst nach 49 Tagen überlaufen.
Ich würde schon mit Pulslängen-Kontrolle weiter testen.

Wenn ich es richtig verstehe und Deine Impulse von einem Relais erzeugt werden und Minuten oder sogar Stunden lang sein können, dann könnte ich zur Kontrolle auch in den Sketch eine Debug-Funktion einbauen, die in Fhem bei jedem Zustandswechsel am Arduino-Pin einen Log-Eintrag erzeugt - unabhängig vom Zählen.
Eventuell kommst Du dann dem Problem eher auf die Spur?
(für normale S0-Signale würde das nicht funktionieren ...)

Gruss
   Stefan

birdy

Hallo Stefan

Ich habe das Ganze mal ein wenig beobachtet und mir ein paar Notizen gemacht.

1.   Mit Pulslängen-Kontrolle.
Über 42 Stunden habe 19.4 Liter verbraucht was 194 Impulsen entsprechen müsste. Der Arducounter hat aber nur 74 Impulse gezählt (120 fehlen).

2.   Ohne Pulslängen-Kontrolle.
Über 31 Stunden habe 11.9 Liter verbraucht was 119 Impulsen entsprechen müsste. Der Arducounter hat aber nur 69 Impulse gezählt (50 fehlen).

Die Pulslängen-Kontrolle scheint also beim Verhalten nicht den entscheidenden Unterschied zu machen.

Zitat von: StefanStrobel am 18 November 2017, 17:12:26
.....könnte ich zur Kontrolle auch in den Sketch eine Debug-Funktion einbauen, die in Fhem bei jedem Zustandswechsel am Arduino-Pin einen Log-Eintrag erzeugt - unabhängig vom Zählen.

Ja sehr gerne wenn das möglich ist. Ich denke das würde mich dann einen wichtigen Stritt weiter bringen.

So kann ich mein DMM mit USB Ausgang einige Stunden mitlaufen lassen und die Werte Aufzeichnen. Anschliessend die beiden Logs gegeneinander abgleichen und es wird sofort klar wo Differenz entsteht. :)

Gruss birdy
FHEM  @Debian bullseye @Proxmox VE 8.1.3
@intelNUC's  (i5)
CUL 433(a-culfw), CUL 868(SlowRF), Max-Cube CUN geflash, HM-CFG-USB-2 (HMALND)

StefanStrobel

Hallo birdy,

anbei eine Variante der Firmware, die bei jedem Status-Change eines im ArduCounter verwendeten Ports eine Log-Zeile ausgibt. Das ganze ist nicht für den Normalbetrieb geeignet, sondern nur zum Debugging.
In Fhem sollte das verbose-Level auf 4 stehen.

Gruss
   Stefan

birdy

Hallo Stefan

Super vielen herzlichen Dank.
Sobald ich neue Erkenntnisse habe, werde ich hier berichten.

Gruss und noch einen schönen Sonntag
birdy
FHEM  @Debian bullseye @Proxmox VE 8.1.3
@intelNUC's  (i5)
CUL 433(a-culfw), CUL 868(SlowRF), Max-Cube CUN geflash, HM-CFG-USB-2 (HMALND)