HourCounter: Unterschied zwischen den Versionen

Aus FHEMWiki
Zeile 109: Zeile 109:
  mit 1=letztes Ereignis war ON-Ereignis <br />
  mit 1=letztes Ereignis war ON-Ereignis <br />
  und 0=letztes Ereignis war OFF-Ereignis
  und 0=letztes Ereignis war OFF-Ereignis
|-
| tickDay || Event wird nach Tageswechsel gefeuert bevor die Tageszähler resettiert werden
|-
| tickHour || Event wird nach Stundenwechsel gefeuert
|-
| tickMonth || Event wird nach Monatswechsel
|-
| tickWeek || Event wird nach Wochenwechsel gefeuert
|}
|}



Version vom 4. Februar 2014, 16:44 Uhr

HourCounter ist ein Perl-Modul, das die Anzahl von Ereignissen erfasst. Bei bipolaren Ereignissen wird zusätzlich die Puls- sowie die Pausendauer ermittelt. Im vorliegenden Beispiel wird ein Betriebsstundenzähler mit einem MAX-Fensterkontakt realisiert.

Features

  • Ermittlung von Betriebsstunden, Auslastung, Verbräuchen, Schalthäufigkeiten
  • Ermittlung der Häufigkeit, Puls- Pausendauer pro Tag
  • Ermittlung der Puls-/Pausendauer der letzten Schaltperiode
  • Bereitstellung von Ereignissen zur Fortführung der Kumulation für Wochen- Tages- u. Monatswerte
  • unterstützende Funktionen zur Ablage von Tages-, Wochen- und Monatswerten

Zielsetzung des WIKI-Artikels

Erläuterung der Funktionalität zur weiterführenden Diskussion im Forum. Forum

Status

Das Modul befindet sich noch in der Evaluierungs-Phase.

Die aktuelle Version ist hier zu finden.

Voraussetzungen

keine besonderen Voraussetzungen. Das Modul ist anders als das Vorgängerskript 99_UtilsMaxCounter nicht mehr an Max-Komponenten gebunden.

Definition

Abstrakt

define <name> HourCounter <regexp_for_ON> [<regexp_for_Off>]

<regexp_for_ON> ist ein regulärer Ausdruck der das Ereignis beschreibt.
Wenn auch [<regexp_for_Off>] definiert ist, so sprechen wir von einem bipolarem Ereignis, das einen EIN- sowie einen AUS-Zustand aufweist.
<regexp_for_ON> berschreibt in diesem Fall die positive Flanke,[<regexp_for_Off>] die negative Flanke.
Die Struktur des regexp-Ausdruckes ist analog zu jener beim Notify aufgebaut.

Konkret

define CN.Test HourCounter SHUTTER.JOHN:onoff:.1 SHUTTER.JOHN:onoff:.0

Hier wird der HourCounter CN.TEST definiert. Ein MAX-Fensterkontakt mit Namen SHUTTER.BRENNER wird als Ereignis-Geber verwendet. Das Reading "onoff" wird als Trigger für unserem Zähler genutzt. Bei den Fensterkontakten sehen diese Ereignisse wie folgt aus:

2013-11-15 23:19:12 MAX SHUTTER.JOHN onoff: 1
....
2013-11-15 23:19:24 MAX SHUTTER.JOHN onoff: 0

Wenn man einen Dummy als Ereignis-Geber verwenden will, lautet die Definition wie folgt:

 define CN.Test HourCounter myDummy:1 myDummy:0

Die neue Instanz weist folgende Struktur auf


Internals:
   CFGFN      
   DEF        SHUTTER.JOHN:onoff:.1 SHUTTER.JOHN:onoff:.0
   NAME       CN.Test
   NR         601
   NTFY_ORDER 50-CN.Test
   STATE      0
   TYPE       HourCounter
   Readings:
     2013-11-15 23:30:15   clearDate       2013-11-15 23:30:15
     2013-11-15 23:30:15   countsOverall   0
     2013-11-15 23:30:15   countsPerDay    0
     2013-11-15 23:30:15   pauseTimeIncrement 0
     2013-11-15 23:30:15   pauseTimeOverall 0
     2013-11-15 23:30:15   pauseTimePerDay 0
     2013-11-15 23:30:15   pulseTimeIncrement 0
     2013-11-15 23:30:15   pulseTimeOverall 0
     2013-11-15 23:30:15   pulseTimePerDay 0
     2013-11-15 23:30:15   state           0
     2013-11-15 23:30:15   value           0
   Helper:
     OFF_Regexp SHUTTER.JOHN:onoff:.0
     ON_Regexp  SHUTTER.JOHN:onoff:.1
     calledByEvent 
     changedTimestamp 2013-11-15 23:30:15
     forceClear 
     forceDayChange 
     isFirstRun 
     sdRoundHourLast 1384552800
     value      -1

