ioBroker IoT-Adapter
Dieser Adapter dient ausschließlich der Kommunikation mit Amazon Alexa, Google Home und Nightscout. Er ist nicht für den Fernzugriff auf Ihre ioBroker-Instanz geeignet. Verwenden Sie hierfür den ioBroker.cloud-Adapter.
Dieser Adapter nutzt die Sentry-Bibliotheken, um Ausnahmen und Codefehler automatisch an die Entwickler zu melden. Weitere Details und Informationen zum Deaktivieren der Fehlerberichterstattung finden Sie in der Sentry-Plugin-Dokumentation ! Die Sentry-Berichterstattung wird ab js-controller 3.0 verwendet.
Erste Schritte
Wozu dient dieser Adapter?
Dieser Adapter verbindet Ihre ioBroker-Geräte mit Sprachassistenten wie Amazon Alexa und Google Home. Er erstellt automatisch virtuelle Smart-Home-Geräte, die per Sprachbefehl gesteuert werden können.
Grundlegende Konzepte
Aufzählungen sind die Methode von ioBroker, Ihre Geräte zu organisieren. Es gibt zwei Arten:
- Räume : Orte wie „Wohnzimmer“, „Schlafzimmer“, „Küche“
- Funktionen : Gerätetypen wie „Licht“, „Heizung“, „Jalousien“
Intelligente Namen sind die Namen, die Sprachassistenten (Alexa, Google Home) zur Identifizierung Ihrer Geräte verwenden. Der Adapter generiert diese Namen automatisch, indem er Raum- und Funktionsinformationen kombiniert (z. B. „Wohnzimmerleuchte“).
So funktioniert es:
- Sie organisieren Ihre ioBroker-Zustände mithilfe von Aufzählungen in Räume und Funktionen .
- Der Adapter erkennt Geräte automatisch und vergibt aussagekräftige Namen wie „Wohnzimmerbeleuchtung“ oder „Schlafzimmerheizung“.
- Diese virtuellen Geräte sind in Alexa oder Google Home verfügbar.
- Sie können sie mit Sprachbefehlen wie „Alexa, schalte das Wohnzimmerlicht ein“ steuern.
Voraussetzungen
Um den IoT-Adapter zu verwenden, müssen Sie sich zuerst in der ioBroker-Cloud unter https://iobroker.pro registrieren.
Hinweis: Der Feuchtigkeitssensor kann nicht ohne den Temperatursensor angezeigt werden, da Alexa und Google Home solche Geräte nicht unterstützen.
Verweis auf Google API-Typeinstellungen

