TP-Link Tapo

Adapter for TP-Link Tapo

Current Release
0.6.12
Developer
TA2k
License
MIT

tapo adapter for ioBroker

Adapter for TP-Link Tapo

based on https://github.com/apatsufas/homebridge-tapo-p100

Loginablauf

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.

Status-Werte (eingehend)

Alle Geraete werden regelmaessig gepollt. Die Werte werden automatisch unter tapo.0.id.* angelegt.

Alle Geraete

Beispiel: tapo.0.80A5897B21C7.nickname, tapo.0.80A5897B21C7.device_on

WertTypBeschreibung
nicknamestringGeraetename
device_idstringGeraete-ID
modelstringModellbezeichnung
fw_verstringFirmware-Version
hw_verstringHardware-Version
macstringMAC-Adresse
device_onbooleanGeraet ein/aus
on_timenumberEinschaltdauer in Sekunden
rssinumberWLAN-Signalstaerke
signal_levelnumberSignalstaerke (1-3)
ssidstringWLAN-Name
ipstringIP-Adresse
overheatedbooleanUeberhitzungsstatus

Lampen (zusaetzlich)

Beispiel: tapo.0.80A5897B21C7.brightness, tapo.0.80A5897B21C7.hue

WertTypBeschreibung
brightnessnumberHelligkeit (0-100)
color_tempnumberFarbtemperatur in Kelvin
huenumberFarbton (0-360, nur L530/L630)
saturationnumberSaettigung (0-100, nur L530/L630)

P110/P115 Energiedaten (zusaetzlich)

Beispiel: tapo.0.80A5897B21C7.current_power, tapo.0.80A5897B21C7.voltage_mv

WertTypBeschreibung
current_powernumberAktuelle Leistung (mW)
today_energynumberEnergieverbrauch heute (Wh)
month_energynumberEnergieverbrauch Monat (Wh)
voltage_mvnumberSpannung (mV)
current_manumberStrom (mA)
power_mwnumberLeistung (mW)
current (consumption)numberAktuelle Leistung (W, berechnet)
total (consumption)numberEnergie heute (kWh, berechnet)

Hub-Sensoren (Child Devices)

Beispiel: tapo.0.80A5897B21C7.child_SENSOR_ID.current_temp

SensorWerteBeschreibung
T100 (Bewegung)detectedBewegung erkannt
T110 (Kontakt)openTuer/Fenster offen
T300 (Wasserleck)water_leak_status, in_alarmWasserleck-Status
T310/T315 (Temp/Feuchte)current_temp, current_humidity, temp_unitTemperatur und Luftfeuchtigkeit
KE100 (Thermostat)target_temp, current_temp, frost_protection_on, trv_statesThermostat-Status

Alle Sensoren liefern zusaetzlich battery_percentage, at_low_battery und signal_level.

Kamera-Status

Beispiel: tapo.0.80A5897B21C7.alarm, tapo.0.80A5897B21C7.personDetection

WertTypBeschreibung
alarmbooleanAlarm aktiv
eyesbooleanPrivacy-Modus (invertiert: true = Kamera sieht)
notificationsbooleanPush-Benachrichtigungen aktiv
motionDetectionbooleanBewegungserkennung aktiv
ledbooleanLED aktiv
autoTrackbooleanAuto-Tracking aktiv
personDetectionbooleanPersonenerkennung aktiv
vehicleDetectionbooleanFahrzeugerkennung aktiv
petDetectionbooleanTiererkennung aktiv
babyCryDetectionbooleanBaby-Schrei-Erkennung aktiv
barkDetectionbooleanBellen-Erkennung aktiv
meowDetectionbooleanMiauen-Erkennung aktiv
glassBreakDetectionbooleanGlasbruch-Erkennung aktiv
tamperDetectionbooleanManipulations-Erkennung aktiv
imageFlipbooleanBild vertikal gespiegelt
ldcbooleanLinsenverzerrungskorrektur aktiv
recordAudiobooleanAudio-Aufnahme aktiv
autoUpgradebooleanFirmware Auto-Update aktiv

Nicht jedes Geraet liefert alle Werte. Felder die das Geraet nicht unterstuetzt werden nicht angelegt.

Kamera-Erkennungsereignisse

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.

