Rasenmäher: Entscheidungshilfe und Einbindung in IPS

Das wäre auch ein Ansatz. Kann man das ohne Spuren wieder rückgängig machen falls es innerhalb der Garantiezeit ein Problem geben sollte?

Nach innen verlegen klingt gut. Hättest du da eventuell ein paar Fotos wie du das gelöst hast?

Der ist relativ einfach zu zerlegen, hier ein Link:

Dmontage-remontage du mouton

ist halt auf Französisch, aber die bilder sagen eh mehr oder weniger alles.
Zum Zerlegen.

AM ausschalten, dann reinigen,
dann ladestecker unden demontieren,
den mikroschalter für die Stopptaste demontieren,
dann 4 Schrauben öffnen und die Haube entfernen,
Dann gibt es noch 4 Schrauben, um den Displaydeckel zu öffnen und das wars.

Den Diagnosestecker kann man mit einem Schraubenzieher einfach nach innen drücken ( seitlich den schnapper eindrücken)

ich hab das Wlanmodul einfach mit Kabelbinder befestigt:

Super, danke. Werde heute abend gleich mal meinen AM aufschrauben und schauen ob ich mir das zutraue.

LG
Hugo

So. alles bekommen, verlötet und verbaut. Kann meinen Automower nun erfolgreich anpingen :slight_smile:
Ich habe heute einige Zeit herumgetüftelt und verstehe da noch einige Dinge nicht.

Das Script von HWH (Automower auf Auto, Manuell oder Basisstation einstellen) funktionierte bei mir auf Anhieb. Daraus schliesse ich, dass zumindest die Hardware funktioniert und richtig konfiguriert ist. Beim Auslesen der Parameter bin ich aber weniger Erfolgreich gewesen.
Ich habe mich mit dem Script von BestEx versucht und bin nach seiner Anleitung vorgegangen. Das Script funktioniert und produziert keine Fehlermeldungen. Ich kann auch die Timer am AM setzen, bekomme aber nichts aus dem Automower geliefert (alle Variablen z.B. Akku Temp, Spannung, Drehzahl etc. werden nicht gesetzt).

Kann mir jemand bitte ein Beispielscript geben, mit dem ich nur z.B. Akkuspannung abfragen kann? Ich bin kein PHP Experte, eher ein versierter User und teilweise kapiere ich leider nicht, was die Scripts tun. Ich hoffe mit einem einfachen Script, Schritt für Schritt weiter zu kommen und irgendwann auch zu verstehen wie es funktioniert. Beim Script von BestEx habe ich nur die IDs angepasst, es aber nicht weiter modifiziert.

Wie weiter vorne von Garfi erklärt, sende ich alle 30 Sekunden folgendes Skript:

csck_sendtext(51803 , "\x0f\x01\xf1\x00\x00");  //Statuscode
csck_sendtext(51803 , "\x0f\x2e\xea\x00\x00");  //Motordrehzahl
csck_sendtext(51803 , "\x0f\x2e\xfe\x00\x00");  //Akku Volt
csck_sendtext(51803 , "\x0f\x2e\xf4\x00\x00");  //Akku Volt auch
csck_sendtext(51803 , "\x0f\x02\x33\x00\x00");  //Akku Temperatur A
csck_sendtext(51803 , "\x0f\x2e\xe0\x00\x00");  //Akku mAh

Über die Registervariable des Sockets starte ich das Script von BestEx:

<?
$CR = '<BR>';
if ($_IPS['SENDER'] == "RegisterVariable")
{


    $data  = $IPS_VALUE;
    $pos1=(substr($data,0,1));
    $werte=(ord(substr($data,3,1))+256*ord(substr($data,4,1)));

    if ($pos1==chr(0x0F))
    {

    $pos2=(substr($data,1,2));
    ips_Logmessage("DATA","Pos1: " . dechex(ord(($pos1))) . "  Pos2: " . dechex(ord(substr($pos2,0,1))). dechex(ord(substr($pos2,1,1))). " Werte: " . $werte);
    switch ($pos2)
     {
       case chr(0x2e).chr(0xea):    if ((int)$werte < 3000){setvalue(39330 /*[Konfig\Scripts\Josef\Variablen\Drehzahl]*/,(int)$werte);}break;
       case chr(0x02).chr(0x2d):    setvalue(22429 /*[Konfig\Scripts\Josef\Variablen\Blade Motor]*/,((int)$werte)); break;
       case chr(0x12).chr(0x8e):    setvalue(56149 /*[Konfig\Scripts\Josef\Variablen\Blade Motor Current II]*/,((int)$werte)); break;

       case chr(0x4a).chr(0x38):    setvalue(16241 /*[Konfig\Scripts\Josef\Variablen\Timer\1]*/,  ord(substr($data,3,1))); setvalue(30690 /*[Konfig\Scripts\Josef\Variablen\Timer\2]*/ , ord(substr($data,4,1))); break;
       case chr(0x4a).chr(0x3a):    setvalue(32418 /*[Konfig\Scripts\Josef\Variablen\Timer\3]*/,  ord(substr($data,3,1))); setvalue(33211 /*[Konfig\Scripts\Josef\Variablen\Timer\4]*/, ord(substr($data,4,1))); break;
       case chr(0x4a).chr(0x3c):    setvalue(47320 /*[Konfig\Scripts\Josef\Variablen\Timer\5]*/,  ord(substr($data,3,1))); setvalue(34424 /*[Konfig\Scripts\Josef\Variablen\Timer\6]*/, ord(substr($data,4,1))); break;
       case chr(0x4a).chr(0x3e):    setvalue(34136 /*[Konfig\Scripts\Josef\Variablen\Timer\7]*/,  ord(substr($data,3,1))); setvalue(37316 /*[Konfig\Scripts\Josef\Variablen\Timer\8]*/, ord(substr($data,4,1)));  break;
       
       case chr(0x4a).chr(0x40):    setvalue(31382 /*[Konfig\Scripts\Josef\Variablen\Timer\9]*/,  ord(substr($data,3,1))); setvalue(41233 /*[Konfig\Scripts\Josef\Variablen\Timer\10]*/, ord(substr($data,4,1)));  break;
       case chr(0x4a).chr(0x42):    setvalue(50476 /*[Konfig\Scripts\Josef\Variablen\Timer\11]*/, ord(substr($data,3,1))); setvalue(48156 /*[Konfig\Scripts\Josef\Variablen\Timer\12]*/, ord(substr($data,4,1))); break;
       case chr(0x4a).chr(0x44):    setvalue(41574 /*[Konfig\Scripts\Josef\Variablen\Timer\13]*/, ord(substr($data,3,1))); setvalue(44660 /*[Konfig\Scripts\Josef\Variablen\Timer\14]*/, ord(substr($data,4,1))); break;
       case chr(0x4a).chr(0x46):    setvalue(32763 /*[Konfig\Scripts\Josef\Variablen\Timer\15]*/, ord(substr($data,3,1))); setvalue(22505 /*[Konfig\Scripts\Josef\Variablen\Timer\16]*/, ord(substr($data,4,1)));break;


       case chr(0x01).chr(0xf1):    switch ($werte) {
                                                        case 12   :setvalue(46477 /*[Konfig\Scripts\Josef\Variablen\Status]*/,"kein Schleifensignal"); break;
                                                        case 34   :setvalue(46477 /*[Konfig\Scripts\Josef\Variablen\Status]*/,"Mäher hochgehoben"); break;
                                                        case 52   :setvalue(46477 /*[Konfig\Scripts\Josef\Variablen\Status]*/,"Kein Kontakt in Ladestation"); break;
                                                        case 54   :setvalue(46477 /*[Konfig\Scripts\Josef\Variablen\Status]*/,"PIN abgelaufen"); break;
                                                        case 1000 :setvalue(46477 /*[Konfig\Scripts\Josef\Variablen\Status]*/,"Ladestation verlassen"); break;
                                                        case 1002 :setvalue(46477 /*[Konfig\Scripts\Josef\Variablen\Status]*/,"Mähen"); break;
                                                        case 1006 :setvalue(46477 /*[Konfig\Scripts\Josef\Variablen\Status]*/,"Mähwerk starten"); break;
                                                        case 1008 :setvalue(46477 /*[Konfig\Scripts\Josef\Variablen\Status]*/,"Mähwerk gestartet"); break;
                                                        case 1012 :setvalue(46477 /*[Konfig\Scripts\Josef\Variablen\Status]*/,"Signal Mähwerk starten"); break;
                                                        case 1014 :setvalue(46477 /*[Konfig\Scripts\Josef\Variablen\Status]*/,"In Ladestation am aufladen"); break;
                                                        case 1016 :setvalue(46477 /*[Konfig\Scripts\Josef\Variablen\Status]*/,"in Ladestation warten"); break;
                                                        case 1024 :setvalue(46477 /*[Konfig\Scripts\Josef\Variablen\Status]*/,"Aus Ladestation ausfahren"); break;
                                                        case 1036 :setvalue(46477 /*[Konfig\Scripts\Josef\Variablen\Status]*/,"Viereckmodus"); break;
                                                        case 1038 :setvalue(46477 /*[Konfig\Scripts\Josef\Variablen\Status]*/,"Festgefahren"); break;
                                                        case 1040 :setvalue(46477 /*[Konfig\Scripts\Josef\Variablen\Status]*/,"Kollission / Schleife erreicht"); break;
                                                        case 1042 :setvalue(46477 /*[Konfig\Scripts\Josef\Variablen\Status]*/,"Suche Ladestation"); break;
                                                        case 1044 :setvalue(46477 /*[Konfig\Scripts\Josef\Variablen\Status]*/,"Stop"); break;
                                                        case 1048 :setvalue(46477 /*[Konfig\Scripts\Josef\Variablen\Status]*/,"Andocken"); break;
                                                        case 1050 :setvalue(46477 /*[Konfig\Scripts\Josef\Variablen\Status]*/,"Aus Ladestation fahren"); break;
                                                        case 1052 :setvalue(46477 /*[Konfig\Scripts\Josef\Variablen\Status]*/,"Bitte Yes drücken"); break;
                                                        case 1056 :setvalue(46477 /*[Konfig\Scripts\Josef\Variablen\Status]*/,"Wartend (Manuell/Home)"); break;
                                                        case 1058 :setvalue(46477 /*[Konfig\Scripts\Josef\Variablen\Status]*/,"Bregrenzung folgend"); break;
                                                        case 1060 :setvalue(46477 /*[Konfig\Scripts\Josef\Variablen\Status]*/,"N-Signal gefunden"); break;
                                                        case 1064 :setvalue(46477 /*[Konfig\Scripts\Josef\Variablen\Status]*/,"Suche Ladestation"); break;
                                                        case 1070 :setvalue(46477 /*[Konfig\Scripts\Josef\Variablen\Status]*/,"Suchschleife folgen"); break;
                                                        case 1072 :setvalue(44466 /*[Objekt #44466 existiert nicht]*/,"Schleife folgen"); break;
                                                        default: setvalue(46477 /*[Konfig\Scripts\Josef\Variablen\Status]*/,$werte);break;
                                                     }
//        case chr(0x2e).chr(0xfe):    if ((int)$werte/1000 < 25){(setvalue(16215 /*[Konfig\Scripts\Josef\Variablen\Spannung]*/,$werte/1000));} break;//Spannung [V]
        case chr(0x2e).chr(0xfe):
                  setvalue(16215 /*[Konfig\Scripts\Josef\Variablen\Spannung]*/,$werte/1000);
                  ips_logmessage("SPANNUNG","SPANNUNG");
               break;//Spannung [V]
        case chr(0x02).chr(0x33):    if ((int)$werte < 50){(setvalue(46948 /*[Konfig\Scripts\Josef\Variablen\Akku Temperatur]*/,(int)$werte));} break;//Akku A Temperatur
        case chr(0x2e).chr(0xe0):    if ((int)$werte < 2500){(setvalue(50997 /*[Konfig\Scripts\Josef\Variablen\Kapazität]*/,(int)$werte));}break;//Kapazität [mAh]
        default: setvalue(50546 /*[Konfig\Scripts\Josef\Variablen\Werte]*/,"Adr: ".(dechex(ord(substr($data,1,1))))." ".(dechex(ord(substr($data,2,1))))." - Werte: ".$werte ); break;
     }
   }
}

