TasmotaV2

Tasmota-Geräte über MQTT einbinden. Das Gerät beschreibt sich per Discovery selbst.

Beta 1.0.114 Downloads14 in 30 Tagen

Privat kostenlos Gewerblich auf Anfrage Anfrage senden

Diese Dokumentation beschreibt immer die neueste Version des Moduls, aktuell 1.0.1 im Kanal Beta.

Tasmota Device V2

Bindet ein Tasmota-Gerät über MQTT ein. Die Instanz liest die Discovery-Nachricht des Geräts (tasmota/discovery/<MAC>/config) und legt daraus Relais, Licht, Rollläden, Taster und Schalter an. Sensoren und Energiewerte entstehen automatisch aus der Telemetrie. Normalerweise wird die Instanz über den Tasmota Konfigurator V2 angelegt.

Voraussetzung am Gerät: MQTT ist eingerichtet und die Discovery ist aktiv (SetOption19 0, Standard). Weitere Einstellungen am Gerät sind nicht nötig. Nur wenn Taster oder Schalter am Gerät in IP-Symcon als Auslöser dienen sollen, gibt es dafür zwei optionale Einstellungen (siehe 2.4).

Inhaltsverzeichnis

1. Konfiguration

FeldBeschreibung
TopicTopic des Geräts (Tasmota-Befehl Topic). Pflichtfeld.
Full-TopicFull-Topic-Muster des Geräts, Standard %prefix%/%topic%/. Der Konfigurator übernimmt es vom Gerät.
Discovery-PräfixPräfix der Discovery-Nachrichten, Standard tasmota/discovery.
Sensorvariablen automatisch anlegenLegt für jeden Wert in der Telemetrie (SENSOR) eine Variable an. Standard: an.
Sensoren ignorierenKommagetrennte Sensornamen, die keine Variablen bekommen, zum Beispiel ANALOG.
SystemvariablenZusätzlich Laufzeit, freier Speicher, WLAN-Details und Version. Standard: aus.
Befehle mit Retain-Flag sendenSetzt beim Senden das Retain-Flag. Achtung: Ein retained Schaltbefehl am Broker überschreibt PowerOnState des Geräts. Standard: aus.
Fingerabdruck-NamenListe mit ID (1 bis 128) und Name. Die Variable FingerprintName zeigt den Namen des zuletzt erkannten Fingers, bei unbenannten IDs “Unbekannt (ID n)”. Namen lassen sich jederzeit ergänzen, die Variable folgt nach dem Speichern. Die Liste erscheint nur, wenn die Instanz den Fingerabdrucksensor erkannt hat oder er unter “Zusätzliche Funktionen” steht. Die Zeile “Discovery” zeigt, ob die Discovery-Nachricht des Geräts angekommen ist (mit Modell und Firmware), und die Zeile “Erkannte Funktionen”, was die Instanz am Gerät gefunden hat.
Zusätzliche FunktionenKommagetrennte Kennungen aus dem Funktionskatalog (zum Beispiel fingerprint), die zusätzlich zu den erkannten angelegt werden. Nur nötig, wenn die Erkennung über die GPIO-Belegung nicht greift.

2. Variablen

Variablen entstehen, sobald das Gerät sie ankündigt oder ein Telegramm sie enthält. Die Idents bleiben bei einer Umbenennung gleich.

2.1 Allgemein

VariableIdentTypBeschreibung
ErreichbarOnlineJa/NeinOb das Gerät erreichbar ist, aus dem Last-Will des Geräts (LWT). Telemetrie und Antworten auf Status-Abfragen setzen die Variable ebenfalls auf erreichbar. Der Ident Online bleibt aus technischen Gründen bestehen.
WLAN-QualitätWifiRSSIGanzzahl (%)Qualität der WLAN-Verbindung.
WLAN-SignalWifiSignalGanzzahl (dBm)Signalstärke.
Zustand beim EinschaltenPowerOnStateGanzzahlSteuerbar: Relaiszustand nach dem Einschalten der Versorgung. 0 bleibt aus, 1 schaltet ein, 2 wechselt den gespeicherten Zustand, 3 stellt ihn wieder her (Standard von Tasmota), 4 schaltet ein und sperrt die weitere Bedienung der Relais, 5 schaltet nach Ablauf von PulseTime ein (umgekehrte Pulszeit). Achtung: Laut Tasmota-Doku sperrt 4 die weitere Bedienung der Relais. Ob sich die Relais und dieser Wert danach noch über IP-Symcon ändern lassen, ist nicht geprüft. Sicher zurücksetzen lässt sich der Wert im Webinterface des Geräts.

