Radon-Sensor einbinden?

Allgemeines zur HomeMatic Haussteuerung

Moderator: Co-Administratoren

Homeberry
Beiträge: 174
Registriert: 22.10.2015, 19:45
Hat sich bedankt: 1 Mal
Danksagung erhalten: 7 Mal

Re: Radon-Sensor einbinden?

Beitrag von Homeberry » 13.02.2019, 19:39

Ich würde etwas ja gerade dann zurückschicken, wenn es ohne Server des Herstellers nicht betrieben werden kann ;-)

Kenobi
Beiträge: 98
Registriert: 19.07.2014, 21:15
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Radon-Sensor einbinden?

Beitrag von Kenobi » 02.09.2019, 16:18

Hallo,

seit einigen Tagen habe ich ein RadonEye im Einsatz, bei mir die einfache Variante mit IOS App und Bluetooth.
Aufgrund der ersten sehr aufschlussreichen Messungen im Kellergeschoss trage ich mich mit der Absicht weitere Sensoren aufzustellen, die dann aber via LAN/WLAN erreichbar sein sollten und zumindest zum Lüften auffordern sollen.

Der Sensor im RadonEye ist von FTLab und heisst RD200M.
Unter https://github.com/Foxi352/radonsensor hat jemand schon mal den RD200M mittels Arduino /Raspberry verbaut. Eine technische Dokumentation des RD200M ist auch dabei. Leider habe ich nicht die notwendigen Kenntnisse, um so etwas zu bauen, aber vielleicht liesst hier jemand mit, der so was kann? Oder Eugen Stall liesse sich für einen "Wiffi Radon" begeistern? Das wäre dann genau die Lösung für mich, wenn der Bausatz den aktuellen Radon Messwert in die HM schreibt.

Falls jemand noch nie von Radon und seine gesundheitlichen Auswirkung im Wohnbereich gehört hat, kann der folgende Artikel erhellend wirken:
https://www.lfu.bayern.de/buerger/doc/uw_57_radon.pdf
Hier könnte Smart-Home wirklich helfen.

Kenobi
Beiträge: 98
Registriert: 19.07.2014, 21:15
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Radon-Sensor einbinden?

Beitrag von Kenobi » 08.12.2019, 13:01

wolfgangm hat geschrieben:
06.02.2019, 19:46
Hat schon mal jemand versucht seinen Radon-Sensor in die Homematic einzubinden?

Das wäre aus meiner Sicht ein höchst wichtiger Einsatz für eine automatische Lüftungssteuerung etc.

Die heutigen Sensoren können WLAN und App, also müsste man das Signal wohl auf diese Weise abzapfen?

Würde mich auf Hinweise freuen.

Wolfgang
Hallo Wolfgang
auch mich hat das Thema Radon im Haus dieses Jahr beschäftigt.
Für mich habe eine brauchbare Lösung gefunden. Sie besteht aus