$Start_t1_s = GetValue(16241 /*[Konfig\Scripts\Josef\Variablen\Timer\1]*/);
$Start_t1_m = GetValue(30690 /*[Konfig\Scripts\Josef\Variablen\Timer\2]*/);
$Stop_t1_s  = GetValue(32418 /*[Konfig\Scripts\Josef\Variablen\Timer\3]*/);
$Stop_t1_m  = GetValue(33211 /*[Konfig\Scripts\Josef\Variablen\Timer\4]*/);

$Start_t2_s = GetValue(31382 /*[Konfig\Scripts\Josef\Variablen\Timer\9]*/);
$Start_t2_m = GetValue(41233 /*[Konfig\Scripts\Josef\Variablen\Timer\10]*/);
$Stop_t2_s  = GetValue(50476 /*[Konfig\Scripts\Josef\Variablen\Timer\11]*/);
$Stop_t2_m  = GetValue(48156 /*[Konfig\Scripts\Josef\Variablen\Timer\12]*/);

$Start_wt1_s = GetValue(47320 /*[Konfig\Scripts\Josef\Variablen\Timer\5]*/);
$Start_wt1_m = GetValue(34424 /*[Konfig\Scripts\Josef\Variablen\Timer\6]*/);
$Stop_wt1_s  = GetValue(34136 /*[Konfig\Scripts\Josef\Variablen\Timer\7]*/);
$Stop_wt1_m  = GetValue(37316 /*[Konfig\Scripts\Josef\Variablen\Timer\8]*/);