WertTypBeschreibung
detection.activebooleantrue wenn Erkennung in den letzten 30 Sekunden
detection.eventCountnumberAnzahl Ereignisse in den letzten 10 Minuten
detection.events.0.start_timenumberUnix-Timestamp Start des neuesten Events
detection.events.0.end_timenumberUnix-Timestamp Ende des neuesten Events
detection.events.0.alarm_typenumberErkennungstyp (siehe Tabelle unten)
detection.events.1.start_timenumberZweitneuestes Event (usw. bis 9)
motionEventbooleanONVIF Echtzeit-Bewegungserkennung

alarm_type Werte

IDBeschreibung
2Bewegung (motion)
3Manipulation (tamper)
4Linienueberquerung (line crossing)
5Bereichsintrusion (area intrusion)
6Person (human)
7Baby-Schrei (baby cry)
8Fahrzeug (vehicle)
9Tier (pet)
11Bellen (bark)
12Miauen (meow)
13Glasbruch (glass break)
14Rauch (smoke)
15Paket abgelegt (package delivery)
16Paket abgeholt (package pick-up)
20Gesichtserkennung (face detection)
32Herumlungern (loitering)

Nicht jede Kamera liefert alle Typen. Die verfuegbaren Werte haengen von Modell und Firmware ab.

Alarm-Konfiguration

Beispiel: tapo.0.80A5897B21C7.alarmInfo.enabled, tapo.0.80A5897B21C7.alarmInfo.alarm_volume

WertTypBeschreibung
alarmInfo.enabledstringAlarm aktiv (on/off)
alarmInfo.alarm_modemixedAlarm-Modus (z.B. sound, light)
alarmInfo.alarm_volumestringLautstaerke
alarmInfo.alarm_durationstringDauer in Sekunden
alarmInfo.alarm_typestringSirenen-Typ
alarmInfo.light_typestringLicht-Typ
alarmInfo.light_alarm_enabledstringLicht-Alarm aktiv (on/off)
alarmInfo.sound_alarm_enabledstringSound-Alarm aktiv (on/off)

Alarm-Event-Typen (welche Erkennungen loesen Alarm aus)

Beispiel: tapo.0.80A5897B21C7.alertEventTypes.motion, tapo.0.80A5897B21C7.alertEventTypes.person

WertTypBeschreibung
alertEventTypes.motionbooleanAlarm bei Bewegung
alertEventTypes.personbooleanAlarm bei Person
alertEventTypes.vehiclebooleanAlarm bei Fahrzeug
alertEventTypes.petbooleanAlarm bei Tier

Benachrichtigungen einrichten

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.

Steuern

tapo.0.id.remote auf true/false setzen steuert den jeweiligen Befehl. Der Befehl wird lokal an das Gerät gesendet.

Plugs / Switches (P100, P110, P115, ...)

RemoteTypBeschreibung
refreshbooleanManueller Status-Refresh
setPowerStatebooleanEin/Aus
setPowerStateChildstringChild-Device steuern: childId,true oder childId,false
setLedEnabledbooleanLED Indikator ein/aus
setAutoOffbooleanAuto-Off Timer ein/aus
setAutoOffDelaynumberAuto-Off Verzoegerung in Minuten
setChildProtectionbooleanTastensperre (Button Lock) ein/aus
setPowerProtectionbooleanUeberlastschutz ein/aus
setPowerProtectionThresholdnumberUeberlast-Schwellwert in Watt
setAutoUpdatebooleanFirmware Auto-Update ein/aus

P110/P115 liefern zusaetzlich Energiedaten (Leistung, Spannung, Strom).

Lampen (L510E, L520E, L530, L630, L900, L920, ...)

Alle Plug-Remotes plus:

RemoteTypBeschreibung
setBrightnessnumberHelligkeit setzen
setColorTempnumberFarbtemperatur (2500-6500K)
setColorstringFarbe setzen: hue, saturation
setLightEffectstringLichteffekt ID oder off
setGradualOnOffbooleanSanftes Ein-/Ausschalten

Fans (F1xx)

RemoteTypBeschreibung
setFanSpeedLevelnumberGeschwindigkeit 0-4 (0 = aus)
setFanSleepModebooleanSchlafmodus ein/aus

Hub (H100, H200)

