Zum Inhalt springen
Startseite » Nous E6

Nous E6

(Werbung) In diesem Beitrag zeige ich dir ein Unboxing des Nous Zigbee LCD Temperatur-/Luftfeuchtesensor E6, die Integration in Home Assistant über ZHA und „custom quirks“ und ein Vergleich mit anderen Temperatur-/Luftfeuchtesensoren.

Sie sehen gerade einen Platzhalterinhalt von YouTube. Um auf den eigentlichen Inhalt zuzugreifen, klicken Sie auf die Schaltfläche unten. Bitte beachten Sie, dass dabei Daten an Drittanbieter weitergegeben werden.

Mehr Informationen

Unboxing

Bei dem Temperatur-/Luftfeuchtigkeitssensor E6 von Nous handelt es sich um Sensoren, dessen Werte du in einem 2,8 Zoll großen Display angezeigt bekommst. Neben den Werten zur Temperatur und Luftfeuchtigkeit, werden dir die Uhrzeit, die Verbindung, der Batteriestand und die Qualität der Temperatur durch ein Smileysymbol angezeigt. Beim Verbindungssymbol wird dir angezeigt, ob das Gerät gerade eine Verbindung hat oder nicht. Das Gerät sendet mit Zigbee 3.0. Auf der Oberseite des Sensors befindet sich ein Knopf um das Gerät in den Paringmodus zu versetzen. Halte diesen Knopf für ca. 5 Sekunden gedrückt, dann siehst du auf dem Display, dass sich das Gerät im Pairingmodus befindet. Zum Lieferumpfang gehören noch 2 AA Batterien und ein Informationsblatt, wo du die Bedienungsanleitung für das Gerät findest. Diese ist auf folgender Seite herunterladbar (Bedienungsanleitung). Die Batteriekebensdauer wird mit ca. 12 Monaten angegeben.

Integration in Home Assistant

Du kannst den Sensor mittels ZHA in Home Assistant integrieren. Hierzu klickst du in Home Assistant auf Einstellungen -> Geräte & Dienste -> ZHA Geräte -> Geräte hinzufügen. Das Gerät versetzt du nun in den Pairingmodus, indem du ca. 5 Sekunden auf den Knopf auf der Oberseite des Sensors drückst. Anschließend wird das Gerät ZHA hinzugefügt. Die Sensorwerte sind nicht verfügbar. Diese musst du (Stand 4/2023) mit einer custom quirks in ZHA hinzufügen.

Custom quirks

Im File editor fügst du im Ordner config einen Unterordner zha_quirks hinzu. In diesen Ordner fügst du eine Datei mit dem Namen Nous_E6.py hinzu. In dieser Datei kopierst du folgenden Code. Dieser wurde freundlicherweise auf folgender Githubseite zur Verfügung gestellt (github).

"""Tuya temp and humidity sensor with screen."""

from typing import Dict

################## clean this up
import zigpy.types as t
from zigpy.zcl import foundation
from zhaquirks.tuya import TuyaTimePayload, TuyaCommand, TuyaDPType
import datetime
from typing import Tuple, Optional, Union
##################

from zigpy.profiles import zha
from zigpy.quirks import CustomDevice
from zigpy.zcl.clusters.general import Basic, Groups, Ota, Scenes, Time, AnalogOutput
from zigpy.zcl.clusters.measurement import RelativeHumidity, TemperatureMeasurement

from zhaquirks.const import (
    DEVICE_TYPE,
    ENDPOINTS,
    INPUT_CLUSTERS,
    MODELS_INFO,
    OUTPUT_CLUSTERS,
    PROFILE_ID,
    SKIP_CONFIGURATION,
)
from zhaquirks.tuya import TuyaLocalCluster, TuyaPowerConfigurationCluster2AAA
from zhaquirks.tuya.mcu import DPToAttributeMapping, TuyaMCUCluster

TUYA_SET_TIME = 0x24

# NOTES:
# The data comes in as a string on cluster, if there is nothing set up you may see these lines in the logs:
# Unknown message (b'19830100a40102000400000118') on cluster 61184: unknown endpoint or cluster id: 'No cluster ID 0xef00 on (a4:c1:38:d0:18:8b:64:aa, 1)'
#                                          28.0 degrees
# Unknown message (b'19840100a5020200040000022c') on cluster 61184: unknown endpoint or cluster id: 'No cluster ID 0xef00 on (a4:c1:38:d0:18:8b:64:aa, 1)'
#                                          55.6% humid
# Unknown message (b'19850100a60402000400000064') on cluster 61184: unknown endpoint or cluster id: 'No cluster ID 0xef00 on (a4:c1:38:d0:18:8b:64:aa, 1)'
#                                          100% battery

