NEWS
[Vorlage] Xiaomi Airpurifier 3H u.a. inkl. Token auslesen.
-
@pittini Beide hatte ich nie zeitgleich aktiviert.
Kann man im Script irgendwo den Pfad angeben, an dem er das Module "suchen" soll?
-
@sebastian-0 Nur das "require" in Zeile 3. Und da nen Pfad....eher nicht, hab ich zumindest noch nie gesehen.
-
Ich benutze dein aktuelles Skript. Aber da scheint ein kleiner Wurm drin zu sein.
Ich hab den Purifier Pro.
Und beim LED Datenpunkt steht im Wert true. Obwohl der Datenpunkt als Zahl angelegt wird.Im Log bekomme ich deswegen diese Warnungen. An welcher Stelle müsste eine Korrektur stattfinden?
javascript.0 2021-04-08 19:43:25.996 warn (5905) at Timeout._onTimeout (/opt/iobroker/node_modules/iobroker.javascript/node_modules/node-mihome/lib/device-miio.js:73:9) javascript.0 2021-04-08 19:43:25.996 warn (5905) at module.exports.loadProperties (/opt/iobroker/node_modules/iobroker.javascript/node_modules/node-mihome/lib/device-miio.js:107:12) javascript.0 2021-04-08 19:43:25.996 warn (5905) at module.exports.emit (events.js:314:20) javascript.0 2021-04-08 19:43:25.995 warn (5905) at module.exports.<anonymous> (script.js.Luft:660:21) javascript.0 2021-04-08 19:43:25.995 warn (5905) at RefreshDps (script.js.Luft:701:45) javascript.0 2021-04-08 19:43:25.991 warn (5905) Wrong type of javascript.0.MiHomeAll.357158741.led: "boolean". Please fix, while deprecated and will not work in next versions.
-
@haselchen Hast Du den Pro oder den Pro H? Denn bei meinem Pro H habe ich beim Datenpunkt
javascript.0.MiHomeAll.318862096.indicator-light.brightness
auch number, das ist aber korrekt. Da ist als Wert 0 (volle Beleuchtung), 1 (schwache Beleuchtung) oder 2 (Beleuchtung aus) möglich.
Gruss, Jürgen
-
@haselchen Erstmal sagste mir Dein GENAUES Model, also das was das Skript unter Info bei dem ausgibt. Dann sehen wir weiter.
-
@sebastian-0 ich habe auch einen Erfolgreich eingebunden
-
-
@haselchen Der scheint da einiges anders zu machen, da kann ich dann leider nicht helfen, sorry.
Gruss, Jürgen
-
@haselchen sagte in [Vorlage] Xiaomi Airpurifier 3H u.a. inkl. Token auslesen.:
der Pro OHNE H
Der reine Pro ist noch absolut ungetestet und steht deshalb auch nicht auf der Liste der unterstützen Geräte bisher. Wenn Du willig bist Tester zu machen sollte der aber voll integrierbar zu sein. Geht irgendwas? Geht gar nix? Wenn was geht, was genau? Was genau geht nicht? Bei welchen Werten?
-
Der Pro ist doch in deinem Skript?!
Zwar nicht 1 zu 1 namentlich aber ab Zeile 172 im Skript:DefineDevice[14] = { // Tested and working - info: {}, model: "zhimi.airpurifier.v7",// https://miot-spec.org/miot-spec-v2/instance?type=urn:miot-spec-v2:device:air-purifier:0000A007:zhimi-v7:1 description: "Mi Air Purifier", setter: { "power": async function (obj, val) { await device[obj].setPower(val) }, "mode": async function (obj, val) { await device[obj].setFanLevel(val) }, "led": async function (obj, val) { await device[obj].setLedBrightness(val) }, "child_lock": async function (obj, val) { await device[obj].setChildLock(val) } }, common: [{ name: "power", type: "boolean", role: "switch", read: true, write: true, min: false, max: true }, { name: "mode", type: "string", read: true, write: true, states: { "auto": "auto", "silent": "silent", "favorite": "favorite" } }, { name: "favorite_level", type: "number", read: true, write: false, min: 0, max: 16 }, { name: "temp_dec", type: "number", role: "value.temperature", read: true, write: false }, { name: "humidity", type: "number", read: true, write: false, min: 0, max: 100, unit: "%" }, { name: "aqi", type: "number", read: true, write: false, unit: "μg/m³" }, { name: "average_aqi", type: "number", read: true, write: false, unit: "μg/m³" }, { name: "led", type: "number", read: true, write: true, min: 0, max: 2, states: { 0: "bright", 1: "dim", 2: "off" } }, { name: "bright", type: "number", read: true, write: false, min: 0, max: 100, unit: "%" }, { name: "volume", type: "number", read: true, write: false, min: 0, max: 100, unit: "%" }, { name: "filter1_life", type: "number", read: true, write: false, min: 0, max: 100, unit: "%" }, { name: "f1_hour", type: "number", read: true, write: false }, { name: "f1_hour_used", type: "number", read: true, write: false }, { name: "motor1_speed", type: "number", read: true, write: false, unit: "rpm" }, { name: "motor2_speed", type: "number", read: true, write: false, unit: "rpm" }, { name: "child_lock", type: "boolean", role: "switch", read: true, write: true, min: false, max: true }]
Nur einen Mi Air Purifier, wie Du ihn oben genannt hast, gibt es nicht.
Es wird alles angelegt und funktioniert auch alles.
Nur der LED Datenpunkt wird als boolean angelegt , obwohl number vorgegeben wird.
Das hatte ich aber schon im vorherigen Post geschrieben. -
@haselchen sagte in [Vorlage] Xiaomi Airpurifier 3H u.a. inkl. Token auslesen.:
{ name: "led", type: "number", read: true, write: true, min: 0, max: 2, states: { 0: "bright", 1: "dim", 2: "off" } },
Dann mach doch bitte mal aus obiger Zeile folgendes:
{ name: "led", type: "boolean", read: true, write: true },
Und vorher bitte den Datenpunkt aus der Objektliste löschen damit er neu angelegt wird.
Dann mal testen.
Sollte es noch ein Problem beim setzen geben, mußt evtl auch noch aus der Zeile 179:
"led": async function (obj, val) { await device[obj].setLedBrightness(val) },
folgendes machen:
"led": async function (obj, val) { await device[obj].setLedBrightness(val ? 'on' : 'off') },
Dann bitte Feedback obs und mit welcher Variante es geklappt hat.
-
@pittini
Leider mit gar keiner. Im Datenpunkt wird weiter true angezeigt.
Geh ich mit dem Cursor drauf, kommt ein Dropdown Menue wo ich die 3 Werte aus dem eigentlichen Datenpunkt auswählen kann (bright dim off)
Wähle ich eines steht es rot im Datenpunkt. Nach aktualisieren der Werte durch das Skript erscheint wieder true im Datenpunkt.javascript.0 2021-04-11 15:53:06.556 error at processImmediate (internal/timers.js:461:21) javascript.0 2021-04-11 15:53:06.556 error at Immediate.<anonymous> (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:5384:37) javascript.0 2021-04-11 15:53:06.556 error at Object.stateChange (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:387:25) javascript.0 2021-04-11 15:53:06.556 error at Object.callback (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:1477:42) javascript.0 2021-04-11 15:53:06.556 error at Object.<anonymous> (script.js.Luft:765:21) javascript.0 2021-04-11 15:53:06.556 error at SetDevice (script.js.Luft:751:64) javascript.0 2021-04-11 15:53:06.556 error at Object.led (script.js.Luft:188:62) javascript.0 2021-04-11 15:53:06.556 error (5905) TypeError: device[obj].setLedBrightness is not a function javascript.0 2021-04-11 15:53:06.552 error (5905) unhandled promise rejection: device[obj].setLedBrightness is not a function Unhandled 2021-04-11 15:53:06.552 error promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch().
Was aber am Schlimmste ist, wenn ich ein Wert aus dem Dropdown Menue nehme, stürzt der Javascript Adapter ab und startet neu.
Edit:
Wo holt er denn dauernd "boolean" her.
Steht nirgends im Skript bei den LED Sachen.javascript.0 2021-04-11 16:25:51.039 warn (11091) at Timeout._onTimeout (/opt/iobroker/node_modules/iobroker.javascript/node_modules/node-mihome/lib/device-miio.js:73:9) javascript.0 2021-04-11 16:25:51.039 warn (11091) at module.exports.loadProperties (/opt/iobroker/node_modules/iobroker.javascript/node_modules/node-mihome/lib/device-miio.js:107:12) javascript.0 2021-04-11 16:25:51.039 warn (11091) at module.exports.emit (events.js:314:20) javascript.0 2021-04-11 16:25:51.039 warn (11091) at module.exports.<anonymous> (script.js.Luft:660:21) javascript.0 2021-04-11 16:25:51.039 warn (11091) at RefreshDps (script.js.Luft:701:45) javascript.0 2021-04-11 16:25:51.037 warn (11091) Wrong type of javascript.0.MiHomeAll.357158741.led: "boolean". Please fix, while deprecated and will not work in next versions.
-
@haselchen sagte in [Vorlage] Xiaomi Airpurifier 3H u.a. inkl. Token auslesen.:
Leider mit gar keiner. Im Datenpunkt wird weiter true angezeigt.
Geh ich mit dem Cursor drauf, kommt ein Dropdown Menue wo ich die 3 Werte aus dem eigentlichen Datenpunkt auswählen kann (bright dim off)
Wähle ich eines steht es rot im Datenpunkt. Nach aktualisieren der Werte durch das Skript erscheint wieder true im Datenpunkt.Wenn Du die 3 Werte auswählen kannst, hast Du entweder den Datenpunkt nicht gelöscht vor der Änderung, oder die Änderung nicht ausgeführt. Und true/false sollte schon passen, deswegen ja die Änderung von Number auf Boolean, so wie es aussieht (in der mihome Definitionsdatei) kann der nur Led an/aus
-
Schonmal danke für Deinen Support.
Hab es nach deiner Anleitung gemacht.
Scheint tatsächlich nur an und aus zu geben.
Wie muss ich das Skript ändern, dass on/off oder true/false in dem Datenpunkt stehen und ich diesen dann auch schalten kann? -
@haselchen sagte in [Vorlage] Xiaomi Airpurifier 3H u.a. inkl. Token auslesen.:
Wie muss ich das Skript ändern, dass on/off oder true/false in dem Datenpunkt stehen und ich diesen dann auch schalten kann?
Hab ich Dir oben beschrieben. Zeig doch mal bitte jetzt Deinen kompletten Definitionsblock aus dem Skript nach den Änderungen.
-
Mache ich sofort.
Könnte es an der Definitionsdatei liegen?
Weil dort LedBrightness aufgeführt ist und dieser Air Purifier nur an/aus kann.
Hab das Gefühl, egal was ich am Skript änder, man müsste bei der Datei vermutlich anfangen?!DefineDevice[14] = { // Tested and working - info: {}, model: "zhimi.airpurifier.v7",// https://miot-spec.org/miot-spec-v2/instance?type=urn:miot-spec-v2:device:air-purifier:0000A007:zhimi-v7:1 description: "Mi Air Purifier", setter: { "power": async function (obj, val) { await device[obj].setPower(val) }, "mode": async function (obj, val) { await device[obj].setFanLevel(val) }, "led": async function (obj, val) { await device[obj].setLedBrightness(val) }, "child_lock": async function (obj, val) { await device[obj].setChildLock(val) } }, common: [{ name: "power", type: "boolean", role: "switch", read: true, write: true, min: false, max: true }, { name: "mode", type: "string", read: true, write: true, states: { "auto": "auto", "silent": "silent", "favorite": "favorite" } }, { name: "favorite_level", type: "number", read: true, write: false, min: 0, max: 16 }, { name: "temp_dec", type: "number", role: "value.temperature", read: true, write: false }, { name: "humidity", type: "number", read: true, write: false, min: 0, max: 100, unit: "%" }, { name: "aqi", type: "number", read: true, write: false, unit: "μg/m³" }, { name: "average_aqi", type: "number", read: true, write: false, unit: "μg/m³" }, { name: "led", type: "boolean", role: "switch", read: true, write: true, min: false, max: true }, { name: "bright", type: "number", read: true, write: false, min: 0, max: 100, unit: "%" }, { name: "volume", type: "number", read: true, write: false, min: 0, max: 100, unit: "%" }, { name: "filter1_life", type: "number", read: true, write: false, min: 0, max: 100, unit: "%" }, { name: "f1_hour", type: "number", read: true, write: false }, { name: "f1_hour_used", type: "number", read: true, write: false }, { name: "motor1_speed", type: "number", read: true, write: false, unit: "rpm" }, { name: "motor2_speed", type: "number", read: true, write: false, unit: "rpm" }, { name: "child_lock", type: "boolean", role: "switch", read: true, write: true, min: false, max: true }]
Hab die Zeilen so geändert, dass ein Switch draus wird, wegen an- und ausschalten. Gibt aber nur Fehlermeldungen.
Hatte oben mal LedBrightness in Led geändert zum Probieren.
2021-04-11 16:53:45.602 - error: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). 2021-04-11 16:53:45.602 - error: javascript.0 (12084) unhandled promise rejection: device[obj].setLed is not a function 2021-04-11 16:53:45.606 - error: javascript.0 (12084) TypeError: device[obj].setLed is not a function
Edit:
Hab gerade gesehen das der Air Purifier Pro mit der gleichen Bezeichnung wie im Skript im node-mihome Ordner unter Devices ist.
static model = 'zhimi.airpurifier.v7'; static name = 'Mi Air Purifier Pro'; static image = 'https://static.home.mi.com/app/image/get/file/developer_1551944689505i5ubr.png';
-
@haselchen Du kannst nicht einfach Funktionsnamen ändern und hoffen das es funktioniert. Die müssen eine Entsprechung in node-mihome Definition haben, sonst gibt eben genau den Fehler den Du bekamst.
Das brightness Thema hat imho eh nix mit Deinem Problem zu tun, man sollte nicht an zuvielen Ecken gleichzeitig schrauben. Versuchen wirs nochmal step by step:- Du löscht jetzt bitte den kompletten Zweig dieses Gerätes aus dem Objektbaum
- Du setzt DIESEN Code anstatt dem vorhandenen in Device 14 ein:
DefineDevice[14] = { // Tested and working - info: {}, model: "zhimi.airpurifier.v7",// https://miot-spec.org/miot-spec-v2/instance?type=urn:miot-spec-v2:device:air-purifier:0000A007:zhimi-v7:1 description: "Mi Air Purifier", setter: { "power": async function (obj, val) { await device[obj].setPower(val) }, "mode": async function (obj, val) { await device[obj].setFanLevel(val) }, "led": async function (obj, val) { await device[obj].setDisplay(val) }, "child_lock": async function (obj, val) { await device[obj].setChildLock(val) } }, common: [{ name: "power", type: "boolean", role: "switch", read: true, write: true, min: false, max: true }, { name: "mode", type: "string", read: true, write: true, states: { "auto": "auto", "silent": "silent", "favorite": "favorite" } }, { name: "favorite_level", type: "number", read: true, write: false, min: 0, max: 16 }, { name: "temp_dec", type: "number", role: "value.temperature", read: true, write: false }, { name: "humidity", type: "number", read: true, write: false, min: 0, max: 100, unit: "%" }, { name: "aqi", type: "number", read: true, write: false, unit: "μg/m³" }, { name: "average_aqi", type: "number", read: true, write: false, unit: "μg/m³" }, { name: "led", type: "boolean", role: "switch", read: true, write: true, min: false, max: true }, { name: "bright", type: "number", read: true, write: false, min: 0, max: 100, unit: "%" }, { name: "volume", type: "number", read: true, write: false, min: 0, max: 100, unit: "%" }, { name: "filter1_life", type: "number", read: true, write: false, min: 0, max: 100, unit: "%" }, { name: "f1_hour", type: "number", read: true, write: false }, { name: "f1_hour_used", type: "number", read: true, write: false }, { name: "motor1_speed", type: "number", read: true, write: false, unit: "rpm" }, { name: "motor2_speed", type: "number", read: true, write: false, unit: "rpm" }, { name: "child_lock", type: "boolean", role: "switch", read: true, write: true, min: false, max: true }] };
Sollte es dann immer noch nicht klappen, bitte logging im Skript aktivieren und das Log dann posten
-
Habs gefunden.
Du hast"led": async function (obj, val) { await device[obj].setLedBrightness(val) },
Hinein gehört
"led": async function (obj, val) { await device[obj].setDisplay(val) },
Laut Definitionsdatei:
/** * Set display status * @param {boolean} v */ setDisplay(v) { return this.miioCall('set_led', [v ? 'on' : 'off']); }
Das Wort Display war es.
Im Grunde macht das ja Spass, wenn es nicht so viel Zeit in Anspruch nehmen würde -
@haselchen sagte in [Vorlage] Xiaomi Airpurifier 3H u.a. inkl. Token auslesen.:
Das Wort Display war es.
Ähm, und was steht in dem von mir geänderten Block oben? Klappt dann jetzt alles?
-
Da haben sich wohl die Antworten überschnitten
Jo, so funktioniert alles.
Keine Fehler mehr im Log und er schaltet an und aus.So macht "Fehlersuche" Spass.
Danke für Deine Geduld und Hilfe!