Einstellungen
Sprache
Diese Einstellung steuert die Sprache, die für automatisch generierte Gerätenamen verwendet wird.
- "Standard" : Intelligente Namen verwenden die Originalnamen aus Ihren ioBroker-Enumerationen (Räume und Funktionen) ohne Übersetzung.
- Spezifische Sprache (z. B. Englisch, Deutsch): Alle bekannten Raum- und Funktionsnamen werden in die ausgewählte Sprache übersetzt.
Beispiel:
- Wenn Ihre Enumeration „Wohnzimmer“ heißt und Sie Englisch als Sprache auswählen, wird das Gerät in Alexa/Google Home als „Wohnzimmerleuchte“ bezeichnet.
- Wenn Sie „Standard“ auswählen, bleibt es bei „Wohnzimmer Light“.
Dies ist nützlich für Demonstrationszwecke oder wenn Sie schnell zwischen Sprachen wechseln möchten.
Die Funktion wird zuerst in den Namen eingefügt.
Diese Einstellung ändert die Reihenfolge der Wörter in automatisch generierten Gerätenamen.
Standardmäßig erstellt der Adapter Gerätenamen, indem er den Raumnamen und den Funktionsnamen kombiniert.
- Wenn nicht ausgewählt (Standardeinstellung) : Der Raum hat Priorität → "Wohnzimmer-Dimmer"
- Wenn aktiviert : Die Funktion hat Vorrang → "Wohnzimmer dimmen"
Warum sollte man das ändern? Manche finden es natürlicher, „Alexa, schalte den Dimmer im Wohnzimmer ein“ statt „Alexa, schalte den Dimmer im Wohnzimmer ein“ zu sagen. Wähle die Variante, die sich in deiner Sprache besser anhört.
Verknüpfe Wörter mit
Diese Einstellung fügt in automatisch generierten Gerätenamen ein Verbindungswort zwischen Raum- und Funktionsnamen hinzu.
Beispiel:
- Ohne diese Einstellung: „Wohnzimmerdimmer“ oder „Wohnzimmerdimmer“
- Mit „in“ als Bindewort: „Dimmer im Wohnzimmer“ oder „Wohnzimmer im Dimmer“
Wichtig: Die Verwendung dieser Funktion wird generell nicht empfohlen , da:
- Sprachassistenten müssen ein zusätzliches Wort erkennen, was zu Missverständnissen führen kann.
- Einfachere Namen funktionieren zuverlässiger mit Sprachbefehlen.
Lassen Sie dieses Feld leer, es sei denn, Sie haben einen bestimmten Grund, Verbindungswörter hinzuzufügen.
AUS-Pegel für Schalter
Manche Gruppen bestehen aus gemischten Geräten: Dimmern und Schaltern. Sie können mit den Befehlen „EIN“ und „AUS“ sowie mit Prozentangaben gesteuert werden. Wenn der Befehl lautet:Set to 30% und dieOFF level is 30% Die Schalter werden also eingeschaltet. Mit dem Befehl „Auf 25 % setzen“ werden alle Schalter ausgeschaltet.
Wenn der Befehl „AUS“ lautet, merkt sich der Adapter den aktuellen Dimmerwert, sofern dieser mindestens 30 % beträgt. Beim anschließenden Befehl „EIN“ schaltet der Adapter den Dimmer nicht auf 100 %, sondern auf den gespeicherten Wert.
Beispiel:
- Angenommen, der OFF-Wert beträgt 30 %.
- Das virtuelle Gerät „Licht“ verfügt über zwei physische Geräte: Schalter und Dimmer .
- Befehl: „Licht auf 40 % stellen“. Der Adapter merkt sich diesen Wert für den Dimmer , stellt ihn auf „Dimmer“ ein und schaltet den Schalter ein.
- Befehl: „Licht ausschalten“. Der Adapter stellt den Dimmer auf 0 % und schaltet den Schalter aus.
- Befehl: "Licht einschalten". Dimmer => 40 %, Schalter => EIN.
- Befehl: „Licht auf 20 % stellen“. Dimmer => 20 %, Schalter => AUS. Der Wert für den Dimmer wird nicht gespeichert, da er unterhalb des AUS-Wertes liegt.
- Befehl: "Licht einschalten". Dimmer => 40 %, Schalter => EIN.
von ON
Sie können das Verhalten des EIN-Befehls für den jeweiligen Zahlenstatus festlegen. Sie können einen bestimmten Wert auswählen oder den letzten von Null verschiedenen Wert verwenden.
Schreiben Sie eine Antwort auf
Für jeden Befehl wird eine Textantwort generiert. Hier können Sie die Objekt-ID definieren, in die dieser Text geschrieben werden soll. Beispiel: sayit.0.tts.text .
Farben
Der Kanal benötigt 3-5 Zustände mit folgenden Rollen:
level.color.saturation- erforderlich für die Kanalerkennung,level.color.hue,level.dimmer,switch- optional,level.color.temperature(optional)
Alexa, set the "device name" to "color"
Alexa, turn the light fuchsia
Alexa, set the bedroom light to red
Alexa, change the kitchen to the color chocolate
Sperren
Um die Möglichkeit zu haben, die Sperren zu verriegeln, muss der Staat die Rolle habenswitch.lock und habennative.LOCK_VALUE um den Sperrstatus zu ermitteln. Falls Sie einen separaten Wert zur Steuerung der Sperre benötigen, können Sie diesen verwenden.native.CONTROL VALUE Die
Alexa, is "lock name" locked/unlocked
Alexa, lock the "lock name"
Wie Gerätenamen generiert werden
Der Adapter erstellt automatisch virtuelle Smart-Home-Geräte, indem er Informationen aus Ihrer ioBroker-Konfiguration kombiniert.
Aufzählungen verstehen
Aufzählungen sind eine in ioBroker integrierte Methode zur Organisation von Geräten:
- Raumaufzählung : Enthält die einzelnen Räume (Wohnzimmer, Badezimmer, Schlafzimmer, Küche usw.).
- Funktionsaufzählung : Enthält Gerätetypen (Licht, Jalousie, Heizung usw.).
Anforderungen an die automatische Erkennung
Damit ein Zustand (Gerät) automatisch in die Smart-Home-Steuerung einbezogen wird, muss er folgende Bedingungen erfüllen:
- Muss in einer Funktionsaufzählung enthalten sein (z. B. "Licht", "Heizung", "Jalousien").
- Die richtige Rolle muss vorhanden sein :
state,switch, oderlevel.*(wielevel.dimmer)- Wenn der gesamte Kanal in der Funktionsaufzählung enthalten ist, benötigen einzelne Zustände keine spezifischen Rollen.
- Muss beschreibbar sein :
common.writemuss seintrue - Besondere Anforderungen:
- Dimmer müssen haben
common.typealsnumber - Heizung muss vorhanden sein
common.unitals°C,°F, oder°KUndcommon.typealsnumber
- Dimmer müssen haben
Wie Namen entstehen
Der Adapter kombiniert Raum- und Funktionsinformationen, um aussagekräftige Namen zu generieren:
Beispiel:
- Sie haben einen Lichtschalter im Wohnzimmer.
- Der Zustand befindet sich in der Aufzählung "Licht" (Funktion) und "Wohnzimmer" (Raum).
- Der generierte Name lautet: „Wohnzimmerleuchte“
Mehrere Geräte desselben Typs: Alle Lampen im Wohnzimmer sind unter dem virtuellen Gerät „Wohnzimmerlicht“ zusammengefasst. Wenn Sie sagen „Alexa, schalte das Wohnzimmerlicht ein“, schalten sich alle Lampen in diesem Raum ein.
Gerät ohne Raum: Wenn ein Zustand nur in einer Funktionsaufzählung (z. B. „Licht“) vorhanden ist, aber keinem Raum zugeordnet ist, wird der ursprüngliche Zustandsname verwendet.
Benutzerdefinierte Namen mit smartName
Sie können die automatische Namensgebung überschreiben:
- Satz
common.smartNameIhrem bevorzugten Namen → Das Gerät wird genau diesen Namen verwenden - Satz
common.smartNameZufalse→ Das Gerät wird von der Smart-Home-Steuerung ausgeschlossen.
Manuelle Konfiguration
Im Konfigurationsdialog können Sie manuell anpassen, welche Zustände einbezogen werden und wie sie gruppiert werden:
Umbenennung:
- Gruppen mit nur einem Bundesstaat : Können umbenannt werden (verwendet den SmartName des Bundesstaates)
- Gruppen mit mehreren Zuständen : Müssen durch Ändern der Aufzählungsnamen umbenannt werden.
Erstellen benutzerdefinierter Gruppen
So erstellen Sie Ihre eigenen Gerätegruppen:
- Verwenden Sie den „Szenen“-Adapter
- Erstellen Sie ein „Skript“ im JavaScript-Adapter.
Ersetzt
Sie können Zeichenfolgen angeben, die in den Gerätenamen automatisch ersetzt werden sollen. Beispiel: Wenn Sie „ersetzt durch“ festlegen:.STATE,.LEVEL so alle.STATE Und.LEVEL wird aus Namen entfernt. Achten Sie auf Leerzeichen. Wenn Sie festlegen.STATE, .LEVEL , Also.STATE Und.LEVEL wird ersetzt und nicht.LEVEL Die
Helfer erklärt
smart.lastObjectIDDieser Zustand wird eingestellt, wenn nur ein Gerät über den Smart-Home-Skill (Alexa, Google Home) gesteuert wird.smart.lastFunctionFunktionsname (falls vorhanden), für den der letzte Befehl ausgeführt wurde.smart.lastRoom: Name des Raums (falls vorhanden), für den der letzte Befehl ausgeführt wurde.smart.lastCommand: Zuletzt ausgeführter Befehl. Der Befehl kann Folgendes sein:true(ON),false(OFF),number(%),-X(decrease at x),+X(increase at X)smart.lastResponseTextantwort auf Befehl. Sie kann an einige gesendet werden.text2speech(sayit) Motor.
Umschaltmodus
Alexa v3 unterstützt den Umschaltmodus. Das bedeutet, dass das Licht ausgeschaltet wird, wenn Sie „Alexa, schalte das Licht ein“ sagen und es bereits eingeschaltet ist.
IFTTT
Google Home
Wenn die folgende Fehlermeldung im Protokoll angezeigt wird:[GHOME] Invalid URL Pro key. Status auto-update is disabled you can set states but receive states only manually Daher müssen Sie den URL-Schlüssel neu generieren:

Dienstleistungen
Es besteht die Möglichkeit, Nachrichten an den Cloud-Adapter zu senden. Wenn Sie anrufen[POST]https://service.iobroker.in/v1/iotService?service=custom_<NAME>&key=<XXX>&user=<USER_EMAIL> und Wert als Nutzlast.
curl --data "myString" https://service.iobroker.in/v1/iotService?service=custom_<NAME>&key=<XXX>&user=<USER_EMAIL>
oder
[GET]https://service.iobroker.in/v1/iotService?service=custom_<NAME>&key=<XXX>&user=<USER_EMAIL>&data=myString
Wenn Sie in den Einstellungen das Feld „Whitelist für Dienste“ aktivieren, wird der Namecustom_test und wird der Dienst mit "custom_test" als Dienstnamen aufgerufen, so wird der Status cloud.0.services.custom_test auf myString gesetzt.
Sie können ein "*" in die Whitelist eintragen, dann sind alle Dienste zugelassen.
Hier finden Sie eine Anleitung zur Verwendung mit Tasker .
Der IFTTT-Dienst ist nur zulässig, wenn ein IFTTT-Schlüssel festgelegt ist.
Reservierte Namen sindifttt ,text2command ,simpleApi ,swagger Diese müssen ohne diecustom_ Präfix.
Sie können die gültige URL für den Dienst auch per Nachricht anfordern:
sendTo('iot.0', 'getServiceEndpoint', { serviceName: 'custom_myService' }, result =>
console.log(JSON.stringify(result)),
);
// Output: {"result":
// {"url": "https://service.iobroker.in/v1/iotService?key=xxx&user=uuu&service=custom_myService",
// "stateID":"iot.0.services.myService",
// "warning":"Service name is not in white list"
// }}
text2command
Sie können schreibentext2command Sie können POST-Anfragen an die in der Whitelist aufgeführten Personen senden.https://service.iobroker.in/v1/iotService?service=text2command&key=<user-app-key>&user=<USER_EMAIL> um Daten zu schreiben intext2command.X.text Variable.
Sie können auch die GET-Methode verwenden.https://service.iobroker.in/v1/iotService?service=text2command&key=<user-app-key>&user=<USER_EMAIL>&data=<MY COMMAND>
X kann in den Einstellungen über die Option „Text2Command-Instanz verwenden“ definiert werden.
Benutzerdefinierte Fertigkeit
Die Antworten für die benutzerdefinierte Fertigkeit können auf zwei Arten verarbeitet werden:
text2commandjavascript
text2command
Wenntext2command Die Instanz wird im Konfigurationsdialog definiert, daher wird die Frage an die Instanz gesendet.
text2command muss so konfiguriert sein, dass der erwartete Ausdruck analysiert und die Antwort zurückgegeben wird.
Javascript
Es besteht die Möglichkeit, die Frage direkt mit dem Skript zu bearbeiten. Diese Funktion ist standardmäßig aktiviert, falls keine Anfrage vorliegt.text2command Instanz ausgewählt.
Wenntext2command Da eine Instanz definiert ist, muss diese Instanz die Antwort liefern, und die Antwort aus dem Skript wird ignoriert.
Der Adapter liefert die Details in zwei Zuständen mit unterschiedlichem Detaillierungsgrad.
smart.lastCommandEnthält den empfangenen Text einschließlich Informationen über die Art der Anfrage (Absicht). Beispiel:askDevice Status Rasenmähersmart.lastCommandObjenthält eine JSON-Zeichenkette, die in ein Objekt mit folgenden Informationen geparst werden kann:wordsdie empfangenen Wörter in einem Array speichernintentEnthält den Abfragetyp. Mögliche Werte sind derzeit:- v1 Fähigkeit:
askDevice,controlDevice,actionStart,actionEnd,askWhen,askWhere,askWho - v2 Fähigkeit:
queryIntentals der vollständige Text erfasst wurdecontrolDeviceals Ausweichlösung bei nur teilweisem Text
- v1 Fähigkeit:
deviceIdEnthält eine Geräte-ID, die das Gerät identifiziert, an das die Anfrage gesendet wurde (bereitgestellt von Amazon). Ist keine Geräte-ID angegeben, ist diese eine leere Zeichenkette.deviceRoomenthält eine zugeordnete Raumkennung, die Sie in der IoT-Admin-Benutzeroberfläche für erfasste Geräte-IDs konfigurieren können.sessionIdEnthält die Sitzungs-ID der Skill-Sitzung; diese sollte bei mehreren gesprochenen Befehlen identisch sein; wird von Amazon bereitgestellt; ist eine leere Zeichenkette, falls keine angegeben wird.userIdEnthält eine Benutzer-ID des Gerätebesitzers (oder später des Nutzers, der mit dem Skill interagiert hat), die von Amazon bereitgestellt wird; ist eine leere Zeichenkette, falls nicht angegeben.userNameEnthält einen zugeordneten Benutzernamen, den Sie in der IoT-Admin-Benutzeroberfläche für gesammelte Benutzer-IDs konfigurieren können.
Weitere Details darüber, wie die Wörter erkannt werden und welche Arten von Anfragen die Alexa Custom Skill unterscheidet, finden Sie unter https://forum.iobroker.net/viewtopic.php?f=37&t=17452 .
Rückgabe des Ergebnisses über den Status smart.lastResponse
Die Antwort muss innerhalb von 200 ms im Zustand gesendet werden.smart.lastResponse und kann eine einfache Textzeichenfolge oder ein JSON-Objekt sein. Handelt es sich um eine Textzeichenfolge, wird dieser Text als Antwort an den Skill gesendet. Handelt es sich bei dem Text um ein JSON-Objekt, können die folgenden Schlüssel verwendet werden:
responseTextmuss den Text enthalten, der an Amazon zurückgesendet werden soll.shouldEndSessionist ein boolescher Wert und steuert, ob die Sitzung nach der gesprochenen Antwort geschlossen wird oder offen bleibt, um weitere Spracheingaben entgegenzunehmen.sessionIdDie Antwort muss die Sitzungs-ID enthalten, für die sie bestimmt ist. Idealerweise sollte diese angegeben werden, um gleichzeitige Sitzungen zu ermöglichen. Wird sie nicht angegeben, wird die erste Sitzung verwendet, die eine Antwort erwartet.
Das Ergebnis wird über eine Nachricht an die IoT-Instanz zurückgegeben.
Die IoT-Instanz akzeptiert außerdem eine Nachricht mit dem Namen „alexaCustomResponse“, die den Schlüssel „response“ und ein Objekt enthält, das die Schlüssel enthalten kann.responseText UndshouldEndSession UndsessionId Wie oben beschrieben. Die IoT-Instanz wird auf die Nachricht nicht antworten!
Beispiel eines Skripts, das Texte verwendet
// important, that ack=true
on({ id: 'iot.0.smart.lastCommand', ack: true, change: 'any' }, obj => {
// you have 200ms to prepare the answer and to write it into iot.X.smart.lastResponse
setState('iot.0.smart.lastResponse', 'Received phrase is: ' + obj.state.val); // important, that ack=false (default)
});
Beispiel eines Skripts, das JSON-Objekte verwendet
// important, that ack=true
on({ id: 'iot.0.smart.lastCommandObj', ack: true, change: 'any' }, obj => {
// you have 200ms to prepare the answer and to write it into iot.X.smart.lastResponse
const request = JSON.parse(obj.state.val);
const response = {
responseText: 'Received phrase is: ' + request.words.join(' ') + '. Bye',
shouldEndSession: true,
sessionId: request.sessionId,
};
// Return response via state
setState('iot.0.smart.lastResponse', JSON.stringify(response)); // important, that ack=false (default)
// or alternatively return as message
sendTo('iot.0', 'alexaCustomResponse', response);
});
Private Cloud
Wenn Sie private Fähigkeiten/Aktionen/навык zur Kommunikation mitAlexa/Google Home/Алиса Sie haben also die Möglichkeit, die Anfragen der IoT-Instanz zu verarbeiten.
Beispiel füryandex alice :
const OBJECT_FROM_ALISA_SERVICE = {}; // object from alisa service or empty object
OBJECT_FROM_ALISA_SERVICE.alisa = '/path/v1.0/user/devices'; // called URL, 'path' could be any text, but it must be there
sendTo('iot.0', 'private', { type: 'alisa', request: OBJECT_FROM_ALISA_SERVICE }, response => {
// Send this response back to alisa service
console.log(JSON.stringify(response));
});
Folgende Typen werden unterstützt:
alexa- Interaktion mit Amazon Alexa oder Amazon Custom Skillghome- mit Google Actions über Google Home interagierenalisa- Handeln mit Yandex Алисаifttt- verhält sich wie IFTTT (eigentlich nicht erforderlich, aber zu Testzwecken)
Yandex Алиса
Nachrichten an die App senden
Ab Version 1.15.x können Sie Nachrichten senden anioBroker Visu Anwendung ( Android und iOS ). Dazu müssen Sie die folgenden Zustände schreiben:
setState('iot.0.app.expire', 60); // optional. Time in seconds
setState('iot.0.app.priority', 'normal'); // optional. Priority: 'high' or 'normal'
setState('iot.0.app.title', 'ioBroker'); // optional. Default "ioBroker"
setState('iot.0.app.message', 'Message text'); // important, that ack=false (default)
// or just one state (this also allows to use payload -> `actions`, `devices` and `openUrl` property)
// only message is mandatory. All other are optional
// Note that, if you are using `actions`or `devices`, the app needs to handle the notification in the background before showing it
// in some scenarios, e.g. low power or spamming to many notifications the OS may decide to not show the notification at all
setState('iot.0.app.message', JSON.stringify({
message: 'Message text',
title: 'ioBroker',
expire: 60,
priority: 'normal',
payload: {
devices: JSON.stringify(['iPhone von Maelle', 'iPhone von Max']), // devices to send the message to, if not given send to all - requires Visu App 1.4.0
openUrl: 'https://www.iobroker.net', // opens a link when clicking on the notification
actions: JSON.stringify([ // actions to respond to the notification - requires Visu App 1.4.0
{ buttonTitle: 'Yes', identifier: 'home:yes' }, // The app will display the button title and on clicking the identifier will be set to the state `iot.0.app.devices.<deviceName>.actionResponse`
{ buttonTitle: 'No', identifier: 'home:no' }
])
}
})); // important, that ack=false (default)
Todo
- Intelligente Namen müssen als Gruppen eine höhere Priorität haben.
Changelog
WORK IN PROGRESS
- (@GermanBluefox) Migrated blockly to TypeScript
7.0.1 (2026-08-06)
- (@GermanBluefox) Migrated to TypeScript 6 and react 19
6.1.3 (2026-06-12)
- (@GermanBluefox) Added support of credentials manager
6.1.0 (2026-06-02)
- (@GermanBluefox) Implemented new feature to select devices from the list and not by enumeration
- (@GermanBluefox) Possibility to send messages to the app directly from the state
- (@GermanBluefox) Migrated google and alisa to TypeScript
6.0.3 (2026-04-23)
- (@GermanBluefox) Allowed to read temperature information via Alexa
6.0.1 (2026-04-07)
- (iobroker-bot) Adapter requires node.js >= 20 now.
- (@GermanBluefox) Removed support for Alexa 2
- (@GermanBluefox) Fixed bug in Alisa with color and motion sensor
- (@GermanBluefox) Validate Discovery response before sending it back
License
The MIT License (MIT)
Copyright (c) 2018-2026 bluefox dogafox@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.