class TemperatureUnitConvert(t.enum8):
    """Tuya Temp unit convert enum."""

    Celsius = 0x00
    Fahrenheit = 0x01


class TuyaTemperatureMeasurement(TemperatureMeasurement, TuyaLocalCluster):
    """Tuya local TemperatureMeasurement cluster."""

    attributes = TemperatureMeasurement.attributes.copy()
    attributes.update(
        {
            0x8001: ("temp_unit_convert", t.enum8),
            0x8002: ("alarm_max_temperature", t.Single),
            0x8003: ("alarm_min_temperature", t.Single),
            0x8004: ("temperature_sensitivity", t.Single),
        }
    )


class TuyaRelativeHumidity(RelativeHumidity, TuyaLocalCluster):
    """Tuya local RelativeHumidity cluster."""


class TemperatureHumidityManufCluster(TuyaMCUCluster):
    """Tuya Manufacturer Cluster with Temperature and Humidity data points."""
    
    dp_to_attribute: Dict[int, DPToAttributeMapping] = {
        1: DPToAttributeMapping(
            TuyaTemperatureMeasurement.ep_attribute,
            "measured_value",
            converter=lambda x: x * 10,  # decidegree to centidegree
        ),
        2: DPToAttributeMapping(
            TuyaRelativeHumidity.ep_attribute,
            "measured_value",
            converter=lambda x: x * 100,  # 0.01 to 1.0
        ),
        4: DPToAttributeMapping(
            TuyaPowerConfigurationCluster2AAA.ep_attribute,
            "battery_percentage_remaining",
            converter=lambda x: x * 2,  # reported percentage is doubled
        ),
        9: DPToAttributeMapping(
            TuyaTemperatureMeasurement.ep_attribute,
            "temp_unit_convert",
            converter=lambda x: TemperatureUnitConvert(x)
        ),
        10: DPToAttributeMapping(
            TuyaTemperatureMeasurement.ep_attribute,
            "alarm_max_temperature",
            converter=lambda x: x / 10
        ),
        11: DPToAttributeMapping(
            TuyaTemperatureMeasurement.ep_attribute,
            "alarm_min_temperature",
            converter=lambda x: x / 10
        ),
        19: DPToAttributeMapping(
            TuyaTemperatureMeasurement.ep_attribute,
            "temperature_sensitivity",
            converter=lambda x: x / 10
        )
    }
    
    set_time_offset = 1970
    set_time_local_offset = 1970

    data_point_handlers = {
        1: "_dp_2_attr_update",
        2: "_dp_2_attr_update",
        4: "_dp_2_attr_update",
        9: "_dp_2_attr_update",
        10: "_dp_2_attr_update",
        11: "_dp_2_attr_update",
        19: "_dp_2_attr_update",
    }

    def handle_set_time_request(self, sequence_number: t.uint16_t) -> foundation.Status:
        payload = TuyaTimePayload()

        utc_now = datetime.datetime.utcnow()
        now = datetime.datetime.now()

        offset_time = datetime.datetime(self.set_time_offset, 1, 1)
        offset_time_local = datetime.datetime(self.set_time_local_offset, 1, 1)
        
        utc_timestamp = int((utc_now - offset_time).total_seconds())
        local_timestamp = int((now - offset_time).total_seconds())
        
        payload.extend(utc_timestamp.to_bytes(4, "big", signed=False))
        payload.extend(local_timestamp.to_bytes(4, "big", signed=False))

        self.create_catching_task(
            self.command(TUYA_SET_TIME, payload, manufacturer=foundation.ZCLHeader.NO_MANUFACTURER_ID, expect_reply=False)
        )

        return foundation.Status.SUCCESS