RemoteTypBeschreibung
playAlarmbooleanAlarm abspielen
stopAlarmbooleanAlarm stoppen
setAlarmVolumestringAlarm Lautstaerke: mute/low/normal/high
setAlarmDurationnumberAlarm Dauer in Sekunden

Thermostat / TRV (KE100)

RemoteTypBeschreibung
setTargetTemperaturenumberZieltemperatur setzen
setTemperatureOffsetnumberTemperatur-Offset (-10 bis 10)
setFrostProtectionbooleanFrostschutz ein/aus

Hub-Sensoren (T100, T110, T300, T310, T315)

Sensordaten (Temperatur, Luftfeuchtigkeit, Bewegung, Kontakt, Wasserleck) werden automatisch via getChildDeviceList abgerufen und als Status angezeigt.

Kameras (C200, C310, C520, TC70, ...)

RemoteTypBeschreibung
refreshbooleanManueller Status-Refresh
setAlertConfigbooleanAlarm ein/aus
setLensMaskConfigbooleanPrivacy (Eyes) ein/aus
setForceWhitelampStatebooleanWeisslicht ein/aus
setLedStatusbooleanLED ein/aus
setMsgPushConfigbooleanBenachrichtigungen ein/aus
setDetectionConfigbooleanBewegungserkennung ein/aus
setAutoTrackTargetbooleanAuto-Tracking ein/aus
setPersonDetectionbooleanPersonenerkennung ein/aus
setVehicleDetectionbooleanFahrzeugerkennung ein/aus
setPetDetectionbooleanTiererkennung ein/aus
setBabyCryDetectionbooleanBaby-Schrei-Erkennung ein/aus
setBarkDetectionbooleanBellen-Erkennung ein/aus
setMeowDetectionbooleanMiauen-Erkennung ein/aus
setGlassBreakDetectionbooleanGlasbruch-Erkennung ein/aus
setTamperDetectionbooleanManipulations-Erkennung ein/aus
setImageFlipVerticalbooleanBild vertikal spiegeln
setLensDistortionCorrectionbooleanLinsenverzerrungskorrektur ein/aus
setRecordAudiobooleanAudio aufnehmen ein/aus
setAutoUpgradebooleanFirmware Auto-Update ein/aus
setHDRbooleanHDR ein/aus
setCoverConfigbooleanPrivacy Zones ein/aus
setRecordPlanbooleanSD-Karten Aufnahme ein/aus
moveMotorstringKamera bewegen: x, y (-360..360, -45..45)
moveMotorStepstringSchrittwinkel (0-360)
moveToPresetstringZu Preset fahren (ID)
calibrateMotorbooleanMotor kalibrieren
savePresetstringPreset speichern (Name)
deletePresetstringPreset loeschen (ID)
setCruisestringPatrol: x/y/off
startManualAlarmbooleanManuellen Alarm starten
stopManualAlarmbooleanManuellen Alarm stoppen
setAlarmModestringAlarm-Modus: both/light/sound/off
setDayNightModestringTag/Nacht-Modus: auto/on/off
setLightFrequencyModestringLichtfrequenz: auto/50/60
setSpeakerVolumenumberLautsprecher-Lautstaerke (0-100)
setMicrophoneVolumenumberMikrofon-Lautstaerke (0-100)
setMotionDetectionSensitivitystringBewegungs-Sensitivitaet: high/normal/low
setPersonDetectionSensitivitystringPersonen-Sensitivitaet: high/normal/low
setOsdstringOSD Beschriftungstext
rebootbooleanKamera neustarten
formatSdCardbooleanSD-Karte formatieren

Nicht jede Kamera unterstuetzt alle Funktionen. Nicht unterstuetzte Befehle werden mit einer Fehlermeldung im Log quittiert.

Kamerasteuerung aktivieren

alt text alt text

Diskussion und Fragen

https://forum.iobroker.net/topic/57336/test-adapter-tp-link-tapo/

Changelog

0.6.12 (2026-08-11)

  • Fix intermittent "Expected double-quoted property name in JSON" on KLAP/TPAP devices: requests per device are now serialized, so rapid commands (or a poll racing a command) no longer corrupt the AES sequence counter and garble the decrypted response