2.2 Relais und Licht

VariableIdentTypBeschreibung
Schalter nPower<n>Ja/NeinRelais n oder Licht, steuerbar. Ein einzelnes Relais ist Power1.
DimmerDimmerGanzzahl (%)Helligkeit, steuerbar.
FarbeColorGanzzahl (RGB)Farbe, steuerbar. Die Helligkeit bleibt beim Ändern der Farbe erhalten.
FarbtemperaturCTGanzzahl (mired)153 bis 500, steuerbar.
WeißWhiteGanzzahl (%)Weißkanal, steuerbar.
ÜberblendenFadeJa/Neinsteuerbar.
ÜberblendgeschwindigkeitSpeedGanzzahl1 bis 40, steuerbar.
SchemaSchemeGanzzahlsteuerbar.
Kanal nChannel<n>Ganzzahl (%)Einzelne PWM-Kanäle (SetOption68), steuerbar.

2.3 Rollläden

VariableIdentTypBeschreibung
Rollladen n PositionShutter<n>PositionGanzzahl (%)100 = offen, 0 = geschlossen (ohne ShutterInvert), steuerbar.
Rollladen n RichtungShutter<n>DirectionGanzzahl-1 schließt, 0 steht, 1 öffnet.
Rollladen n LamellenwinkelShutter<n>TiltGanzzahlNur bei Geräten mit Lamellen, steuerbar.
Rollladen n SperreShutter<n>LockJa/NeinSteuerbar: gesperrt, dann bewegen Taster und Befehle den Rollladen nicht (ShutterLock<n>).
Rollladen n SteuerungShutter<n>ControlGanzzahlAuf, Stopp, Zu. Steht im Ruhezustand auf Stopp.

2.4 Taster und Schalter

Optional, nur wenn man es braucht. Ein Taster oder Schalter am Gerät schaltet normalerweise direkt das Relais, und das Modul zeigt nur den neuen Zustand (Power<n>). Das genügt für die meisten Geräte, es muss nichts eingestellt werden.

Soll IP-Symcon dagegen auf Taster oder Schalter am Gerät reagieren, zum Beispiel mit einer Szene bei Doppelklick oder einem Befehl bei langem Drücken, gibt es am Gerät zwei Einstellungen:

Einstellung am GerätWirkungVariable
SetOption73 1Taster melden jede Aktion einzeln (SINGLE, DOUBLE, TRIPLE, QUAD, PENTA, HOLD, CLEAR)Button<n>
SetOption114 1Schalter melden ihre Aktion nur über MQTT (ON, OFF, TOGGLE, HOLD)Switch<n>

Achtung: Mit diesen Einstellungen sind Taster oder Schalter vom Relais getrennt und schalten es nicht mehr selbst. Das Relais schaltet dann nur noch, wenn IP-Symcon (oder eine Regel im Gerät) darauf reagiert. Fällt IP-Symcon oder der MQTT-Broker aus, bleibt der Taster am Gerät wirkungslos. Ohne die Einstellungen legt das Modul keine Taster- und Schaltervariablen an.

VariableIdentTypBeschreibung
Taster nButton<n>TextLetzte Aktion: SINGLE, DOUBLE, TRIPLE, QUAD, PENTA, HOLD, CLEAR. Nur mit SetOption73 1.
Schalter-Eingang nSwitch<n>TextLetzte Aktion oder Zustand (ON, OFF, TOGGLE, HOLD). Nur mit SetOption114 1 oder SwitchMode 15/16.

2.5 Energie und Sensoren

VariableIdentTypBeschreibung
EnergiewerteEnergy_<Wert>KommazahlLeistung, Strom, Spannung, Zähler und weitere Werte aus ENERGY. Mehrphasige Geräte liefern Energy_<Wert>_1, _2 und so weiter.
SensorwerteSensor_<Sensor>_<Wert> (die Variablen entstehen schon aus der Discovery-Nachricht sensors, ihre Werte erst aus der Telemetrie)Kommazahl, TextJeder Wert aus der Telemetrie, zum Beispiel Sensor_BME280_Temperature. Einheit und Nachkommastellen kommen aus einer Tabelle, unbekannte Werte erscheinen ohne Einheit. Pro Instanz werden höchstens 400 Variablen angelegt.