$Start_wt2_s = GetValue(41574 /*[Konfig\Scripts\Josef\Variablen\Timer\13]*/);
$Start_wt2_m = GetValue(44660 /*[Konfig\Scripts\Josef\Variablen\Timer\14]*/);
$Stop_wt2_s  = GetValue(32763 /*[Konfig\Scripts\Josef\Variablen\Timer\15]*/);
$Stop_wt2_m  = GetValue(22505 /*[Konfig\Scripts\Josef\Variablen\Timer\16]*/);




$text1 = date("H:i",($Start_t1_s-1)*60*60 +$Start_t1_m*60);
$text2 = date("H:i",($Stop_t1_s-1)*60*60 +$Stop_t1_m*60);
$text3 = date("H:i",($Start_t2_s-1)*60*60 +$Start_t2_m*60);
$text4 = date("H:i",($Stop_t2_s-1)*60*60 +$Stop_t2_m*60);
$text5 = date("H:i",($Start_wt1_s-1)*60*60 +$Start_wt1_m*60);
$text6 = date("H:i",($Stop_wt1_s-1)*60*60 +$Stop_wt1_m*60);
$text7 = date("H:i",($Start_wt2_s-1)*60*60 +$Start_wt2_m*60);
$text8 = date("H:i",($Stop_wt2_s-1)*60*60 +$Stop_wt2_m*60);

$text = "Wochentage".$CR.
        "Timer 1 ".$CR."Start : ".$text1.$CR.
          " Stop : ".$text2.$CR.$CR.
          "Timer 2 ".$CR."Start : ".$text3.$CR.
          "Stop : ".$text4.
          $CR.$CR.
          "Wochenende".$CR.
        "Timer 1 ".$CR."Start : ".$text5.$CR.
          " Stop : ".$text6.$CR.$CR.
          "Timer 2 ".$CR."Start : ".$text7.$CR.
          "Stop : ".$text8
          ;

SetValueString(23237 ,$text);

?>

Wenn mir jemand Tipps geben kann, dass ich einen Schritt weiterkomme, bin ich sehr dankbar.

LG
Hugo

sobald ich zeit habe werde ich in den nächsten Tagen versuchen mir das einmal anzuschauen

