ioBroker - WLANThermo Nano

Und hast du schon ein Script / eine Idee um die MQTT Antwort zu zerlegen? Und ggf eine neue zu senden?
komme derzeit nicht dazu mich damit zu befassen (immer nur 10min und dann möchte mein Sohn etwas...)
 

tritor

Member
@Steffen,

Im system.adapter.wlanthermo-nano.0 Eintrag gibt es einen Datenpunkt connected.
Dieser geht nach Einschalten und erfolgreicher Verbindung des Nano bei mir auch wie erwartet auf true.

Beim Ausschalten des Nano bleibt der Status auf true und zwar über längere Zeit. Weisst du was hier der Trigger ist und wann der Datenpunkt auf false geht?

Würde diese Info gerne verwenden um den Adapter auszuschalten sobald der Nano ausgeschaltet wird.
Als Trigger für das Einschalten und das Starten des Adapters bin ich immer noch bei den Datenpunkt en des Asuswrt Adapters, da ist mir noch nichts besseres eingefallen.

Edit: soweit ich das beobachtet habe bezieht sich der Connect Status nicht auf die aktuelle Netzwerkverbindung, sondern auf den Status der Instanz (Adapter). Kannst du das bestätigen?

Grüsse
 
Zuletzt bearbeitet:
Ich denke, da kannst du nur auf den MQTT Zeitstempel achten.
wenn danken neuer nach Zeit x kommt kannst du von disconnected ausgehen.
 

s.ochs

BOFH
Teammitglied
Das JSON zerlegen ginge z. B. so:

Javascript:
var device = "NANO-xxx";
var pathmqtt = "mqtt.0.WLanThermo.";
var pathdata = pathmqtt + device + ".status.data";

var pathjs = "javascript.0.WLANThermo."; 
var pathChannels = pathjs + device + ".channel";

// Eventbasierte Function zum Auslesen des data-JSON  
on({id: pathdata, change: "any"}, function (obj) {
       
   try {
       jr = JSON.parse(getState(pathdata).val);
    }
   catch (e) {
           console.error('Cannot parse: ' + getState(pathdata).val);
           return;
    }

    // Werte auslesen und ablegen
    for (var i = 0; i < 8; i++) {
        setState(`${pathChannels}.${i+1}.temp`,  (jr.channel[i].temp));
        setState(`${pathChannels}.${i+1}.name`,  (jr.channel[i].name));
        setState(`${pathChannels}.${i+1}.min`,   (jr.channel[i].min));
        setState(`${pathChannels}.${i+1}.max`,   (jr.channel[i].max));
        setState(`${pathChannels}.${i+1}.typ`,   (jr.channel[i].typ));
        setState(`${pathChannels}.${i+1}.alarm`, (jr.channel[i].alarm));
        setState(`${pathChannels}.${i+1}.color`, (jr.channel[i].color));
    }
   
  console.log('Data ausgelesen');
   
});
Datenpunkte müssen aber vorher angelegt werden.

@Steffen,

Im system.adapter.wlanthermo-nano.0 Eintrag gibt es einen Datenpunkt connected.
Dieser geht nach Einschalten und erfolgreicher Verbindung des Nano bei mir auch wie erwartet auf true.

Beim Ausschalten des Nano bleibt der Status auf true und zwar über längere Zeit. Weisst du was hier der Trigger ist und wann der Datenpunkt auf false geht?
Zum Adapter selbst kann ich leider nicht viel sagen.
Ich habe heute mit Dutchmann gesprochen. Er bekommt Ende der Woche ein ESP32-Version zum Testen von mir, dann wird er in den nächsten Tagen den Adapter entsprechend anpassen.
 
HI Steffen (@s.ochs );
ich habe gerade beim auswerten Festgestellt, dass sich der Connected Status im MQTT nie ändert. Egal ob ein Thermometer angeschlossen ist oder nicht ( an den Buchsen) steht dieser immer auf false.
Und als Alarm wird auch kein Aktueller alarm ausgegeben, sondern was eingestellt ist ( Alarm = 1 --> Summer , Alarm =2 --> Push , Alarm = 3 --> Summer und Push )
Woher bekomme ich jetzt einen Info ob ein Alarm vorliegt?