2.6 Systemvariablen

Nur mit der Option “Systemvariablen”.

VariableIdentTypBeschreibung
LaufzeitSystem_Uptime, System_UptimeSecText, GanzzahlLaufzeit des Geräts.
Freier Speicher, Auslastung, VersorgungsspannungSystem_Heap, System_LoadAvg, System_VccZahlZustand des Geräts.
Version, Hostname, IP-AdresseSystem_Version, System_Hostname, System_IPAddressTextGeräteinformationen.
ModulSystem_ModuleTextName des Moduls oder Templates (zum Beispiel “Sonoff Basic”), aus der Discovery.
Group-TopicSystem_GroupTopicTextGruppen-Topic des Geräts, aus der Antwort auf Status 0.
WLANSystem_WifiSSId, System_WifiBSSId, System_WifiMode, System_WifiChannelText, GanzzahlVerbindungsdaten.

2.7 Spezialfunktionen (Funktionskatalog)

Hardware, die die Discovery nicht beschreibt, erkennt die Instanz an der GPIO-Belegung des Geräts oder, beim Sonoff iFan, an einem Kennzeichen der Discovery (Befehl Gpio, wird beim Start und bei “Zustand abfragen” gesendet). Für jede erkannte Funktion legt sie Variablen an, wertet deren Ergebnisse aus und ordnet bedienbaren Variablen den Befehl zu. Der Katalog liegt in libs/data/features.json.

Unterstützte Spezialhardware:

  • Fingerabdrucksensor AS608
  • Lüfter Sonoff iFan02 und iFan03
  • LED-Streifen WS2812 (adressierbare LEDs)
  • IR-Empfänger
  • Anwesenheitsradar HLK-LD2410
  • Geräte mit Energiemessung (Leistungsgrenzen)
  • Port-Erweiterungen MCP230xx und PCF8574
  • PWM-Treiber PCA9685
FunktionKennungErkennungVoraussetzung am Gerät
Zustand beim Einschaltenpoweronstatefür jedes Gerätkeine
Fingerabdrucksensor AS608fingerprintGPIO AS608 Rx oder AS608 TxFirmware mit AS608-Treiber, GPIOs belegt
Lüfter Sonoff iFan02/iFan03ifanKennzeichen if in der DiscoveryGerät mit dem iFan-Modul
IR-EmpfängerirreceiveGPIO IRrecvGPIO IRrecv ist belegt
LED-Streifen WS2812ws2812GPIO WS2812GPIO WS2812 ist belegt
Anwesenheitsradar HLK-LD2410ld2410GPIO LD2410 Tx oder LD2410 Rx, oder Daten LD2410Eigene Firmware mit USE_LD2410 (nicht in den vorkompilierten Firmwares), GPIOs LD2410 Tx und LD2410 Rx belegt
Port-Erweiterung MCP230xxmcp230xxDaten MCP230XX, MCP230XX_INT, MCP230_OUT oder S29cmnd_D<n>Eigene Firmware mit USE_MCP230xx
Port-Erweiterung PCF8574pcf8574Daten PCF8574-<n> oder PCF8574-<n>_INPEigene Firmware mit USE_PCF8574, für die Pinwerte USE_PCF8574_SENSOR, für Ereignisse USE_PCF8574_MQTTINPUT
PWM-Treiber PCA9685pca9685Daten PCA9685Eigene Firmware mit USE_PCA9685
LeistungsgrenzenpowerlimitDas Gerät liefert Energiewerte (ENERGY) in der Telemetrie oder in der Discovery-Nachricht sensors, wird dann dauerhaft gemerktEnergiemessung am Gerät

