Pittini / iobroker-nodemihome

Steuerung von bisher nicht unterstützten Xiaomi Geräten in Iobroker via node-mihome
MIT License
27 stars 15 forks source link

Module Error #9

Closed jonaschuba closed 3 years ago

jonaschuba commented 3 years ago

Hey, als absoluter Neuling habe ich mich an das Projekt des ioBrokers gewagt, Scheiter der vergeblich bei meinem Xiaomi Luftreiniger.

Ich habe in der Script-Engine "node-mihome" als Zusatzmodul eingetragen und die drei Häkchen gesetzt. Das Skript hab ich anschließend unter Skripte als JS eingefügt und ebenfalls "node-mihome" genannt. Dann bekommm ich jedoch ein Error raus.

Als Anfänger hab ich absolut keine Ahnung davon, wäre aber sehr cool, wenn du mir helfen könntest.

LG

Hier die Infos:

Geändertes im File: `const SkriptVersion = "0.2.8"; const mihome = require'node-mihome';

const username = 'jxxxx@googlemail.com'; const password = 'xxxx'; const options = { country: 'de' }; const refresh = 10000;

const praefix0 = "javascript.0.MiHomeAll";

const logging = true; //Logging aktivieren/deaktivieren `

Error: ` 17:50:05.410 info javascript.0 (6923) Stop script script.js.node-mihome
17:50:05.460 info javascript.0 (6923) Start javascript script.js.node-mihome
17:50:05.487 error javascript.0 (6923) script.js.node-mihome: Error: Cannot find module '/opt/iobroker/node_modules/iobroker.javascript/lib/../../node-mihome'
17:50:05.487 error javascript.0 (6923) at script.js.node-mihome:3:16
17:50:05.487 error javascript.0 (6923) at script.js.node-mihome:843:3
17:50:05.488 info javascript.0 (6923) script.js.node-mihome: Starting AllMyMi V.0.2.8
17:50:05.488 info javascript.0 (6923) script.js.node-mihome: Reaching init
17:50:05.489 info javascript.0 (6923) script.js.node-mihome: registered 0 subscriptions and 0 schedules
17:50:05.490 error javascript.0 (6923) script.js.node-mihome: TypeError: Cannot read property 'miioProtocol' of undefined
17:50:05.490 error javascript.0 (6923) at Init (script.js.node-mihome:571:12)
17:50:05.490 error javascript.0 (6923) at script.js.node-mihome:65:1
17:50:05.490 error javascript.0 (6923) at script.js.node-mihome:843:3
17:51:52.138 info javascript.0 (6923) Stop script script.js.node-mihome
17:51:52.184 info javascript.0 (6923) Start javascript script.js.node-mihome
17:51:52.201 error javascript.0 (6923) script.js.node-mihome: Error: Cannot find module '/opt/iobroker/node_modules/iobroker.javascript/lib/../../node-mihome'
17:51:52.201 error javascript.0 (6923) at script.js.node-mihome:3:16
17:51:52.201 error javascript.0 (6923) at script.js.node-mihome:80:3
17:51:52.202 info javascript.0 (6923) script.js.node-mihome: registered 0 subscriptions and 0 schedules
17:51:52.202 error javascript.0 (6923) script.js.node-mihome: ReferenceError: DefineDevice is not defined
17:51:52.202 error javascript.0 (6923) at script.js.node-mihome:14:1
17:51:52.203 error javascript.0 (6923) at script.js.node-mihome:80:3
17:52:03.356 info javascript.0 (6923) Stop script script.js.node-mihome
17:52:19.340 info javascript.0 (6923) Stop script script.js.node-mihome
17:52:26.672 info javascript.0 (6923) Start javascript script.js.node-mihome
17:52:26.675 error javascript.0 (6923) script.js.node-mihome compile failed: at script.js.node-mihome:2

`

jonaschuba commented 3 years ago

Aktueller Error:

18:03:56.780 info javascript.0 (7467) Start javascript script.js.node-mihome
18:03:56.791 error javascript.0 (7467) script.js.node-mihome compile failed: at script.js.node-mihome:2
Pittini commented 3 years ago

