Skip to content

Latest commit

 

History

History
667 lines (452 loc) · 33 KB

README.md

File metadata and controls

667 lines (452 loc) · 33 KB

Universalsensor HB-UNI-Sensor1

Inhaltsverzeichnis

Features

  • Demonstriert einen HomeMatic/RaspberryMatic/FHEM Universalsensor
  • Sensoren für Temperatur (DS18B20, BME280), Luftdruck (BME280, BMP180), Luftfeuchte (BME280, SHT10, SHT21, SHT31), Helligkeit (MAX44009, TSL2561, BH1750), UV-Index (VEML6070, VEML6075) uvm. bestückbar
  • modifizierbar für andere Sensoren
  • Bestückung mit Arduino Pro Mini oder alternativ mit ATmega328P
  • RC- oder Quarzoszillator möglich
  • konfigurierbares Sendeintervall über WebUI
  • konfigurierbare Höhe (für Berechnung des Luftdrucks auf Meeresniveau/Normaldruck) über WebUI
  • über die defines am Anfang des Sketches können entweder Dummy Werte für die Sensoren (zum Testen der Anbindung an HomeMatic/RaspberryMatic/FHEM) oder reale Sensoren aktiviert werden Beispiel:
    #define SENSOR_BME280 // realer BME280 angeschlossen
    //#define SENSOR_BME280 // es werden BME280 Dummy Werte gesendet
  • Es können mehrere HB-UNI-Sensor1 an einer Zentrale verwendet werden. Dafür müssen sich die einzelnen Sensoren nur in Device ID und Device Serial unterscheiden:
    const struct DeviceInfo PROGMEM devinfo =
    { 0xA5, 0xA5, 0x00 }, // Device ID
    "UNISENS001", // Device Serial
  • Ich empfehle den MAX44009 Helligkeitssensor anstatt dem TSL2561, siehe
    Vergleich TSL2561 MAX44009
  • Der Status eines digitalen Eingangs kann mit übertragen werden. Falls diese Option aktivert ist wird bei einer Änderung an diesem Eingang sofort ein neues Telegramm an die Zentrale gesendet, unabhängig vom eingestellten Sendeintervall.
  • Folgende Sensoren sind zur Zeit beim HB-UNI-Sensor1 aktivierbar:
    #define SENSOR_DS18X20
    #define SENSOR_BME280
    #define SENSOR_BMP180
    #define SENSOR_MAX44009
    #define SENSOR_TSL2561
    #define SENSOR_BH1750
    #define SENSOR_SHT31
    #define SENSOR_SHT21
    #define SENSOR_SHT10
    #define SENSOR_DIGINPUT
    #define SENSOR_VEML6070
    #define SENSOR_VEML6075

Hinweise

  • Zum Kompilieren des Sketches benötigt man alle Dateien unterhalb der Verzeichnisses Arduino.

  • Der HB-UNI-Sensor1 Sketch benötigt den master-Branch der AskSinPP Library, nicht den V4 Release-Branch wie dort angegeben.
    Grund: Verwendung der broadcastEvent() Methode.

Bilder

Prototyp

pic

Beispiel Aufbau Aussensensor - Version 2.01

pic

pic

pic

pic

pic

pic

Beispiel Aufbau Innensensor - Version i2.20

pic

pic

pic

pic

pic

pic

pic

pic

Schaltplan

➡️ Schaltplan - Version 2.01

➡️ Schaltplan - Version i2.20

Platine

Version 2.01

pic

pic

Version i2.20

pic

Gerber

➡️ PCB Gerber

Mögliche I2C Adressen der Sensoren

Die I2C Adressen lassen sich (falls der Sensor das unterstützt) meisten am Sensor Breakout-Board über eine Lötbrücke einstellen und müssen zu den im Sketch definierten Adressen passen!

Sensor Adressen (hex) Bemerkungen
DS18B20 - OneWire, kein I2C Sensor
BME280 76, 77 wählbar über Pin
BMP180 77 -
MAX44009 4A, 4B wählbar über Pin
TSL2561 29, 39, 49 wählbar über Pin
BH1750 23, 5C wählbar über Pin
SHT31 44, 45 wählbar über Pin
SHT21 40 -
SHT10 - kein I2C Sensor, kann aber die I2C Pins mitbenutzen
AHT15 38 -
VEML6070 38+39 (+0C) beide 3x Adressen werden benötigt, 0C unklar
VEML6075 10 -
24AA025UID 50..57 kein Sensor, ggf. für später für UID vorgehalten

Messung der Batteriespannung

pic

  • Option 1: Standard, UBatt = Betriebsspannung AVR
    keine zusätzliche Hardware notwendig
    #define BAT_SENSOR tmBattery

  • Option 2: Batteriespannungsmessung für StepUp/StepDown
    2 zusätzliche Widerstände notwendig
    #define BAT_SENSOR tmBatteryResDiv<A0, 9, 5700>
    // sense pin A0, activation pin D9, Faktor = Rges/Rlow*1000, z.B. 470k/100k, Faktor 570k/100k*1000 = 5700

  • Option 3: Echte Batteriespannungsmessung unter Last
    #define BAT_SENSOR tmBatteryLoad<A0, 9, 4000, 200>
    // sense pin A0, activation pin D9, Faktor = Rges/Rlow*1000, z.B. 10/30 Ohm, Faktor 40/10*1000 = 4000, 200ms Belastung vor Messung

Die Batteriespannungsmessung unter Last dient u.a. dem Schutz vor einem "Babbling Idiot, siehe Babbling Idiot Protection

Aus meiner Sicht würde es sehr helfen, eine echte Messung des Batteriezustands unter Last zu haben, um frühzeitig leere Batterien zu erkennen und zu tauschen. Bekanntermaßen sagt eine Spannungsmessung an unbelasteter Batterie, je nach Batterie- bzw. Akkutyp, nicht viel über den Ladezustand aus.

Die Schaltung belastet die Batterie bzw. den Akku für einige Hundert Millisekunden und misst dabei die Spannung. Dies führt meiner Meinung nach zu realistischeren Werten über den Batteriezustand als eine asynchrone und unbelastete Messung.

Dazu wurde eine neue Batterieklasse nach Vorbild von papas Batterieklassen erstellt. Sie heißt hier tmBatteryLoad und befindet sich unter Sensors/tmBattery.h
Die Aktivierung ist oben in Option 3 dargestellt.
Mit dieser Klasse und der Schaltung werden die Batterien bei 3V mit ca. 75mA für die kurze Zeit der Messung belastet. Anpassungen an andere Spannungen und Ströme sind natürlich leicht über die Widerstände R2/R3 möglich. Momentan geschieht das 2 mal am Tag.
battery.init(seconds2ticks(12UL * 60 * 60), CLOCK);

Das Bild zeigt den Einbruch der Batteriespannung wenn für 200ms mit 75mA belastet wird. Die Spannung bricht um 142mV ein und wird am Ende der 200ms gemessen.
pic

Verringerung Ruhestrom

➡️ Verringerung Ruhestrom

Aufbau

Version 2.01

  • alle SMD Widerstände und Kondensatoren haben die Bauform 0805 (außer die Kondensatoren für den optionalen Step-up Wandler, die haben 1206).

  • Gehäuse mit Klarsichtdeckel: GAINTA G201C (ohne Befestigunslaschen), GAINTA G201CMF (mit Befestigunslaschen)

  • Gehäusevariante Innen, 3D Druck Design by FrankenKai (modwadd)

  • Batteriehalter 2xAA: COMF BH-321-1A

  • MOSFET für Option 'Echte Batteriespannungsmessung unter Last'

    • Meine Wahl: IRLML6344 (Gate Threshold Voltage - GTV) 0,8V, RDSon 27mOhm, 5A, SOT-23 Gehäuse, Pinout Gate 1, Source 2, Drain 3, N-Channel)
    • Es gehen natürlich auch günstigere bzw. leichter beschaffbare MOSFETs, wichtig ist das dieser bei minimaler Betriebsspannung des Sensors (nehmen wir mal 2V an) sicher durchschalten kann (GTV) und das der RDSon möglichst klein im Bezug zu den Widerständen des Spannungsteilers R2/R3 ist. Und natürlich muss er den gewählten Laststrom aushalten und das Pinout muss passen.
    • Der Si2302 zum Beispiel wäre auch gut geeignet, ist leichter beschaffbar und günstiger (aliexpress), GTV 0,7V, RDSon 85mOhm, 2,6A.
    • HM user 'klassisch' weist auf den Umstand hin dass der GTV Wert nicht der Wert ist, beim dem der MOSFET sicher leitet sondern da fängt er gerade (mit minimalen Strom) erst an zu leiten. Die Spannung muss also für sicheres Durchschalten schon etwas höher sein als die GTV. Bei den genannten MOSFET IRLML6344 und Si2302 ist das kein Problem, z.B. hat der IRLML6344 bei Vgs 2,5V einen Widerstand von 27mOhm. Bei anderen MOSFET sollte man ins Datenblatt schauen und sicherstellen dass die Leitfähigkeit bei minimaler Betriebsspannung gegeben ist.

  • Spule für optionalen Step-Up Wandler: Murata LQH43CN100K03L oder vergleichbare, unbedingt Strom und DC-Widerstand beachten, aus Produktrange 'Power lines', 'DC/DC' o.ä.