Hier das MQTT Log:
{"system":{"time":"1597736351","unit":"C","rssi":-60,"online":2},"channel":[{"number":1,"name":"Pitmaster","typ":0,"temp":24.90,"min":79.00,"max":88.00,"alarm":0,"color":"#0000FF","fixed":false,"connected":false},{"number":2,"name":"Roastbeef","typ":0,"temp":999.00,"min":10.00,"max":56.00,"alarm":0,"color":"#22B14C","fixed":false,"connected":false},{"number":3,"name":"Kanal 3","typ":0,"temp":999.00,"min":90.00,"max":110.00,"alarm":0,"color":"#EF562D","fixed":false,"connected":false},{"number":4,"name":"Kanal4","typ":0,"temp":999.00,"min":10.00,"max":350.00,"alarm":0,"color":"#FFC100","fixed":false,"connected":false},{"number":5,"name":"Kanal 5","typ":0,"temp":999.00,"min":77.00,"max":90.00,"alarm":0,"color":"#A349A4","fixed":false,"connected":false},{"number":6,"name":"Kanal5","typ":0,"temp":999.00,"min":105.00,"max":115.00,"alarm":0,"color":"#804000","fixed":false,"connected":false},{"number":7,"name":"Kanal 7","typ":0,"temp":999.00,"min":10.00,"max":35.00,"alarm":0,"color":"#5587A2","fixed":false,"connected":false},{"number":8,"name":"Kanal8","typ":0,"temp":999.00,"min":10.00,"max":53.00,"alarm":0,"color":"#FF9B69","fixed":false,"connected":false},{"number":9,"name":"Kanal 9","typ":15,"temp":999.00,"min":10.00,"max":35.00,"alarm":0,"color":"#5C7148","fixed":true,"connected":false},{"number":10,"name":"Kanal 10","typ":15,"temp":999.00,"min":10.00,"max":35.00,"alarm":0,"color":"#5C7148","fixed":true,"connected":false},{"number":11,"name":"Kanal 11","typ":17,"temp":999.00,"min":10.00,"max":35.00,"alarm":0,"color":"#5C7148","fixed":true,"connected":false},{"number":12,"name":"Kanal 12","typ":17,"temp":999.00,"min":10.00,"max":54.00,"alarm":0,"color":"#5C7148","fixed":true,"connected":false}],"pitmaster":{"type":["off","manual","auto"],"pm":[{"id":0,"channel":5,"pid":2,"value":100,"set":88.00,"typ":"manual","set_color":"#ff0000","value_color":"#000000"},{"id":1,"channel":2,"pid":2,"value":0,"set":50.00,"typ":"off","set_color":"#FE2EF7","value_color":"#848484"}]}}
 
Zuletzt bearbeitet:
Hier mal mein Script zum auslesen ( habe die slebe functuion wie du genutzt).
Es fehlt noch Pitmaster und Settings zur Laufzeit auslesen ( falls es Änderrungen geben sollte)

Update !! ALLE Warns zur Laufzeit entfernt !!

JAVASCRIPT: ioBroker


//Init
//1. Benötigte Variabelen als Einstellungen, weden später in einer Variabelen geseiuchert und können zur Laufzeit verändert werden
var device = "MINI-2462abc32738"; //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_chanels = 12; // anzahl der verfügbaren Kanäle
var debug = false ; // debug write infos

// save Settings
createState(pathSettings +'.device', device, {type: 'string',name: 'Grill.0.Settings.device'});
createState(pathSettings +'.pathmqtt', pathmqtt, {type: 'string',name: 'Grill.0.Settings.pathmqtt'});
createState(pathSettings +'.fullpath', pathdata, {type: 'string',name: 'Grill.0.Settings.fullpath'});
createState(pathSettings +'.pathjs', pathjs, {type: 'string',name: 'Grill.0.Settings.pathjs'});
createState(pathSettings +'.pathChannels', pathChannels, {type: 'string',name: 'Grill.0.Settings.pathChannels'});
createState(pathSettings +'.pathPitmaster', pathPitmaster, {type: 'string',name: 'Grill.0.Settings.pathPitmaster'});
createState(pathSettings +'.max_chanels', max_chanels, {type: 'int',name: 'Grill.0.Settings.max_chanels'});

//2. Alle Kanäle autonmatisch anlegen.

function create_varaiables (debug, max_chanels)

