Radioaktivitätsmessung mit DIYGeigerCounter: Unterschied zwischen den Versionen

Aus FHEMWiki
K (Einige Infos ergänzt und Fehler korrigiert)
(Anpassung von <source>-Tags nach <syntaxhighlight>)
 
Zeile 14: Zeile 14:
Folgende Zeilen müssen in diese Datei kopiert werden:
Folgende Zeilen müssen in diese Datei kopiert werden:


<source lang="perl">
<syntaxhighlight lang="perl">
params rad_counts rad_dose
params rad_counts rad_dose
reading rad_counts match "(^\d+),(\d+\.\d+),(\d+.\d{2})\r\n"
reading rad_counts match "(^\d+),(\d+\.\d+),(\d+.\d{2})\r\n"
Zeile 20: Zeile 20:
reading rad_dose match "(^\d+),(\d+\.\d+),(\d+.\d{2})\r\n"
reading rad_dose match "(^\d+),(\d+\.\d+),(\d+.\d{2})\r\n"
reading rad_dose postproc {s/(^\d+),(\d+\.\d+),(\d+.\d{2})\r\n/$2/;; $2}
reading rad_dose postproc {s/(^\d+),(\d+\.\d+),(\d+.\d{2})\r\n/$2/;; $2}
</source>
</syntaxhighlight>


Damit holt FHEM aus z.B. der seriellen Ausgabe ''102,0.1166,5.03'' (IPM,DOSIS,VCC) die ersten beiden Werte heraus, indem für jeden Wert auf eine komplette Ausgabezeile gematcht wird (match) und dann der eigentliche Wert durch Suchen und Ersetzen herausgefilter wird (postproc).
Damit holt FHEM aus z.B. der seriellen Ausgabe ''102,0.1166,5.03'' (IPM,DOSIS,VCC) die ersten beiden Werte heraus, indem für jeden Wert auf eine komplette Ausgabezeile gematcht wird (match) und dann der eigentliche Wert durch Suchen und Ersetzen herausgefilter wird (postproc).
Zeile 26: Zeile 26:
Dann kann die Definition des Device und seiner Attribute erfolgen:
Dann kann die Definition des Device und seiner Attribute erfolgen:


<source lang="perl">
<syntaxhighlight lang="perl">
define Rad_Counter_Serial ECMD serial /dev/cuaU1@9600
define Rad_Counter_Serial ECMD serial /dev/cuaU1@9600
attr Rad_Counter_Serial classdefs message=./rad_counter.classdef
attr Rad_Counter_Serial classdefs message=./rad_counter.classdef
Zeile 33: Zeile 33:
attr Rad_Counter_Serial split \r\n
attr Rad_Counter_Serial split \r\n
attr Rad_Counter_Serial verbose 5
attr Rad_Counter_Serial verbose 5
</source>
</syntaxhighlight>


Die Schnittstellenbezeichnung kann je nach verwendetem Betriebssystem natürlich unterschiedlich sein.
Die Schnittstellenbezeichnung kann je nach verwendetem Betriebssystem natürlich unterschiedlich sein.
Zeile 42: Zeile 42:
Um eine weitere interne Verarbeitung der Daten zu ermöglichen definieren wir noch ein ECMDDevice:
Um eine weitere interne Verarbeitung der Daten zu ermöglichen definieren wir noch ein ECMDDevice:


<source lang="perl">
<syntaxhighlight lang="perl">
defmod Rad_Counter ECMDDevice message rad_counts rad_dose
defmod Rad_Counter ECMDDevice message rad_counts rad_dose
attr Rad_Counter IODev Rad_Counter_Serial
attr Rad_Counter IODev Rad_Counter_Serial
attr Rad_Counter event-min-interval rad_dose.av:58
attr Rad_Counter event-min-interval rad_dose.av:58
attr Rad_Counter userReadings rad_dose.av {movingAverage("Rad_Counter","rad_dose",1200)}
attr Rad_Counter userReadings rad_dose.av {movingAverage("Rad_Counter","rad_dose",1200)}
</source>
</syntaxhighlight>