Bestückungsvarianten

Thema Variante zu bestückende Bauelemente
CC1101 immer M1, R9, C12
Interface immer LED1, R7, CONFIG1
I2C immer R5, R6
CPU ATmega328P Chip IC1, R1, C1, C5, C6, C7
CPU Arduino Pro Mini über Pin Header JP1, JP2, JP3 stecken oder löten
I2C Sensoren Temperatur, Luftdruck, Luftfeuchte, Helligkeit nach Bedarf IC3 + C4, IC6 + C11, SV1, SV2
1-Wire Sensor DS18B20 Temperatur IC7, R8
Betriebsspannung Standard 2x AA (3V) SJ1 geschlossen
Betriebsspannung Step-Up 1x AA oder Akku (1,2-1,5V) MAX1724, L1, C8, C9, C10, SJ1 offen
Betriebsspannung >3V nur mit LDO, extern oder LDO auf dem Arduino Pro Mini, SJ1 offen
Messung Batteriespannung Standard 3V keine zusätzlichen Bauelemente nötig
Messung Batteriespannung Step-Up MAX1724 R2 470k, R3 100k, SJ2 geschlossen
Messung Batteriespannung Messung unter Last (Schutz vor "Babbling Idiot") R2 30, R3 10, T1, R4 bestücken, SJ2 offen, R2/R3 an gewünschten Laststrom anpassen
Version i2.20

  • alle SMD Widerstände und Kondensatoren haben die Bauform 0805

  • Gehäusevariante 1 (Innen): PP042W-S / BOX-SENS-WHITE
    BOX-SENS-WHITE

  • Gehäusevariante 2 (Innen): 3D Druck, Design by Jan_von_neben_an (Schmelzerboy)
    Gehäuse HB-UNI-Sensor1

pic

Bauelement Wert Bauform Bemerkungen Beispiel Reichelt oder aliexpress
IC1 Atmega 328P TQFP ATMEGA 328P-AU
IC2 CC1101 SMD (aliexpress)
R1, R5, R6, R8, R9 10k 0805 R8 nur bei DS18B20 Einsatz RND 0805 1 10K
R7 1,5k 0805 RND 0805 1 1,5K
C1..C7 100nF 0805 C5..C7 je nach verbauten I2C-Sensoren X7R-G0805 100N
C8 1uF 0805 X7R-G0805 1,0/25
LED1 gelb 0805 KBT KP-2012SYC
CONFIG1 DTSM-3 3x6x2,5mm Tactile Push Button SMD aliexpress
R2..R4, T1 Optional: Echte Batteriespannungsmessung unter Last Advanced Feature
IC3 MCP111T-XXX SOT23 Optional: uC-Supervisor Advanced Feature
Q1 8 MHz SMD Optional: Quarz 8MHz statt int. RC-Osc. CSTCE 8,00
BAT1 Keystone 2462 Halter für 2xAA oder ähnliche -

Flashen

Version 2.01
1. Bootloader (nur bei Verwendung eines ATmega328P Chips)
  • Zunächst wird der Arduino Standard-Bootloader mittels eines ISP-Programmers geflasht.
    Beispiele für ISP-Programmer sind u.a. USBasp, Diamex, Atmel-ICE.
    Auch ein Arduino Uno kann zum ISP-Programmer umfunktioniert werden.
  • Die ISP Programmierung läuft über 6 Pins und so sieht die Anschlussbelegung zu JP2 auf der Platine aus:
ISP JP2 Pin
GND 2
RESET 3
+3,3V 4
SCK 9
MISO 10
MOSI 11
  • Es reicht die Pins auf JP2 aufzustecken und leicht zu verkanten, so wie im Foto zu sehen, der Bootloader muss nur einmal programmiert werden.
  • Für den Vorgang muss der Chip aufgelötet sein und mit Spannung versorgt werden. Falls ein externer Quarz eingesetzt werden soll muss auch dieser bestückt sein.
  • Wenn der ISP-Programmer einmal dran ist sollten auch gleich die Fuses geprüft und ggf. angepasst werden (Oszillator, BOD usw.).
  • Beispiele für Bootloader und Fuse-Einstellungen: Bootloader HB-UNI-Sensor1

pic

2. Applikation / Sketch
  • Wenn der Bootloader vorhanden ist kann ganz normal mittels eines FTDI-Adapters direkt aus der Arduino IDE seriell programmiert werden. Dazu werden 4 Pins an JP1 verwendet:
FTDI JP1 Pin
RXD 12
TXD 11
DTR 10
GND 9

pic

Version i2.20
1. Bootloader
  • Zunächst wird der Arduino Standard-Bootloader mittels eines ISP-Programmers geflasht.
    Beispiele für ISP-Programmer sind u.a. USBasp, Diamex, Atmel-ICE.
    Auch ein Arduino Uno kann zum ISP-Programmer umfunktioniert werden.
  • Die ISP Programmierung läuft über 6 Pins vom Steckverbinder K2.
  • Achtung, K2 muss von hinten kontaktiert werden! Pin1 ist gekennzeichnet.
  • Es reicht die Pins des Programmers auf K2 aufzustecken und ggf. leicht zu verkanten, die Lötpunkte sind aber schon versetzt angeordnet so dass die Pins automatisch halten sollten. Der Bootloader muss nur einmal programmiert werden.
  • Für den Vorgang muss der Chip aufgelötet sein und mit Spannung versorgt werden. Falls ein externer Quarz eingesetzt werden soll muss auch dieser bestückt sein.
  • Wenn der ISP-Programmer einmal dran ist sollten auch gleich die Fuses geprüft und ggf. angepasst werden (Oszillator, BOD usw.).
  • Beispiele für Bootloader und Fuse-Einstellungen: Bootloader HB-UNI-Sensor1
2. Applikation / Sketch
  • Wenn der Bootloader vorhanden ist kann ganz normal mittels eines FTDI-Adapters direkt aus der Arduino IDE seriell programmiert werden.
  • Dazu wird K1 verwendet, dabei auf die richtige Reihenfolge der Pins zwischen Platine und FTDI-Adapter achten.
  • Auch bei K1 sind die Lötpunkte versetzt angeordnet so dass die Pins automatisch halten sollten.

Changelog

Version 2.01 (gegenüber Dirk/PeMue 1.60)

  • HB-UNI-Sensor1 für Außen- oder Innenanwendungen, 10/2018
  • MAX44009 hinzugefügt
  • BMP180 entfernt (Ersatz durch BME280)
  • TSL2561 entfernt (Ersatz durch MAX44009) warum? Vergleich TSL2561 MAX44009
  • Zweite I2C Stiftleiste für zusätzliche Sensoren auf Breakout-Boards
  • Schaltung für echte Batteriespannungsmessung unter Last hinzugefügt
  • 10k pull-up Widerstand am ChipSelect des CC1101 für sicheres ISP-Flashen (Bootloader) mit verbautem CC1101
  • Option: Miniatur-Quarz 8MHz bestückbar (anstatt int. RC-Osc.)
  • alle Abstände der Leiterbahnen gegeneinander auf min. 0,25mm vergrößert
  • Layout entflochten und verbessert
  • Lötpads für BME280 und MAX44009 nach außen verlängert falls man versuchen will diese ohne Reflow oder Heisßluft zu löten
