-
Autor
Nach dem etwas enthusiastischen Weihnachsteinkauf und der ersten Ernüchterung zu den Problemen des internen Sensors kam natürlich nach dem Kauf des Shelly-Addons mit einem DS18B20 die zweite Ernüchterung, da sich ein DS18B20 nicht direkt als externer Sensor einbinden lässt.
Aber frei nach dem Motto - "geht nicht, gibt es nicht", verhalf etwas Scripting zu einer funktionierenden Lösung.
Neben dem Wall Display verwende ich dafür ein Plus1PM, welches mit dem Shelly-Addon verheiratet wurde, und an dem wiederum der DS18B20.
Die Lösung über Script liegt darin, dass ich über ein Script im Plus1PM den Messwert aus dem Wall-Display mit dem Messwert vom DS18B20 vergleiche. Daraus wird der notwendige Offset für das Wall-Display berechnet und in das Wall-Display geschrieben. Somit hat man den Wert auch mit schwankenden Offset immer auf dem "richtigen" Wert. Es ist dadurch auch möglich, das Display eingeschaltet zu lassen, ohne dass der Messwert durch die Eigenerwärmung "davon läuft". Ein allfällig notwendige Kompensation (Offset) wird rein über den DS18B20 durchgeführt.
In Summe sind drei RPC-Calls erforderlich um die erforderlichen Werte abzufragen, sowie ein Call um den neuen Offset zu setzen. Der Aufruf aller Funktionen erfolgt über einen Timer, wobei sichergestellt wird, dass alle drei Aufrufe zur Abfrage erfolgreich waren, bevor ein neuer Offset berechnet und geschrieben wird. Das Schreiben des neuen Offsets erfolgt dabei immer um einen Timer-Zyklus verzögert.
Das Script ist sicher noch nicht perfekt. Es fehlt in jedem Fall noch die eine oder andere Fehlerprüfung. Insbesonders werden die Rückgabewerte der verschiedenen Calls nicht auf Plausibilität geprüft. Schlagend wird dieser Umstand aber nur, wenn die IP für das Wall-Display auf einen anderen Shelly zeigt.
var wallStatus = {};
var wallConfig = {};
var sensorStatus = {};
var nextLevel = 0;
var lastError = 0;
function GetWallStatus(){
Shelly.call(
"HTTP.GET",
{url: "http://<IP-WallDisplay>/rpc/Temperature.GetStatus?id=0", timeout: 5 },
function(result, error_code, error_message) {
print("callback GetWallStatus");
if (error_code != 0) {
print(error_code + " " + error_message);
lastError = error_code;
} else {
wallStatus = JSON.parse(result.body);
print(JSON.stringify(wallStatus));
nextLevel++;
}
});
}
function GetWallConfig(){
Shelly.call(
"HTTP.GET",
{url: "http://<IP-WallDisplay>/rpc/Temperature.GetConfig?id=0", timeout: 5 },
function(result, error_code, error_message) {
print("callback GetWallConfig");
if (error_code != 0) {
print(error_code + " " + error_message);
lastError = error_code;
} else {
wallConfig = JSON.parse(result.body);
print(JSON.stringify(wallConfig));
nextLevel++;
}
});
}
function GetSensorStatus(){
Shelly.call(
"Temperature.GetStatus",
{id: 100},
function(result, error_code, error_message) {
print("callback GetSensorStatus");
if (error_code != 0) {
print(error_code + " " + error_message);
lastError = error_code;
} else {
print(result);
sensorStatus = result;
nextLevel++;
}
});
}
function SetWallConfig(){
sensorWall = wallStatus.tC - wallConfig.offset_C;
sensorB10 = sensorStatus.tC;
newWallTC = sensorB10 - sensorWall;
print("SetWallConfig " + sensorWall + " " + sensorB10 + " " + newWallTC);
wallConfig.offset_C = newWallTC;
urlConfig = "http://<IP-WallDisplay>/rpc/Temperature.SetConfig?id=0&config=" + JSON.stringify(wallConfig);
print(urlConfig);
Shelly.call(
"HTTP.GET",
{url: urlConfig, timeout: 5 },
function(result, error_code, error_message) {
print(result.body);
if (error_code != 0) {
print(error_message);
lastError = error_code;
print(error_code);
}
});
}
function timer_callback(){
print("");
print("timer callback " + nextLevel + " " + lastError);
if(lastError !== 0) {
nextLevel = 0;
lastError = 0;
}
if(nextLevel === 3) {
print("SetWallConfig");
SetWallConfig();
nextLevel = 0;
}
if(nextLevel < 3) {
GetWallStatus();
GetWallConfig();
GetSensorStatus();
}
}
Timer.set(10000, true, timer_callback);
print("timer started");
Alles anzeigen