In diesem Fall wird zusätzlich noch jede Minute ein [[Gleitende_Mittelwerte_berechnen_und_loggen|Durchschnittswert]] mit dem Namen ''rad_dose.av'' (über einen Zeitraum von 1200 Sekunden gemittelt) erzeugt. Dies erfordert natürlich vorher den Eintrag der Zusatzfunktion [[Gleitende_Mittelwerte_berechnen_und_loggen#Subroutine_movingAverage_in_99_MyUtils_anlegen|movingAverage]] in der Datei ''99_Utils.pm'' im FHEM Programmverzeichnis.
In diesem Fall wird zusätzlich noch jede Minute ein [[Gleitende_Mittelwerte_berechnen_und_loggen|Durchschnittswert]] mit dem Namen ''rad_dose.av'' (über einen Zeitraum von 1200 Sekunden gemittelt) erzeugt. Dies erfordert natürlich vorher den Eintrag der Zusatzfunktion [[Gleitende_Mittelwerte_berechnen_und_loggen#Subroutine_movingAverage_in_99_MyUtils_anlegen|movingAverage]] in der Datei ''99_Utils.pm'' im FHEM Programmverzeichnis.
Zeile 54: Zeile 54:
Die Definition mit Auswahl der zu loggenden Werte erfolgt so:
Die Definition mit Auswahl der zu loggenden Werte erfolgt so:


<source lang="perl">
<syntaxhighlight lang="perl">
defmod FileLog_Rad_Counter FileLog ./log/Rad_Counter-%Y.txt Rad_Counter:(rad_dose|rad_dose.av|rad_counts)[:].*
defmod FileLog_Rad_Counter FileLog ./log/Rad_Counter-%Y.txt Rad_Counter:(rad_dose|rad_dose.av|rad_counts)[:].*
</source>
</syntaxhighlight>


Und ergibt dieses Beispiellog:
Und ergibt dieses Beispiellog:
<source lang="text">
<syntaxhighlight lang="text">
2016-12-31_23:41:15 Rad_Counter rad_counts: 120
2016-12-31_23:41:15 Rad_Counter rad_counts: 120
2016-12-31_23:41:15 Rad_Counter rad_dose.av: 0.082
2016-12-31_23:41:15 Rad_Counter rad_dose.av: 0.082
Zeile 74: Zeile 74:
2016-12-31_23:42:15 Rad_Counter rad_dose.av: 0.086
2016-12-31_23:42:15 Rad_Counter rad_dose.av: 0.086
2016-12-31_23:42:15 Rad_Counter rad_dose: 0.1303
2016-12-31_23:42:15 Rad_Counter rad_dose: 0.1303
</source>
</syntaxhighlight>


Hier ist sehr gut der minütlich generierte Mittelwert zu sehen.
Hier ist sehr gut der minütlich generierte Mittelwert zu sehen.

Aktuelle Version vom 26. Juli 2017, 20:01 Uhr

Die Selbstbau-Geizerzähler von DIYGeigerCounter besitzen einen seriellen TTL Ausgang können daher relativ einfach mit FHEM-Bordmittel angebunden werden. Eine Vorverarbeitung findet im Gerät statt und neben den Impulsen pro Minute können folgende Dosiseinheiten ausgegeben werden: uSv/h, uR/h, mR/h oder xBg.

Vorbereitung

Je nach verwendeter Server-Hardware die serielle Schnittstelle mit der Pin-Leiste des DIYCounter verbinden. Evtl. per Kabel, falls TTL-fähig, sonst via TTL Seriell-Adapter. Im Menü des Geigerzählers den SERIAL OUTPUT MODE auf GK-B5 und SERIAL LOG PERIOD auf 10s einstellen. Diese Werte sind notwendig für dieses HowTo; andere Werte sind möglich, führen dann aber zu Fehlern in der Verarbeitung durch FHEM wenn die Zeiten nicht angepasst werden.

Integration in FHEM

Definition des seriellen Device

Das Einlesen der Daten geschieht über ECMD.

Vor dem Ausführen der Befehle in FHEM ist folgende Datei im Programmverzeichnis von FHEM (z.B. /usr/local/fhem/ od. /opt/fhem) anzulegen:

rad_counter.classdef

Folgende Zeilen müssen in diese Datei kopiert werden:

params rad_counts rad_dose
reading rad_counts match "(^\d+),(\d+\.\d+),(\d+.\d{2})\r\n"
reading rad_counts postproc {s/(^\d+),(\d+\.\d+),(\d+.\d{2})\r\n/$1/;; $1}
reading rad_dose match "(^\d+),(\d+\.\d+),(\d+.\d{2})\r\n"
reading rad_dose postproc {s/(^\d+),(\d+\.\d+),(\d+.\d{2})\r\n/$2/;; $2}

Damit holt FHEM aus z.B. der seriellen Ausgabe 102,0.1166,5.03 (IPM,DOSIS,VCC) die ersten beiden Werte heraus, indem für jeden Wert auf eine komplette Ausgabezeile gematcht wird (match) und dann der eigentliche Wert durch Suchen und Ersetzen herausgefilter wird (postproc).

Dann kann die Definition des Device und seiner Attribute erfolgen:

define Rad_Counter_Serial ECMD serial /dev/cuaU1@9600
attr Rad_Counter_Serial classdefs message=./rad_counter.classdef
attr Rad_Counter_Serial logTraffic 5
attr Rad_Counter_Serial partial 2
attr Rad_Counter_Serial split \r\n
attr Rad_Counter_Serial verbose 5

Die Schnittstellenbezeichnung kann je nach verwendetem Betriebssystem natürlich unterschiedlich sein. Die zusätzlichen Attribute dienen dem Zweck, dass im Falle einer zerstückelten Ausgabe durch z.B. USB-Bufferprobleme die Zeilen wieder korrekt zusammengesetzt werden, bevor das Matching durch die .classdef erfolgt. Hierbei werden die beiden Readings rad_counts und rad_dose für ein ECMD-Device erzeugt.

Definition des ECMD Device

Um eine weitere interne Verarbeitung der Daten zu ermöglichen definieren wir noch ein ECMDDevice:

defmod Rad_Counter ECMDDevice message rad_counts rad_dose
attr Rad_Counter IODev Rad_Counter_Serial
attr Rad_Counter event-min-interval rad_dose.av:58
attr Rad_Counter userReadings rad_dose.av {movingAverage("Rad_Counter","rad_dose",1200)}

In diesem Fall wird zusätzlich noch jede Minute ein Durchschnittswert mit dem Namen rad_dose.av (über einen Zeitraum von 1200 Sekunden gemittelt) erzeugt. Dies erfordert natürlich vorher den Eintrag der Zusatzfunktion movingAverage in der Datei 99_Utils.pm im FHEM Programmverzeichnis.

Definiton des FileLog

Die Definition mit Auswahl der zu loggenden Werte erfolgt so:

defmod FileLog_Rad_Counter FileLog ./log/Rad_Counter-%Y.txt Rad_Counter:(rad_dose|rad_dose.av|rad_counts)[:].*

Und ergibt dieses Beispiellog:

2016-12-31_23:41:15 Rad_Counter rad_counts: 120
2016-12-31_23:41:15 Rad_Counter rad_dose.av: 0.082
2016-12-31_23:41:15 Rad_Counter rad_dose: 0.1371
2016-12-31_23:41:25 Rad_Counter rad_counts: 84
2016-12-31_23:41:25 Rad_Counter rad_dose: 0.0960
2016-12-31_23:41:35 Rad_Counter rad_counts: 78
2016-12-31_23:41:35 Rad_Counter rad_dose: 0.0891
2016-12-31_23:41:55 Rad_Counter rad_counts: 54
2016-12-31_23:41:55 Rad_Counter rad_dose: 0.0617
2016-12-31_23:42:05 Rad_Counter rad_counts: 42
2016-12-31_23:42:05 Rad_Counter rad_dose: 0.0480
2016-12-31_23:42:15 Rad_Counter rad_counts: 114
2016-12-31_23:42:15 Rad_Counter rad_dose.av: 0.086
2016-12-31_23:42:15 Rad_Counter rad_dose: 0.1303

Hier ist sehr gut der minütlich generierte Mittelwert zu sehen. Eine Weiterverarbeitung kann dann sehr einfach via Plot-Editor erfolgen.

Links