Version i2.20 (gegenüber V2.01)

  • HB-UNI-Sensor1 für für Außen- oder Innenanwendungen, 07/2019
  • Weiterentwicklung vom PLHT Sensor Version 2.01 mit anderen Gehäusevarianten
  • Bestückung mit ATmega328P, RC-Oszillator als Standard
  • Sensoren für Temperatur (DS18B20, BME280), Luftdruck (BME280, BMP180), Luftfeuchte (BME280, SHT10, SHT21, SHT31), Helligkeit (MAX44009, TSL2561, BH1750), UV-Index (VEML6070, VEML6075) uvm. bestückbar
  • 5x I2C Stiftleisten vorhanden, damit können bis zu 5 I2C Sensoren auf Breakout-Boards parallel bestückt werden
  • 1-Wire Temperatursensor DS18B20 bestückbar
  • Spannungsversorgung: Batterien/Akku 2 AA-Zellen
  • Die nicht benutzten Arduino Pins 3, 6, 7, A0 sind auf einem extra Steckverbinder für Erweiterungen herausgeführt (K3)
  • Option: Echte Batteriespannungsmessung unter Last (Schutz vor "Babbling Idiot")
  • Option: uC-Supervisor MCP111 bestückbar (Schutz vor "Babbling Idiot")
  • Option: Miniatur-Quarz 8MHz bestückbar (anstatt int. RC-Osc.)

Verbesserungen für's nächste Redesign

Version 2.01

  • das linke Bohrloch D2,5mm besser zu den vorhandenen Löchern im Batteriehalter ausrichten, zweites Bohrloch rechts vorsehen (TomMajor)
  • Arduino Pro Mini Leiste JP2/U-Bat: Jumper vorsehen um beim Pro Mini den Eingang des LDO abzuklemmen, der LDO wird bei Batteriebetrieb nicht benötigt. Am Besten ist es sowieso den LDO zu entfernen um Ruhestrom zu sparen. (TomMajor)
  • MAX44001 und BME280 Pin 1 Markierungen nachtragen (PeMue)
  • SHT10 optional (kpwg)
  • die Breakout-Boards Pinreihen beide am Rand platzieren und mit Abstand zueinander - aktuell musste ich am MAX44009 feilen, damit es passte (kpwg)
  • alle wichtigen Beschriftungen des Bestückungsdruckes größer machen - die Chinesen haben offenbar Probleme mit so kleinen Zeichen (kpwg)
  • die LED Pads als 1206 vorsehen - 0805 lässt sich auf 1206 gut auflöten, aber 1206 auf 0805 ist schon grenzwertig (kpwg)
  • ich verfolge etwas die Diskussion über GND bei der Antennen des CC1101. Um da flexibler zu sein (also eventuell die Durchkontaktierung aufbohren zum Trennen) ist es eventuell besser, sich das GND für den T1 aus einer getrennten Durchkontaktierung und nicht aus dem linken GND des CC1101 zu holen. (harvey)
  • ISP-Header zum bequemen initialen Prog. des Bootloaders - noch unklar ob im Layout machbar (TomMajor, kpwg)
  • Den CC1101 1,5mm vom Rand weg versetzen damit der Klarsichtdeckel des GAINTA G201 Gehäuses besser passt (TomMajor)
  • Die Platine links und rechts je 1,5mm kürzer machen damit der Klarsichtdeckel des GAINTA G201 Gehäuses besser passt (TomMajor)
  • Option für Arduino Pro Mini Modul loswerden, nur noch ATmega328P chip, damit dann besseres Layout für 3x Sensor Breakout-Boards möglich (TomMajor)
  • das Lötpad GDO2 am CC1101 kann im Platinenlayout entfernt werden da nicht benötigt (TomMajor)
Version i2.20

  • die Befestigungslöcher der Platine für das BOX-SENS-WHITE Gehäuse müssen ca. 1mm weiter auseinander (TomMajor)
  • das Lötpad GDO2 am CC1101 kann im Platinenlayout entfernt werden da nicht benötigt (TomMajor)
  • den optionalen Miniatur-Quarz um 90° drehen damit ein 32kHz Quarz optional liegend bestückt werden kann + ggf. 2 weitere SMD Kond. für diesen 32kHz Quarz (harvey)
  • ggf. Lötpads für einen 2. DS18B20 vorsehen um einen Differenztemperatursensor zu realisieren (der 2. DS18B20 geht dann nach Extern) (harvey)

Bestellung der Platine