Readings

Reading Beschreibung
clearDate Datum, zu dem alle kumulativen Readings über set .. clear gelöscht wurden
countsOverall Absolutzähler für das Auftreten des ON-Ereignisses
countsPerDay Tageszähler für das Auftreten des ON-Ereignisses
pauseTimeIncrement Zeitdauer in Sekunden der Pause-Phase der letzten Periode
pauseTimeOverall Zeitdauer in Sekunden über alle aufgetretenen Pause-Phasen
pauseTimePerDay Zeitdauer in Sekunden über alle aufgetretenen Pause-Phasen des akt. Tages
pulseTimeIncrement Zeitdauer in Sekunden der Puls-Phase der letzten Periode
pulseTimeOverall Zeitdauer in Sekunden über alle aufgetretenen Puls-Phasen
pulseTimePerDay Zeitdauer in Sekunden über alle aufgetretenen Puls-Phasen des akt. Tages
value Aktueller Schaltzustand gemäss ON/OFF Ereignis,
mit 1=letztes Ereignis war ON-Ereignis 
und 0=letztes Ereignis war OFF-Ereignis
tickDay Event wird nach Tageswechsel gefeuert bevor die Tageszähler resettiert werden
tickHour Event wird nach Stundenwechsel gefeuert
tickMonth Event wird nach Monatswechsel
tickWeek Event wird nach Wochenwechsel gefeuert

Web-Oberfläche

HourCounter

Anwendung

Nachfolgende Darstellung zeigt das Einschaltverhalten eines Heizungskessels zusammen mit den abgeleiteten Werten.

13 11 15 HourCounter Chart.png

  • die Kurve "Brenner EIN" zeigt die Trigger-Signale unseres ON/OFF Filters, also das Ein-/Ausschalten des Brenners
  • die Kurve "Brenner-Starts" zeigt die über den Tag aufgelaufenen Starts, also chronologisch das Anwachsen von Reading countsPerDay
  • die Kurve "Betriebsstunden" zeigt die aufgelaufene Zeit aus dem Reading pulseTimePerDay umgerechnet zu Stunden
  • die Kurve "Dauer" zeigt die Dauer des letzten Pulses in Sekunden
  • die Kurve Auslastung zeigt das Verhältnis des Readings pulseTimePerDay zur seit Tagesbeginn vergangenen Zeit.

Chart der Aktualwerte

Wir benötigen hierzu ein File-Archiv für die aufgelaufenen Daten.

define CN.Test.File FileLog ./log/CN.Test-%Y.log (CN\.Test:.*)

Man erhält nach den ersten Ereignissen Einträge in folgender Form:

2013-11-16_12:45:40 CN.Test value: 1
2013-11-16_12:45:40 CN.Test 1
2013-11-16_12:46:21 CN.Test pulseTimeIncrement: 41    
2013-11-16_12:46:21 CN.Test pulseTimePerDay: 41
2013-11-16_12:46:21 CN.Test pulseTimeOverall: 41
2013-11-16_12:46:21 CN.Test value: 0
2013-11-16_12:50:38 CN.Test countsPerDay: 2
2013-11-16_12:50:38 CN.Test countsOverall: 2
2013-11-16_12:50:38 CN.Test pauseTimeIncrement: 257
2013-11-16_12:50:38 CN.Test pauseTimePerDay: 756
2013-11-16_12:50:38 CN.Test pauseTimeOverall: 756
2013-11-16_12:50:38 CN.Test value: 1
2013-11-16_12:50:38 CN.Test 2

Nun kann man den Chart definieren: 13 11 16 HourCounter ChartBuild 01.png

Für die Kurve "Brenner EIN" verwenden wir CN.Test.value. Damit diese als unterste Kurve dargestellt wird transformieren wir den Wert 1 auf -2 und alle anderen (also die 0) auf -21 mit folgender Funktion:

$fld[3]=~"1"?-2:-19

Die "Brenner Starts" können wir direkt von countsPerDay ableiten.

Für die "Betriebsstunden" verwenden wir pulseTimePerDay. Da diese in Sekunden vorliegen teilen wir den Wert durch 3600, um Stunden zu erhalten.

$fld[3]/=3600

Als letzten versorgen wir noch die Kurve "Dauer" mit pulseTimeIncrement. Da wir diese in Minuten haben wollen ist ebenfalls eine Umformung nötig.

$fld[3]/=60

Somit sind die Basis-Kurven angelegt.

Eigene Readings definieren

ToDo.

Archiv für Tages-/Wochen-/Monatswerte anlegen

ToDo.

Fragen und Antworten

ToDo