Adapter for TP-Link Tapo
based on https://github.com/apatsufas/homebridge-tapo-p100
Die Tapo Mail und Passwort eingeben. Es werden die Geräte via Cloud abgerufen, aber lokal gesteuert. Wenn die IP nicht gefunden wird muss sie manuell unter tapo.0.id.ip gesetzt werden.
Alle Geraete werden regelmaessig gepollt. Die Werte werden automatisch unter tapo.0.id.* angelegt.
Beispiel: tapo.0.80A5897B21C7.nickname, tapo.0.80A5897B21C7.device_on
| Wert | Typ | Beschreibung |
|---|---|---|
| nickname | string | Geraetename |
| device_id | string | Geraete-ID |
| model | string | Modellbezeichnung |
| fw_ver | string | Firmware-Version |
| hw_ver | string | Hardware-Version |
| mac | string | MAC-Adresse |
| device_on | boolean | Geraet ein/aus |
| on_time | number | Einschaltdauer in Sekunden |
| rssi | number | WLAN-Signalstaerke |
| signal_level | number | Signalstaerke (1-3) |
| ssid | string | WLAN-Name |
| ip | string | IP-Adresse |
| overheated | boolean | Ueberhitzungsstatus |
Beispiel: tapo.0.80A5897B21C7.brightness, tapo.0.80A5897B21C7.hue
| Wert | Typ | Beschreibung |
|---|---|---|
| brightness | number | Helligkeit (0-100) |
| color_temp | number | Farbtemperatur in Kelvin |
| hue | number | Farbton (0-360, nur L530/L630) |
| saturation | number | Saettigung (0-100, nur L530/L630) |
Beispiel: tapo.0.80A5897B21C7.current_power, tapo.0.80A5897B21C7.voltage_mv
| Wert | Typ | Beschreibung |
|---|---|---|
| current_power | number | Aktuelle Leistung (mW) |
| today_energy | number | Energieverbrauch heute (Wh) |
| month_energy | number | Energieverbrauch Monat (Wh) |
| voltage_mv | number | Spannung (mV) |
| current_ma | number | Strom (mA) |
| power_mw | number | Leistung (mW) |
| current (consumption) | number | Aktuelle Leistung (W, berechnet) |
| total (consumption) | number | Energie heute (kWh, berechnet) |
Beispiel: tapo.0.80A5897B21C7.child_SENSOR_ID.current_temp
| Sensor | Werte | Beschreibung |
|---|---|---|
| T100 (Bewegung) | detected | Bewegung erkannt |
| T110 (Kontakt) | open | Tuer/Fenster offen |
| T300 (Wasserleck) | water_leak_status, in_alarm | Wasserleck-Status |
| T310/T315 (Temp/Feuchte) | current_temp, current_humidity, temp_unit | Temperatur und Luftfeuchtigkeit |
| KE100 (Thermostat) | target_temp, current_temp, frost_protection_on, trv_states | Thermostat-Status |
Alle Sensoren liefern zusaetzlich battery_percentage, at_low_battery und signal_level.
Beispiel: tapo.0.80A5897B21C7.alarm, tapo.0.80A5897B21C7.personDetection
| Wert | Typ | Beschreibung |
|---|---|---|
| alarm | boolean | Alarm aktiv |
| eyes | boolean | Privacy-Modus (invertiert: true = Kamera sieht) |
| notifications | boolean | Push-Benachrichtigungen aktiv |
| motionDetection | boolean | Bewegungserkennung aktiv |
| led | boolean | LED aktiv |
| autoTrack | boolean | Auto-Tracking aktiv |
| personDetection | boolean | Personenerkennung aktiv |
| vehicleDetection | boolean | Fahrzeugerkennung aktiv |
| petDetection | boolean | Tiererkennung aktiv |
| babyCryDetection | boolean | Baby-Schrei-Erkennung aktiv |
| barkDetection | boolean | Bellen-Erkennung aktiv |
| meowDetection | boolean | Miauen-Erkennung aktiv |
| glassBreakDetection | boolean | Glasbruch-Erkennung aktiv |
| tamperDetection | boolean | Manipulations-Erkennung aktiv |
| imageFlip | boolean | Bild vertikal gespiegelt |
| ldc | boolean | Linsenverzerrungskorrektur aktiv |
| recordAudio | boolean | Audio-Aufnahme aktiv |
| autoUpgrade | boolean | Firmware Auto-Update aktiv |
Nicht jedes Geraet liefert alle Werte. Felder die das Geraet nicht unterstuetzt werden nicht angelegt.
Beispiel: tapo.0.80A5897B21C7.detection.active, tapo.0.80A5897B21C7.detection.events.0.alarm_type
Die Kamera wird lokal gepollt und liefert Erkennungs-Events (Bewegung, Personen, etc.). Die letzten 10 Events werden abgerufen (searchDetectionList), neuestes Event zuerst.
| Wert | Typ | Beschreibung |
|---|---|---|
| detection.active | boolean | true wenn Erkennung in den letzten 30 Sekunden |
| detection.eventCount | number | Anzahl Ereignisse in den letzten 10 Minuten |
| detection.events.0.start_time | number | Unix-Timestamp Start des neuesten Events |
| detection.events.0.end_time | number | Unix-Timestamp Ende des neuesten Events |
| detection.events.0.alarm_type | number | Erkennungstyp (siehe Tabelle unten) |
| detection.events.1.start_time | number | Zweitneuestes Event (usw. bis 9) |
| motionEvent | boolean | ONVIF Echtzeit-Bewegungserkennung |
| ID | Beschreibung |
|---|---|
| 2 | Bewegung (motion) |
| 3 | Manipulation (tamper) |
| 4 | Linienueberquerung (line crossing) |
| 5 | Bereichsintrusion (area intrusion) |
| 6 | Person (human) |
| 7 | Baby-Schrei (baby cry) |
| 8 | Fahrzeug (vehicle) |
| 9 | Tier (pet) |
| 11 | Bellen (bark) |
| 12 | Miauen (meow) |
| 13 | Glasbruch (glass break) |
| 14 | Rauch (smoke) |
| 15 | Paket abgelegt (package delivery) |
| 16 | Paket abgeholt (package pick-up) |
| 20 | Gesichtserkennung (face detection) |
| 32 | Herumlungern (loitering) |
Nicht jede Kamera liefert alle Typen. Die verfuegbaren Werte haengen von Modell und Firmware ab.
Beispiel: tapo.0.80A5897B21C7.alarmInfo.enabled, tapo.0.80A5897B21C7.alarmInfo.alarm_volume
| Wert | Typ | Beschreibung |
|---|---|---|
| alarmInfo.enabled | string | Alarm aktiv (on/off) |
| alarmInfo.alarm_mode | mixed | Alarm-Modus (z.B. sound, light) |
| alarmInfo.alarm_volume | string | Lautstaerke |
| alarmInfo.alarm_duration | string | Dauer in Sekunden |
| alarmInfo.alarm_type | string | Sirenen-Typ |
| alarmInfo.light_type | string | Licht-Typ |
| alarmInfo.light_alarm_enabled | string | Licht-Alarm aktiv (on/off) |
| alarmInfo.sound_alarm_enabled | string | Sound-Alarm aktiv (on/off) |
Beispiel: tapo.0.80A5897B21C7.alertEventTypes.motion, tapo.0.80A5897B21C7.alertEventTypes.person
| Wert | Typ | Beschreibung |
|---|---|---|
| alertEventTypes.motion | boolean | Alarm bei Bewegung |
| alertEventTypes.person | boolean | Alarm bei Person |
| alertEventTypes.vehicle | boolean | Alarm bei Fahrzeug |
| alertEventTypes.pet | boolean | Alarm bei Tier |
Fuer Benachrichtigungen bei Erkennung ein ioBroker-Skript auf detection.events.0.start_time triggern:
const alarmTypen = { 2:'Bewegung', 3:'Manipulation', 4:'Linienueberquerung', 5:'Bereichsintrusion',
6:'Person', 7:'Baby-Schrei', 8:'Fahrzeug', 9:'Tier', 11:'Bellen', 12:'Miauen',
13:'Glasbruch', 14:'Rauch', 15:'Paket abgelegt', 16:'Paket abgeholt', 20:'Gesicht', 32:'Herumlungern' };
on({ id: 'tapo.0.DEVICE_ID.detection.events.0.start_time', change: 'ne' }, (obj) => {
const typ = getState('tapo.0.DEVICE_ID.detection.events.0.alarm_type').val;
sendTo('telegram.0', {
text: (alarmTypen[typ] || 'Typ ' + typ) + ' um ' + new Date(obj.state.val * 1000).toLocaleString()
});
});Blockly-Beispiel (als XML importierbar):
<xml xmlns="https://developers.google.com/blockly/xml">
<block type="on_ext" x="38" y="13">
<mutation xmlns="http://www.w3.org/1999/xhtml" items="1"></mutation>
<field name="CONDITION">ne</field>
<field name="ACK_CONDITION"></field>
<value name="OID0">
<shadow type="field_oid">
<field name="oid">tapo.0.DEVICE_ID.detection.events.0.start_time</field>
</shadow>
</value>
<statement name="STATEMENT">
<block type="telegram">
<field name="INSTANCE">.0</field>
<field name="LOG"></field>
<value name="MESSAGE">
<block type="text_join">
<mutation items="3"></mutation>
<value name="ADD0">
<block type="text">
<field name="TEXT">Tapo Erkennung: Typ </field>
</block>
</value>
<value name="ADD1">
<block type="get_value">
<field name="ATTR">val</field>
<field name="OID">tapo.0.DEVICE_ID.detection.events.0.alarm_type</field>
</block>
</value>
<value name="ADD2">
<block type="text">
<field name="TEXT"> erkannt</field>
</block>
</value>
</block>
</value>
</block>
</statement>
</block>
</xml>Das Polling-Intervall ist in den Adaptereinstellungen konfigurierbar (Standard: 10 Sekunden). Alles lokal, kein Cloud-Zugriff noetig.
tapo.0.id.remote auf true/false setzen steuert den jeweiligen Befehl. Der Befehl wird lokal an das Gerät gesendet.
| Remote | Typ | Beschreibung |
|---|---|---|
| refresh | boolean | Manueller Status-Refresh |
| setPowerState | boolean | Ein/Aus |
| setPowerStateChild | string | Child-Device steuern: childId,true oder childId,false |
| setLedEnabled | boolean | LED Indikator ein/aus |
| setAutoOff | boolean | Auto-Off Timer ein/aus |
| setAutoOffDelay | number | Auto-Off Verzoegerung in Minuten |
| setChildProtection | boolean | Tastensperre (Button Lock) ein/aus |
| setPowerProtection | boolean | Ueberlastschutz ein/aus |
| setPowerProtectionThreshold | number | Ueberlast-Schwellwert in Watt |
| setAutoUpdate | boolean | Firmware Auto-Update ein/aus |
P110/P115 liefern zusaetzlich Energiedaten (Leistung, Spannung, Strom).
Alle Plug-Remotes plus:
| Remote | Typ | Beschreibung |
|---|---|---|
| setBrightness | number | Helligkeit setzen |
| setColorTemp | number | Farbtemperatur (2500-6500K) |
| setColor | string | Farbe setzen: hue, saturation |
| setLightEffect | string | Lichteffekt ID oder off |
| setGradualOnOff | boolean | Sanftes Ein-/Ausschalten |
| Remote | Typ | Beschreibung |
|---|---|---|
| setFanSpeedLevel | number | Geschwindigkeit 0-4 (0 = aus) |
| setFanSleepMode | boolean | Schlafmodus ein/aus |
| Remote | Typ | Beschreibung |
|---|---|---|
| playAlarm | boolean | Alarm abspielen |
| stopAlarm | boolean | Alarm stoppen |
| setAlarmVolume | string | Alarm Lautstaerke: mute/low/normal/high |
| setAlarmDuration | number | Alarm Dauer in Sekunden |
| Remote | Typ | Beschreibung |
|---|---|---|
| setTargetTemperature | number | Zieltemperatur setzen |
| setTemperatureOffset | number | Temperatur-Offset (-10 bis 10) |
| setFrostProtection | boolean | Frostschutz ein/aus |
Sensordaten (Temperatur, Luftfeuchtigkeit, Bewegung, Kontakt, Wasserleck) werden automatisch via getChildDeviceList abgerufen und als Status angezeigt.
| Remote | Typ | Beschreibung |
|---|---|---|
| refresh | boolean | Manueller Status-Refresh |
| setAlertConfig | boolean | Alarm ein/aus |
| setLensMaskConfig | boolean | Privacy (Eyes) ein/aus |
| setForceWhitelampState | boolean | Weisslicht ein/aus |
| setLedStatus | boolean | LED ein/aus |
| setMsgPushConfig | boolean | Benachrichtigungen ein/aus |
| setDetectionConfig | boolean | Bewegungserkennung ein/aus |
| setAutoTrackTarget | boolean | Auto-Tracking ein/aus |
| setPersonDetection | boolean | Personenerkennung ein/aus |
| setVehicleDetection | boolean | Fahrzeugerkennung ein/aus |
| setPetDetection | boolean | Tiererkennung ein/aus |
| setBabyCryDetection | boolean | Baby-Schrei-Erkennung ein/aus |
| setBarkDetection | boolean | Bellen-Erkennung ein/aus |
| setMeowDetection | boolean | Miauen-Erkennung ein/aus |
| setGlassBreakDetection | boolean | Glasbruch-Erkennung ein/aus |
| setTamperDetection | boolean | Manipulations-Erkennung ein/aus |
| setImageFlipVertical | boolean | Bild vertikal spiegeln |
| setLensDistortionCorrection | boolean | Linsenverzerrungskorrektur ein/aus |
| setRecordAudio | boolean | Audio aufnehmen ein/aus |
| setAutoUpgrade | boolean | Firmware Auto-Update ein/aus |
| setHDR | boolean | HDR ein/aus |
| setCoverConfig | boolean | Privacy Zones ein/aus |
| setRecordPlan | boolean | SD-Karten Aufnahme ein/aus |
| moveMotor | string | Kamera bewegen: x, y (-360..360, -45..45) |
| moveMotorStep | string | Schrittwinkel (0-360) |
| moveToPreset | string | Zu Preset fahren (ID) |
| calibrateMotor | boolean | Motor kalibrieren |
| savePreset | string | Preset speichern (Name) |
| deletePreset | string | Preset loeschen (ID) |
| setCruise | string | Patrol: x/y/off |
| startManualAlarm | boolean | Manuellen Alarm starten |
| stopManualAlarm | boolean | Manuellen Alarm stoppen |
| setAlarmMode | string | Alarm-Modus: both/light/sound/off |
| setDayNightMode | string | Tag/Nacht-Modus: auto/on/off |
| setLightFrequencyMode | string | Lichtfrequenz: auto/50/60 |
| setSpeakerVolume | number | Lautsprecher-Lautstaerke (0-100) |
| setMicrophoneVolume | number | Mikrofon-Lautstaerke (0-100) |
| setMotionDetectionSensitivity | string | Bewegungs-Sensitivitaet: high/normal/low |
| setPersonDetectionSensitivity | string | Personen-Sensitivitaet: high/normal/low |
| setOsd | string | OSD Beschriftungstext |
| reboot | boolean | Kamera neustarten |
| formatSdCard | boolean | SD-Karte formatieren |
Nicht jede Kamera unterstuetzt alle Funktionen. Nicht unterstuetzte Befehle werden mit einer Fehlermeldung im Log quittiert.
https://forum.iobroker.net/topic/57336/test-adapter-tp-link-tapo/
- Support for TPAP/SPAKE2+ protocol (P100 FW 1.4.3+ and newer devices)
- Support for KLAP v1 (md5) handshake
- Fix camera connection for firmware 1.9.1+ (C310 etc.)
- 30+ new camera remotes (detection, motor, alarm, cruise, presets, image/audio, OSD)
- New data points for camera status and detection events
- New remotes for plugs, lamps, fans, hubs and thermostats
- Device-specific remotes (only relevant controls per device type)
- Energy data (voltage, current) for P110/P115
- Automatic reconnect for devices that go offline and come back
- Less log spam for unreachable devices
- disable sentry to prevent crashes
- disable battery devices
- improved wrong formatted mail adresses
- add checks for battery devices
- fix camera remotes
- improve handshake if e-mail is not entered in lowercase
- fix handshake for device with HW v1.20
- fixed Get Device Info failed error
- update Tapo local lib
- ignore ssl legacy error
update onvif lib to fix issues with newer cameras
- fix tapo Plugs and setLensMask
- (TA2k) initial release
MIT License
Copyright (c) 2024-2030 TA2k tombox2020@gmail.com
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.



