Gardena/Husqvarna G3 Mähroboter einbinden (R38/40/70 & 305/308)

Guten Morgen allerseits,

das leidige Thema ist gelöst. Seit gestern verrichtet eine Robonect H30x Platine die Arbeit in meinem R38Li. Vorab, wer weitere Info’s möchte oder das Modul bestellen möchte, der wendet sich am besten hierhin: Robonect.de - Foren-Ãœbersicht
Ich habe für das Modul zusätzlich eine WLAN Antenne mit Pigtail mitbestellt.
Das Modul ist sehr begehrt, so dass es im Moment sicher ein paar Wochen dauern kann, bis man in der Warteliste dran ist.

Die Robonect Platine ist eine circa 8x8cm grosse Platine, die auf den Aux Port und den MMI (Display-Platine) Port des Mainboards aufgesteckt wird. Auf dem Robonect Board befinden sich neben den genannten Ports auch noch ein Serieller Anschluss für eine TTL-Kamera und ein WLAN Modul. Der Hauptprozessor ist ein STM 32bit F3 Prozessor, wie er auch bei vielen Coptersteuerung (Naze32, Sparky, etc) Verwendung findet.

RobonectH30x_Einbau_0000.jpg
Der Einbau geht relativ einfach: Als erstes entfernt man die äussere Abdeckung des Robbi’s, das sind 4 Schrauben. Danach das mit 5 Schrauben befestigte MMI-Modul samt Gehäuse. Vorsichtig zur Seite klappen. Dann die mit einer Schraube gesicherte Führung der Schnitthöhenanzeige entfernen und schon hat man quasi die Wirbelsäule des Robbi’s vor sich. Hier sieht man, wie klein der eigentlich ist, eher so wie ein Kinderschuhkarton. Rundherum aufgeschraubt (Achtung, Garantiesiegel) und schon sieht man das Innere, im Grunde nur die Neigungssensoren, Radmotoren, den Hauptschalter und das Mainboard.

Das Mainboard ist mit zwei Schrauben befestigt. Eine davon muss man lösen, und einen mitgelieferten Distanzbolzen einschrauben. Dann das MMI Kabel vom Mainboard abziehen. Nun wird die Platine aufgesteckt, auf den Distanzbolzen geschraubt und das MMI Kabel auf die Platine gesteckt.

Dann kommt etwas, was mir nicht so gut gefällt. Man muss sich die Spannung fürs Board über einen Stromdieb, also so ein Metallclip der die Isolierung des Kabels einschneidet, von einem der Robbi-Kabel abgreifen. Ein enstprechender Molex Stecker mit Y-Kabel hätte mir besser gefallen.

Das wars im Grunde. Man kann dann wieder zuschrauben, wobei man peinlichst genau auf den Sitz der Dichtungen achten muss.
Ich habe noch die WLAN Antenne im inneren des Hauptgeäuses mit Kabelbindern angebracht, sowie eine 4-adrige (VCC, GND, RX, TX) Signalleitung vom Mainboard in den MMI Bereich (Das ist der Wassergeschützte Bereich) und dann weiter durch die Gummidichtung für das Piezo Buzzer Kabel nach vorne geführt. Dieses Kabel ist für die Kamera. Diese habe ich mit Heisskleber in ein Gehäuse geklebt. Das Gehäuse hat vorne und hinten eine Bohröffnung für die Linse und das Kabel. Ich habe mir bei Gardena ein Ersatzteil bestellt, und zwar das eingeklipste Plastikteil mit der Typenbezeichnung. Dieses kann ich einfach austauschen., falls ich mal das Gehäuse ohne Loch brauche. Allerdings muss man leider trotzdem den innen liegenden Teil des Plastikgehäuses trotzdem durchbohren. Ist aber später nicht sichtbar.

Wenn alles wieder zugeschraubt ist (wobei man natürlich das Robonect auch mit geöffneten Mäher testen), schaltet man den Hauptschalter wieder an und der Robbi tut ganz normal seine Dienste.

Das Robonect Modul ist relativ einfach zu konfigurieren: Das WLAN Modul auf dem board spannt ein unverschlüsseltes WLAN auf, mit diesem muss man sich verbinden und gelangt dann auf eine zeroconf Webseite (192.168.2.1). Danach steht das aufspielen einer Firmware an, das board kommt nur mit der zeroconf Version. Die jeweils neueste (Im Moment Version 0.5b) gibt es auf der Robonect Webseite. Zur Zeit gibt es so alle 4 Wochen ein update mit bugfixing und neuen Features.

Nach dem reboot des Boards wird man mit der Statusseite begrüsst:

Man konfiguriert dann sinnvollerweise auf der WLAN Seite zwei Dinge:

  1. Das die Robbi WLAN Zelle verschlüsselt ist.

  2. Das der Robbi auch als Client mit statischer IP-Adresse im eigenen WLAN unterwegs ist, und somit über jeden Client im Haus erreichbar ist.
    Man kann die WLAN Zelle auch abschalten, hat dann aber den Nachteil, dass bei einer Fehlkonfiguration des WLANs der Robbi nicht mehr erreichbar ist und man einen Reset machen muss. Dafür gibt es 3 Wege, wobei bei mir nur einer funktioniert:

  3. Hat der board einmal die PIN gelernt (macht es automatisch beim eingeben der PIN in den Robbi), sollte normalerweise die Eingabe einer Reset PIN (9999-eigene PIN = Reset PIN) dazu führen. Bei mir (und anderen laut Foreneinträgen) hängt der Robbi aber dann im Service Mode fest

  4. Batterie raus, warten, Batterie rein (War bei mir nicht erfolgreich)

  5. Gehäsue ab, MMI Gehäuse ab, und dann mit spitzen Fingern 2 Resetbuttons drücken. Hat immer funktioniert.