Wer den Sensor nachbauen möchte, aber noch nie eine Platine bestellt hat:

  • Es gibt unzählige Hersteller für Leiterplatten. Früher habe ich oft in Deutschland bestellt, bei Firmen wie Beta Layout und ähnlichen. Seit ein paar Jahren ist die Direktbestellung in China ziemlich unkompliziert und preislich sehr attraktiv geworden, deswegen bestelle ich mittlerweile meistens dort.
    Gute Erfahrungen habe ich z.B. mit JLCPCB gemacht, die Platinen kosten meisten nur ein paar Euro und sind innerhalb von 2-3 Wochen da.
  • Die Gerberdateien können direkt beim Anbieter hoch geladen werden und man sieht eine Vorschau wie die Platine aussehen wird.
  • Im folgenden Bild sind die Bestellparameter für die PLHT Sensor Platine zu sehen:

pic

RaspberryMatic/CCU Installation

Einstellungen/Systemsteuerung/Zusatzsoftware -> Datei hb-tm-devices-addon.tgz installieren.

pic

RaspberryMatic WebUI

Der angemeldete Sensor auf der RaspberryMatic:

pic

pic

pic

FHEM Installation

Die Datei FHEM/HMConfig_UniSensor1.pm nach /opt/fhem/FHEM kopieren, dann FHEM neustarten.

pic

pic

Parameter Höhe einstellen:
"Ich konnte bei meinem THPL Sensor mit BME280 und MAX44009 über getConfig // Config-Button drücken // set regSet altitudeUS1 590 // Config-Button drücken // getConfig // Config-Button drücken die Höhe einstellen. Bitte berichtigt mich, wenn ich da zu viel drücke und mache- so hat es jedenfalls funktioniert ::)"
FHEM user kpwg

Offseteinstellungen für Temperatur, Luftdruck und Luftfeuchte über WebUI

  • Ab HB-UNI-Sensor1 Version V1.40 und HB-TM-Devices-AddOn V2.60 können die Offsetwerte für Temperatur, Luftdruck und Luftfeuchte über das WebUI eingestellt werden.

  • Achtung, für negative Werte mit Kommastelle gibt es in einigen RaspberryMatic Versionen (z.B. 3.57.4.20210320) einen Bug - ProofAndSetValue #1058, durch den man nur ganzzahlige negative Werte einstellen kann.
    Bei der RaspberryMatic Version 3.53.34.20201121 ist der Bug noch nicht vorhanden.

  • Einen Workaround für diesen Bug wird von Baxxy hier beschrieben.

  • Die relative Luftfeuchte wird immer ohne Kommastelle an die Zentrale gesendet. Zum einen reicht das oft aus da viele Sensoren sowieso mit Abweichungen von mehreren Prozent spezifiziert sind, zum anderen kann man dadurch den HM internen Datentyp HUMIDITY nutzen und damit die Feuchte auch in einem Diagramm darstellen was mit eigenen Datentypen meines Wissens nach nicht möglich ist.
    HB-UNI-Sensor1 intern wird jedoch auch bei der Luftfeuchte mit Kommastelle gerechnet, so dass eine eventuelle Offseteinstellung mit Kommastelle auch bei der Luftfeuchte voll zum Tragen kommt falls man die Möglichkeit hat, diesen Messwert genau zu kalibrieren.

pic

Serieller Log beim Start des Sensors

  • define NDEBUG ist deaktiviert:
    //#define NDEBUG

pic

Benutzerspezifische Sensordaten

Ab HB-TM-Devices-AddOn Version 2.51 habe ich die Möglichkeiten für benutzerspezifischen Daten bzw. ein benutzerspezifisches Datenlayout erweitert.
Neu ab dieser Version sind 5 weitere Sensoren-Templates HB-UNI-Sensor2..6 die man nach eigen Wünschen gestalten kann.
Diese haben neue Device Model IDs bekommen (F112..F116), eigene install/uninstall-Skripte sowie eigene Firmware-xml.