class TuyaNousE6TempHumiditySensor(CustomDevice):
    """Custom device representing tuya temp and humidity sensor with a screen (NOUS E6)."""

    signature = {
        # <SimpleDescriptor endpoint=1, profile=260, device_type=81
        # device_version=1
        # input_clusters=[4, 5, 61184, 0]
        # output_clusters=[25, 10]>
        MODELS_INFO: [("_TZE200_nnrfa68v", "TS0601")],
        ENDPOINTS: {
            1: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: zha.DeviceType.SMART_PLUG, # this is how the device reports itself
                INPUT_CLUSTERS: [
                    Basic.cluster_id,
                    Groups.cluster_id,
                    Scenes.cluster_id,
                    TemperatureHumidityManufCluster.cluster_id,
                ],
                OUTPUT_CLUSTERS: [Ota.cluster_id, Time.cluster_id],
            }
        },
    }

    replacement = {
        SKIP_CONFIGURATION: True,
        ENDPOINTS: {
            1: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: zha.DeviceType.TEMPERATURE_SENSOR,
                INPUT_CLUSTERS: [
                    Basic.cluster_id,
                    TemperatureHumidityManufCluster,  # Single bus for temp, humidity, and battery
                    TuyaTemperatureMeasurement,
                    TuyaRelativeHumidity,
                    TuyaPowerConfigurationCluster2AAA,
                ],
                OUTPUT_CLUSTERS: [Ota.cluster_id, Time.cluster_id],
            }
        },
    }

Soweit bisher noch nicht geschehen, muss die configuration.yaml nun angepasst werden.

configuration.yaml

zha: !include zha.yaml

Nun ist noch die Datei zha.yaml zu erstellen. Hier ist folgender Code einzutragen.

zha.yaml

  enable_quirks: true
  custom_quirks_path: /config/zha_quirks/

Nun ist über die Entwicklerwerkzeuge die Konfiguration zu prüfen. Anschließend ist Home Assistant neu zu starten. Nach dem Neustart wird noch einmal ein Pairing durchgeführt.

Vergleich mit anderen Geräten

In meinem Versuchsaufbau habe ich mehrere Temperatur-/Luftfeuchtigkeitsmesser nebeneinander gestellt und geschaut, in wieweit die Werte voneinander abweichen. Der Vergleich wird mit folgenden Geräten durchgeführt.

Beim Vergleich viel auf, dass die Temperatur-/Luftfeuchtigkeitswerte des Ecowitt und Nous fast identisch waren. Bei den beiden Werten werden beim Ikea Vindstyrka höhere Werte wiedergegeben. Die Temperaturwerte sind beim analogen Messgerät vergleichbar mit dem Ecowitt und dem Nous.

Fazit

Der Nous Temperatur-/Feuchtigkeitssensor E6 funktioniert bei mir ohne Probleme. Die gemessenen Werte sind mit dem Temperatur-/Luftfeuchtigkeitsmesser von Ecowitt vergleichbar. Lediglich beim Ablesen wäre es wünschenswert, wenn das Display durch Tastendruck beleuchtet werden könnte. Die Beleuchtung des IKEA Vindstyrka gefällt mir sehr gut.

Transparenzhinweis

Die Firma Nous Technology hat mir den Sensor zur Verfügung gestellt. In meiner Berichterstattung bin ich jedoch vollkommen frei.

Änderungsprotokoll

04/2023: Veröffentlichung des Beitrages

Wie hilfreich war dieser Beitrag?

Klicke auf die Sterne um zu bewerten!

Durchschnittliche Bewertung 4.8 / 5. Anzahl Bewertungen: 4

Bisher keine Bewertungen! Sei der Erste, der diesen Beitrag bewertet.

Es tut uns leid, dass der Beitrag für dich nicht hilfreich war!

Lasse uns diesen Beitrag verbessern!

Wie können wir diesen Beitrag verbessern?

*Die mit Sternchen markierten Links sind sogenannte „Affiliate-Links“. Als Amazon-Partner verdiene ich an qualifizierten Verkäufen. Wird über diese ein Einkauf getätigt, werde ich mit einer kleinen Provision beteiligt – ohne das Kosten für dich entstehen. Vielen Dank für deinen Support!

Die Anzeige der Produkte wurde mit dem affiliate-toolkit Plugin umgesetzt.

Ein Gedanke zu „Nous E6“

  1. Hallo,
    das set up hat gut funktioniert. Leider ist die refresh Rate für die Temperatur bei ca. 60 Minuten. Gibt es eine Möglichkeit diese zu ändern, bzw. bei Änderungen von +/- 0,2 Grad zu aktualisieren?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

The maximum upload file size: 5 MB. You can upload: image. Links to YouTube, Facebook, Twitter and other services inserted in the comment text will be automatically embedded. Drop file here