Sent from my iPad using Tapatalk HD

Hallo Hugo,

Hast du auch einen Cutter angelegt?
Du hast ja einen Client Socket. Danach ist noch ein Cutter anzulegen, der auf den Client Socket zugreift.
Da ist dann als Startzeichen OF (Hex) und eine Länge von 5 einzutragen.
Hinter dem Cutter kommt dann die Register Variable, die das Script startet.

Du kannst ja mal auf den Client Socket gehen, und da auf Debug klicken, dann siehst du mal ob was vom Automower zurückkommt.
Gruß garfi

Hallo Garfi!

Ja, einen Cutter habe ich angelegt:

Benutze feste Schritte

  • Engabelänge 5
  • Sync Zeichen 0F (Hex)
    Timeout 0

Übergeordnete Instanz: IP des Automowers:10001

Die RegVar habe ich hinter dem Socket angelegt. Ich probier gleich mal aus was passiert, wenn ich sie hinter dem Cutter anlege.

Beim Client Socket habe ich kein Debug - liegt das an meiner IPS Version (2.5?)

LG
Hugo

Erfolg!

Das mit dem Cutter wars. Ich hatte die RegVar unter dem Clientsocket angelegt:mad:

Zwei kleine Fragen hab ich noch: Beim Timer habe ich in IPS folgendes eingestellt (und über das Script zum AM geschickt):
Startzeit 1: 21:00, Stopzeit 1: 07:00
Startzeit 2: 00:00, Stopzeit 2: 00:00

Beim AM werden folgende zeiten ausgelesen:
Startzeit 1: 20:59, Stopzeit 1: 07:00
Startzeit 2: 01:00, Stopzeit 2: 01:00

Script:

<?
/* Die Reihenfolge der Timer ist : T1 Start, T1 Stop, T2 Start, T2 Stop, Wochenend T1 Start, Wochenend T1 Stop, Wochenend T2 Start, Wochenend T2 Stop */
$IPS_Timer_ID = [24490,37312 /*[Konfig\Scripts\Josef\Timer\]*/,31065,34914 /*[Konfig\Scripts\Josef\Timer\]*/,40034,56604 /*[Konfig\Scripts\Josef\Timer\]*/,58831,50606]; /* 8 Timer unterhalb einer Dummy Variable anlegen und ID`s hier eintragen */
$Minuten_Index = [0,2,4,6,8,10,12,14];
$Stunden_Index = [1,3,5,7,9,11,13,15];

foreach ($IPS_Timer_ID as $key =&gt; $ID)
{
$IPS_Timer_Info =  IPS_GetEvent ($ID);
$Unix_Zeit_in_sekunden = $IPS_Timer_Info['CyclicTimeFrom'];


$Zeit_Array[$Stunden_Index[$key]] = date("H",$Unix_Zeit_in_sekunden);
$Zeit_Array[$Minuten_Index[$key]] = date("i",$Unix_Zeit_in_sekunden);

}


$Header = chr(0x0F).chr(0xca);
$Footer = chr(0x00);

$Timer_Automower_adressen = [chr(0x38),chr(0x39),chr(0x3a),chr(0x3b),chr(0x40),chr(0x41),chr(0x42),chr(0x43),
                   chr(0x3c),chr(0x3d),chr(0x3e),chr(0x3f),chr(0x44),chr(0x45),chr(0x46),chr(0x47)];

foreach ($Timer_Automower_adressen as $key =&gt; $adresse)
{
  Csck_sendtext(51803 /*[Lantronix Automower]*/,$Header.$adresse.chr($Zeit_Array[$key]).$Footer); /* Client Socket ID eintragen */
}


sleep(1);
IPS_Runscript(26286 /*[Konfig\Scripts\Josef\Timer auslesen]*/); /* ID des Abfragescripts eintragen um die Anzeige der Timer im WF zu aktualisieren */

?&gt;

Den AM habe ich im Home Modus (steht in der Ladestation). IPS liest aus „In Ladestation warten“ was auch stimmt; wenn ich aber auf „Auto“ umschalte, ist immer noch „In Ladestation warten“.
Wie kann ich diese Modi (Manuell, Auto, Home) auslesen?