Sensor RadonEye von FTLab RD200M (Bluetooth)
Python Script (https://github.com/ceandre/radonreader)

Raspberry Zero W mit
2019-07-10-raspbian-buster-lite.img
sudo apt update
sudo apt install python-pip -y
(sudo python -m pip install -U pip) => pip-19.2.3
sudo apt install libglib2.0-dev -y
sudo pip install bluepy
und einem Cronjob, der alle 5 Minuten das Python-Script aufruft, und den Radon-Wert via Curl in eine Systemvariable auf der Raspimatic schreibt.

Den aktuellen Wert incl. Verlauf betrachte ich dann via RedMatic auf meinem Smartphone bzw. als Langzeit-Diagramm via ccu-historian.
Man kann das technisch sicher noch eleganter machen, aber für mich erfüllt es seinen Zweck.

Jetzt interessiert mich, wie ich den Raspi einsparen kann und statt dessen einen ESP32 Microcontroller verwenden kann...

Viele Grüsse
Kenobi

Raspopo
Beiträge: 9
Registriert: 14.01.2015, 21:17
Danksagung erhalten: 1 Mal

Re: Radon-Sensor einbinden?

Beitrag von Raspopo » 10.02.2020, 18:06

Hallo Kenobi,

hab ne ähnliche Lösung.
Als Radonfachperson und HM-User seit 7 Jahren musste eine Einbindung eines Radon-Sensors her.
Seit 3 Jahren ist bei mir ein Airthings Wave im Keller im Einsatz. (Die anderen Detektoren sind mir auch bekannt.)
via Raspberry Zero W / Bluetooth kommen die Werte zur CCU2.
Die steuert dann die Aktoren zur Fensteröffnung.

Jetzt werden nicht nur in den Schlafzimmern die Fenster Co2-getriggert (via Netatmo) automatisch geöffnet, sondern auch die Kellerfenster Radon-getriggert.

Hat etwas gedauert, aber jetzt hab ich die Radonkonzentration (die im 1. Jahr der Messung gemittelt über 350 Bq/m3 lag mit Spitzenwerte über 1.800 Bq/m3) im Griff. (Referenzwert ist übrigens 300 Bq/m3 übers Jahr gemittelt)

Bei Bedarf gebe ich noch ne Beschreibung dazu.

Viele Grüsse
Robert

muennich
Beiträge: 30
Registriert: 18.05.2019, 10:00
System: CCU
Hat sich bedankt: 3 Mal

Re: Radon-Sensor einbinden?

Beitrag von muennich » 01.05.2020, 22:00

Hallo Raspopo,

habe soeben deinen Beitrag und Angebot hier gefunden. Könntest Du bitte mehr zu Deiner Lösung schreiben.

Danke
Gruß
Andreas

Raspopo
Beiträge: 9
Registriert: 14.01.2015, 21:17
Danksagung erhalten: 1 Mal

Re: Radon-Sensor einbinden?

Beitrag von Raspopo » 12.08.2020, 14:04

Hallo Andreas,

sorry für die verzögerte Antwort.

Die Anleitung, mit der ich mir letztes Jahr den Raspi Zero W konfiguriert habe, liegt auf https://github.com/Airthings/wave-reader

Das Skript "read-wave.py" habe ich dann mit der Seriennummer meines Wave ergänzt und so geändert,
dass die Werte: date_time, humidity, temperature, radon_st_avg, radon_lt_avg via print ausgegeben werden.

Code: Alles auswählen

# MIT License
#
# Copyright (c) 2018 Airthings AS
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
#
# https://airthings.com
# 
# Modified for Raspian Zero Bridge-Mode
# with Aithings Wave SN: 2900050111 and MAC: a0:e6:f8:ef:29:80
# by R. Hofmann 2019

# ===============================
# Module import dependencies
# ===============================

from bluepy.btle import UUID, Peripheral, Scanner, DefaultDelegate
import sys
from datetime import datetime
import time
import struct
import tableprint

# ===============================
# Script guards for correct usage
# ===============================

if len(sys.argv) > 1:
    Mode = sys.argv[1].lower()

SerialNumber = int(2900050111)

# ====================================
# Utility functions for WavePlus class
# ====================================

def parseSerialNumber(ManuDataHexStr):
    if (ManuDataHexStr == "None"):
        SN = "Unknown"
    else:
        ManuData = bytearray.fromhex(ManuDataHexStr)

        if (((ManuData[1] << 8) | ManuData[0]) == 0x0334):
            SN  =  ManuData[2]
            SN |= (ManuData[3] << 8)
            SN |= (ManuData[4] << 16)
            SN |= (ManuData[5] << 24)
        else:
            SN = "Unknown"
    return SN

# ===================================
# Sensor index definitions
# ===================================

SENSOR_IDX_DATETIME      = 0
SENSOR_IDX_HUMIDITY      = 1
SENSOR_IDX_TEMPERATURE   = 2
SENSOR_IDX_RADON_ST_AVG  = 3
SENSOR_IDX_RADON_LT_AVG  = 4

# ===============================
# Class WavePlus
# ===============================

class Wave():

    UUID_DATETIME     = UUID(0x2A08)
    UUID_HUMIDITY     = UUID(0x2A6F)
    UUID_TEMPERATURE  = UUID(0x2A6E)
    UUID_RADON_ST_AVG = UUID("b42e01aa-ade7-11e4-89d3-123b93f75cba")
    UUID_RADON_LT_AVG = UUID("b42e0a4c-ade7-11e4-89d3-123b93f75cba")

    def __init__(self, SerialNumber):
        self.periph            = None
        self.datetime_char     = None
        self.humidity_char     = None
        self.temperature_char  = None
        self.radon_st_avg_char = None
        self.radon_lt_avg_char = None

    def connect(self):
        scanner     = Scanner().withDelegate(DefaultDelegate())
        deviceFound = False
        searchCount = 0
        while deviceFound is False and searchCount < 50:
            devices      = scanner.scan(0.1) # 0.1 seconds scan period
            searchCount += 1
            for dev in devices:
                ManuData = dev.getValueText(255)
                SN = parseSerialNumber(ManuData)
                if (SN == SerialNumber):
                    MacAddr = dev.addr
                    deviceFound  = True # exits the while loop on next conditional check
                    break # exit for loop
        
        if (deviceFound is not True):
            print "ERROR: Could not find device."
            print "GUIDE: (1) Please verify the serial number. (2) Ensure that the device is advertising. (3) Retry connection."
            sys.exit(1)
        else:
            self.periph = Peripheral(MacAddr)
            self.datetime_char     = self.periph.getCharacteristics(uuid=self.UUID_DATETIME)[0]
            self.humidity_char     = self.periph.getCharacteristics(uuid=self.UUID_HUMIDITY)[0]
            self.temperature_char  = self.periph.getCharacteristics(uuid=self.UUID_TEMPERATURE)[0]
            self.radon_st_avg_char = self.periph.getCharacteristics(uuid=self.UUID_RADON_ST_AVG)[0]
            self.radon_lt_avg_char = self.periph.getCharacteristics(uuid=self.UUID_RADON_LT_AVG)[0]
            
    def read(self, sensor_idx):
        if (sensor_idx==SENSOR_IDX_DATETIME and self.datetime_char!=None):
                rawdata = self.datetime_char.read()
                rawdata = struct.unpack('HBBBBB', rawdata)
                data    = datetime(rawdata[0], rawdata[1], rawdata[2], rawdata[3], rawdata[4], rawdata[5])
                unit    = " "
        elif (sensor_idx==SENSOR_IDX_HUMIDITY and self.humidity_char!=None):
                rawdata = self.humidity_char.read()
                data    = struct.unpack('H', rawdata)[0] * 1.0/100.0
                unit    = " %rH"
        elif (sensor_idx==SENSOR_IDX_TEMPERATURE and self.temperature_char!=None):
                rawdata = self.temperature_char.read()
                data    = struct.unpack('h', rawdata)[0] * 1.0/100.0
                unit    = " degC"
        elif (sensor_idx==SENSOR_IDX_RADON_ST_AVG and self.radon_st_avg_char!=None):
                rawdata = self.radon_st_avg_char.read()
                data    = struct.unpack('H', rawdata)[0] * 1.0
                unit    = " Bq/m3"
        elif (sensor_idx==SENSOR_IDX_RADON_LT_AVG and self.radon_lt_avg_char!=None):
                rawdata = self.radon_lt_avg_char.read()
                data    = struct.unpack('H', rawdata)[0] * 1.0
                unit    = " Bq/m3"
        else:
            print "ERROR: Unkown sensor ID or device not paired"
            print "GUIDE: (1) method connect() must be called first, (2) Ensure correct sensor_idx input value."
            sys.exit(1)
        return str(data)#+unit
    
    def disconnect(self):
        if self.periph is not None:
            self.periph.disconnect()
            self.periph            = None
            self.datetime_char     = None
            self.humidity_char     = None
            self.temperature_char  = None
            self.radon_st_avg_char = None
            self.radon_lt_avg_char = None

try:
    #---- Connect to device ----#
    wave = Wave(SerialNumber)
    wave.connect()

    # read current values
    date_time    = wave.read(SENSOR_IDX_DATETIME)
    humidity     = wave.read(SENSOR_IDX_HUMIDITY)
    temperature  = wave.read(SENSOR_IDX_TEMPERATURE)
    radon_st_avg = wave.read(SENSOR_IDX_RADON_ST_AVG)
    radon_lt_avg = wave.read(SENSOR_IDX_RADON_LT_AVG)

    print date_time,";",humidity,";",temperature,";",radon_st_avg,";",radon_lt_avg

finally:
    wave.disconnect()
Ein cron-job auf dem Raspi ruft dann alle 20 Minuten:

Code: Alles auswählen

python2 /home/wave-reader/read_wave.py pipe > /home/wave-reader/Wavedaten.csv
auf.
Damit wird dann jedes mal ein Verbindungsaufbau zwischen Wave und Raspi via Bluetooth, eine Datenübertragung, eine Speicherung auf dem Raspi in der Datei "Wavedaten.csv" und ein disconnect durchgeführt.

Das Wave aktualisiert alle 60 Minuten die Radonwerte. Da es aber vorkommen kann, dass die Datenübertragung blockiert ist (wenn z.B. gerade via Smart Phone App eine Übertragung statt findet) habe ich mit 20 Minuten drei Übertragungen pro Stunde eingerichtet.

In der WebUI auf der CCU2 laufen dann auch alle 20 Minuten zwei Skripte, die via

Code: Alles auswählen

dom.GetObject("CUxD.CUX2801002:3.CMD_EXEC").State("scp pi@192.168.111.11:/home/wave-reader/Wavedaten.csv /media/sd-mmcblk0/WaveDaten/Wavedaten.csv");
die Daten vom Raspi auf die SD Karte in der CCU2 kopiert

und mit:

Code: Alles auswählen

dom.GetObject("CUxD.CUX2801002:4.CMD_QUERY_RET").State(1);
dom.GetObject("CUxD.CUX2801002:4.CMD_SETS").State("tclsh /usr/local/addons/Airthings/ReadWaveLog.tcl");
dom.GetObject("CUxD.CUX2801002:4.CMD_RETS").State();
die Daten über ein TCL Skript einliest.

(Vorher noch ein Gerät "(90) Universal Wrapper Device" mit Funktion "Thermostat" in der CUxD einrichten. Bei mir steht dafür die CUX2801002)

Hier noch das TCL Skript:

Code: Alles auswählen

	#!/bin/tclsh

	load tclrega.so

	#---------------------------------------------------------------------------------------------------------------#
	#                                                   CONFIG                                                      #
	#---------------------------------------------------------------------------------------------------------------#
	set ::env(LD_LIBRARY_PATH) "/usr/local/addons/cuxd"
	set filename "/media/sd-mmcblk0/WaveDaten/Wavedaten.csv"
	#---------------------------------------------------------------------------------------------------------------#

	proc readWaveLog {} {

		global filename
		global wavedate_
		global wavefeuchte_
		global wavetemp_
		global wavekurzakt_
		global wavelangakt_

		set f [open $filename r]
		set file_data [read $f]
		close $f

		set fields [split $file_data ";"]
		
		set wavedate_ [lindex $fields 0]
		set wavefeuchte_ [lindex $fields 1]
		set wavetemp_ [lindex $fields 2]
		set wavekurzakt_ [lindex $fields 3]
		set wavelangakt_ [lindex $fields 4]
	}

	readWaveLog

	#
	# set ReGaHss variables
	#
	set rega_cmd ""
	append rega_cmd "var sWave1 = dom.GetObject('CUxD.CUX9002001:1.SET_TEMPERATURE');"
	append rega_cmd "var sWave2 = dom.GetObject('CUxD.CUX9002001:1.SET_HUMIDITY');"
	append rega_cmd "var sWave3 = dom.GetObject('RadonLevel_Tag');"
	append rega_cmd "var sWave4 = dom.GetObject('RadonLevel_Jahr');"
	
	append rega_cmd "sWave1.State('$wavetemp_');"
	append rega_cmd "sWave2.State('$wavefeuchte_');"
	append rega_cmd "sWave3.State('$wavekurzakt_');"
	append rega_cmd "sWave4.State('$wavelangakt_');"

	rega_script $rega_cmd
Per CCU-Historian auf meiner Synology DS218+ habe ich auch eine feine Darstellung/Auswertung Überall zur Hand (permanente SmartPhone-Anbindung via Wireguard VPN auf meinem CubieTruck).
Der Job kann mit Sicherheit eleganter programmiert werden. Da die Sache bei mir aber stabil läuft habe ich keine weitere Zeit mehr investiert.

Bei Bedarf erstelle ich aber noch eine einfachere Schritt für Schritt Anleitung, weil ich mir einen weiteren Wave zugelegt habe.

Gruß
Robert

muennich
Beiträge: 30
Registriert: 18.05.2019, 10:00
System: CCU
Hat sich bedankt: 3 Mal

Re: Radon-Sensor einbinden?

Beitrag von muennich » 12.08.2020, 14:12

Hallo Robert,

danke für Deine Antwort.
Klingt gut. Wenn ich die Energie und Zeit finde, dann versuche ich das nachzubauen. Ich hoffe ich kann bei Verrständnisproblemen auf dich zurückkommen.

Vielen Dank im Voraus.

Gruß
Andreas

Raspopo
Beiträge: 9
Registriert: 14.01.2015, 21:17
Danksagung erhalten: 1 Mal

Re: Radon-Sensor einbinden?

Beitrag von Raspopo » 12.08.2020, 14:34

Klar, ich helfe gerne. (In der Regel ohne lange Wartezeiten.)

Kleine Korrektur noch:
Für mein CUxD-Device "Radon_Wave" in der CCU2 steht nicht die Adresse CUX2801002 sondern die Adresse CUX9002001

Gruß
Robert.

Raspopo
Beiträge: 9
Registriert: 14.01.2015, 21:17
Danksagung erhalten: 1 Mal

Re: Radon-Sensor einbinden?

Beitrag von Raspopo » 14.08.2020, 10:26

Erwähnen sollte ich noch, dass zu dem CUxD-Device "Radon_Wave" mit Funktion "Thermostat" (und damit die Variablen CUxD.CUX9002001:1.SET_TEMPERATURE und CUxD.CUX9002001:1.SET_HUMIDITY) auch noch zusätzlich die Systemvariablen RadonLevel_Tag und RadonLevel_Jahr in der CCU2 angelegt werden müssen (siehe TCL-Skript).

Parameter:
RadonLevel_Tag; Radon Aktivitätskonzentration Tagesdurchschnitt; Zahl, Minimalwert: 0 Maximalwert: 6500; Bq/m3; Kanalzuordnung: Radon_Wave:1
RadonLevel_Jahr wie RadonLevel_Tag

Gruß
Robert

asmd
Beiträge: 35
Registriert: 23.01.2020, 12:15
Hat sich bedankt: 2 Mal
Danksagung erhalten: 2 Mal

Re: Radon-Sensor einbinden?

Beitrag von asmd » 18.03.2021, 11:45

Hallo Robert,

habe mir auch einen Airthings Wave besorgt und möchte den gerne in meine Raspberrymatic einbinden.
Bei mir läuft die RM auf einem Raspberry 4.

Du hast ja einen eigenen Raspberry, der mit dem Wave kommuniziert und die Daten in eine CSV schreibt. Die wiederum holst du von der CCU ab und schreibst es in Variablen.

Wäre es nicht möglich den Raspberry, auf dem RaspberryMatic läuft direkt dazu zu verwenden mit dem Wave zu kommunizieren?
Bluetooth hätte er ja.
Dacht dein Skript etwas zu modifizieren und mit pmatic ausführen zu lassen?
Allerdings weiß ich nicht ob und wie ich Bluetooth in der RaspberryMatic verwenden kann?
Kann mir da jemand helfen?

Vielen Dank und viele Grüße
Alois

Antworten

Zurück zu „HomeMatic allgemein“