Die node-mihome wird nicht gefunden, das Script fängt gar nicht erst an was zu machen. Bitte mal auf Schreibfehler prüfen und wenn ok, das komplette system mal neustarten.

jonaschuba commented 3 years ago
Nach Neustart tut sich immer noch nichts. Das zeigt der Log an: ` javascript.0 2021-02-04 18:18:48.488 error (1224) at process._tickCallback (internal/process/next_tick.js:68:7)
javascript.0 2021-02-04 18:18:48.488 error (1224) at promise.then (/opt/iobroker/node_modules/standard-as-callback/built/index.js:19:49)
javascript.0 2021-02-04 18:18:48.488 error (1224) at tryCatcher (/opt/iobroker/node_modules/standard-as-callback/built/utils.js:11:23)
javascript.0 2021-02-04 18:18:48.487 error (1224) at client.get (/opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInRedis.js:616:17)
javascript.0 2021-02-04 18:18:48.487 error (1224) at adapter.getForeignState (/opt/iobroker/node_modules/iobroker.javascript/main.js:1238:17)
javascript.0 2021-02-04 18:18:48.487 error (1224) at createProblemObject (/opt/iobroker/node_modules/iobroker.javascript/main.js:1722:17)
javascript.0 2021-02-04 18:18:48.487 error (1224) at prepareScript (/opt/iobroker/node_modules/iobroker.javascript/main.js:1621:37)
javascript.0 2021-02-04 18:18:48.487 error (1224) at createVM (/opt/iobroker/node_modules/iobroker.javascript/main.js:1383:28)
javascript.0 2021-02-04 18:18:48.487 error (1224) at Object.createScript (vm.js:277:10)
javascript.0 2021-02-04 18:18:48.487 error (1224) at new Script (vm.js:83:7)
javascript.0 2021-02-04 18:18:48.486 error (1224) SyntaxError: Unexpected string
javascript.0 2021-02-04 18:18:48.486 error (1224) ^^^^^^^^^^^^^
javascript.0 2021-02-04 18:18:48.486 error (1224) const mihome = require'node-mihome';
javascript.0 2021-02-04 18:18:48.486 error at script.js.node-mihome:2
javascript.0 2021-02-04 18:18:48.486 error (1224) script.js.node-mihome compile failed:

`

Pittini commented 3 years ago

Hm, ich kann Dir da tatsächlich nicht helfen, weils halt kein Fehler im/vom Skript ist. Es scheint als würde die node-mihome entweder nicht oder nicht richtig laufen, das is aber ne systemseitige Sache. Schreib das Problem doch mal ins Forum, das lesen mehr als hier, evtl. hat einer ne Idee. Wichtig sind jetzt genaue Systemdaten, npm Version, js Adapterversion, Betriebssystem? Version? Raspi oder PC? Schreib das im Forum gleich dazu, inkl der Logs von hier, dann muss man weniger nachfragen. https://forum.iobroker.net/topic/39388/vorlage-xiaomi-airpurifier-3h-u-a-inkl-token-auslesen/47

jonaschuba commented 3 years ago

Bildschirmfoto 2021-02-04 um 19 54 31

So, es läuft jetzt, aber anscheinend gibt es keine Verbindung zu den Geräten.

jonaschuba commented 3 years ago

Luftreiniger ist ein 2H. Luftbefeuchtern einMi Smart Antibacterial Humidor

Pittini commented 3 years ago

Ja, das liegt am 2H, der ist zwar im Skript integriert, aber der PullRequest bei node-mihome noch nicht gemerged. Deswegen fehlt Dir da die Definitionsdatei. Die kannste Dir aber selber anlegen. Das hier unter dem Namen zhimi.airpurifier.mc2.js ins Verzeichnis /opt/iobroker/node_modules/iobroker.javascript/node_modules/node-mihome/lib/devices/ Dann Js Controller neustarten, dann sollte das funktionieren.

const Device = require('../device-miio');

