LG HomBot Script

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)

Hallo Kevin,

vielen Dank! Wird getestet, wenn der Robbi da ist. :slight_smile:

Grüße,
Kai

Es fehlen noch 2 Variablenprofile die Modus und Status zugewiesen werden sollten.

IPS Home 2017-04-26 12-12-56.jpg

IPS Home 2017-04-26 12-12-39.jpg

Hallo Kevin,

danke nochmal läuft alles…
Aber ich konnte es mir nicht verkneifen: Siri - Bier holen - YouTube

Grüße,
Kai

Ich würde mal die Token für die Pushnachrichten aus dem Skript entfernen :rolleyes:

Und auf Anpingen zwecks Erreichbarkeit reagiert meiner auch ganz böse … mit ich dreh jetzt mal das Wlan ab :eek:

Hallo!

ich habe meinen LG Robo mit einem WLan Stick ausgestattet und er ist schon über die WEB erreichbar

Ich habe laut Anleitung alles installiert nur bekomme beim Skript ProcessData immer die Fehlermeldung in Zeile 44

 $searchText = "/(.*)="(.*)"/";

Was mache ich hier falsch?

Welche Fehlermeldung erhältst du denn?

Grüße,
Kai

Parse error:  syntax error, unexpected '(' in C:\IP-Symcon\scripts\ProcessData on line 44
Abort Processing during Fatal-Error: syntax error, unexpected '('
   Error in Script C:\IP-Symcon\scripts\ProcessData on Line 44

Tausch es mal gegen folgendes aus:

$searchText = "/(.*)=\"(.*)\"/";

Dir scheint da ein Backslash beim kopieren abhanden gekommen zu sein.

Grüße,
Kai

Super jetzt hab ich keine fehler in diesem Skript

im skript ProcessCommand

hab ich folgende fehlermeldung

$jsonRequest = „{„COMMAND“:{„CLEAN_MODE“:„CLEAN_ZZ“}}“;

Parse error:  syntax error, unexpected 'COMMAND' (T_STRING) in C:\IP-Symcon\scripts\ProcessCommand on line 12
Abort Processing during Fatal-Error: syntax error, unexpected 'COMMAND' (T_STRING)
   Error in Script C:\IP-Symcon\scripts\ProcessCommand on Line 12

Auch da fehlen wieder die Backslash.
Vergleich doch mal die Zeile mit den oben, wenn du Fehler hast.

Grüße,
Kai

Gesendet von iPhone mit Tapatalk

Ja stimmt teiler der Zeichen waren nicht mitkopiert

jetzt habe ich alle kontrolliert aber diesen Fehler kann ich nicht deuten

if ($_IPS["VARIABLE"] == 17101 /*[Geräte\Staubsauger\Tulln 1OG\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"}}";
    }

}
Notice:  Undefined index: VARIABLE in C:\IP-Symcon\scripts\ProcessCommand on line 7

Hallo,

im Original von spoosie steht:

$jsonRequest = "{\"COMMAND\":{\"CLEAN_MODE\":\"CLEAN_ZZ\"}}";

Bei Dir fehlen da mehrere backslashes.

Grüße, Gerhard

hallo Gerhard,

die \ sind offensichtlich beim posten nicht mitgegangen

hier noch mal de original

 if ($_IPS["VARIABLE"] == 17101 /*[Geräte\Staubsauger\Tulln 1OG\Modus]*/)
    {
       if ($_IPS["VALUE"] == 1)
       {
            IPS_LogMessage($scriptName,"Modus ZickZack");
            $jsonRequest = "{\"COMMAND\":{\"CLEAN_MODE\":\"CLEAN_ZZ\"}}";
        }

warum ich die meldung

Notice:  Undefined index: VARIABLE in C:\IP-Symcon\scripts\ProcessCommand on line 7

bekomme, verstehe ich nicht :confused:

Du hast aber nicht bei den Variablen Modus/Turbo/Wiederholen die CustomAction hinterlegt und darüber das Script gestartet oder?
Wenn du das Script von Hand ausführst, bekommst du diese Meldungen.

Grüße,
Kai

was hab ich nicht ? ich verstehe das nicht …:confused:

Wie hast du das Script denn ausgeführt, als du die Fehlermeldungen erhalten hast?

Hast du bei den Variablen Modus/Turbo/Wiederholen eine Action (Variable Actions — IP-Symcon :: Automation Software) hinterlegt? Hier musst du das Script ProcessCommand hinterlegen.

Grüße,
Kai

ach !!! jetzt hab ichs !!! VIELEN DANK!