Mir aufgefallen ist auch, dass die ganze WLAN Geschichte noch ein wenig „shaky“ ist. Nicht im Betrieb, aber in der Konfiguration. So hat das Konfigurieren des WLANs gerne mal zu einem „Schwerwiegenden Fehler“ auf dem board geführt, d.h. es macht einen reboot, ist dann aber nach 10s wieder da. Einmal habe ich mich beim Konfigurieren von mehreren Parametern gleichzeitig ausgesperrt. Deswegen: Immer die WLAN Zelle aktiviert lassen.

Zusätzlich zum WLAN hat auch die Vergabe von einem Usernamen und Passwort mit mehr als Buchstaben und Zahlen dazu geführt, dass ich mich ausgesperrt hatte. Das bedeutete dann wieder Gehäsue ab, usw.

Wie weiter oben beschrieben, wird allerdings permanent bugfixing gemacht, so dass diese kleinen, nicht schwerwiegenden Probleme, keine allzugrosse Hürde darstellen sollten.

Auf dem Webinterface des Robbi sieht man alle relevanten Daten, wie Timer, Betriebszustand (mäht, lädt, standby), Steuermode (Auto, Manuell, Feierabend für heute, etc), Batteriekapazätäten und Ströme, Motorendrehzahlen, usw.

Für uns Automatisierer besonderst interressant: Die Platine verfügt über zwei APIs. Eine JSON und eine XML.
So lassen sich relativ einfach Stati abfragen und per Skript verarbeiten. Auch das aktive Eingreifen in die Funktion des Robbi ist simpel.
Beispielsweise kann man ihn in die Ladestation schicken, wenn innerhalb IP-Symcon eine anderer Sensor Regen erkennt.

Das folgende, simple beispiel zeigt, wie einfach die Integration ist.


$mower = '10.1.1.70';
$cmd = 'mode'; //Kommando
$mode = 'auto'; //Modus
//Funktion um Modus und Kommando zu senden
function G3_send ($param1, $param2, $param3) {
      $url = 'http://'.$param3.'/json?cmd='.$param1.'&mode='.$param2;
      fopen($url,'r');
     return true;
  }
$execute = G3_send($cmd,$mode,$mower);

Leider verhindert ein Software Fehler im JSON Api auf der Platine (ein kleiner Formatierungsfehler in der Ausgabe) die vollständige Nutzung der Schnittstelle. In den nächsten tagen soll aber die Version 0.5c kommen, dann könnte man eine schöne Funktionslibrary schreiben, die die Befehle in IPS integriert. Weitere Info’s zur API finden sich hier: API (offene Schnittstelle für eigene Applikationen) - Robonect.de

Sollte ich etwas brauchbares Schreiben, werde ich es hier posten. Sollte ein andere User etwas schreiben, oder aber auch Kommentare zum Robonect haben, hängt euch gerne an diesen Thread dran.

Insgesamt gefällt mir das Produkt wirklich gut, da steckt sicher eine ganze Menge Arbeit vom Entwickler drin, deswegen von mir ein herzliches Dankeschön an Ihn und eine klare Empfehlung!

Der Entwickler hat sich da wirklich viel Mühe gegeben. Wenn man sich in den Foren so um sieht liest man gelegentlich dass das Modul auch in anderen Mowern einsetzbar sein sollte. Hat schon jemand etwas in Richtung 330x/320 gesehen?

Die Version 0.5c kommt wohl noch heute Abend.

Cool, danke für die Info!!!
Mein R70Li wird sich freuen (und ich noch mehr) :smiley:
Endlich ein neues Spielzeug, dass den Mäher wieder „praktischer“ nutzen lässt.

Habe gleich mal eine Anfrage auf den Weg gebracht.

Im robonect forum gibt es einen thread zu den viertadmodellen. Der wird dir gefallen…

Wobei es da um den 310er geht und entdeckt wurde, das neuere Baujahre (mind 2016) im 310 ein anderes Board benutzen.
Mein Sachstand ist, dass 330x/320 gar nicht probiert wurde und 310er nur geht, wenn man Kabel „customized“.

Korrekt - ich habe gestern mit dem Entwickler telefoniert.
Sehr schade, da ich selber einen 330X habe :frowning:

MST

Stehen da irgendwo Preise von dem Teil, oder habe ich die übersehen ??

Gruß
Bruno

Hi,

ich habe ebenfalls einen R40Li und besitze das Modul. Mit der API lässt sich ja schonmal einiges machen, ebenso ist der Entwickler (Fabian) unglaublich fit und vor allem hilfsbereit und ausgeschlossen für Neues (siehe FeatureListe).

Hat sich denn schon jemand an die Erstellung einer Class gemacht?

Ich bin leider nicht fit genug das zu erledigen, werde aber gerne als Tester herhalten!

Gruß
spooniester

Ich bin gerade dran. Schreibe eine Funktionsbibliothek, die die Daten als JSON an Robonect übergibt. Innerhaln PHP stehen dann Funktionen zur Verfügung wie G3_Status($ip), die die Statusdaten als array zurückgeben.