module.exports = class extends Device {

  static model = 'zhimi.airpurifier.mc2';
  static name = 'Mi Air Purifier 2H';
  static image = 'https://static.home.mi.com/app/image/get/file/developer_15470144879uw2ei4h.png';

  constructor(opts) {
    super(opts);

    this._propertiesToMonitor = [
      'power',
      'mode',
      'favorite_level',
      'temp_dec',
      'humidity',
      'aqi',
      'average_aqi',
      'buzzer',
      'led',
      'led_b',
      'filter1_life',
      'f1_hour',
      'f1_hour_used',
      'motor1_speed',
      'child_lock',
    ];
  }

  getPower() {
    return this.properties['power'] === 'on';
  }

  getMode() {
    return this.properties['mode'];
  }

  getFavoriteLevel() {
    return this.properties['favorite_level'];
  }

  getTemperature() {
    return this.properties['temp_dec'] / 10;
  }

  getHumidity() {
    return this.properties['humidity'];
  }

  getPM2_5() {
    return this.properties['aqi'];
  }

  getAveragePM2_5() {
    return this.properties['average_aqi'];
  }

  getLed() {
    return this.properties['led'] === 'on';
  }

  getLedB() {
    return this.properties['led_b'];
  }

  getBuzzer() {
    return this.properties['buzzer'] === 'on';
  }

  getFilterRemaining() {
    return this.properties['filter1_life'];
  }

  getFilterTotal() {
    return this.properties['f1_hour'];
  }

  getFilterUsed() {
    return this.properties['f1_hour_used'];
  }

  getMotorSpeed() {
    return this.properties['motor1_speed'];
  }

  getChildLock() {
    return this.properties['child_lock'] === 'on';
  }

  setPower(v) {
    return this.miioCall('set_power', [v ? 'on' : 'off']);
  }

  setMode(v) {
    return this.miioCall('set_mode', [v]);
  }

  setFavoriteLevel(v) {
    return this.miioCall('set_level_favorite', [v]);
  }

  setLed(v) {
    return this.miioCall('set_led', [v ? 'on' : 'off']);
  }

  setLedB(v) {
    return this.miioCall('set_led_b', [v]);
  }

  setBuzzer(v) {
    return this.miioCall('set_buzzer', [v ? 'on' : 'off']);
  }

  setChildLock(v) {
    return this.miioCall('set_child_lock', [v ? 'on' : 'off']);
  }

};
jonaschuba commented 3 years ago

Danke, klappt. Gibts das auch für den Luftbefeuchtern?

jonaschuba commented 3 years ago

Nutzt du die Geräte in Yahka? Kannst du mir von den Zuweisungen ein Screenshot machen? Danke!!!

Pittini commented 3 years ago

Isch abe gar kein Yahka. Kann man das essen? Der Luftbefeuchter sollte eigentlich laufen, zumindest is der in node-mihome drin. Kann aber auch da sein dasses noch nicht gemergede Änderungen gab. Hier das File, abzuspeichern als deerma.humidifier.jsq.js

const Device = require('../device-miio');

