NEWS
BLE Adapter neues Plugins - howto?
-
Hallo zusammen,
ich habe in den letzten Tagen mit Hilfe von Gemini einen Mopeka Pro Bluetooth Gasflaschensensor via Raspi Bluetooth und dem BLE-Adapter in ioBroker integriert.Im ersten Versuch ging es den Weg über ein dediziertes Mopeka Plugin, so wie es ja wahrscheinlich im Adapter vorgesehen ist. Aber egal was man anstellte, das Plugin wurde einfach nicht eingelesen. Alle anderen schon, Xiaomi etc..
Gemini ist dann den Weg gegangen und hat den zugehörigen Code direkt in die _default.js des Adapters mit eingebaut, was auch grundsätzlich funktioniert. Nachteil ist nun natürlich, dass die _default.js bei jedem Update des Adapters wieder überschrieben wird und man die Integration danach neu basteln muss.
Meine Frage in die Runde, oder evtl. auch direkt an @alcalzone :
Gibt es einen Trick dabei, wie man ein neues Plugin zum laufen bekommt, bzw. wie überzeugt man den Adapter es zu laden?Und ja natürlich hatte ich den Namen der Datei in die Adapter-Konfig eingetragen ;-)
Falls das hilft, hier ggf. direkt das Plugin, welches im gleichen Verzeichnis abgelegt ist wie die anderen Plugins:
"use strict"; var import_global = require("../lib/global"); function parseData(raw) { if (raw.length === 1) { // Hier war in der neuen default.js ein Unterschied. // Wir nehmen die Version, die auch in der neuen default.js für andere Daten genutzt wird. return raw; } else { return raw.toString("hex"); } } const plugin = { name: "mopeka_pro", description: "Handles the Mopeka Pro Check LPG Sensor", advertisedServices: [], isHandling: (peripheral) => { return ( peripheral.advertisement && peripheral.advertisement.manufacturerData && peripheral.advertisement.manufacturerData.length >= 10 && peripheral.advertisement.manufacturerData.readUInt16LE(0) === 0x0059 ); }, createContext: (peripheral) => peripheral, defineObjects: (peripheral) => { const stateObjects = []; stateObjects.push({ id: `mopeka_level_raw`, common: { role: "value.level", name: "Mopeka Raw Level", type: "number", unit: "us", read: true, write: false }, native: void 0 }); stateObjects.push({ id: `mopeka_temperature`, common: { role: "value.temperature", name: "Mopeka Temperature", type: "number", unit: "°C", read: true, write: false }, native: void 0 }); stateObjects.push({ id: `mopeka_battery_v`, common: { role: "value.voltage", name: "Mopeka Battery Voltage", type: "number", unit: "V", read: true, write: false }, native: void 0 }); stateObjects.push({ id: `mopeka_battery_percent`, common: { role: "value.battery", name: "Mopeka Battery Percent", type: "number", unit: "%", read: true, write: false }, native: void 0 }); return { device: { common: void 0, native: void 0 }, channels: [], states: stateObjects }; }, getValues: (peripheral) => { const ret = {}; try { const data = peripheral.advertisement.manufacturerData; const rawBat = data.readUInt8(2); let voltage = (rawBat < 10) ? rawBat : ((rawBat & 0x7F) / 32.0 + 2.0); const rawTemp = data.readUInt8(4); const tempC = (rawTemp & 0x3F) - 40; const rawLevel = data.readUInt16LE(3) & 0x3FFF; ret["mopeka_level_raw"] = rawLevel; ret["mopeka_temperature"] = tempC; ret["mopeka_battery_v"] = Math.round(voltage * 100) / 100; ret["mopeka_battery_percent"] = Math.min(100, Math.max(0, Math.round((voltage - 2.2) / 0.8 * 100))); } catch (e) { import_global.Global.adapter.log.error(`[Mopeka Plugin] Parse Error for ${peripheral.address}: ${e}`); } return ret; } }; module.exports = plugin;