Moin,
hier mal meine Scriptsammlung für den Staubsaugerroboter von LG. Vllt. kann ja jemand damit etwas anfangen.
Es geht los mit einer Übersicht des Baums.
Viele der Variablen werden aus dem „ProcessData“ Script erzeugt. Aber manche halt auch eben nicht. Dafür hier die Beschreibung dazu.
Variable Cam
String Variable - ~HTMLBox Profil.
<script type="text/javascript" src="/user/HomBot/cam.js"></script><div style='width:100%;height:100%;' id="cam"><center><canvas id="cam_canvas" width="320" height="240"></canvas></center></div>
Den folgenden Code als File unter …/webfront/user/HomBot/cam.js ablegen.
HOMEBOTIP entsprechend anpassen! Dies setzt natürlich eine static IP voraus.
function drawSnapshot()
{
var
yuvUrl = 'http://HOMBOTIP:6260/images/snapshot.yuv',
canvas = document.getElementById('cam_canvas'),
context = canvas.getContext('2d'),
width = canvas.width,
height = canvas.height,
outputImage = context.createImageData(width, height),
outputImageData = outputImage.data
;
var xhr = new XMLHttpRequest();
xhr.open('GET', yuvUrl, true);
xhr.responseType = 'arraybuffer';
xhr.onload = function() {
var yuvData = new Uint8Array(xhr.response), y, u, v;
for (var i = 0, p = 0; i < outputImageData.length; i += 4, p += 1)
{
y = yuvData[ p ];
v = yuvData[ Math.floor(width * height * 1.5 + p /2) ];
u = yuvData[ Math.floor(width * height + p / 2) ];
outputImageData[i] = y + 1.371 * (v - 128);
outputImageData[i+1] = y - 0.336 * (u - 128) - 0.698 * (v - 128);
outputImageData[i+2] = y + 1.732 * (u - 128);
outputImageData[i+3] = 255;
}
context.putImageData(outputImage,0,0);
window.setTimeout('drawSnapshot()', 1000);
}
xhr.send(null);
}
drawSnapshot();
Variable Map
Das ist ein wenig umständlich gelaufen, aber funktioniert am Ende doch ganz gut. Und zwar wird die Map durch einen andern Dienst erstellt. Das nachfolgende Skript triggert die Erstellung an und legt dann eine Grafik ab, die wiederum von IPS zur Darstellung heran gezogen wird. Infos zum externen Tool folgen später.
Skript „Fahre zur Ladestation“
<?
$scriptName = "HomBot";
$hombotIP = "HOMBOTIP";
IPS_LogMessage($scriptName,"Schicke Hom-Bot zur Aufladestation");
file_get_contents("http://".$hombotIP.":6260/json.cgi?%7b%22COMMAND%22:%22HOMING%22%7d");
?>
Skript „Pausiere Saugvorgang“
<?
$scriptName = "HomBot";
$hombotIP = "HOMBOTIP";
IPS_LogMessage($scriptName,"Pausiere Hom-Bot");
file_get_contents("http://".$hombotIP.":6260/json.cgi?%7b%22COMMAND%22:%22PAUSE%22%7d");
?>
Skript „Starte Saugvorgang“
<?
$scriptName = "HomBot";
$hombotIP = "HOMBOTIP";
IPS_LogMessage($scriptName,"Starte Hom-Bot");
file_get_contents("http://".$hombotIP.":6260/json.cgi?%7b%22COMMAND%22:%22CLEAN_START%22%7d");
?>
Skript „ProcessCommand“
Die folgenden Variablen erhalten eine CustomAction auf das folgende Skript
Modus/Turbo/Wiederholen. Bitte die VariablenIDs und ScriptID im Skript anpassen.
<?
$scriptName = "HomBot";
$hombotIP = "HOMEBOTIP";
IPS_LogMessage($scriptName,"Process command...");
if ($_IPS["VARIABLE"] == 13757 /*[Hom-Bot\Modus]*/)
{
if ($_IPS["VALUE"] == 1)
{
IPS_LogMessage($scriptName,"Modus ZickZack");
$jsonRequest = "{\"COMMAND\":{\"CLEAN_MODE\":\"CLEAN_ZZ\"}}";
}
else if ($_IPS["VALUE"] == 2)
{
IPS_LogMessage($scriptName,"Modus Cell-By-Cell");
$jsonRequest = "{\"COMMAND\":{\"CLEAN_MODE\":\"CLEAN_SB\"}}";
}
else if ($_IPS["VALUE"] == 3)
{
IPS_LogMessage($scriptName,"Modus Spot");
$jsonRequest = "{\"COMMAND\":{\"CLEAN_MODE\":\"CLEAN_SPOT\"}}";
}
}
else if ($_IPS["VARIABLE"] == 57250 /*[Hom-Bot\Turbo]*/)
{
if ($_IPS["VALUE"])
{
IPS_LogMessage($scriptName,"Turbo AN");
$jsonRequest = "{\"COMMAND\":{\"TURBO\":\"true\"}}";
}
else
{
IPS_LogMessage($scriptName,"Turbo AUS");
$jsonRequest = "{\"COMMAND\":{\"TURBO\":\"false\"}}";
}
}
else if ($_IPS["VARIABLE"] == 43559 /*[Hom-Bot\Wiederholen]*/)
{
if ($_IPS["VALUE"])
{
IPS_LogMessage($scriptName,"Wiederholen AN");
$jsonRequest = "{\"COMMAND\":{\"REPEAT\":\"true\"}}";
}
else
{
IPS_LogMessage($scriptName,"Wiederholen AUS");
$jsonRequest = "{\"COMMAND\":{\"REPEAT\":\"false\"}}";
}
}
$url = "http://".$hombotIP.":6260/json.cgi?".urlencode($jsonRequest);
IPS_LogMessage($scriptName,$url);
file_get_contents($url);
IPS_Sleep(1000);
IPS_RunScript (36271 /*[Hom-Bot\ProcessData]*/);
?>
Skript „ProcessData“
<?
include "orga.php";
$scriptName = "HomBot";
$hombotIP = "HOMBOTIP";
// Die ID des Webfront Konfigurators
$webfrontID = xxxxx;
IPS_LogMessage($scriptName,"Process data...");
$catID = IPS_GetParent($_IPS["SELF"]);
$url = "http://".$hombotIP.":6260/status.txt";
// Bevor das Gerät abgefragt wird, muss geschaut werden ob es noch am Netz ist. Er fällt ja gerne mal aus, wenn er fest hängt.
if (!Sys_Ping($hombotIP, 2000))
{
// War er beim letzten Test schon nicht erreichbar?
$lastVal = getVariable($catID,"Erreichbar");
// if (is_null($lastVal) || $lastVal == true)
// WFC_PushNotification($webfrontID,"Fehler","HomBot FEHLER - Nicht mehr erreichbar. Festgefahren?","Fehler",0);
CreateVariable("Erreichbar", 0,false , "reachable", $catID );
}
else
{
CreateVariable("Erreichbar", 0,true , "reachable", $catID );
CreateVariable("Letzte Aktualisierung", 1,time() , "lastMessage", $catID );
// File_get_contents bringt den Webserver aufm HomBot zum Absturz
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_URL, $url);
$data = curl_exec ($ch);
$dataArray = explode("
",$data);
// IPS_LogMessage($scriptName,$data);
$searchText = "/(.*)=\"(.*)\"/";
foreach($dataArray as $dataEntry)
{
preg_match($searchText, $dataEntry,$result);
if (sizeof($result) != 3)
continue;
if ($result[1] == "JSON_ROBOT_STATE")
{
// Status mappen
$value = 0; // -> STATUS unknown
if ($result[2] == "CHARGING")
$value = 1;
else if ($result[2] == "WORKING")
$value = 2;
else if ($result[2] == "BACKMOVING_INIT")
$value = 3;
else if ($result[2] == "DOCKING")
$value = 4;
else if ($result[2] == "STANDBY")
$value = 5;
if ($value == 0)
CreateVariable("Status unbekannt", 3,$result[2] , "statusunknown", $catID );
CreateVariable("Status", 1,$value , "status", $catID );
}
else if ($result[1] == "JSON_BATTPERC")
CreateVariable("Batterie", 1,$result[2] , "battery", $catID );
else if ($result[1] == "JSON_TURBO")
CreateVariable("Turbo", 0,$result[2] , "turbo", $catID );
else if ($result[1] == "JSON_REPEAT")
CreateVariable("Wiederholen", 0,$result[2] , "repeat", $catID );
else if ($result[1] == "JSON_MODE")
{
// Modus mappen
$value = 0; // -> MODE unknown
if ($result[2] == "ZZ")
$value = 1;
else if ($result[2] == "SB")
$value = 2;
else if ($result[2] == "SPOT") // Kann meiner wohl nicht
$value = 3;
if ($value == 0)
CreateVariable("Modus unbekannt", 3,$result[2] , "modeunknown", $catID );
CreateVariable("Modus", 1,$value , "mode", $catID );
}
else if ($result[1] == "CLREC_LAST_CLEAN")
{
$date = explode("/",$result[2]);
$value = mktime ($date[3], $date[4], $date[5], $date[1], $date[2], $date[0]);
CreateVariable("Letzte Reinigung", 1,$value , "lastClean", $catID );
}
}
}
function getVariable($parentID,$varName)
{
// Variable vorhanden
if($varID=@IPS_GetVariableIDByName($varName,$parentID))
{
return GetValue($varID);
}
return null;
}
?>
Dann noch das orga.php File entsprechend in den Skriptordner schmeissen.
Und hier nun noch ein WebFront Beispiel, wie das so aussehen kann. Die Map ist in diesem Screener jetzt nicht wirklich repräsentativ. Ich hatte den Sauger letztens für den Alexa Test nur mal kurz hin und her fahren lassen. Da zeigt er nix von den Räumen. Bei Interesse poste ich gerne noch ein weiteres.
So, dass ist mal alles wieder nur ganz kurz angerissen, aber es gibt schon mal ne Basis für weitere Diskussionen.
Viel Spass
Kevin
orga.php.zip (1.45 KB)