module.exports = class extends Device {

  static model = 'deerma.humidifier.jsq';
  static name = 'Mi Smart Antibacterial Humidifier';
  static image = 'https://cdn.awsde0.fds.api.mi-img.com/miio.files/developer_1584598944z7vf4g16.png';

  constructor(opts) {
    super(opts);

    this._propertiesToMonitor = [
      'limit_hum',
      'power',
      'humidity',
      'temperature',
      'buzzer',
      'led',
      'depth',
      'dry',
      'child_lock',
      'mode',
    ];
  }

  getPower() {
    const { power } = this.properties;
    if (power === 'on') return true;
    if (power === 'off') return false;
    return undefined;
  }

  getFanLevel() {
    const fanLevel = parseInt(this.properties['mode'], 10);
    if (fanLevel >= 0) return fanLevel;
    return undefined;
  }

  getTartgetHumidity() {
    return this.properties['limit_hum'];
  }

  getWaterLevel() {
    return this.properties['depth'];
  }

  getTemperature() {
    return this.properties['temperature'];
  }

  getHumidity() {
    return this.properties['humidity'];
  }

  getMode() {
    const { dry } = this.properties;
    if (dry === 'on') return 'dry';
    if (dry === 'off') return 'humidify';
    return undefined;
  }

  getChildLock() {
    const childLock = this.properties['child_lock'];
    if (childLock === 'on') return true;
    if (childLock === 'off') return false;
    return undefined;
  }

  getLedBrightness() {
    const led = this.properties['led_b'];
    if (led >= 0) return led;
    return undefined;
  }

  getBuzzer() {
    const { buzzer } = this.properties;
    if (buzzer === 'on') return true;
    if (buzzer === 'off') return false;
    return undefined;
  }

  setPower(v) {
    return this.miioCall('set_power', [v ? 'on' : 'off']);
  }

  setBuzzer(v) {
    return this.miioCall('set_buzzer', [v]);
  }

  setFanLevel(v) {
    return this.miioCall('set_mode', [v]);
  }

  setTargetHumidity(v) {
    if ([30, 40, 50, 60, 70, 80].includes(v)) {
      return this.miioCall('set_limit_hum', [v]);
    }
    return Promise.reject(new Error(`Invalid target humidity: ${v}`));
  }

  setLedBrightness(v) {
    return this.miioCall('set_led_b', [String(v)]);
  }

  setChildLock(v) {
    return this.miioCall('set_child_lock', [v ? 'on' : 'off']);
  }

  setMode(v) {
    if (v === 'dry') {
      return this.miioCall('set_dry', ['on']);
    }
    if (v === 'humidify') {
      return this.miioCall('set_dry', ['off']);
    }
    return Promise.reject(new Error(`Invalid mode: ${v}`));
  }

};
jonaschuba commented 3 years ago

Mit Yahka meine ich den HomeKit Adapter

Pittini commented 3 years ago

Hab ich trotzdem nicht.

jonaschuba commented 3 years ago

Soweit funktioniert beim Luftreiniger jetzt alles, bis auf die Power Funktion. Egal ob 0 oder 1, der Luftreiniger tut nichts. Child-Lock ist auch nicht ansprechbar, stört mich aber nicht.

Zum Luftbefeuchtern kriege ich gar keine Verbindung.

Pittini commented 3 years ago

Zeile 113 und 119, nimm mal hinten das (val ? 'on' : 'off') raus, so das wie bei den anderen Einträgen nur noch (val) steht, dann sollte power und childlock klappen. Zum Luftbefeuchter kann ich ohne Logs nix sagen.

jonaschuba commented 3 years ago

Die Werte werden aktuell nicht mehr aktualisiert. Ordnerstruktur ist noch da, der Rest nicht mehr. Hast du eine Idee? 021-02-21 14:47:24.860 | error | at UDP.onMessage (dgram.js:921:8)

Bildschirmfoto 2021-02-21 um 15 02 21

Pittini commented 3 years ago

Irgendwelche updates, inbesonders vom JS Controller gemacht?

jonaschuba commented 3 years ago

Nein.

jonaschuba commented 3 years ago

Hab jetzt Javascript neuinstalliert und das Skript neu reingezogen. Vorher alles gelöscht.

Cannot find module 'node-mihome' or its corresponding type declarations.(2307) In der dritten Zeile des Scripts kriege ich den Error.

Pittini commented 3 years ago

Naja, nachdem Du JS neu installiert hast, isses klar das node-mihome weg ist. Musst wieder eintragen und die beiden Files anlegen. Alternativ kannste meinen Fork verwenden, wie, siehe hier: https://github.com/Pittini/iobroker-nodemihome/issues/12

jonaschuba commented 3 years ago

Skript hab ich neu angelegt und den Luftreiniger in den Ordner gezogen.

Pittini commented 3 years ago

Nochmal. Hast Du die node-mihome wieder im JS Adapteradmin eingetragen?

Pittini commented 3 years ago

Da hier nix mehr kommt, mach ich zu.