Danke euch!
Hugo

Beim cutter ist die übergeordnete Instanz der Clien Socket. Bei mir gibt es da aber einen Debug, ebenso im Cutter und in der Registervariable.
Dann kannst du mal schauen, wie weit deine Antwort kommt.

Anbei naoch ein paar Screenshots, wie es aussehen sollte (Fehlermeldung sind nur da, weil es nicht vom meinen Life-IPS ist), da sieht man auch den Debug:

gruß garfi

Hallo Garfi!

Bei mir siehts anders aus, habe aber das Debug gefunden. Es ist nicht als Reiter wie bei dir, sondern unten als Button vorhanden.

LG
Hugo

Hallo Hugo,

mit

csck_sendtext(xxxxx, "\x0f\x01\x2c\x00\x00");  

kannst du den Status auslesen.

LG garfi

Hallo Garfi!

Danke, das funktioniert so. Heisst das, dass ich generell für das Lesen „\x0f\x01…“ und zum schreiben „\x0f\x81…“ schicken muss?

LG
Hugo

Hallo Hugo,

ja Prinzipiell ist das erste Bit 0 für lesen und 1 für schreiben (binär betrachtet).
auf Seite 3 in diesen Thema gibt es noch ein paar Adressen. Aber Vorsicht, manche Adressen dürfen nicht verändert werden, also nur bekannte verwenden.

LG garfi

Hallo!

Dank eurer Hilfe funktioniert die Schnittstelle zum Automower nahezu perfekt. Ich kann den Mäher manuell starten, die Timer auslesen und manipulieren, den Mäher bei Regen heimschicken usw.
Eine Kleinigkeit habe ich aber noch nicht geschafft: Ich teilen den Mäher mit meinem Nachbarn. Wenn er der Schleife links folgt, mäht er bei mir, rechts beim Nachbarn. Der Durchgang ist relativ schmal, sodass es unwahrscheinlich ist dass der Mäher ins andere Segment fährt wenn er einmal drin ist. Hat jemand einen Tipp, wie ich steuern kann ob er links, rechts oder dem Suchkabel entlang ausfahren soll?

LG
Hugo

Hallo Ihr Ichmähenichtselbsthelden,

Ich gebe zu, dass das Thema interessant ist und mich ja fast schwach werden ließ.
ABER
Ein von Teichfröschen recht gut und ständig besuchter Teich befindet sich zentral auf meinem Grundstück. Nun wandern die Freunde ja öfter mal in der Umgebung rum und verlassen das Gelände. Letztes Jahr war es extrem. Da war die Wiese voller Frösche, so dass ich nur unter Schwierigkeiten mähen konnte. Dieses Jahr ist es überschaubar. Es wechselt also.
Wie verhindert der Teichbesitzer unter Euch denn ein ständiges Blutbad?
Ein leiser flacher autarker Dauermäher mit rasiermesserscharfen Klingen ist bestimmt was anderes als ein großer Mensch, der mit einem lauten Mäher durch den Garten stampft.

Hi Boui,

ich denke, das kommt auf die Mäh-Intervalle an. Sind sie kurz, findet das Massaker nur einmal statt und reduziert die Population soweit, dass Fortpflanzung kaum noch effektiv ist…:smiley:

Ja aber so wie ich es verstanden habe, mäht dieser Automäher - übertrieben gesagt - fast ständig. Das erscheint mir ja genau das Prinzip zu sein.

Nachtrag: Ich sehe schon meine Kleine im Garten stehen. In der Hand abgetrennte Froschglieder. Angeekelter Gesichtsausdruck. Bäh, Papa, bäh.

ja, wenn man die Teile hinterher noch identifizieren kann, ist das Mist :smiley:

Ich denke schon das die Geräuschentwicklung die Frösche verscheucht. Die Messer liegen auch im Innenbereich und der Mäher ist recht niedrig. Am besten Ihr schickt mir mal ein paar Frösche und ich Teste :slight_smile:

Sent from my iPad using Tapatalk HD