{
var variab =`${pathChannels}.${max_chanels}.alarm`;

if (debug == true){ log ("Check variabels");log("Varaib12Alarm is :" + (getState(variab).val)); log ("variab is :" + variab);}
//Prüfen ob alle Variabelen schon existieren, wennn nicht neu anlegen
if ((getState(variab).val)==null)
{
if (debug == true){ log ("Varaib 12 not found, create all");}
//Variabelen anlegen für max 12 Kanäle ( je nach definition oben)
for (var i = 0; i < max_chanels; i++)
{


createState(`${pathChannels}.${i+1}.alarm`, 0, {type: 'number',name: `${pathChannels}.${i+1}.alarm`});
createState(`${pathChannels}.${i+1}.temp_min`, 0, {type: 'number',name: `${pathChannels}.${i+1}.temp_min`});
createState(`${pathChannels}.${i+1}.temp_max`, 0, {type: 'number',name: `${pathChannels}.${i+1}.temp_max`});
createState(`${pathChannels}.${i+1}.actual_temp`, 0, {type: 'number',name: `${pathChannels}.${i+1}.actual_temp`});
createState(`${pathChannels}.${i+1}.color`, 0, {type: 'string',name: `${pathChannels}.${i+1}.color`});
createState(`${pathChannels}.${i+1}.type`, 0, {type: 'number',name: `${pathChannels}.${i+1}.type`});
createState(`${pathChannels}.${i+1}.connected`, false, {type: 'boolean',name: `${pathChannels}.${i+1}.connected`});
createState(`${pathChannels}.${i+1}.fixed`, false, {type: 'boolean',name: `${pathChannels}.${i+1}.fixed`});
createState(`${pathChannels}.${i+1}.name`, "name", {type: 'string',name: `${pathChannels}.${i+1}.name`});
}
return;

}
}



function read_vaues_and_set (debug, max_chanels)
{ // Werte aus MQTT lesen und in alle Kanäle ( max 12 Schreiben)
log ("pathdata is :" + pathdata);
log (getState(pathdata).val);

try {
jr = JSON.parse(getState(pathdata).val);
}
catch (e) {
console.error('Cannot parse: ' + getState(pathdata).val);
return;
}

// Werte auslesen und ablegen
for (var i = 0; i < max_chanels; i++) {
log("actual_temp is: jr.channel.temp")
setState(`${pathChannels}.${i+1}.actual_temp`, (jr.channel.temp));
setState(`${pathChannels}.${i+1}.name`, (jr.channel.name));
setState(`${pathChannels}.${i+1}.temp_min`, (jr.channel.min));
setState(`${pathChannels}.${i+1}.temp_max`, (jr.channel.max));
setState(`${pathChannels}.${i+1}.type`, (jr.channel.typ));
setState(`${pathChannels}.${i+1}.alarm`, (jr.channel.alarm));
setState(`${pathChannels}.${i+1}.color`, (jr.channel.color));
setState(`${pathChannels}.${i+1}.connected`, (jr.channel.connected));
setState(`${pathChannels}.${i+1}.fixed`, (jr.channel.fixed));
}

if (debug == true) {console.log('Data ausgelesen');}

}




function main(debug)
{ log ("debug is :" + debug)
create_varaiables(debug, max_chanels);
read_vaues_and_set(debug, max_chanels);

}
//Event based start
on({id: pathdata, change: "any"}, function (obj) {
main(debug);
});
 
Zuletzt bearbeitet:

s.ochs

BOFH
Teammitglied
ich habe gerade beim auswerten Festgestellt, dass sich der Connected Status im MQTT nie ändert. Egal ob ein Thermometer angeschlossen ist oder nicht ( an den Buchsen) steht dieser immer auf false.
Ok, du beziehst dich auf das "connected" im Kanal-Objekt. Das beschreibt zusammen mit "fixed" um welche Fühlerart es sich handelt. Fixierte Kanäle sind alle außer NTC/PTC, da hier der Fühlertyp für die Berechnung vorgegeben ist. Connected sind wiederum BT-Fühler.

Und als Alarm wird auch kein Aktueller alarm ausgegeben, sondern was eingestellt ist ( Alarm = 1 --> Summer , Alarm =2 --> Push , Alarm = 3 --> Summer und Push )
Woher bekomme ich jetzt einen Info ob ein Alarm vorliegt?
Richtig, die API gibt nicht aus ob ein Alarm vorliegt oder nicht, nur welche Form des Alarms gewählt wurde. Der Alarm wird am jeweiligen Endsystem selbst berechnet und kann so unabhängig verwaltet werden. Du hast ja alles um den Alarm zu bestimmen, also aktuellen Messwert und die Grenzwerte.