Bzgl. Preis fürs Modul bittet der Hersteller ihn direkt zu kontaktieren, ist aber erschwinglich.

Der Sinn dieser Heimlichtuerei erschliesst sich mir nicht wirklich :confused:

Hi,

habe seit heute auch das Modul in meinem Robi am Werkeln. Wie sieht es aus, lässt sich das Robonect schon aus IPS auslesen und Befehle senden?

Gruß

Jimmy

Habe auch das Robonect n meinem r40li. Gibt es schon was neues in Bezug auf Integration in Symcon?

Gesendet von meinem Nexus 5 mit Tapatalk

Moin,
ich bin Fabian und der Entwickler vom Robonect Modul.

Inzwischen werden auch die größeren Modelle von Robonect unterstützt:

Hier die Liste der Unterstützen Modelle:
Gardena: R38Li, R40Li, R45Li, R50Li, R70Li, R80Li, Sileno, Sileno+
Husqvarna: Automower® 105, 305, 308, 308X, 310, 315, 320, 330X, 420, 430X, 450X
Flymo: Robotic 1200R

Für Anfragen, schickt mir bitte eine Nachricht. Robonect.de - E-Mail senden

Hallo Leute,
hat schon jemand das Robonect brauchbar in IPS .
Info wäre nett !
Gibts die Möglichkeit evtl.den Skript zu Verfügung gestellt zu bekommen !?

Gruß
Thomas

Kann heute Abend mal Posten was ich bis jetzt zusammengebastelt habe.

Hallo manni,
das wäre super !
Bin schon gespannt !
Gruß
Thomas

Bevor ich mir für meinen 330X das Robonect Modul zulege möchte ich wissen wie meine WLan Anbindung im Garten ist. Kennt jemand eine Android App die so etwas aufzeichnet? Am schönsten wäre wenn man sein Handy auf den 330x legen könnte, es mit fährt und es wird ein „Ausleuchtungskarte“ erstellt.

Wird wohl schwierig mit solch einem Tool.

Ich habe so etwas schon mit inSSIDer auf dem Laptop gemacht (allerdings mit dem Laptop auf dem Arm durchs Haus gelaufen).

auf dem Handy habe ich Wifi Analyzer, welches die Signalstärke und auch „fremde“ WLANs anzeigt. Allerdings wird hier auch nichts geloggt…

Andreas

Hier mal was zum Probieren.

IP-Adresse, Benutzername, Passwort eintragen.
Und dann noch angeben, ob eine Kamera installiert ist oder nicht mit true / false.

Update 4.4.2017 - 11:00
Update 4.4.2017 - 11:19 :smiley:


<?
/*******************************************************************************

    MSC - Version 0.3 vom 03.04.2017

********************************************************************************


                    SKRIPT ZUM AUSLESEN VON MÄHROBOTER
                          AUSGESTATTET MIT DEM
                      ROBONECT-MODUL H30x Ver. 0.9c

    ------------------------------------------------------------------------
    
                            INSTALLATIONS-Skript
                        
                        
********************************************************************************
*******************************************************************************/

// Verbindungsdaten
    $ip = "1.1.1.1";
    $user = "user";
    $pass = "pass";

// Kamera installiert true/false
    $cam_installed = true;
    
/*******************************************************************************
*******************************************************************************/

      $content = @Sys_GetURLContentEx('http://'.$ip.'/json?cmd=status', array("AuthUser"=> $user, "AuthPass"=> $pass));
        if($content == false){
            echo "Abfrage Mähroboter nicht möglich";
            return;
            }
    
    $data_status = json_decode($content, true);


// Variablenprofile anlegen
    create_profil("_Wlan", 1, 0, 0, 0, "", " dBm",  "", "");
    create_profil("_Batterie", 1, 0, 0, 0, "", " %",  "", "");
    create_profil("_BST", 1, 0, 0, 0, "", " h",  "", "");
    create_profil("_Robo_Minuten", 1, 0, 45, 15, "", "",  "", "");
    create_profil("_Robo_Stunden", 1, 0, 24, 1, "", "",  "", "");
    create_profil("_Robo_Status", 1, 0, 0, 0, "", "",  array(0 => "Status wird ermittelt", 1 => "parkt", 2 => "mäht", 3 => "sucht die Ladestation", 4 => "lädt", 5 => "warten auf umsetzen", 7 => "Fehlerstatus",8 => "kein Schleifensignal", 16 => "abgeschaltet", 17 => "schläft"));
    create_profil("_Robo_Mode", 1, 0, 0, 0, "", "",  array(0 => "Auto", 1 => "Manuell", 2 => "Home", 3 => "Demo"));
    create_profil("_Robo_Betriebsmode", 1, 0, 0, 0, "", "",  array(0 => "Start", 1 => "Stop", 2 => "Feierabend", 3 => "Home", 4 => "Auto", 5 => "Manuell"));
    create_profil("_Robo_Timer", 1, 0, 0, 0, "", "",  array(0 => "deaktiviert", 1 => "aktiv", 2 => "standby"));
    create_profil("_Robo_JobRemote", 1, 0, 0, 0, "", "",  array(0 => "Standard", 1 => "Fernstart 1", 2 => "Fernstart 2"));
    create_profil("_Robo_JobMode", 1, 0, 0, 0, "", "",  array(1 => "Home", 2 => "Feierabend", 3 => "Manuell", 4 => "Auto"));
    create_profil("_Robo_JobStart", 1, 0, 0, 0, "", "",  "starten", "#3366FF");


