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; -
Moin, neben dem Script existiert im Verzeichnis immer auch eine gleichnamige Datei mit Extention .map. Kann es sein das die noch einzurichten und anzupassen ist?
-
Moin, neben dem Script existiert im Verzeichnis immer auch eine gleichnamige Datei mit Extention .map. Kann es sein das die noch einzurichten und anzupassen ist?
@Funcaretta Moin,
ich stecke da selber leider gar nicht so tief drin um Dir diese Frage beantworten zu können.
Grundsätzlich funktioniert das aber so bei mir. Leider gab es bisher ja auch keine andere Antwort auf meine Anfrage.Bzgl. der korrekten Interpretation der Daten vom Mopeka Sensor sind wir allerdings dann erst in den letzten Tagen so weit gekommen, dass es nun halbwegs zuverlässig läuft. Da es sich letztlich um einen Ultraschall-Sensor handelt, der ein Gas-Gemisch-Level auslotet, welches dann auch noch Temperaturschwankungen unterliegt, war das gar nicht so einfach.
Ich habe es nun erstmal wieder im Probebetrieb zur weiteren Beobachtung. -
@Funcaretta Moin,
ich stecke da selber leider gar nicht so tief drin um Dir diese Frage beantworten zu können.
Grundsätzlich funktioniert das aber so bei mir. Leider gab es bisher ja auch keine andere Antwort auf meine Anfrage.Bzgl. der korrekten Interpretation der Daten vom Mopeka Sensor sind wir allerdings dann erst in den letzten Tagen so weit gekommen, dass es nun halbwegs zuverlässig läuft. Da es sich letztlich um einen Ultraschall-Sensor handelt, der ein Gas-Gemisch-Level auslotet, welches dann auch noch Temperaturschwankungen unterliegt, war das gar nicht so einfach.
Ich habe es nun erstmal wieder im Probebetrieb zur weiteren Beobachtung.@Pedder007 kannst du mir einen gefallen tun? Kannst du mal den Bluetooth Adapter installieren, den Sensor versuchen zu pairen und mir die Objekte und das Log zeigen.
Der Bluetooth Adapter ist etwas Generischer als der BLE Adapter und Implementiert verschiedene auf Bluetooth basierende Protokolle wie BThome.Ich hab damit schon mein Smartphone gekoppelt und Mediensteuerung übernommen (leider wird dabei auch das Audio an den Adapter gesendet).