Es fehlt noch Pitmaster und Settings zur Laufzeit auslesen ( falls es Änderrungen geben sollte)
Selbes Schema, nur drauf achten, was Objekt und was Array ist.
 
HI,
danke für die Schnelle Antwort. Hatte Angenommen bei Alarm steht ne 1 bei Aktiven Alarm.
Pitmaster: Danke bin ich gerade dabei. Entferne aber erstmal alle Warnungen im iobroker. Danach stelle ich das neue Script online.
 
So fertig.
So sieht es im IOBROKER bei den Objekten aus:



1597742376630.png







1597742431722.png





Hier das Javascript:
(ROT = Anpassen )



//Init
//1. Benötigte Variabelen als Einstellungen, weden später in einer Variabelen geseiuchert und können zur Laufzeit verändert werden
var device = "MINI-2xxxxxxxxxx"; //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 pitmaster_connected
= 2 ; // number of connected Pitmaster modules
var max_chanels = 12; // anzahl der verfügbaren Kanäle
var debug = false ; // debug write infos
// save Settings
createState(pathSettings +'.device', device, {type: 'string',name: 'Grill.0.Settings.device'});
createState(pathSettings +'.pathmqtt', pathmqtt, {type: 'string',name: 'Grill.0.Settings.pathmqtt'});
createState(pathSettings +'.fullpath', pathdata, {type: 'string',name: 'Grill.0.Settings.fullpath'});
createState(pathSettings +'.pathjs', pathjs, {type: 'string',name: 'Grill.0.Settings.pathjs'});
createState(pathSettings +'.pathChannels', pathChannels, {type: 'string',name: 'Grill.0.Settings.pathChannels'});
createState(pathSettings +'.pathPitmaster', pathPitmaster, {type: 'string',name: 'Grill.0.Settings.pathPitmaster'});
createState(pathSettings +'.max_chanels', max_chanels, {type: 'int',name: 'Grill.0.Settings.max_chanels'});
//2. Alle Kanäle autonmatisch anlegen.
function create_varaiables (debug, max_chanels,pitmaster_connected)

{
var variab =`${pathChannels}.${max_chanels}.alarm`;

if (debug == true){ log ("Check variabels");log("Varaib12Alarm is :" + (getState(variab).val)); log ("variab is :" + variab);}
//Prüfen ob alle Variabelen schon existieren, wennn nicht neu anlegen
if ((getState(variab).val)==null)
{
if (debug == true){ log ("Varaib 12 not found, create all");}
//Variabelen anlegen für max 12 Kanäle ( je nach definition oben)
for (var i = 0; i < max_chanels; i++)
{

createState(`${pathChannels}.${i+1}.alarm`, 0, {type: 'number',name: `${pathChannels}.${i+1}.alarm`});
createState(`${pathChannels}.${i+1}.temp_min`, 0, {type: 'number',name: `${pathChannels}.${i+1}.temp_min`});
createState(`${pathChannels}.${i+1}.temp_max`, 0, {type: 'number',name: `${pathChannels}.${i+1}.temp_max`});
createState(`${pathChannels}.${i+1}.actual_temp`, 0, {type: 'number',name: `${pathChannels}.${i+1}.actual_temp`});
createState(`${pathChannels}.${i+1}.color`, 0, {type: 'string',name: `${pathChannels}.${i+1}.color`});
createState(`${pathChannels}.${i+1}.type`, 0, {type: 'number',name: `${pathChannels}.${i+1}.type`});
createState(`${pathChannels}.${i+1}.connected`, false, {type: 'boolean',name: `${pathChannels}.${i+1}.connected`});
createState(`${pathChannels}.${i+1}.fixed`, false, {type: 'boolean',name: `${pathChannels}.${i+1}.fixed`});
createState(`${pathChannels}.${i+1}.name`, "name", {type: 'string',name: `${pathChannels}.${i+1}.name`});
}
}

// Variabelen für den Pitmaster
var variab =`${pathPitmaster}.${pitmaster_connected}.status`;
if ((getState(variab).val)==null)
{
for (var i = 0; i < pitmaster_connected; i++)
{

createState(`${pathPitmaster}.${i+1}.pitmaster`, 0, {type: 'number',name: `${pathPitmaster}.${i+1}.pitmaster`});
createState(`${pathPitmaster}.${i+1}.connected_chanel`, 0, {type: 'number',name: `${pathPitmaster}.${i+1}.connected_chanel`});
createState(`${pathPitmaster}.${i+1}.pid`, 0, {type: 'number',name: `${pathPitmaster}.${i+1}.pid`});
createState(`${pathPitmaster}.${i+1}.current_value`, 0, {type: 'number',name: `${pathPitmaster}.${i+1}.current_value`});
createState(`${pathPitmaster}.${i+1}.set_temp`, 0, {type: 'number',name: `${pathPitmaster}.${i+1}.set_temp`});
createState(`${pathPitmaster}.${i+1}.status`, "0", {type: 'string',name: `${pathPitmaster}.${i+1}.status`});
createState(`${pathPitmaster}.${i+1}.set_color`, "0", {type: 'string',name: `${pathPitmaster}.${i+1}.set_color`});
createState(`${pathPitmaster}.${i+1}.value_color`, "0", {type: 'string',name: `${pathPitmaster}.${i+1}.value_color`});
}
}

}