// Instanzen, Variablen und Skripte anlegen
    $did = SetDummyByName(IPS_GetParent($_IPS['SELF']), $data_status['name'], preg_replace('/[^A-Za-z0-9]/', '', "robo".$data_status['name']), 0, "");
    
        // Ausleseskript
        if(@IPS_GetScriptIDByName("Auslesen", $did) == false){
            $sid_getData = IPS_CreateScript(0);

            IPS_SetParent($sid_getData, $did);
            IPS_SetPosition($sid_getData, 100);
            IPS_SetName($sid_getData, "Auslesen");
            IPS_SetIdent($sid_getData, "roboScriptGetData");
            }
        

        // Steuerungskript
        if(@IPS_GetScriptIDByName("Steuern", $did) == false){
            $sid_control = IPS_CreateScript(0);

            IPS_SetParent($sid_control, $did);
            IPS_SetPosition($sid_control, 101);
            IPS_SetName($sid_control, "Steuern");
            IPS_SetIdent($sid_control, "roboScriptControl");
            }

        if($cam_installed == true){
            // Skript Kamerabild laden
            if(@IPS_GetScriptIDByName("Bild laden", $did) == false){
                $sid_picture = IPS_CreateScript(0);

                IPS_SetParent($sid_picture, $did);
                IPS_SetPosition($sid_picture, 102);
                IPS_SetName($sid_picture, "Bild laden");
                IPS_SetIdent($sid_picture, "roboScriptPicture");
                }
            }

        $did_stat = SetDummyByName($did, "Status", "roboStatus", 10, "");
            $trigger = CreateVariableByName($did_stat, "Status", "roboStatus", 1, "_Robo_Status", 10, "");
            CreateVariableByName($did_stat, "Uptime", "roboUptime", 3, "", 11, "");
            CreateVariableByName($did_stat, "Modus", "roboMode", 1, "_Robo_Mode", 12, "");
            CreateVariableByName($did_stat, "Betriebsmodus", "roboOperatingMode", 1, "_Robo_Betriebsmode", 13, $sid_control);
            CreateVariableByName($did_stat, "Batterie", "roboBattery", 1, "_Batterie", 14, "");
            CreateVariableByName($did_stat, "Betriebsstunden", "roboHours", 1, "_BST", 15, "");
            CreateVariableByName($did_stat, "Timer", "roboTimer", 1, "_Robo_Timer", 16, "");
            CreateVariableByName($did_stat, "Wlan-Signal", "roboWlan", 1, "_Wlan", 17, "");
            CreateVariableByName($did_stat, "Fehler", "roboError", 3, "", 18, "");
            CreateVariableByName($did_stat, "Fehlerspeicher", "roboErrorlist", 3, "~HTMLBox", 19, "");
            
        $did_control = SetDummyByName($did, "Mähauftrag erstellen", "roboJobControl", 11, "");
            $did_starttime = SetDummyByName($did_control, "Startzeit einstellen", "roboJobTimeStart", 10, "");
                CreateVariableByName($did_starttime, "Stunden", "roboJobTime_h", 1, "_Robo_Stunden", 10, $sid_control);
                CreateVariableByName($did_starttime, "Minuten", "roboJobTime_m", 1, "_Robo_Minuten", 11, $sid_control);
            $did_stoptime = SetDummyByName($did_control, "Endzeit einstellen", "roboJobTimeStop", 11, "");
                CreateVariableByName($did_stoptime, "Stunden", "roboJobTime_h", 1, "_Robo_Stunden", 12, $sid_control);
                CreateVariableByName($did_stoptime, "Minuten", "roboJobTime_m", 1, "_Robo_Minuten", 13, $sid_control);    
            CreateVariableByName($did_control, "Fernstart", "roboJobRemote", 1, "_Robo_JobRemote", 12, $sid_control);
            CreateVariableByName($did_control, "nachfolgender Modus", "roboJobMode", 1, "_Robo_JobMode", 13, $sid_control);
            CreateVariableByName($did_control, "Mähauftrag starten", "roboJobStart", 1, "_Robo_JobStart", 14, $sid_control);


// Inhalt Ausleseskript
$content = '<?    
/*******************************************************************************

    MSC - Version 0.9 vom 18.09.2016

********************************************************************************


                         SKRIPT ZUM AUSLESEN VON MÄHROBOTER
                                 AUSGESTATTET MIT DEM
                             ROBONECT-MODUL H30x Ver. 0.9c

    ------------------------------------------------------------------------

                                Datenabfrage vom Modul


********************************************************************************
*******************************************************************************/

// Verbindungsdaten
    $ip = "'.$ip.'";
    $user = "'.$user.'";
    $pass = "'.$pass.'";

/*******************************************************************************
*******************************************************************************/
// Allgemeine Gerätedaten vom Gateway abfragen
      $content = @Sys_GetURLContentEx("http://".$ip."/json?cmd=status", array("AuthUser"=> $user, "AuthPass"=> $pass));
        if($content == false) return;
    
    $data_status = json_decode($content, true);

// *****************************************************************************

    // Fehlerauswertung
        // noch nicht integriert
        $error = "";