0.6.11 (2026-08-11)

  • Fix: L530 name variants (e.g. "L530 Series", hw 1.0) are now detected as color bulbs, so setColor/setColorTemp are available (match by prefix instead of exact "L530")

0.6.10 (2026-08-11)

  • Fix setColorTemp for L530/L530E: send the value directly in Kelvin (it was wrongly converted from mired, e.g. 6000 became 2500) and send only color_temp (no hue/saturation), which made the lamp briefly apply the temperature and then revert to a warm hue

0.6.9 (2026-08-11)

  • Publish the configured PTZ presets as a state (presets: id -> name), refreshed after save/delete, so you can see which names/ids moveToPreset accepts

0.6.8 (2026-08-11)

  • PTZ move-to-preset now accepts the preset name (not just the numeric id) and reports success correctly
  • Camera connect/reconnect log messages now show the IP instead of undefined

0.6.7 (2026-08-11)

  • Doorbell ring now also works for hub-paired battery doorbells (e.g. D210 + H200): the ring UDP packet (port 20005) is sent from the hub IP, so any packet on the doorbell port now triggers the ringEvent (matches Home Assistant)

0.6.6 (2026-08-11)

  • Fix: an unreachable camera/doorbell (ONVIF/EHOSTUNREACH) no longer aborts init, so the ringEvent state and doorbell UDP listener are set up even for battery/hub-paired doorbells (D210)

0.6.5 (2026-08-11)

  • Log all incoming doorbell UDP (port 20005) packets at debug level to help diagnose hub-paired doorbells (e.g. D210 + H200)

0.6.4 (2026-08-11)

  • Camera ONVIF port (2020) unreachable is now an info hint, not an error (EHOSTUNREACH/ETIMEDOUT)
  • Capture onvif socket errors so they no longer surface as uncaught errors

0.6.3 (2026-08-10)

  • Camera line crossing detection (on/off toggle + status), ported from python-kasa
  • List dynamic light effects (getLightEffects) for L530/L630
  • Battery status exposed for battery-powered cameras via device info

0.6.2 (2026-08-10)

  • Fix camera PTZ move-to-preset (the request was missing the preset wrapper)
  • Support for Tapo smart chime D100C (play/stop chime, volume, ring type) - uses the plug/TPAP protocol

0.6.1 (2026-08-09)

  • Support for Tapo video doorbells (D-series, e.g. D235) - initialized as camera devices
  • Fetch SMART.TAPODOORBELL / SMART.TAPOCHIME device types from the cloud (doorbells were missing from the device list)
  • Also fetch SMART.TAPOLOCK / SMART.TAPOROBOVAC / SMART.TAPONVR device types
  • Doorbell ring event (ringEvent state) via UDP broadcast (port 20005) and alarm polling fallback

0.6.0 (2026-07-30)

  • Fix camera login for newer firmware (FW 1.4.3+, e.g. C200 1.4.4)
  • Use the Camera Account credentials (Stream Username/Password) for local camera login
  • Try camera default credentials (admin, LV3 built-in) when the password is rejected
  • TPAP/SPAKE2+ fallback for cameras that no longer use the stok login
  • Stop amplifying device lockouts: no repeated login attempts while a camera is suspended
  • Actionable, rate-limited camera log messages (Camera Account / Third-Party Compatibility hints)

0.5.5 (2026-05-25)

  • added udp detection for better device detection

0.5.4 (2026-04-02)

  • 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

0.4.8 (2025-02-04)

  • disable sentry to prevent crashes

0.4.7 (2025-01-14)

  • disable battery devices
  • improved wrong formatted mail adresses

0.4.6 (2025-01-10)

  • add checks for battery devices

0.4.5 (2024-12-16)

  • fix camera remotes

0.4.4 (2024-12-12)

  • improve handshake if e-mail is not entered in lowercase

0.4.3 (2024-12-09)

  • fix handshake for device with HW v1.20

0.4.1 (2024-11-29)

  • fixed Get Device Info failed error

0.3.4 (2024-11-10)

  • update Tapo local lib

0.3.3 (2024-06-17)

  • ignore ssl legacy error

0.3.2 (2024-05-27)

update onvif lib to fix issues with newer cameras

0.2.9 (2024-01-30)

  • fix tapo Plugs and setLensMask

0.0.2

  • (TA2k) initial release

License

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.