NEWS
MAX17043 über I2C eines Raspberry Pi UPS auslesen?
-
Hallo zusammen,
habe hier ein Raspberry Pi UPS HAT, diesmal von DFRobots.
https://www.dfrobot.com/product-1932.html
Doku:
https://wiki.dfrobot.com/UPS HAT for Raspberry Pi Zero SKU%3A DFR0528Dort ist ein MAX17043 verbaut, den ich über das Python Programm auslesen kann.
Geht das irgendwie auch in ioBroker? -
@hg6806 sagte: Geht das irgendwie auch in ioBroker?
Hast Du es mal mit dem Adapter iobroker.i2c versucht?
Das Python-Beispiel könnte dann bis zur Log-Ausgabe so aussehen:
const addr = 0x10; // anpassen! sendTo('i2c.0', 'read', { address: addr, register: 0x05, bytes: 1 }, (ret) => { log('Register 5: ' + ret.inspect()); }); sendTo('i2c.0', 'read', { address: addr, register: 0x06, bytes: 1 }, (ret) => { log('Register 6: ' + ret.inspect()); });
-
Danke, habe den I2C Adapter installiert. Ein INA219 hatte auch funktioniert, das war ja auch vorgegeben.
Aber den Max findet er nicht.Das Programm erstelle ich als Javascript?
-
@hg6806 sagte: Das Programm erstelle ich als Javascript?
Ja. Du musst wohl erst mal die Adresse des Max checken.
-
Die Adresse 0x10 passt.
Der Javascript wirft folgenden Fehler:
javascript.0 (2540) TypeError: ret.inspect is not a function at Object.cb (script.js.common.Max:9:30) at change (/opt/iobroker/node_modules/@iobroker/js-controller-adapter/src/lib/adapter/adapter.js:5809:71) at Immediate._onImmediate (/opt/iobroker/node_modules/@iobroker/db-states-redis/lib/states/statesInRedisClient.js:322:37) at processImmediate (internal/timers.js:464:21)
Was muss ich denn im I2C Adapter machen?
-
@hg6806 sagte: Der Javascript wirft folgenden Fehler:
Gib mal direkt die Variable ret als Log aus.
sendTo('i2c.0', 'read', { address: 0x10, register: 0x05, bytes: 1 }, (ret) => { log(ret); });
-
@paul53 sagte in MAX17043 über I2C eines Raspberry Pi UPS auslesen?:
sendTo('i2c.0', 'read', { address: 0x10, register: 0x05, bytes: 1, }, (ret) => { log(ret); });
2022-02-25 22:44:21.648 error Error reading from 0x10
Aber die Adresse ist doch 0x10
Laut Python Prg was auch läuft:import smbus addr=0x10 #ups i2c address bus=smbus.SMBus(1) #i2c-1 vcellH=bus.read_byte_data(addr,0x03) vcellL=bus.read_byte_data(addr,0x04) socH=bus.read_byte_data(addr,0x05) socL=bus.read_byte_data(addr,0x06) capacity=(((vcellH&0x0F)<<8)+vcellL)*1.25 #capacity electricity=((socH<<8)+socL)*0.003906 #current electric quantity percentage print("capacity=%dmV"%capacity) print("electricity percentage=%.2f"%electricity)
-
@hg6806 sagte: Laut Python Prg was auch läuft:
Diesen Teil der Adapter-Anleitung hast Du befolgt?
sudo usermod -aG i2c iobroker
-
@paul53
Hatte ich nicht befolgt.
Nach der Ausführung aber noch das gleiche Problem:javascript.0 2022-02-26 17:37:14.945 info script.js.common.Max: {'address':16,'register':5,'bytes':1} i2c.0 2022-02-26 17:37:14.934 error Error reading from 0x10
Der I2C Adapter findet noch immer kein Device, egal welche Bus-Nr. (=Adresse?)
Das Python Programm läuft aber und gibt Werte aus.
-
@hg6806 sagte: egal welche Bus-Nr. (=Adresse?)
Die Bus-Nr. ist 1 (s. Python). "address" ist die Geräte-Adresse am Bus.
Ich habe keine Ahnung, weshalb das Gerät nicht erkannt wird, denn ich verwende kein I2C.Läuft ioBroker direkt auf dem RasPi mit der UPS?
-
@paul53
Ja, läuft alles direkt auf dem Pi3Habe es hinbekommen!
Man muss im I2C Adapter die Bus-Nr.1 auswählen, speichern+schließen und den Adapter neustarten (müsset automatisch gehen)
Erst dann wird auf Adrs. 10 etwas gefunden.
Ich habe es wie folgt konfiguriert:
und bekomme folgende Werte:
Wie bekomme ich das folgende nun in Blockly oder Javascript umgesetzt?
vcellH=bus.read_byte_data(addr,0x03) vcellL=bus.read_byte_data(addr,0x04) socH=bus.read_byte_data(addr,0x05) socL=bus.read_byte_data(addr,0x06) capacity=(((vcellH&0x0F)<<8)+vcellL)*1.25 #capacity electricity=((socH<<8)+socL)*0.003906 #current electric quantity percentage
-
Ich glaube ich habs.
Nachrichtentechnik Studium schon 20 Jahre her, ein bissel ist doch hängengeblieben.High-Byte *256 (=1 Byte) + Low-Byte, den Rest dann normal berechnen.
-
@hg6806 sagte: bekomme folgende Werte:
Dass die Registerwerte als Datenpunkte vorliegen, vereinfacht die Sache. Vorschlag:
const idR3 = 'i2c.0.0x10.0x03'; const idR4 = 'i2c.0.0x10.0x04'; const idR5 = 'i2c.0.0x10.0x05'; const idR6 = 'i2c.0.0x10.0x06'; const idmV = '0_userdata.USV.Spannung'; // Einheit: mV const idLadung = '0_userdata.USV.Ladung'; // Einheit: % on(idR4, function(dp) { let u = 1.25 * (256 * (getState(idR3).val & 0x0F) + dp.state.val); setState(idmV, Math.round(u), true); }); on(idR6, function(dp) { let level = 0.003906 * (256 * getState(idR5).val + dp.state.val); setState(idLadung, Math.round(level), true); });
-
@paul53
Danke, aber jetzt habe ich das nächste Problem.Ich wollte das selbst berechnen, habe einen Datenpunkt angelegt.
Wie kann ich mehr Parameter definieren? Oder geht das nur noch über "Objektdaten" und nicht mehr schön grafisch?
-
@hg6806 sagte: geht das nur noch über "Objektdaten" und nicht mehr schön grafisch?
Das ist zur Zeit leider so.
-
@paul53
So, läuft nun alles, vielen Dank nochmals!