Ein Benutzer, der das Datenlayout eines Sensors ändern möchte, kann dies mit folgenden Schritten erreichen:
  • hb-uni-sensorX.xml auf das gewünschte Datenlayout anpassen, siehe Beispiele hb-uni-sensor2.xml / hb-uni-sensor3.xml
  • dazu passend die Senderoutine im Sketch HB-UNI-SensorX.ino ändern so dass die Payload zum xml passt, im init() der WeatherEventMsg:
    class WeatherEventMsg : public Message {
    public:
    void init() {..
  • weiterhin im Sketch HB-UNI-SensorX.ino sicherstellen das die richtige Device Model ID (F112..F116), passend zum xml, verwendet wird
  • das neue hb-uni-sensorX.xml unter
    /usr/local/addons/hb-tm-devices-addon/customized_firmware
    ablegen
  • Neustarten der Zentrale
  • Anlernen des neuen Sensors
Das AddOn Skript sorgt dafür, dass die alternativen Firmware xml-Dateien bei Aktionen wie:
  • AddOn Update-Installation,
  • Einspielen eines RM/CCU Backups,
  • Update der RM/CCU Firmware wieder in das richtige Verzeichnis kopiert und in der Zentrale berücksichtigt werden.
Ich habe dazu ein paar kurze Beispiele gemacht:
hb-uni-sensor2.xml

Hier ist der Datenpunkt Digitaler Eingang ('Ventilposition' im WebUI) eingefügt, dafür sind die beiden Datenpunkte Absolute Luftfeuchte und Taupunkt weggelassen.
Dazu habe ich einen passendes HB-UNI-Sensor2 Sketch gemacht.

pic

Dieser sketch liegt mit im /Arduino Verzeichnis. Er muss in .ino umbenannt werden und für die Arduino-IDE muss das Verzeichnis dann HB-UNI-Sensor2 heißen (Bei der Arduino-IDE müssen Sketch-Name und Verzeichnisname gleich sein).
Und es darf beim Kompilieren nur ein .ino pro Verzeichnis vorhanden sein!

hb-uni-sensor3.xml

Hier ist der Datenpunkt Digitaler Eingang ('Ventilposition' im WebUI) geändert in 'Wassertemperatur' um eine Frage aus dem Forum aufzugreifen.
Dazu habe ich einen passendes HB-UNI-Sensor3 Sketch gemacht, in dem nur als Beispiel diese Wassertemperatur mit dem Wert 22,4 °C gesendet wird.

pic

Dieser sketch liegt mit im /Arduino Verzeichnis. Er muss in .ino umbenannt werden und für die Arduino-IDE muss das Verzeichnis dann HB-UNI-Sensor3 heißen (Bei der Arduino-IDE müssen Sketch-Name und Verzeichnisname gleich sein).
Und es darf beim Kompilieren nur ein .ino pro Verzeichnis vorhanden sein!

hb-uni-sensor4.xml

Ist identisch zu hb-uni-sensor2.xml, nur als Dummy vorgehalten.

hb-uni-sensor5.xml

Ein neuer Datenpunkt für den UV-Sensor VEML6070 wurde ergänzt, der per define im Sketch unterstützt wird.
Der Datenpunkt 'Ventilposition' (Digitaler Eingang) wurde entfernt.

hb-uni-sensor6.xml

Ein neuer Datenpunkt für den UV-Sensor VEML6075 wurde ergänzt, der per define im Sketch unterstützt wird.
Der Datenpunkt 'Ventilposition' (Digitaler Eingang) wurde entfernt.

Außerdem noch der Hinweis das bei Änderungen am xml immer eventuell vorhandene dazugehörigen Geräte mit dieser Device Model ID in der Zentrale abgelernt/gelöscht und nach der xml Änderung wieder neu angelernt werden müssen.
Die verwendeten Device Model IDs:
Sensor Device Model
HB-UNI-Sensor1 0xF103
HB-UNI-Sensor2 0xF112
HB-UNI-Sensor3 0xF113
HB-UNI-Sensor4 0xF114
HB-UNI-Sensor5 0xF115
HB-UNI-Sensor6 0xF116

Trägheit verschiedener Temperatursensoren

Der Temperaturwert des BME280 reagiert träger als andere Temperatursensoren, dies liegt m.E. an der engen thermischen Kopplung zwischen aufgelötetem Chip und Platine und der daraus resultierenden thermischen Trägheit des Systems.
Temperatursensoren die nur über ihre Anschlüsse in der Luft hängen reagieren schneller.

Ich empfehle daher für die Temperaturmessung einen zusätzlichen DS18B20 zu verbauen und die Temperatur des BME280 zu ignorieren. Im Sketch ist das entsprechend berücksichtigt.

Vergleich der BME280 / DS18B20 / SHT10 Temperaturwerte bei einem 6K Sprung
Quelle: FHEM user Gernott
'Links war der BME280-breakout horizontal positioniert, recht vertikal über eine Kante stehend. Dort wir der Sensor offenbar besser angeströmt und reagiert dann deutlich schneller. Der SHT hing ohne breakout dünn verdrahtet im Raum und reagiert ziemlich schnell.'

pic

Anschlussbelegung DS18B20

pic

Optionaler Reset-Baustein MCP111

  • In einigen meiner Schaltungen ist der optionale Reset-Baustein MCP111 zu sehen. Dieser hat den Vorteil eines sehr geringen Ruhestromes von < 1µA gegenüber dem integrierten Brown-out Detector (BOD) im AVR, dieser benötigt ca. 18µA (@3V).
  • Dabei verwende ich typischerweise den MCP111-240, der bei nominal 2,32V den Reset für den AVR aktiviert. Kombiniert mit der Batteriespannungsmessung unter Last (Babbling Idiot Protection, siehe oben) ist das ein gutes Schutzkonzept gegen Dauersender durch leere Batterien oder Akkus. Ein Dauersender kann sehr schnell das gesamte Funknetz im Haus lahmlegen.
  • Die Reset-Spannung von 2,32V ergibt pro Zelle eine Entladeschlußspannung von 1,16V (bei 2 Zellen). Aus meiner Sicht ist diese Entladeschlußspannung gleichermaßen für AA Alkaline-Zellen oder NiMH Akkus geeignet, auch wenn man im Alkaline Fall etwas Energie verschenkt.
  • Als Low-Batt Schwelle für das Gerät könnte man dann z.B. 2,4V wählen.

pic

Bewegungsmelder mit PIR AS312 am digitalen Eingang

  • Der Inverter mit Transistor sorgt für minimalen Ruhestrom (keine Bewegung, PIR Ausgang Low, Transistor gesperrt) und trägt außerdem durch die Entkopplung zum sicheren Betrieb bei (keine unerwünschte Auslösung des PIR während des 868MHz Sendevorgangs an die Zentrale).
  • Die Bilder demonstrieren die Ideen und den konstruktiven Aufbau von FHEM user fhemfreund, getrimmt auf minimale Gerätegröße. Danke für den Ideenaustausch und das zur Verfügung gestellte Gerät. 😄
  • Mit der RTC Option beträgt der Ruhestrom inklusive PIR nur ca. 14uA und es besteht somit die Hoffnung dass die eingesetzte Batterie CR2450 möglichst lange hält.

pic

pic

pic

pic

pic

Was sonst noch passierte (Batteriewechsel)

  • Batteriewechsel beim HB-UNI-Sensor1 Außen nach ca. 2 Jahren..

pic

⚠️ Warnung vor dem Flashen von 3,3V Geräten mit USBasp Klones

➡️ Warnung

Links

HomeMatic Forum: Hardwareentwicklung und Selbstbau von Aktoren und Sensoren

HomeMatic Forum: HB-UNI-Sensor1 - Neuauflage

HomeMatic Forum: Nachbau HB-UNI-Sensor1

FHEM Forum: Selbstbau HM_WDS10_TH_O mit Luftdruckmessung

FHEM Forum: AskSin++ Library

Benötige Libraries

AskSinPP Library
EnableInterrupt
Low-Power

Für einen DS18B20 Sensor (Temperatur):
OneWire

Für einen BME280 Sensor (Temperatur/Druck/Feuchte):
BME280

Für einen BMP180 Sensor (Temperatur/Druck):
BMP180

Für einen MAX44009 Sensor (Helligkeit in Lux):
keine zusätzliche Library nötig.

Für einen TSL2561 Sensor (Helligkeit in Lux):
TSL2561

Für einen BH1750 Sensor (Helligkeit in Lux):
BH1750

Für einen SHT31 Sensor (Temperatur/Feuchte):
SHT31

Für einen SHT21/Si7021 Sensor (Temperatur/Feuchte):
SHT21

Für einen SHT10 Sensor (Temperatur/Feuchte):
SHT10

Für einen VEML6070 Sensor (UV-Index):
keine zusätzliche Library nötig.

Für einen VEML6075 Sensor (UV-Index):
VEML6075

Lizenz

Creative Commons BY-NC-SA
Give Credit, NonCommercial, ShareAlike

Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.