-
Notifications
You must be signed in to change notification settings - Fork 15
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Cannot read property 'forEach' of undefined #59
Comments
Nach dem einfügen der Datei auch den JS Adapter neu gestartet? |
Sicher, auch versucht komplett ioBroker neu zu starten. Hat beides nicht geholfen. |
Für mich grad nicht wirklich nachvollziehbar. Kanns auch nicht testen, hab das Ding ja nicht. Aber setz Dich doch mal mit dem ersteller der Def Datei in Verbindung, evtl. weis der was: #37 |
Ich hab es in dem Issue mal versucht, eine Email oder sowas von ihm konnte ich nicht finden. |
Du kannst versuchen die Def Datei erstmal auf was sicheres wie on/off zu reduzieren und dann nach und nach wieder Funktionen dazuzunehmen bis Du wieder den Fehler hast, dann weiste was das Problem verursacht. Also den Teil:
ändern zu:
Danach nicht vergessen den JS Controller nach jeder Änderung neuzustarten. Wennde den Fehler schon bei on/off haben solltest, liegts an was anderem, was Du aber nicht testen kannst weil Du scheinbar nur das eine Xiaomi Gerät hast. |
Ich hab das mal getan und weiterhin den selben Fehler. Der Fehler muss also im Script oder der Def Datei liegen. Vielleicht hilft das ja weil es das Debugging sehr einschränkt und es kein äußerer Fehler ist. |
Hallo, Ich habe auch den Mi Smart Fan 2 und genau die gleiche Fehlermeldung. Gibt es inzwischen schon eine Lösung? |
Hey, die Lösung ist relativ einfach: in dem device File vom importierten Modul ist ein Fehler. Wenn die Attribute nicht gefüllt sind checkt er nicht ob das Ding leer ist sondern versucht gleich drüber zu interieren - das führt zu besagtem Problem. Kann man mit optional chaining lösen. Also quasi Variable?.forEach start Variable.forEach |
Das wäre super wenn du das machen würdest, vielen Dank :-) |
Sehr gern, hoffe es klappt bei dir dann auch. Wenn du die änderst in: |
Vielen Dank für deine Mühe, aber leider hat es nicht geklappt. 2022-07-31 12:53:42.254 - error: javascript.0 (1414) script.js.Xiaomi_Home_: TypeError: Cannot read properties of undefined (reading 'forEach')2022-07-31 12:53:42.255 - error: javascript.0 (1414) at /opt/iobroker/node_modules/iobroker.javascript/node_modules/node-mihome/lib/device-miio.js:192:18 |
Das sollte eig nicht passieren.. ich schau es mir nochmal an und Versuch es Mal zu reproduzieren. Ist der Code denn noch wie verändert und hast du den Adapter neugestartet? |
Ja, der ist noch verändert und ich habe sowohl den JS Adapter als auch IOB neu gestartet. Ich habe jetzt in der Datei dmaker.fan.p18.js die Zeile "this._miotSpecType = 'urn:miot-spec-v2:device:fan:0000A005:dmaker-p18:1';" entfernt. Jetzt läuft das Skript durch, allerdings kann ich den Ventilator immer noch nicht an/ausschalten und die Datenpunkte werden auch nicht aktualiesiert. |
Komisch.. ich schau es mir Mal in Ruhe morgen an - falls ich es nicht nachstellen kann, können wir es uns ja ggf. Mal über discord zusammen anschauen |
Super, vielen Dank |
Okay, doof von mir.. Falsche Line. Müsste Line 192 sein: properties.forEach(property => { Zu: properties?.forEach(property => { |
Super von Dir, es war die Line 192 Bei mir funktionieren jetzt Allerdings funktioniert die Rückmeldung nicht. Wenn ich im in der App oder am Gerät etwas ändere (z.B. den Ventilator einschalte) wir die Änderung nicht in den IOB übertragen. Hast du dafür auch eine Lösung? |
Der Rest ist leider falsch gemapped.. muss man in den device files und im Skript anpassen. Um den aktuellen Status hatte ich mich nicht gekümmert, wollte das Gerät nur über Alexa schalten können ohne das es in die China Cloud kommuniziert, deshalb hatte ich mir den Rest nicht mehr angeschaut :/ |
Im Script selber habe ich das entsprechende DefineDevice geändert zu: { // Tested and working
info: {},
model: "dmaker.fan.p18",// https://miot-spec.org/miot-spec-v2/instance?type=urn:miot-spec-v2:device:fan:0000A005:dmaker-p18:1
description: "Mi Smart Standing Fan 2",
setter: {
"fan.on": async function (obj, val) { await device[obj].setPower(val) },
"fan.mode": async function (obj, val) { await device[obj].setMode(val) },
"fan.fan-level": async function (obj, val) { await device[obj].setFanLevel(val) },
"fan.horizontal-swing": async function (obj, val) { await device[obj].setHorizontalSwing(val) },
"fan.horizontal-angle": async function (obj, val) { await device[obj].setHorizontalAngle(val) },
"fan.alarm": async function (obj, val) { await device[obj].setAlarm(val) },
"fan.motor-control": async function (obj, val) { await device[obj].setMotorController(val) },
"physical-controls-locked.physical-controls-locked": async function (obj, val) { await device[obj].setChildLock(val) },
"fan.off-delay-time": async function (obj, val) { await device[obj].setOffDelayTime(val) },
"fan.brightness": async function (obj, val) { await device[obj].setBrightness(val) }
},
common:
[{ name: "fan.on", type: "boolean", role: "switch", read: true, write: true },
{ name: "fan.mode", type: "number", role: "switch", read: true, write: true, min: 0, max: 1, states: { 0: "Straight Wind", 1: "Natural Wind" } },
{ name: "fan.fan-level", type: "number", role: "switch", read: true, write: true, min: 1, max: 4, states: { 1: "Slow", 2: "Middle", 3: "High", 4: "Turbo" } },
{ name: "fan.horizontal-swing", type: "boolean", role: "switch", read: true, write: true },
{ name: "fan.horizontal-angle", type: "number", role: "switch", read: true, write: true, min: 30, max: 140, unit: "°", states: { 30: "30°", 60: "60°", 90: "90°", 120: "120°", 140: "140°" } },
{ name: "fan.status", type: "number", role: "indicator", read: true, write: false, min: 1, max: 100 },
{ name: "fan.alarm", type: "boolean", role: "switch", read: true, write: true },
{ name: "fan.motor-control", type: "number", role: "switch", read: false, write: true, min: 0, max: 2, states: { 0: "None", 1: "Left", 2: "Right" } },
{ name: "physical-controls-locked.physical-controls-locked", type: "boolean", role: "switch", read: true, write: true, min: false, max: true },
{ name: "fan.off-delay-time", type: "number", role: "switch", read: true, write: true, min: 0, max: 480, unit: "m" },
{ name: "fan.brightness", type: "boolean", role: "switch", read: true, write: true }
]
}; Zusätzlich im entsprechenden Device File: const Device = require('../device-miio');
module.exports = class extends Device {
static model = 'dmaker.fan.p18';
static name = 'Mi Smart Standing Fan 2';
static image = 'http://static.home.mi.com/app/image/get/file/developer_1541408255kg3xtr1j.png';
constructor(opts) {
super(opts);
this._miotSpecType = 'urn:miot-spec-v2:device:fan:0000A005:dmaker-p18:1';
this._propertiesToMonitor = [
'fan:on',
'fan:mode',
'fan:fan-level',
'fan:horizontal-swing',
'fan:horizontal-angle',
'fan:status',
'fan:brightness',
'fan:alarm',
'fan:motor-control',
'physical-controls-locked:physical-controls-locked',
'fan:off-delay-time'
];
}
getPower() {
power = this.properties['fan:on'];
if (power === 1) return true;
if (power === 0) return false;
return undefined;
}
getFanLevel() {
const fanLevel = parseInt(this.properties['fan:fan-level'], 10);
if (fanLevel > 0) return fanLevel;
return undefined;
}
getMode() {
return this.properties['fan:mode'];
}
getBrightness() {
return this.properties['fan:brightness'];
}
getHorizontalSwing() {
return this.properties['fan:horizontal-swing'];
}
setHorizontalAngle() {
return this.properties['fan:horizontal-angle'];
}
getAlarm() {
return this.properties['fan:alarm'];
}
getMotorController() {
return this.properties['fan:motor-control'];
}
getChildLock() {
return this.properties['physical-controls-locked:physical-controls-locked'];
}
getOffDelayTime() {
return this.properties['fan:off-delay-time'];
}
setPower(v) {
return this.miotSetProperty('fan:on', v);
}
setMode(v) {
return this.miotSetProperty('fan:mode', v);
}
setFanLevel(v) {
return this.miotSetProperty('fan:fan-level', v);
}
setHorizontalSwing(v) {
return this.miotSetProperty('fan:horizontal-swing', v);
}
setHorizontalAngle(v) {
return this.miotSetProperty('fan:horizontal-angle', v);
}
setBrightness(v) {
return this.miotSetProperty('fan:brightness', v);
}
setAlarm(v) {
return this.miotSetProperty('fan:alarm', v);
}
setMotorController(v) {
return this.miotSetProperty('fan:motor-control', v);
}
setChildLock(v) {
return this.miotSetProperty('physical-controls-locked:physical-controls-locked', v);
}
setOffDelayTime(v) {
return this.miotSetProperty('fan:off-delay-time', v);
}
}; |
Sehr toll, dass Ihr hier eine Lösung gefunden habt. Wäre super nett wenn (wenn keine Fehler in den Tests auftreten) @ChristopherGier daraus nen PullRequest machen könnte. |
Hi. Ich hatte im ioBroker Forum auch schon mal das Problem gemeldet und bin gerade dazu gekommen, es nach dem Thread hier zu testen. Inzwischen habe ich beim Ausführen des Scripts keine Fehler mehr, die Datenpunkte werden korrekt angelegt, aber leider stehen alle Datenpunkte in "Fan" auf "NULL". Ich bekomme also keine Rückmeldung vom Gerät zum Status, und auch das Steuern funktioniert bei mir nicht. IP Adresse, Name etc funktionier Ich hoffe ich habe alle Änderungen korrekt dem Textverlauf entnommen und eingebaut. Habe ich da noch was vergessen?
|
Mit dem Fix von ChristopherGier geht es so halb, ich kann den Fan steuern und bekomme die Werte unter "Info" angezeigt (IP, Name etc.). |
Nicht wirklich. Aber ich kann zumindest mal erklären warum IP, Name etc da sind aber sonst nix. Diese "statischen" Infos wie IP, kommen für alle Geräte bei der Anmeldung am Xiaomi Server für alle Geräte in Deinem Besitz. Jetzt guggt im zweiten Schritt, das Skript, welche Geräte davon, vom Skript unterstützt werden und legt dafür die DAtenpunkte an und erstellt ein Object dass normaler weise dann regelmäßig Datenupdates erhält. Und genau das scheint nicht zu klappen. Warum weis ich nicht wirklich. |
Ich habe im Device File alle Anweisung gelöscht und nach und nach wieder eingeführt. Das hat dann auch geklappt. |
Gibts da inzwischen eine Lösung für? |
Moin, erstmal tolles Skript. leider scheitert meine Einrichtung des Mi Smartfan 2.
Ich hab die Def Datei eingefuegt und ioBroker neugestartet. Er findet diese auch, aber bekommt dann den Error aus dem Title.
Hier mal ein Log:
Leider erschließt sich mir nicht wieso das passiert.
The text was updated successfully, but these errors were encountered: