Nano V3 Datenpunkte Script für MQTT

tritor

Member
Hi,

da der ioBroker Adapter mit vollem ESP32-Support (vor allem der NanoV3) noch nicht fertig ist, habe ich mal die Daten des Nano V3 über MQTT in den ioBroker gebracht. Man benötigt auf jeden Fall die Einbindung des NanoV3 per MQTT in ioBroker.

Dazu benötigt man viele Datenpunkte und auch das Zerlegen des MQTT - data Strings.

Ich habe ein Script für des Erstellen der Datenpunkte erstellt.
Desweiteren habe ich ein Blockly angefertigt, welches die Daten aus dem MQTT - data String in die einzelnen Datenpunkte schreibt.

Für die Datenpunkte, einfach ein js-script erstellen und den Content des files WlanThermoNanoV3DPscript.txt reinkopieren und danach nur 1x ausführen (kann 1 Minute laufen und dann wieder stoppen). Es sollten dann alle Datenpunkte unter: "javascript.0.WLanThermoNano.NanoV3." angelegt sein.

Das Blockly sollte eigentlich zu importieren sein mit dem Content aus dem File WlanThermoNanoV3MQTTdata.txt.
Dann ist auf jeden Fall noch das Feld für den Trigger zu ändern, da dies ja auf meinen NanoV3 MQTT Datenstring zeigt.

Ich bein kein JS Programmierer und ich weiß, es gibt sicher elegantere Varianten, aber es ist ja nur eine Zwischenlösung, bis der Adapter mit ESP32 Support fertig ist.

Grüße
 

Anhänge

  • WlanThermoNanoV3DPscript.txt
    10.8 KB · Aufrufe: 10
  • WlanThermoNanoV3MQTTdata.txt
    842.8 KB · Aufrufe: 10

Fugaaa

New member
HI, also bei mir scheint es zu funktionieren. Allerdings übernimmt er den Typ, beim import nicht richtig. Kennt wer das Problem? ich bekomme jetzt halt ständig warnungen.

Update: also er übernimmt alles richtig. aber ich bekomme Fehlermeldungen wie zu Beispiel:

You are assigning a string to the state "javascript.0.WLanThermoNano.NanoV3.Ch07_temp" which expects a number. Please fix your code to use a number or change the state type to string.

Wobei ja die Temperatur eine Number ist oder sehe ich da etwas falsch?
 
Zuletzt bearbeitet:

Steak-Thermo

Active member
Javascript ist da nicht so. Eine Variable ist da nicht auf String oder Integer festgelegt. Im JSON-Objekt stecken aber erstmal Strings, da wird ja auch keine Definition mitgegeben. Wenn Javascript nun also der Meinung ist, dass es sich um einen String handelt, wird eben ein String gespeichert und ioBroker meckert dann, dass der state nicht passt. Probiere mal, im Blockly ein "nach Zahl" aus dem Konvertierung-Block vorzuschalten. Ich gehe davon aus, dass es dann klappt. Bei den ersten beiden Werten (RSSI und SOC) wurde das ja auch gemacht.

Ich habe am WE mal quick and dirty was zusammengeschustert und das gerade etwas erweitert. Das kannst du ja vielleicht als Grundlage für eine Programmierung in javascript nehmen. Ich werde mich da demnächst auch mal ransetzen, muss aber schauen, dass ich dafür mal Zeit finde.
Der Code kann noch nix, außer ein paar Daten aus dem JSON-Objekt lesen und in der Konsole ausgeben. Den habe ich übrigens zum Teil hier bei @Markus7501 geklaut (Danke, hat mir sehr geholfen!). Zum Schreiben muss aber nur je ein setState ergänzt werden:
setState(Pfad, Wert);

Das Anlegen der Datenpunkte kann am Anfang erfolgen. Mit entsprechender Abfrage kann es auch jedes Mal mit ausgeführt werden. Evtl. geschickt in einer Schleife für die einzelnen Kanäle. Pfad ist der Pfad *unterhalb* javascript.0. (Die Werte werden immer unterhalb angelegt. Ich weiß nicht, ob es stört, wenn der komplette Pfad angegeben wird. Ich hatte da mal Schwierigkeiten. Kann aber auch an was anderem gelegen haben.) Wert ist der Wert, der geschrieben werden soll und Objekt beinhaltet dann Name, Typ, Rolle und evtl. Einheit.
Das ist kein Code, den ich ausprobiert habe. Stecken also bestimmt noch ein paar Syntaxfehler drin und die Werte sollten auch nochmal auf Korrektheit geprüft werden, damit die Pfade nicht gemixt sind.

//Init
//1. Benötigte Variabelen als Einstellungen, weden später in einer Variablen gesichert und können zur Laufzeit verändert werden
var device = "MINI-ESP"; //Name Mini
var pathmqtt = "mqtt.0.WLanThermo."; //MQTT Name
var pathdata = pathmqtt + device + ".status.data"; //MQTT volständiger Pfad
var pathjs = "javascript.0.Grill."; //genera iobroker path
var pathChannels = pathjs + device + ".channel"; // path to store chanels
var pathPitmaster = pathjs + device + ".pitmaster"; // path to store pitmaster
var pathSettings= pathjs + device +".settings"; // settings path in iobroiker
var max_channels = 12; // anzahl der verfügbaren Kanäle
const DP = "WLanThermoNano.NanoV3.";

// Dient der Logging-Ausgabe
function info(Ausgabetext)
{
console.log(Ausgabetext);
}

function StateAnlegen(Pfad, Wert, Objekt)
{
if ((getState(Pfad).val) == null)
{
createState(Pfad, Wert, Objekt);
}
}

//System
StateAnlegen(DP+"Charge" ,"", {name:"NanoV3_Charge", type: "boolean", role: "state" });
StateAnlegen(DP+"RSSI" ,"", {name:"NanoV3_RSSI", type: "number", role: "state" });
StateAnlegen(DP+"SOC" ,"", {name:"NanoV3_SOC", type: "number", role: "state" });
StateAnlegen(DP+"Unit" ,"", {name:"NanoV3_Unit", type: "string", role: "state" });
StateAnlegen(DP+"Online" ,"", {name:"NanoV3_Online", type: "string", role: "state" });

//Pitmaster
StateAnlegen(DP+"id" ,"", {name:"NanoV3_id", type: "number", role: "state" });
StateAnlegen(DP+"pid" ,"", {name:"NanoV3_pid", type: "number", role: "state" });
StateAnlegen(DP+"value" ,"", {name:"NanoV3_value", type: "number", role: "state" });
StateAnlegen(DP+"set" ,"", {name:"NanoV3_set", type: "number", role: "state" });
StateAnlegen(DP+"typ" ,"", {name:"NanoV3_typ", type: "string", role: "state" });
StateAnlegen(DP+"set_color" ,"", {name:"NanoV3_set_color", type: "string", role: "state" });
StateAnlegen(DP+"value_color" ,"", {name:"NanoV3_value_color", type: "string", role: "state" });

//Channels
StateAnlegen(DP+"Ch01_nbr" ,"", {name:"NanoV3_Ch1_number", type: "number" , role: "state" });
StateAnlegen(DP+"Ch01_name" ,"", {name:"NanoV3_Ch1_name", type: "string" , role: "state" });
StateAnlegen(DP+"Ch01_typ" ,"", {name:"NanoV3_Ch1_typ", type: "number" , role: "state" });
StateAnlegen(DP+"Ch01_temp" ,"", {name:"NanoV3_Ch1_temp", type: "number" , role: "state", unit: "°C" });
[...]

// Hier wird der Code hinterlegt, der ausgeführt werden soll, wen sich etwas in den Daten ändert (ne: nur bei Änderungen).
on({id: 'mqtt.0.WLanThermo.NANO-98f4ab755a08.status.data', change: "ne"}, function (obj) {
var jr;
// Werte aus MQTT lesen und in alle Kanäle (max 12 Schreiben)
try
{
jr = JSON.parse(getState(pathdata).val);
}
catch (e)
{
//console.error('Cannot parse: ' + getState(pathdata).val);
return;
}
// Werte auslesen und ablegen für die Kanäle
for (var i = 0; i < max_channels; i++)
{
// hier müsste dann jeweils ein setState hin:
setState(DP + "Ch0" + i +"_temp", parseFloat(jr.channel.temp));
// Ist noch nicht ganz ausgereift, geht nämlich nur bis 9. Danach passt der Name nicht mehr.
// parseFloat ist das casten in eine Zahl. Natürlich nur für Zahlen notwendig.
info(jr.channel.temp);
info(jr.channel.name);
info(jr.channel.min);
info(jr.channel.max);
info(jr.channel.typ);
info(jr.channel.alarm);
info(jr.channel.color);
info(jr.channel.connected);
info(jr.channel.fixed);
}
});
 
Oben Unten