Table of Contents

Internet of Things: Teckin Smart Plug SP22

Di queste prese intelligenti marchiate Teckin ne esistono almeno due versioni. Le più vecchie si basano sul chip ESP mentre quelle più recenti si basano sul chip Realtek RTL8710BN. Questo fa molta differenza se si vuole cambiare il firmware originale con quello libero ed open source Tasmota, infatti Tasmota è compatibile solo con il chip ESP.

Le prese - con la configurazione originale - utilizzano la piattaforma cloud Tuya per essere controllate. Esiste l'app Smart Life - Smart Living per Android ed una equivalente per iOS.

Perché il Cloud Tuya è male

Abbiamo provato a gestire una presa intelligente Teckin SP22 tramite le API della libreria Python TinyTuya. Per quanto mi riguarda l'esperienza è del tutto disastrosa in termini di flessibilità e libertà di programmazione. Questo un riassunto delle motivazioni.

Per poter gestire un device Tuya tramite API è necessario:

Smart Life App

The QR code printed on the plug itseld points to http://e.tuya.com/smartlife, here you can download the 76.7 Mb smartlife.apk. We prefered to download it from the Google Play, searching the Smart Life - Smart Living app by Volcano Technology Limited, at the URL https://play.google.com/store/apps/details?id=com.tuya.smartlife. Strangely enough, the Google Play app is only 40.35 Mb…

Pairing the smart plug with the App and WiFi

  1. Plug the SP22 into an electricity outlet.
  2. Start the Smart Life app on the smartphone (it shows a warning message if the phone is rooted).
  3. Tap Try now (Provalo adesso) to use the app without registering an account.
  4. Tap the + in the upper-right corner Add devices (Aggiungi dispositivo).
  5. Select the Electrical Outlet Wi-Fi (Presa Wi-Fi).
    • If you negate the localization permission, you will be required to manyally enter the WiFi network name.
    • Input the ESSID and password.
  6. Press the button on the SP22 for 5 seconds: the LED under the button start flashing in blue, about three time per second: the device is in pairing mode.
  7. Tap the Next button into the app as required, untill the app start searching for the device.
  8. The procedure on the smartphone should terminate with the message Successfully Added (Aggiunto con successo).

After the pairing

How the app communicates witht the device

How the app communicates witht the cloud

How to create a Tuya Developer Account

To use the TinyTuya library we need the device local key. This key is assigned by the Tuya Cloud to your device when you do the pairing with the Smart Life app. The key will be valid and can be used locally to control your device even if the Tuya cloud is unavailable, but you cannot move the device into another network; in that case you need to obtain a new local key from Tuya cloud.

Actually we need to:

These are the steps to be executed into the Web Framework:

TinyTuya Python library

Il nostro obiettivo è poter controllare i dispositivi tramite una qualche API, possibilmente in Python e con esigenze modeste. La piattaforma di riferimento è Raspberry Pi o una qualunque distribuzione GNU/Linux.

La scelta è caduta sulla libreria Python TinyTuya, che sembra rispondere a tutte le richieste. L'installazione ha dei prerequisiti che possono essere soddisfatti con l'installazione locale via pip, qualora la distribuzione di riferimento non li soddisfi. In particolare la libreria python3-crypto offerta da Debian 10 è adeguata, mentre la libreria python3-pycryptodome di Debian è alla versione 3.6.1, mentre TinyTuya richiede 3.9.9. In definitiva si possono scaricare i pacchetti dal repository https://pypi.org/ e installarli manualmente:

pip3 install pycryptodome-3.9.9-cp37-cp37m-manylinux1_x86_64.whl
pip3 install tinytuya-1.1.2-py2.py3-none-any.whl

Scanning for devices on the LAN

After installing the TinyTuya Python library, just run:

python3 -m tinytuya

TinyTuya (Tuya device scanner) [1.1.2]

Scanning on UDP ports 6666 and 6667 for devices (15 retries)...

3.3 Device Found [Valid payload]: 10.0.0.129
    ID = bff7e612edf4edb899uaiz, Product ID = keyqwtgrcsf3hxng, Version = 3.3
    No Stats - Device Key required to poll for status

Scan Complete!  Found 1 devices.

According to the instruction of the TinyTuya Readme, we need the following data to interact with the device:

DEVICE_ID This is the device ID shown after the devices scan performed by python3 -m tinytuya.
IP_ADDRESS This is the IP address acquired by the device, this is shown by python3 -m tinytuya.
LOCAL_KEY This is a API programming key obtained from the Tuya Cloud. You need to register to the Tuya web developmente framework and obtain a developer account. It seems that this requires a payment, but a free trial period exists.

Let's see how to obtain a Tuya Developer account on https://iot.tuya.com. As I reported into the issue #15 it seems that a Developer Account is not longer available for free, nor it is so simple to obtain.

Getting the device local key and programming

Now we use TinyTuya library to get the local key required to control the device. NOTICE: run the tinytuya wizard in a terminal with a dark background, otherwise you cannot read the white text!

python3 -m tinytuya wizard

Enter API Key from tuya.com: 4e46be08d231a017dc2c
Enter API Secret from tuya.com: 0061ee191a3e90e22467c1be8dce4b1f
Enter any Device ID currently registered in Tuya App (used to pull full list): bff7e612edf4edb899uaiz
Enter Your Region (Options: us, eu, cn or in): eu

Some output will be displayed on the screen and two files are created: tinytuya.json and devices.json

{
    "apiKey": "4e46be08d231a017dc2c",
    "apiSecret": "0061ee191a3e90e22467c1be8dce4b1f",
    "apiRegion": "eu",
    "apiDeviceID": "bff7e612edf4edb899uaiz"
}
[
    {
        "name": "Presa #1",
        "id": "bff7e612edf4edb899uaiz",
        "key": "a28b367332e8b5ee"
    }
]

Finally you can control the device using Python. Here it is an example on how to get the status of the smart switch and toggle its status:

#!/usr/bin/env python3
import tinytuya
d = tinytuya.OutletDevice('bff7e612edf4edb899uaiz', '10.0.0.129', 'a28b367332e8b5ee')
d.set_version(3.3)
data = d.status()  
# Show status and state of first controlled switch on device
print('Dictionary %r' % data)
print('State (bool, true is ON) %r' % data['dps']['1'])
# Toggle switch state
switch_state = data['dps']['1']
data = d.set_status(not switch_state)
if data:
    print('set_status() result %r' % data)

Here it is an example of the dictionary returned by the tinytuya.OutletDevice().status() method. There are several keys, where the 1 is the ON/OFF status and the 20 is the voltage in decivolt:

Dictionary {'dps': {'1': True, '9': 0, '18': 0, '19': 0, '20': 2302}}
State (bool, true is ON) True

Tasmota and Tuya-Convert

La soluzione Tuya Cloud è ovviamente non accettabile se si vuole avere il controllo dei device al di fuori del circolo vizioso Smart Life app - Tuya Cloud. Purtroppo sostituire il firmware originale con Tasmota pare che sia diventato impossibile. Anzitutto sembra che Teckin si sia impegnata a rendere impossibile il funzionamento di Tuya-Convert (tool per il flash del firmware Tasmota), almeno a giudicare dalla issue 197. Poi, cosa ancora più grave, sembra proprio che le nuove versioni di SP22 siano basate su chip Realtek non compatibile con Tasmota, vedere questa pagina informativa.