// *****************************************************************************
        
    // Fehlerspeicher
      $content = @Sys_GetURLContentEx("http://".$ip."/json?cmd=error", array("AuthUser"=> $user, "AuthPass"=> $pass));
        if($content != false){
             $data_error = json_decode($content, true);
    
               $errorlist ="<table style=\'font-size:11px;text-align:left;\'>";
            $errorlist .= "<tr style=\'height:5px;\'><td colspan=\'3\'></td></tr>";
    
            foreach($data_error[\'errors\'] as $key => $value){
                $errorlist .="<tr style=\'font-size:14px;\'>";
                $errorlist .="<td width=70 valign=top>".$value[\'date\']."</td>";
                $errorlist .="<td width=70 valign=top>".$value[\'time\']."</td>";
                $errorlist .="<td width=250> ".$value[\'error_message\']."</td>";
                $errorlist .="</tr>";
                   }
            $errorlist .= "<tr style=\'height:5px;\'><td colspan=\'3\'></td></tr>";
            $errorlist .="</table>";            
            }
		else{
    		$errorlist ="<table style=\'font-size:14px;text-align:left;\'>";
            $errorlist .= "<tr style=\'height:5px;\'><td colspan=\'3\'>Fehlerspeicher ist leer</td></tr>";
			$errorlist .="</table>";  
			}

// *****************************************************************************


// Variablen schreiben
// --------------------
    SetVariable("roboStatus", IPS_GetObjectIDByIdent("roboStatus", IPS_GetParent($_IPS[\'SELF\'])), $data_status[\'status\'][\'status\'], true);
    SetVariable("roboUptime", IPS_GetObjectIDByIdent("roboStatus", IPS_GetParent($_IPS[\'SELF\'])), uptime($data_status[\'status\'][\'duration\']), true);
    SetVariable("roboMode", IPS_GetObjectIDByIdent("roboStatus", IPS_GetParent($_IPS[\'SELF\'])), $data_status[\'status\'][\'mode\'], true);
    SetVariable("roboBattery", IPS_GetObjectIDByIdent("roboStatus", IPS_GetParent($_IPS[\'SELF\'])), (int)$data_status[\'status\'][\'battery\'], true);
    SetVariable("roboHours", IPS_GetObjectIDByIdent("roboStatus", IPS_GetParent($_IPS[\'SELF\'])), (int)$data_status[\'status\'][\'hours\'], true);
       SetVariable("roboTimer", IPS_GetObjectIDByIdent("roboStatus", IPS_GetParent($_IPS[\'SELF\'])), $data_status[\'timer\'][\'status\'], true);
    SetVariable("roboWlan", IPS_GetObjectIDByIdent("roboStatus", IPS_GetParent($_IPS[\'SELF\'])), $data_status[\'wlan\'][\'signal\'], true);
    SetVariable("roboError", IPS_GetObjectIDByIdent("roboStatus", IPS_GetParent($_IPS[\'SELF\'])), $error, true);
    SetVariable("roboErrorlist", IPS_GetObjectIDByIdent("roboStatus", IPS_GetParent($_IPS[\'SELF\'])), $errorlist, true);

    
/*******************************************************************************
*******************************************************************************/

// FUNKTIONEN

/*******************************************************************************
*******************************************************************************/
// Schreiben der Variablen
function SetVariable($ident, $parentID, $newvalue, $check = false){
Global $global;

   $vid = IPS_GetObjectIDByIdent($ident, $parentID);
   if($check == true){
        $oldvalue = GetValue($vid);
        if($newvalue != $oldvalue){
            SetValue($vid, $newvalue);
               }
        }
    else SetValue($vid, $newvalue);
    }
    
    
// Aufbereiten der Statuszeit
function uptime($sec) {
    $time = sprintf(\'%d Tag%s, %d Stunde%s,\'.\' %d Minute%s und %d Sekunde%s\',
        $sec / 86400, floor($sec / 86400) != 1 ? \'e\':\'\',
          $sec / 3600 % 24, floor($sec / 3600 % 24) != 1 ? \'n\':\'\',
           $sec / 60 % 60, floor($sec / 60 % 60) != 1 ? \'n\':\'\',
          $sec % 60, floor($sec % 60) != 1 ? \'n\':\'\'
           );
       return $time;
    }

/*******************************************************************************
*******************************************************************************/

?>';

    IPS_SetScriptContent($sid_getData, $content);
    
            
// Inhalt Steuerungsskript
$content = '<?    
/*******************************************************************************

    MSC - Version 1.3 vom 22.01.2017

********************************************************************************


                         SKRIPT ZUM AUSLESEN VON MÄHROBOTER
                                 AUSGESTATTET MIT DEM
                             ROBONECT-MODUL H30x Ver. 0.9c

    ------------------------------------------------------------------------

                           Befehle an die Steuerung senden


********************************************************************************
*******************************************************************************/

// Verbindungsdaten
    $ip = "'.$ip.'";
    $user = "'.$user.'";
    $pass = "'.$pass.'";

/*******************************************************************************
*******************************************************************************/



if($_IPS[\'SENDER\'] == "WebFront"){
    $object = IPS_GetObject($_IPS[\'VARIABLE\']);

    switch($object[\'ObjectIdent\']){
        case "roboOperatingMode":
            switch($_IPS[\'VALUE\']){
            case 0:
                $command = "start";
                $text = \'Mähroboter gestartet\';
            break;
            case 1:
                $command = "stop";
                $text = \'Modus "Stop" aktiv\';
            break;
            case 2:
                $command = "mode&mode=eod";
                $text = \'Modus "Feierabend" aktiv\';
            break;
            case 3:
                $command = "mode&mode=home";
                $text = \'Modus "Home" aktiv\';
            break;
            case 4:
                $command = "mode&mode=auto";
                $text = \'Modus "Auto" aktiv\';
            break;
            case 5:
                $command = "mode&mode=man";
                $text = \'Modus "Manuell" aktiv\';
            break;
            default:
                return;
            break;
            }        

             $ch = curl_init();
                 $url = "http://".$ip."/xml?cmd=".$command;
                     curl_setopt($ch, CURLOPT_URL, $url);
                     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
                    curl_setopt($ch, CURLOPT_USERPWD, $user.":".$pass);
            
                 curl_exec($ch);
             curl_close($ch);
            
            SetValue($_IPS[\'VARIABLE\'], $_IPS[\'VALUE\']);
            WFC_SendNotification($_IPS[\'CONFIGURATOR\'], "'.$data_status['name'].'", $text, "HouseRemote", 5);                
        break;
        case "roboJobStart":
            $remote = GetValue(IPS_GetObjectIDByIdent("roboJobRemote", IPS_GetObjectIDByIdent("roboJobControl", IPS_GetParent($_IPS[\'SELF\']))));
            $mode = GetValue(IPS_GetObjectIDByIdent("roboJobMode", IPS_GetObjectIDByIdent("roboJobControl", IPS_GetParent($_IPS[\'SELF\']))));
    
        // Startzeitumrechnung ins 15min Raster
            $hrs = GetValue(IPS_GetObjectIDByIdent("roboJobTime_h", IPS_GetObjectIDByIdent("roboJobTimeStart", IPS_GetObjectIDByIdent("roboJobControl", IPS_GetParent($_IPS[\'SELF\'])))));
            $min = GetValue(IPS_GetObjectIDByIdent("roboJobTime_m", IPS_GetObjectIDByIdent("roboJobTimeStart", IPS_GetObjectIDByIdent("roboJobControl", IPS_GetParent($_IPS[\'SELF\'])))));

              switch($min){
                  case 0:
                    $starttime = $hrs * 4;
                break;
                  case 15:
                    $starttime = $hrs * 4 + 1;
                break;
                  case 30:
                    $starttime = $hrs * 4 + 2;
                break;
                  case 45:
                    $starttime = $hrs * 4 + 3;
                break;
                }
                
           // Endzeitumrechnung ins 15min Raster
            $hrs = GetValue(IPS_GetObjectIDByIdent("roboJobTime_h", IPS_GetObjectIDByIdent("roboJobTimeStop", IPS_GetObjectIDByIdent("roboJobControl", IPS_GetParent($_IPS[\'SELF\'])))));
            $min = GetValue(IPS_GetObjectIDByIdent("roboJobTime_m", IPS_GetObjectIDByIdent("roboJobTimeStop", IPS_GetObjectIDByIdent("roboJobControl", IPS_GetParent($_IPS[\'SELF\'])))));
    
              switch($min){
                  case 0:
                    $endtime = $hrs * 4;
                break;
                  case 15:
                    $endtime = $hrs * 4 + 1;
                break;
                  case 30:
                    $endtime = $hrs * 4 + 2;
                break;
                  case 45:
                    $endtime = $hrs * 4 + 3;
                break;
                }

             $ch = curl_init();
                 $url = "http://".$ip."/xml?cmd=mode&mode=job&remotestart=$remote&begin=$starttime&end=$endtime&after=$mode";
                     curl_setopt($ch, CURLOPT_URL, $url);
                     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
                    curl_setopt($ch, CURLOPT_USERPWD, $user.":".$pass);
            
                 curl_exec($ch);
             curl_close($ch);

             WFC_SendNotification($_IPS[\'CONFIGURATOR\'], "'.$data_status['name'].'", "Mähauftrag gestartet", "HouseRemote", 5);
        break;
        default:
            SetValue($_IPS[\'VARIABLE\'], $_IPS[\'VALUE\']);
        break;
           }
    }

/*******************************************************************************
*******************************************************************************/

?>';

    IPS_SetScriptContent($sid_control, $content);
    
    


if($cam_installed == true){
// Bild laden
    $remote = "http://".$ip."/cam.jpg";
    $media_orig = IPS_GetKernelDir()."\\media\\".$data_status['name']."_orig.jpg";
    $media = IPS_GetKernelDir()."\\media\\".$data_status['name'].".jpg";

    // Downloaden
    $context = stream_context_create(array(
          'http' => array(
        'header'  => "Authorization: Basic " . base64_encode($user.':'.$pass)
        )));
        $data = file_get_contents($remote, false, $context);

    if($data == true){
        // Speichern
        file_put_contents($media_orig, $data);
            
        // Bild um 180° drehen
        $source = imagecreatefromjpeg($media_orig);
          $rotate = imagerotate($source, 180, 0);
          ImageDestroy($source);
          imagejpeg($rotate, $media, 180);
            
        CreateMediaImage($did, "Bild", $rotate, $media, 20, false);
        ImageDestroy($rotate);
        }

// Inhalt Skript Bild laden
$content = '<?    
/*******************************************************************************

    MSC - Version 0.6 vom 28.12.2016

********************************************************************************


                         SKRIPT ZUM AUSLESEN VON MÄHROBOTER
                                 AUSGESTATTET MIT DEM
                             ROBONECT-MODUL H30x Ver. 0.9c

    ------------------------------------------------------------------------

                           Bild vom Kameramodul laden


********************************************************************************
*******************************************************************************/

// Verbindungsdaten
    $ip = "'.$ip.'";
    $user = "'.$user.'";
    $pass = "'.$pass.'";

/*******************************************************************************
*******************************************************************************/

switch($_IPS[\'SENDER\']){
    case "Variable":
       switch($_IPS[\'VALUE\']){
               case 1:        // parkt
                $control = false;
                setPicture("parked");
            break;
               case 2:        // mäht
                $control = true;
            break;
               case 3:        // sucht die Ladestation
                $control = true;
            break;
            case 4:        // lädt
                  $control = false;
                  setPicture("charge");
            break;
               case 5:        // warten auf umsetzen
                $control = true;
            break;
               case 16:    // abgeschaltet
                $control = false;
                setPicture("off");
            break;            
               case 17:    // schläft
                $control = false;
                setPicture("sleep");
            break;
            }
           IPS_SetEventActive(IPS_GetObjectIDByIdent("roboScriptTimer", $_IPS[\'SELF\']), $control);
        break;
        case "TimerEvent":
            $status = Sys_Ping($ip, 500);

            if($status == true){
                $remote = "http://".$ip."/cam.jpg";
                $media_orig = IPS_GetKernelDir()."\\media\\'.$data_status['name'].'_orig.jpg";
                $media = IPS_GetKernelDir()."\\media\\'.$data_status['name'].'.jpg";

            // Downloaden
                $context = stream_context_create(array(
                      \'http\' => array(
                     \'header\'  => "Authorization: Basic " . base64_encode($user.\':\'.$pass)
                    )));
                $data = file_get_contents($remote, false, $context);

                if($data == true){
                // Speichern
                    file_put_contents($media_orig, $data);
            

                // Bild um 180° drehen
                       $source = imagecreatefromjpeg($media_orig);
                      $rotate = imagerotate($source, 180, 0);
                      ImageDestroy($source);
                      imagejpeg($rotate, $media, 180);
            
                    CreateMediaImage(IPS_GetParent($_IPS[\'SELF\']), "Bild", $rotate, $media, 20, false);
                    ImageDestroy($rotate);
                    }
                }
            else setPicture("disconnect");        
        break;
        default:
            return;
        break;
        }

/*******************************************************************************
*******************************************************************************/

// FUNKTIONEN

/*******************************************************************************
*******************************************************************************/
// Funktion Bild erstellen
// ------------------------
function setPicture($mode){
       $media = IPS_GetKernelDir()."\\media\\'.$data_status['name'].'.jpg";

    $format = getimagesize($media);
    $image = imagecreatetruecolor($format[0], $format[1]);
    $tfarbe = imagecolorallocate($image, 255, 150, 0);
    
    switch($mode){
        case "disconnect":
            $text = utf8_decode("--| Mähroboter nicht erreichbar |--");
            $x = 165;
        break;
        case "charge":
            $text = utf8_decode("--| Mähroboter lädt |--");
            $x = 215;        
        break;
        case "parked":
            $text = utf8_decode("--| Mähroboter geparkt |--");
            $x = 200;
        break;
        case "off":
            $text = utf8_decode("--| Mähroboter abgeschaltet |--");
            $x = 180;
        break;
        case "sleep":
            $text = utf8_decode("--| Mähroboter schläft |--");
            $x = 200;
        break;
        default:
            return;
        break;
        }
        
    imagestring ($image, 5, $x, 235, $text, $tfarbe);
    imagejpeg($image, $media);
    
    CreateMediaImage(IPS_GetParent($_IPS[\'SELF\']), "Bild", $image, $media, 20, false);
    imagedestroy($image);
    }


// Funktion Media - Bild anlegen
// ------------------------------
function CreateMediaImage($parentID, $name, $media, $imagefile, $position, $option = true){
    $ident = preg_replace(\'/[^A-Za-z0-9]/\', \'\', $name);
    $mediaID = @IPS_GetObjectIDByIdent($ident, $parentID);

    if ($mediaID === false){
        $mediaID = IPS_CreateMedia(1);
        IPS_SetParent($mediaID, $parentID);
        IPS_SetIdent ($mediaID, $ident);
        IPS_SetPosition($mediaID, $position);
        IPS_SetMediaCached($mediaID, false);
        IPS_SetName($mediaID, $name);
        }
                
    IPS_SetMediaFile($mediaID, $imagefile, false);
    if($option) IPS_SetMediaContent($mediaID, base64_encode($media));
    IPS_SendMediaEvent($mediaID);
    
    return $mediaID;
    }
/*******************************************************************************
*******************************************************************************/

?>';

    IPS_SetScriptContent($sid_picture, $content);
    }


    // Events anlegen
        SetTimeEventByName($sid_getData, "ScriptTimer", "roboScriptTimer", 10, 15, true);
        
        if($cam_installed == true){
            SetTimeEventByName($sid_picture, "ScriptTimer", "roboScriptTimer", 10, 90, true);
            SetTriggerEventByName($sid_picture, "StatusTrigger", "roboStatusTrigger", 11, $trigger, true);
            }
                
/*******************************************************************************
********************************************************************************

    FUNKTIONEN

*******************************************************************************
*******************************************************************************/
// Funktion Dummy erstellen
// -----------------------------------------------------------------------------
function SetDummyByName($parentID, $name, $ident, $position, $icon, $check = false){
    $did = @IPS_GetObjectIDByIdent($ident, $parentID);
    if($did === false){
        $did = @IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}");
        IPS_SetName($did, $name);
        IPS_SetIdent($did, $ident);
        IPS_SetParent($did, $parentID);
          IPS_SetPosition($did, $position);
          IPS_SetIcon($did, $icon);
         }

    if($check){
        if($name != IPS_GetObject($did)['ObjectName'])IPS_SetName($did, $name);
        if($position != IPS_GetObject($did)['ObjectPosition'])IPS_SetPosition($did, $position);
        }
    return $did;
    }    

// Funktion Variable erstellen
// -----------------------------------------------------------------------------
function CreateVariableByName($parentID, $name, $ident, $type, $profil, $pos, $script, $check = false, $logging = false){
    $vid = @IPS_GetObjectIDByIdent($ident, $parentID);
       if($vid === false){
        $vid = @IPS_CreateVariable($type);
           IPS_SetParent($vid, $parentID);
           IPS_SetName($vid, $name);
           IPS_SetIdent($vid, $ident);
           IPS_SetVariableCustomProfile($vid, $profil);
           @IPS_SetVariableCustomAction($vid, $script);
           IPS_SetPosition($vid, $pos);
            
        if($logging == true){
        	$list = IPS_GetInstanceListByModuleID("{43192F0B-135B-4CE7-A0A7-1475603F3060}");

            AC_SetAggregationType($list[0], $vid, 0);
            AC_SetGraphStatus($list[0], $vid, false);
            AC_SetLoggingStatus($list[0], $vid, true);
            IPS_ApplyChanges($list[0]);
            }
        }
    if($check){
        if($name != IPS_GetObject($vid)['ObjectName'])IPS_SetName($vid, $name);
        if($pos != IPS_GetObject($vid)['ObjectPosition'])IPS_SetPosition($vid, $pos);
        }
      return $vid;
    }

// Funktion Variablenprofil erstellen
// -----------------------------------------------------------------------------
function create_profil($profil, $typ, $min, $max, $step, $pre, $suf, $asso, $color = false){
 $data = @IPS_GetVariableProfile($profil);

    if($data == true){
        // Einträge löschen
        foreach($data['Associations'] as $key => $array){
            @IPS_SetVariableProfileAssociation($profil, $key, "", "", -1);
            }
        }
    else{
          IPS_CreateVariableProfile($profil, $typ);
        IPS_SetVariableProfileValues($profil, $min, $max, $step);
        }

// -----------------------------------------------------------------------------

   // neue Einträge erstellen
   IPS_SetVariableProfileValues($profil, $min, $max, $step);

    if(is_array($asso) == true){
        foreach($asso as $key => $value){
           IPS_SetVariableProfileText($profil, $pre, $suf);
           if($color == false){
                @IPS_SetVariableProfileAssociation($profil, $key, $value, "", -1);
               }
            else{
                @IPS_SetVariableProfileAssociation($profil, $key, $value, "", hexdec($color[$key]));
               }
            }
        }
    else{
       IPS_SetVariableProfileText($profil, $pre, $suf);
       if($color == false){
              @IPS_SetVariableProfileAssociation($profil, 0, $asso, "", -1);
              }
       else{
              @IPS_SetVariableProfileAssociation($profil, 0, $asso, "", hexdec($color));
              }
        }
    }


// Funktion TimeEvent erstellen
// -----------------------------------------------------------------------------
function SetTimeEventByName($parentID, $name, $ident, $position, $time, $state){
   $eid = @IPS_GetObjectIDByIdent($ident, $parentID);

    if($eid === false){
        $eid = IPS_CreateEvent(1);

        IPS_SetEventCyclic($eid, 0, 0, 0, 0, 1, $time);
        IPS_SetName($eid, $name);
        IPS_SetParent($eid, $parentID);
        IPS_SetPosition($eid, $position);
         IPS_SetIdent($eid, $ident);
        IPS_SetEventActive($eid, $state);
         }

    return $eid;
    }


// Funktion TriggerEvent erstellen
// -----------------------------------------------------------------------------
function SetTriggerEventByName($parentID, $name, $ident, $position, $trigger, $state){
   $eid = @IPS_GetObjectIDByIdent($ident, $parentID);

    if($eid === false){
        $eid = IPS_CreateEvent(0);

        IPS_SetEventTrigger($eid, 1, $trigger);
        IPS_SetName($eid, $name);
        IPS_SetParent($eid, $parentID);
        IPS_SetPosition($eid, $position);
         IPS_SetIdent($eid, $ident);
        IPS_SetEventActive($eid, $state);
         }

    return $eid;
    }


// Funktion MediaImage erstellen
// -----------------------------------------------------------------------------
function CreateMediaImage($parentID, $name, $media, $imagefile, $position, $option = true){
    $ident = preg_replace('/[^A-Za-z0-9]/', '', $name);
    $mediaID = @IPS_GetObjectIDByIdent($ident, $parentID);

    if ($mediaID === false){
        $mediaID = IPS_CreateMedia(1);
        IPS_SetParent($mediaID, $parentID);
        IPS_SetIdent ($mediaID, $ident);
        IPS_SetPosition($mediaID, $position);
        IPS_SetMediaCached($mediaID, false);
        IPS_SetName($mediaID, $name);
        }
                
    IPS_SetMediaFile($mediaID, $imagefile, false);
    if($option) IPS_SetMediaContent($mediaID, base64_encode($media));
    IPS_SendMediaEvent($mediaID);
    
    return $mediaID;
    }
    
/*******************************************************************************
*******************************************************************************/

?>