function read_vaues_and_set (debug, max_chanels, pitmaster)
{ // Werte aus MQTT lesen und in alle Kanäle ( max 12 Schreiben)
//log ("pathdata is :" + pathdata);
// log (getState(pathdata).val);
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_chanels; i++) {

setState(`${pathChannels}.${i+1}.actual_temp`, (jr.channel.temp));
setState(`${pathChannels}.${i+1}.name`, (jr.channel.name));
setState(`${pathChannels}.${i+1}.temp_min`, (jr.channel.min));
setState(`${pathChannels}.${i+1}.temp_max`, (jr.channel.max));
setState(`${pathChannels}.${i+1}.type`, (jr.channel.typ));
setState(`${pathChannels}.${i+1}.alarm`, (jr.channel.alarm));
setState(`${pathChannels}.${i+1}.color`, (jr.channel.color));
setState(`${pathChannels}.${i+1}.connected`, (jr.channel.connected));
setState(`${pathChannels}.${i+1}.fixed`, (jr.channel.fixed));
}


if (debug == true) {console.log('Data ausgelesen');}

}

function read_pid_and_set (debug, max_chanels, pitmaster)
{ // Werte aus MQTT lesen und in alle Kanäle ( max 12 Schreiben)
//log ("pathdata is :" + pathdata);
// log (getState(pathdata).val);
try {
jr = JSON.parse(getState(pathdata).val);
}
catch (e) {
console.error('Cannot parse: ' + getState(pathdata).val);
return;
}

//Werte Auslesen für die Pitmaster ! Mini V1 = 1 Mini V2 = 2
for (var i = 0; i < 2; i++)
{

setState(`${pathPitmaster}.${i+1}.pitmaster`, (jr.pitmaster.pm.id));
setState(`${pathPitmaster}.${i+1}.connected_chanel`, (jr.pitmaster.pm.channel));
setState(`${pathPitmaster}.${i+1}.pid`, (jr.pitmaster.pm.pid));
setState(`${pathPitmaster}.${i+1}.current_value`, (jr.pitmaster.pm.value));
setState(`${pathPitmaster}.${i+1}.set_temp`, (jr.pitmaster.pm.set));
setState(`${pathPitmaster}.${i+1}.status`, (jr.pitmaster.pm.typ));
setState(`${pathPitmaster}.${i+1}.set_color`, (jr.pitmaster.pm.set_color));
setState(`${pathPitmaster}.${i+1}.value_color`, (jr.pitmaster.pm.value_color));

}
if (debug == true) {console.log('Data ausgelesen');}

}


function main(debug)
{ log ("debug is :" + debug)
create_varaiables(debug, max_chanels,pitmaster_connected);
read_vaues_and_set(debug, max_chanels, pitmaster_connected);
read_pid_and_set(debug, max_chanels, pitmaster_connected);
}
//Event based start
on({id: pathdata, change: "any"}, function (obj) {
main(debug);
});
 

Anhänge

Ist nur lesend oder?
Als Max Werte für die Anzeigen, kannst du ja die Einstellungen als Max der Kanäle +10/20 Grad nehmen
 

Grammy

New member
Ja im Moment nur lesend, möchte aber evtl. mit den switches rumprobieren - geht mir jetzt erstmal um die Darstellung der werte
 
Super. Bin auf das Finale file gespannt.
Wenn ich ein Update zum senden habe, melde ich mich.
will si CH noch mal an mein Script ran und schauen ob ich noch etwas mehr Ressourcen (RAM oder Laufzeit) sparen kann.
 
Oben Unten