@helmutlinner Hallo, aller Anfang ist schwer, war bei mir auch so:
Zuerst richtest Du Dir im iobroker Datenpunkte ein, am besten unter dem Objektbaum 0_userdata.0... Dazu nimmst Du folgendes Script und lässt es einmal laufen, danach solltest Du die Datenpunkte sehen:
/* /* Strommessung
*/
var pfad = '0_userdata.0.Strom.hb.Status.',
name_geraet = 'Pzem_hb', // zB Waschmaschine (Achtung keine Umlaute)
beschreibung = 'Strommessung Home Base'; // zB
// Energie
createState(pfad + name_geraet + '.Zaehler.Energy_TotalStartTime', 0, {
name: 'Energie Total StartTime',
desc: 'xx',
type: 'string',
unit: '',
role: '',
read: true,
write: true
});
createState(pfad + name_geraet + '.Zaehler.Energy_Total', 0, {
name: 'Energie total',
desc: 'xx',
type: 'number',
unit: 'kWh',
role: 'value.power.consumption',
read: true,
write: true
});
createState(pfad + name_geraet + '.Zaehler.Energy_Yesterday', 0, {
name: 'Energie gestern',
desc: 'xx',
type: 'number',
unit: 'kWh',
role: 'value.power.consumption',
read: true,
write: true
});
createState(pfad + name_geraet + '.Zaehler.Energy_Today', 0, {
name: 'Energie heute',
desc: 'xx',
type: 'number',
unit: 'kWh',
role: 'value.power.consumption',
read: true,
write: true
});
createState(pfad + name_geraet + '.Zaehler.Period', 0, {
name: 'Periode',
desc: 'xx',
type: 'number',
unit: '',
role: '',
read: true,
write: true
});
// Leistung
createState(pfad + name_geraet + '.Zaehler.Power_Ph1', 0, {
name: 'Leistung Phase 1',
desc: 'xx',
type: 'number',
unit: 'W',
role: 'value.power',
read: true,
write: true
});
createState(pfad + name_geraet + '.Zaehler.Power_Ph2', 0, {
name: 'Leistung Phase 2',
desc: 'xx',
type: 'number',
unit: 'W',
role: 'value.power',
read: true,
write: true
});
createState(pfad + name_geraet + '.Zaehler.Power_Ph3', 0, {
name: 'Leistung Phase 3',
desc: 'xx',
type: 'number',
unit: 'W',
role: 'value.power',
read: true,
write: true
});
// Scheinleistung
createState(pfad + name_geraet + '.Zaehler.ApparentPower_Ph1', 0, {
name: 'Scheinleistung Phase 1',
desc: 'xx',
type: 'number',
unit: 'VA',
role: 'value.power',
read: true,
write: true
});
createState(pfad + name_geraet + '.Zaehler.ApparentPower_Ph2', 0, {
name: 'Scheinleistung Phase 2',
desc: 'xx',
type: 'number',
unit: 'VA',
role: 'value.power',
read: true,
write: true
});
createState(pfad + name_geraet + '.Zaehler.ApparentPower_Ph3', 0, {
name: 'Scheinleistung Phase 3',
desc: 'xx',
type: 'number',
unit: 'VA',
role: 'value.power',
read: true,
write: true
});
// Blindleistung
createState(pfad + name_geraet + '.Zaehler.ReactivePower_Ph1', 0, {
name: 'Blindleistung Phase 1',
desc: 'xx',
type: 'number',
unit: 'VAr',
role: 'value.power',
read: true,
write: true
});
createState(pfad + name_geraet + '.Zaehler.ReactivePower_Ph2', 0, {
name: 'Blindleistung Phase 2',
desc: 'xx',
type: 'number',
unit: 'VAr',
role: 'value.power',
read: true,
write: true
});
createState(pfad + name_geraet + '.Zaehler.ReactivePower_Ph3', 0, {
name: 'Blindleistung Phase 3',
desc: 'xx',
type: 'number',
unit: 'VAr',
role: 'value.power',
read: true,
write: true
});
// Leistungsfaktor
createState(pfad + name_geraet + '.Zaehler.Factor_Ph1', 0, {
name: 'Leistungsfaktor Phase 1',
desc: 'xx',
type: 'number',
unit: '',
role: '',
read: true,
write: true
});
createState(pfad + name_geraet + '.Zaehler.Factor_Ph2', 0, {
name: 'Leistungsfaktor Phase 2',
desc: 'xx',
type: 'number',
unit: '',
role: '',
read: true,
write: true
});
createState(pfad + name_geraet + '.Zaehler.Factor_Ph3', 0, {
name: 'Leistungsfaktor Phase 3',
desc: 'xx',
type: 'number',
unit: '',
role: '',
read: true,
write: true
});
// Frequenz
createState(pfad + name_geraet + '.Zaehler.Frequency_Ph1', 0, {
name: 'Frequenz Phase 1',
desc: 'xx',
type: 'number',
unit: 'Hz',
role: '',
read: true,
write: true
});
createState(pfad + name_geraet + '.Zaehler.Frequency_Ph2', 0, {
name: 'Frequenz Phase 2',
desc: 'xx',
type: 'number',
unit: 'Hz',
role: '',
read: true,
write: true
});
createState(pfad + name_geraet + '.Zaehler.Frequency_Ph3', 0, {
name: 'Frequenz Phase 3',
desc: 'xx',
type: 'number',
unit: 'Hz',
role: '',
read: true,
write: true
});
// Volt
createState(pfad + name_geraet + '.Zaehler.Voltage_Ph1', 0, {
name: 'Spannung Phase 1',
desc: 'xx',
type: 'number',
unit: 'V',
role: '',
read: true,
write: true
});
createState(pfad + name_geraet + '.Zaehler.Voltage_Ph2', 0, {
name: 'Spannung Phase 2',
desc: 'xx',
type: 'number',
unit: 'V',
role: '',
read: true,
write: true
});
createState(pfad + name_geraet + '.Zaehler.Voltage_Ph3', 0, {
name: 'Spannung Phase 3',
desc: 'xx',
type: 'number',
unit: 'V',
role: '',
read: true,
write: true
});
// Strom
createState(pfad + name_geraet + '.Zaehler.Current_Ph1', 0, {
name: 'Strom Phase 1',
desc: 'xx',
type: 'number',
unit: 'A',
role: '',
read: true,
write: true
});
createState(pfad + name_geraet + '.Zaehler.Current_Ph2', 0, {
name: 'Strom Phase 2',
desc: 'xx',
type: 'number',
unit: 'A',
role: '',
read: true,
write: true
});
createState(pfad + name_geraet + '.Zaehler.Current_Ph3', 0, {
name: 'Strom Phase 3',
desc: 'xx',
type: 'number',
unit: 'A',
role: '',
read: true,
write: true
});
// Berechnete
createState(pfad + name_geraet + '.Zaehler.Current', 0, {
name: 'Strom gesamt',
desc: 'xx',
type: 'number',
unit: 'A',
role: 'value.power',
read: true,
write: true
});
createState(pfad + name_geraet + '.Zaehler.Power', 0, {
name: 'Leistung gesamt',
desc: 'xx',
type: 'number',
unit: 'W',
role: 'value.power.consumption',
read: true,
write: true
});
createState(pfad + name_geraet + '.Zaehler.ApparentPower', 0, {
name: 'Scheinleistung gesamt',
desc: 'xx',
type: 'number',
unit: 'VA',
role: 'value.power.consumption',
read: true,
write: true
});
createState(pfad + name_geraet + '.Zaehler.ReactivePower', 0, {
name: 'Blindleistung gesamt',
desc: 'xx',
type: 'number',
unit: 'VAr',
role: 'value.power.consumption',
read: true,
write: true
});
// Zähler
createState(pfad + name_geraet + '.Zaehler.Zaehler_actual', 0, {
name: 'Zählerstand aktuell',
desc: 'xx',
type: 'number',
unit: 'kWh',
role: 'value.power.consumption',
read: true,
write: true
});
createState(pfad + name_geraet + '.Zaehler.Zaehler_Korrektur', 0, {
name: 'Zähler Korrektur (setzen)',
desc: 'xx',
type: 'number',
unit: 'kWh',
role: '',
read: true,
write: true
});
createState(pfad + name_geraet + '.Zaehler.Zaehler_HT', 0, {
name: 'Zählerstand Basiswert HT (setzen)',
desc: 'xx',
type: 'number',
unit: 'kWh',
role: '',
read: true,
write: true
});
createState(pfad + name_geraet + '.Zaehler.Zaehler_NT', 0, {
name: 'Zählerstand Basiswert NT (setzen)',
desc: 'xx',
type: 'number',
unit: 'kWh',
role: '',
read: true,
write: true
});
createState(pfad + name_geraet + '.Zaehler.Zaehler_Basiswert', 0, {
name: 'Zählerstand Basiswert (setzen oder Summe HT/NT)',
desc: 'xx',
type: 'number',
unit: 'kWh',
role: '',
read: true,
write: true
});
createState(pfad + name_geraet + '.Zaehler.Zaehler_Basiswert_Datum', 0, {
name: 'Zählerstand Basiswert Datum/Uhrzeit (setzen)',
desc: 'xx',
type: 'string',
unit: '',
role: '',
read: true,
write: true
});
createState(pfad + name_geraet + '.Zaehler.Zaehler_Pzem_Lastchanged', 0, {
name: 'Datum/Uhrzeit',
desc: 'xx',
type: 'string',
unit: '',
role: '',
read: true,
write: true
});
Als nächstes brauchst Du ein Script, dass den MQTT-String parst (durchsucht) und die Daten auf einzlene Datenpunkte mapped, die wir vorher erzeugt haben.
on('mqtt.0.tele.stromhb.SENSOR', function(dp) {
let tstrom = JSON.parse(dp.state.val);
if(tstrom['Time']) {
let val = tstrom['Time'];
setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Zaehler_Pzem_Lastchanged', val, true);
}
let strom = JSON.parse(dp.state.val).ENERGY;
if(strom['TotalStartTime']) {
let val = strom['TotalStartTime'];
setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Energy_TotalStartTime', val, true);
} if(strom['Total']) {
let val = strom['Total'];
setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Energy_Total', val, true);
} if(strom['Yesterday']) {
let val = strom['Yesterday'];
setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Energy_Yesterday', val, true);
} if(strom['Today']) {
let val = strom['Today'];
setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Energy_Today', val, true);
} if(strom['Period']) {
let val = strom['Period'];
setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Period', val, true);
} if(strom['Power']) {
let val = strom['Power'][0];
setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Power_Ph1', val, true);
} if(strom['Power']) {
let val = strom['Power'][1];
setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Power_Ph2', val, true);
} if(strom['Power']) {
let val = strom['Power'][2];
setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Power_Ph3', val, true);
} if(strom['ApparentPower']) {
let val = strom['ApparentPower'][0];
setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.ApparentPower_Ph1', val, true);
} if(strom['ApparentPower']) {
let val = strom['ApparentPower'][1];
setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.ApparentPower_Ph2', val, true);
} if(strom['ApparentPower']) {
let val = strom['ApparentPower'][2];
setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.ApparentPower_Ph3', val, true);
} if(strom['ReactivePower']) {
let val = strom['ReactivePower'][0];
setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.ReactivePower_Ph1', val, true);
} if(strom['ReactivePower']) {
let val = strom['ReactivePower'][1];
setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.ReactivePower_Ph2', val, true);
} if(strom['ReactivePower']) {
let val = strom['ReactivePower'][2];
setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.ReactivePower_Ph3', val, true);
} if(strom['Factor']) {
let val = strom['Factor'][0];
setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Factor_Ph1', val, true);
} if(strom['Factor']) {
let val = strom['Factor'][1];
setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Factor_Ph2', val, true);
} if(strom['Factor']) {
let val = strom['Factor'][2];
setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Factor_Ph3', val, true);
} if(strom['Frequency']) {
let val = strom['Frequency'][0];
setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Frequency_Ph1', val, true);
} if(strom['Frequency']) {
let val = strom['Frequency'][1];
setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Frequency_Ph2', val, true);
} if(strom['Frequency']) {
let val = strom['Frequency'][2];
setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Frequency_Ph3', val, true);
} if(strom['Voltage']) {
let val = strom['Voltage'][0];
setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Voltage_Ph1', val, true);
} if(strom['Voltage']) {
let val = strom['Voltage'][1];
setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Voltage_Ph2', val, true);
} if(strom['Voltage']) {
let val = strom['Voltage'][2];
setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Voltage_Ph3', val, true);
} if(strom['Current']) {
let val = strom['Current'][0];
setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Current_Ph1', val, true);
} if(strom['Current']) {
let val = strom['Current'][1];
setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Current_Ph2', val, true);
} if(strom['Current']) {
let val = strom['Current'][2];
setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Current_Ph3', val, true);
}
setTimeout(function() {
// Code, der erst nach 5 Sekunden ausgeführt wird
setState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Zaehler_Basiswert", (getState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Zaehler_HT").val + getState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Zaehler_NT").val), true);
setState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Current", (getState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Current_Ph1").val + getState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Current_Ph2").val + getState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Current_Ph3").val), true);
setState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Power", (getState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Power_Ph1").val + getState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Power_Ph2").val + getState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Power_Ph3").val), true);
setState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.ReactivePower", (getState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.ReactivePower_Ph1").val + getState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.ReactivePower_Ph2").val + getState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.ReactivePower_Ph3").val), true);
setState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.ApparentPower", (getState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.ApparentPower_Ph1").val + getState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.ApparentPower_Ph2").val + getState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.ApparentPower_Ph3").val), true);
// setState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Zaehler_actual", (getState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Zaehler_Basiswert").val + getState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Zaehler_Korrektur").val), true);
setState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Zaehler_actual", (getState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Zaehler_Basiswert").val + getState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Energy_Total").val - getState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Zaehler_Korrektur").val), true);
}, 5000);
});
Bei mir heißt der Knoten im MQTT-Adapter stromhb, das musst Du natürlich anpassen. Das Script muss dann dauernd laufen.
Am Ende werdne noch einige Berechnungen vorgenommen, ignoriere das erst mal.
Viel Erfolg