Hinweise zum Anwesenheitsradar LD2410 (aus der Tasmota-Doku und dem Quelltext des Treibers):

  • Der Treiber ist nicht in den vorkompilierten Firmwares enthalten, er braucht eine eigene Firmware mit USE_LD2410. Gemeint ist der HLK-LD2410 (B und C), der LD2410S hat einen eigenen Treiber und wird nicht unterstützt.
  • Das Gerät veröffentlicht die Telemetrie laut Quelltext nur, solange die Bewegungsenergie nicht null ist. Ein ruhender Mensch erzeugt keine Telemetrie. Für eine zuverlässige Anwesenheit den OUT-Pin des Sensors an einen GPIO legen und dort als Switch konfigurieren, er erscheint dann als Schalter (Switch<n>, siehe 2.4).
  • Haltezeit und Empfindlichkeit speichert der Sensor selbst, die Instanz fragt sie beim Start ab.
  • Der Engineering-Modus (LD2410EngineeringStart, LD2410EngineeringEnd) und LD2410Get laufen über TASV2_SendCommand und TASV2_SendCommandWait.

Die Treiber der Port-Erweiterungen und des PCA9685 sind laut Tasmota-Doku nicht in den vorkompilierten Firmwares enthalten.

VariableIdentTypBeschreibung
Entfernung bewegtes Ziel, ruhendes Ziel, ErkennungsentfernungLD2410MovingDistance, LD2410StaticDistance, LD2410DetectDistanceKommazahl (cm)Nur mit LD2410: Entfernungen aus der Telemetrie.
Energie bewegtes und ruhendes ZielLD2410MovingEnergy, LD2410StaticEnergyGanzzahlNur mit LD2410: Stärke der Erkennung aus der Telemetrie.
Anwesenheit (OUT-Pin)LD2410OutPinJa/NeinNur mit LD2410: Zustand des OUT-Pins, aus der Antwort auf LD2410Get. Zuverlässiger Anwesenheitswert ist der OUT-Pin als Schalter am Gerät (siehe unten).
LichtsensorLD2410LightGanzzahlNur mit LD2410 und eingebautem Lichtsensor, aus LD2410Get.
Haltezeit ohne PersonLD2410DurationGanzzahl (s)Nur mit LD2410, steuerbar (1 bis 65535). LD2410Duration 0 (Werkseinstellung) sendet das Modul nie.
Empfindlichkeit bewegtes Ziel, ruhendes ZielLD2410MovingSens, LD2410StaticSensTextNur mit LD2410, steuerbar: bis zu neun Zahlen von 0 bis 100, durch Komma getrennt, je Entfernungsstufe (0,75 m), zum Beispiel 50,50,40,30,20,15,15,15,15. Ungültige Eingaben werden nicht gesendet.
Energie bewegt/ruhend, Stufe nLD2410MovingGate<n>, LD2410StaticGate<n>GanzzahlNur mit LD2410 (Stufen 0 bis 8): Entstehen, wenn das Gerät den Befehl LD2410Get im Engineering-Modus beantwortet.
MCP230XX Pin DMCP230XX_D<n>Ja/NeinZustand des Pins (0 bis 15), aus der Telemetrie und aus Interrupt-Meldungen. Die Variable entsteht, sobald das Gerät den Pin meldet.
MCP230XX Zeit seit dem letzten InterruptMCP230XXIntervalMsGanzzahl (ms)Aus MCP230XX_INT.
MCP230XX Ausgang DMCP230XX_Out<n>Ja/NeinAusgangspin, steuerbar (`Sensor29 ,ON
PCF8574- Pin DPCF8574_<c>_D<n>Ja/NeinPinzustand des Chips c (1 bis 4), nur lesbar. Die Ausgänge der Chips sind zusätzlich Power-Schalter (Power<n>).
PCA9685 PWM Pin PCA9685_PWM<n>GanzzahlPWM-Wert (0 bis 4096) des Pins n (0 bis 15), steuerbar (driver15 pwm,<n>,<Wert>). Entsteht, sobald das Gerät den Pin meldet.
PixelPixelsGanzzahlNur mit LED-Streifen: Anzahl der Pixel (1 bis 512), steuerbar.
ÜberblendgeschwindigkeitSpeedGanzzahlNur mit LED-Streifen im Voraus, sonst sobald das Gerät sie meldet: 1 (schnell) bis 40 (langsam), steuerbar.
ÜberblendenFadeJa/Neinsteuerbar.
SchemaSchemeGanzzahlAuswahl des Lichtprogramms, steuerbar: 0 einfarbig, 1 Aufwachen, 2 und 3 Farbwechsel, 4 Zufall; mit LED-Streifen zusätzlich 5 Uhr, 6 Kerze, 7 RGB-Muster, 8 Weihnachten, 9 Chanukka, 10 Kwanzaa, 11 Regenbogen, 12 Feuer, 13 Treppe, 14 Löschen. Achtung: Nur eine eigene Firmware mit Netzwerk-Lichtprogrammen (DDP, kompiliert mit USE_NETWORK_LIGHT_SCHEMES) verschiebt die Nummern, dort passen die Namen der Auswahl nicht mehr (laut Tasmota-Doku werden die Pixel-Effekte zu 6 bis 15). In der Standard-Firmware gelten die hier genannten Nummern.
IR-ProtokollIRProtocolTextNur mit IR-Empfänger: Protokoll des zuletzt empfangenen Codes (zum Beispiel NEC).
IR-BitsIRBitsGanzzahlNur mit IR-Empfänger: Länge des Codes.
IR-DatenIRDataTextNur mit IR-Empfänger: Code, zum Beispiel 0x00FF00FF.
IR-HashIRHashTextNur mit IR-Empfänger, falls das Gerät einen Hash mitsendet.
LeistungsgrenzeMaxPowerGanzzahl (W)Nur bei Energiemessung, steuerbar (MaxPower): Leistungsgrenze in Watt. Was das Gerät bei Überschreitung tut, steht in der Tasmota-Doku zu MaxPower.
Haltezeit der LeistungsgrenzeMaxPowerHoldGanzzahl (s)Nur bei Energiemessung, steuerbar (MaxPowerHold).
Zeitfenster der LeistungsgrenzeMaxPowerWindowGanzzahl (s)Nur bei Energiemessung, steuerbar (MaxPowerWindow).
LüfterstufeFanSpeedGanzzahlNur iFan: 0 (aus) bis 3, steuerbar. Die Lampe des iFan ist Power1, die Lüfterrelais erscheinen nicht als Schalter.
Letzte Fingerabdruck-IDFingerprintIdGanzzahlID des zuletzt erkannten Fingerabdrucks.
Name des letzten FingerabdrucksFingerprintNameTextName zur ID aus der Liste “Fingerabdruck-Namen”.
Treffergenauigkeit des FingerabdrucksFingerprintConfidenceGanzzahlGenauigkeit des letzten Treffers.
Gespeicherte FingerabdrückeFingerprintCountGanzzahlAnzahl im Sensor, wird beim Start abgefragt (FpCount).
Fingerabdruck-StatusFingerprintStatusTextAntwort auf FpEnroll und FpDelete; NOMATCH, wenn ein Finger nicht erkannt wurde.
Fingerabdruck anlernen (ID)FingerprintEnrollGanzzahlSteuerbar: sendet FpEnroll <ID>, erlaubt sind 0 (Anlernen abbrechen) bis 128.
Fingerabdruck löschen (ID)FingerprintDeleteGanzzahlSteuerbar: sendet FpDelete <ID>, erlaubt sind 1 bis 128 (FpDelete 0 würde alle Abdrücke löschen und wird nicht gesendet).

3. Funktionen

boolean TASV2_SendCommand(integer $InstanzID, string $Command, string $Payload); Sendet einen beliebigen Tasmota-Befehl an cmnd/<Topic>/<Command>, zum Beispiel TASV2_SendCommand($id, 'Backlog', 'Power1 ON; Delay 20; Power1 OFF');. Die Antwort kommt asynchron und wird, soweit bekannt, in die Variablen übernommen.

Die Treiber der Port-Erweiterungen sind in den vorkompilierten Tasmota-Firmwares nicht enthalten, die Variablen entstehen deshalb nur bei einer eigenen Firmware. Eingänge werden gemeldet, wenn sich ein Pin ändert (Interrupt), oder mit der Telemetrie. Die Einstellung der Pins ist am Gerät nötig, zum Beispiel:

TASV2_SendCommand($id, 'Sensor29', '4,5');                // MCP230xx: Pin 4 als Ausgang
TASV2_SendCommand($id, 'driver15', 'pwmf,200');           // PCA9685: PWM-Frequenz

Beispiel für einzelne Pixel eines LED-Streifens (Led<x>, Farbe als #RRGGBB), Syntax laut Tasmota-Doku:

TASV2_SendCommand($id, 'Led3', '#FF0000');           // Pixel 3 rot
TASV2_SendCommand($id, 'Led1', '#00FF00 #0000FF');   // Pixel 1 grün, Pixel 2 blau

Beispiele für IR-Sender (GPIO IRsend), Syntax laut Tasmota-Doku:

// Code senden (Standard-Firmware: NEC, RC5, RC6), Schreibweise wie in der Tasmota-Doku
TASV2_SendCommand($id, 'IRSend', '{"Protocol":"NEC","Bits":32,"Data":0x8166817E}');

// Klimaanlage (Tasmota-IR-Build)
TASV2_SendCommand($id, 'IRHVAC', '{"Vendor":"Mitsubishi_Heavy_152","Power":"On","Mode":"Cool","FanSpeed":3,"Temp":22}');

string TASV2_SendCommandWait(integer $InstanzID, string $Command, string $Payload, integer $Timeout); Sendet einen Tasmota-Befehl wie TASV2_SendCommand und wartet auf die Antwort des Geräts. Die Antwort kommt als Text (JSON) zurück. Ohne Antwort innerhalb von $Timeout Millisekunden (100 bis 30000), bei unbekanntem Befehl oder wenn die MQTT-Verbindung nicht aktiv ist, ist der Rückgabewert ein leerer Text. Den Timeout muss man bei dieser Funktion immer angeben, empfohlen sind 3000.

Wofür sie gedacht ist:

  • Einstellungen lesen, bevor ein Skript sie ändert, zum Beispiel PowerOnState, TelePeriod oder ein SetOption.
  • Abfragen ohne Variable, zum Beispiel Firmware (Status 2), Netzwerk (Status 5), Template oder Gpio.
  • Befehle prüfen: ob das Gerät den Befehl angenommen hat und welchen Wert es jetzt hat.
  • Konfigurationsskripte, die mehrere Befehle nacheinander senden und jeweils das Ergebnis brauchen.

Für das einfache Schalten und Bedienen genügt TASV2_SendCommand oder die Bedienung der Variablen. TASV2_SendCommandWait blockiert das aufrufende Skript, bis die Antwort da ist, und sollte deshalb nicht in Ereignissen verwendet werden, die oft auslösen. Befehle, auf die das Gerät nicht antwortet (zum Beispiel ShutterOpen1), laufen bis zum Timeout. Es zählt nur eine Antwort, die zum Befehl passt: Das ist eine Nachricht stat/<Topic>/RESULT mit dem Befehlsnamen als Schlüssel (oder STATUS<n> bei Status).

$antwort = TASV2_SendCommandWait($id, 'PowerOnState', '', 3000);
if ($antwort !== '') {
    $wert = json_decode($antwort, true)['PowerOnState'] ?? null; // zum Beispiel 3
}

// Firmware des Geräts
$firmware = json_decode(TASV2_SendCommandWait($id, 'Status', '2', 3000), true)['StatusFWR']['Version'] ?? '';

boolean TASV2_RequestState(integer $InstanzID); Fragt den Zustand des Geräts ab (Status 0), die Hardware (Gpio) und die Startwerte der erkannten Funktionen. Läuft automatisch beim Start, beim Verbinden der Instanz mit dem MQTT-Parent (auch beim Anlegen über den Konfigurator) und wenn die MQTT-Verbindung aktiv wird. Fehlt noch die Discovery-Nachricht des Geräts und sendet das Gerät sie (SetOption19 0), fordert die Instanz sie dabei selbst an.

void TASV2_RequestInitialState(integer $InstanzID); Wird vom internen Timer einmal 8 Sekunden nach dem Start oder Neuladen aufgerufen und fragt den Zustand ab, falls der MQTT-Parent inzwischen aktiv ist. Der Aufruf von Hand ist nicht nötig.

boolean TASV2_RequestDiscovery(integer $InstanzID); Veranlasst das Gerät, seine Discovery-Nachricht erneut zu senden (Befehl Discover 1). Das ist nötig, wenn die Instanz neu angelegt wurde und die einmalig gesendete Nachricht verpasst hat.

4. Spenden

Dieses Modul ist für die nicht kommerzielle Nutzung kostenlos, Schenkungen als Unterstützung für den Autor werden hier akzeptiert:

PayPal Amazon Wunschzettel

5. Lizenz

CC BY-NC-SA 4.0