Rasenmäher: Entscheidungshilfe und Einbindung in IPS

Mein AM spricht jetzt über xbee mit IPS.
Scripte hab ich mal angefangen:

Daten anfordern: Diese Script ist alle z.B 30 Sekunden auszuführen, dann werden die Daten angefordert. (Bei Wlanverbindung muss das Comport_sendtext gegen Csck_sendtext ausgetauscht werden)

<?
COMPort_SendText(48114 /*[Serial Port Xbee AM]*/, "\x0f\x01\xf1\x00\x00");  //Statuscode
COMPort_SendText(48114 /*[Serial Port Xbee AM]*/, "\x0f\x2e\xea\x00\x00");  //Motordrehzahl
COMPort_SendText(48114 /*[Serial Port Xbee AM]*/, "\x0f\x2e\xfe\x00\x00");  //Akku Volt
COMPort_SendText(48114 /*[Serial Port Xbee AM]*/, "\x0f\x2e\xf4\x00\x00");  //Akku Volt auch
COMPort_SendText(48114 /*[Serial Port Xbee AM]*/, "\x0f\x02\x33\x00\x00");  //Akku Temperatur A
COMPort_SendText(48114 /*[Serial Port Xbee AM]*/, "\x0f\x2e\xe0\x00\x00");  //Akku mAh


?>

Daten aufbereiten:

<?



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));

    switch ($pos2) {

       case chr(0x2e).chr(0xea):    setvalue(33903 /*[Automower\Motordrehzahl]*/,$werte); break;//Mähmotor drehzahl
       case chr(0x01).chr(0xf1):    switch ($werte) {
														case 12 :setvalue(58642 /*[Automower\Status]*/,"kein Schleifensignal"); break;
												    	case 34 :setvalue(58642 /*[Automower\Status]*/,"Mäher hochgehoben"); break;
												    	case 54 :setvalue(58642 /*[Automower\Status]*/,"PIN abgelaufen"); break;
												    	case 1000 :setvalue(58642 /*[Automower\Status]*/,"Ladestation verlassen"); break;
												    	case 1002 :setvalue(58642 /*[Automower\Status]*/,"Mähen"); break;
												    	case 1006 :setvalue(58642 /*[Automower\Status]*/,"Mähwerk starten"); break;
												    	case 1008 :setvalue(58642 /*[Automower\Status]*/,"Mähwerk gestartet"); break;
												    	case 1012 :setvalue(58642 /*[Automower\Status]*/,"Signal Mähwerk starten"); break;
												    	case 1014 :setvalue(58642 /*[Automower\Status]*/,"In Ladestation am aufladen"); break;
												    	case 1016 :setvalue(58642 /*[Automower\Status]*/,"in Ladestation warten"); break;
												    	case 1024 :setvalue(58642 /*[Automower\Status]*/,"Aus Ladestation ausfahren"); break;
												    	case 1036 :setvalue(58642 /*[Automower\Status]*/,"Viereckmodus"); break;
												    	case 1038 :setvalue(58642 /*[Automower\Status]*/,"Festgefahren"); break;
												    	case 1040 :setvalue(58642 /*[Automower\Status]*/,"Kollission / Schleife erreicht"); break;
												    	case 1042 :setvalue(58642 /*[Automower\Status]*/,"Suche Ladestation"); break;
												    	case 1044 :setvalue(58642 /*[Automower\Status]*/,"Stop"); break;
												    	case 1048 :setvalue(58642 /*[Automower\Status]*/,"Andocken"); break;
												    	case 1050 :setvalue(58642 /*[Automower\Status]*/,"Aus Ladestation fahren"); break;
												    	case 1052 :setvalue(58642 /*[Automower\Status]*/,"Bitte Yes drücken"); break;
												    	case 1056 :setvalue(58642 /*[Automower\Status]*/,"Wartend (Manuell/Home)"); break;
												    	case 1058 :setvalue(58642 /*[Automower\Status]*/,"Bregrenzung folgend"); break;
												    	case 1060 :setvalue(58642 /*[Automower\Status]*/,"N-Signal gefunden"); break;
												    	case 1064 :setvalue(58642 /*[Automower\Status]*/,"Suche Ladestation"); break;
												    	case 1070 :setvalue(58642 /*[Automower\Status]*/,"Suchschleife folgen"); break;
												    	case 1072 :setvalue(58642 /*[Automower\Status]*/,"Schleife folgen"); break;
														default: setvalue(58642 /*[Automower\Status]*/,$werte);break;



																		}
		 										break;

        case chr(0x2e).chr(0xfe):    setvalue(20583 /*[Automower\Akku Spannung [V]]*/,$werte/1000); break;//Spannung [V]
        case chr(0x02).chr(0x33):    setvalue(17694 /*[Automower\Akku A Temperatur ]*/,$werte); break;//Akku A Temperatur
        case chr(0x2e).chr(0xe0):    setvalue(45299 /*[Automower\Akkukapazität [mAh]]*/,$werte); break;//Kapazität [mAh]
		  default: setvalue(23973 /*[Automower\unbekannte Meldung]*/,"Adr: ".(dechex(ord(substr($data,1,1))))." ".(dechex(ord(substr($data,2,1))))." - Werte: ".$werte ); break;


}
}

}
?>										   

Diese Script zerlegt die ankommenden Daten. Wenn etwas unbekanntes ankommt, wird das in eine Strinvariable geschrieben. Ich hab einen Cutter angelegt, der alles in 5 Byte zerlegt (Startbyte 0F), danach eine RegisterVariable, die dieses Script startet.

Das Script sollte natürlich noch erweitert werden, um mehr Informationen aus dem AM zu bekommen.
Ich habe einen 230ACX mit Softwareversion 2.80. Ich weiß nicht, ob andere Automower oder Softwareversionen andere Adressen benutzen.

Wenn wer noch mehr bekannte Adressen hat, bitte posten.

gruß garfi

Sind das alles Status Rückmeldungen oder kann ich auch (z.b. 1000 Ladestation verlassen) den Mower damit steuern ???

Für alle die es noch nicht gefunden haben der Port ist 10001

Auf der folgenden Seite gibt es ein paar weitere INfos zur Ansteuerung des Automowers (beitrag #80) : AutoMower von Elektrolux und Husqvarna - Seite 8
Auszug :

Das Protokoll des AutoMower ist:
Anfrage an den AM:

Byte 1: 0F Hex ; ist immer so.
Byte 2 und 3: die Adresse der AM-Variable.
Byte 4 und 5: sind normalerweise 0, bei einigen StringVariablen als Index.

Der AM antwortet dann:
Byte 1: 0F Hex
Byte 2 und 3: die angefragte Adresse.
Byte 4 und 5: Die gelesenen Daten.

Hier mal ein Beispiel:

Connected to „Kommunikationsanschluss (COM1)“
Request: 18.05.2006 10:52:04.46664
0F 46 50 00 00 .FP…
Answer: 18.05.2006 10:52:04.48264 (+0.0156 seconds)
0F 46 50 E8 03 .FPè.
Request: 18.05.2006 10:52:04.48264 (+0.0000 seconds)
0F 46 52 00 00 .FR…
Answer: 18.05.2006 10:52:04.49764 (+0.0156 seconds)
0F 46 52 29 5C .FR)\
Request: 18.05.2006 10:52:04.49764 (+0.0000 seconds)
0F 46 54 00 00 .FT…
Answer: 18.05.2006 10:52:04.51364 (+0.0000 seconds)
0F 46 54 00 00 .FT…
Request: 18.05.2006 10:52:04.51364 (+0.0000 seconds)
0F 46 56 00 00 .FV…
Answer: 18.05.2006 10:52:04.52964 (+0.0156 seconds)
0F 46 56 0B 00 .FV…
Request: 18.05.2006 10:52:04.52964 (+0.0000 seconds)
0F 46 58 00 00 .FX…
Answer: 18.05.2006 10:52:04.54464 (+0.0156 seconds)
0F 46 58 E1 10 .FXá.

Und weil wir schon dabei sind :slight_smile:

Hex Dez Namen
004c 76 Average calculating number [0-9] Test abc
004D 77 Added cutting power Hex2Dez 2748
0057 87 Different between left & right [pulses] Dez2Hex ABC
0137 311 Long average blade motor currency [??] Dez2Bin 101010111100
0138 312 1 if average calculating is ready Dez2Oct 5274
0193 403 Pulses from left motor (inc. if forward) Hex2Bin 101010111100
0194 404 Pulses from left motor (inc. if forward)
0199 409 Power right
019a 410 Power left
01ad 429 Length left motor (inc. if forward) [pulses]
019f 415 Left wheel direction: 1=forward
01a0 416 1 if right wheel will go forward
01a1 417 1 if forward right wheel
01a2 418 1 if left wheel rotate forward
01a3 419 Length past wire [pulses]
01a8 424 Loop sensor (front&rear) A0
01a9 425 Loop sensor A1
01aa 426 Loop sensor N7
01ab 427 Loop sensor F9
01b9 441 Loop Quality signal (max 500)
01ba 442 Loop sensor average F9
01ac 428 Loop sensor Average (A0)
01db 475 Front loop sensor A0
01dc 476 Rear loop sensor A0
01eb 491 Current [mA]
01ec 492 Charging time [min]
01ef 495 Charging battery amount [mAh]
01f0 496 Charging amount left when starting search [mAh]
01f1 497 Statuscode
022c 556 Cutting speed [time/puls]
022d 557 Blade motor currency consumption [??]
0233 563 Battery temp. [°C]
0234 564 Time since charging [min]
0235 565 Latest temp. (when charging) [°C]
0236 566 Time to next temp. measure [Sec]
0239 569 Charging number [1-10]
0243 579 Reference wheel speed
0250 592 X angle [??]
0257 599 Up side down [??]
0270 624 Blade motor status
027d 637 Return fast
0284 644 1 if more then 30 pulses outside wire (A0)
0285 645 Time mower inside wire (A0) max 100 [ms]
028d 653 Return run without wire
028e 654 Return fast complex
028f 655 Return fast platanos
0290 656 Return wheel
029d 669 Missing puls signal (0 if no error)
128c 4748 Collision sensor[A/D]
128d 4749 Lift sensors [A/D]
128e 4750 Blade motor current [A/D]
128f 4751 Current left [??]
1290 4752 Current right [??]
12cc 4812 Stop button [A/D]
1cfb 7419 Length past wire [cm]
24bf 9407 Speed right
24c0 9408 Speed left
2ee0 12000 Used battery amount [mAh]
2eea 12010 Blade motor speed [rpm]
2ef4 12020 Battery voltage [mV]
2efe 12030 Battery voltage current compensated [mV]
3390 13200 Version Firmware
36b1 14001 ? Sek
36b3 14003 ? Min
36b5 14005 ? Std
36b7 14007 ? Tag
36b9 14009 ? Monat
36bb 14011
36bd 14013 ? Jahr
3AC0 15040 Version Sprach Datei
4650 18000 ---- Start der Daten (Betriebsdaten)
4a38 19000 ----Start der Daten (Kundenenstellungen)
4a38 19000 Timer 1 Start Std
4a39 19001 Timer 1 Start Min
4a3a 19002 Timer 1 Stop Std
4a3b 19003 Timer 1 Stop Min
4a3c 19004 Wochen-Timer 1 Start Std
4a3d 19005 Wochen-Timer 1 Start Min
4a3e 19006 Wochen-Timer 1 Stop Std
4a3f 19007 Wochen-Timer 1 Stop Min
4a40 19008 Timer 2 Start Std
4a41 19009 Timer 2 Start Min
4a42 19010 Timer 2 Stop Std
4a43 19011 Timer 2 Stop Min
4a44 19012 Wochen-Timer 2 Start Std
4a45 19013 Wochen-Timer 2 Start Min
4a46 19014 Wochen-Timer 2 Stop Std
4a47 19015 Wochen-Timer 2 Stop Min
4a4e 19022 Timer aus
4a50 19024 W-Timer-Tage
4bc6 19398 ---- Ende der Daten (Kundenenstellungen)
4E4F 20047 ---- Ende der Daten (Betriebsdaten)
b6b1 46769 Uhr Sekunde
b6b3 46771 Uhr Minute
b6b5 46773 Uhr Stunde
b6b7 46775 Datum Tag
b6b9 46777 Datum Monat
b6bd 46781 Datum Jahr
C650 50768 ---- Start der Daten (schreiben der Betriebsdaten)
CA38 51768 ---- Start der Daten (schreiben der Kundendaten)
ca38 51768 schreiben Timer 1 Start
ca3a 51770 schreiben Timer 1 Stop
ca3c 51772 schreiben Wochen-Timer 1 Start
ca3e 51774 schreiben Wochen-Timer 1 Stop
ca40 51776 schreiben Timer 2 Start
ca42 51778 schreiben Timer 2 Stop
ca44 51780 schreiben Wochen-Timer 2 Start
ca46 51782 schreiben Wochen-Timer 2 Stop
ca4e 51790 schreiben Timer aus
ca50 51792 schreiben W-Timer-Tage
CBC6 52166 ---- Ende der Daten (schreiben der Kundendaten)
CBF0 52208 ---- Ende der Daten (Schreiben der Betriebsdaten)
0
0
0

Ich habe länger nichts an IPS gemacht, weil alles so läuft wie es soll… jetzt lese ich hier gerade mit und frage mich, was wollt ihr denn von Eurem Mähroboter.

Ich habe einen Robomow RL200 (nachdem ich mit einem älteren Friendly Robotics schon über Jahre zufrieden war) und der braucht kein IPS - er mäht einfach, wenn er soll.

Da mich natürlich jede Bastelstunde reizt, nun die Frage, was kann ich sinnvolles mit IPS an einem Mäher steuern, der doch eigentlich alles allein macht?

Über IPS möchte ich die folgenden Funktionen realisieren :

1.) Programmieren der Timer
2.) Bei Regen nicht fahren bzw. später fahren wenn es wieder trocken ist
3.) E-Mail + SMS bei Diebstahl (Schleifen Signal fehlt)
4.) Wartungs information remote bekommen (AM steckt fest etc.)

Kann sein das mir noch mehr einfällt aber auf die schnelle ist das erst mal meine Liste

Die folgende Info über die Timer Steuerung habe ich hier AutoMower von Elektrolux und Husqvarna - Seite 10 gefunden :

Die Manipulation des Timers geht so wie du es schreibst. Wenn er gerade im Viereckmodus ist, kann einige Zeit vergehen bis er das merkt, aber es geht.

Soweit ich es bisher heraus gefunden habe, das höchstwertige Bit der Adresse sagt dem AM das er die folgenden Daten schreiben soll.
Von 0x0001 bis 0x7fff ist lesen.
von 0x8001 bis 0xfff schreibt er.

Im Bereich 0x3390 und 0x3AC0 macht er das etwas anders !
Da benutzt er das das Datenbyte als Subadresse.
Code:
gesendent empfangen
0f 33 90 00 00 -> 0f 33 90 30 00
0f 33 90 00 01 -> 0f 33 90 32 00
0f 33 90 00 02 -> 0f 33 90 2e 00
0f 33 90 00 04 -> 0f 33 90 32 00
0f 33 90 00 05 -> 0f 33 90 00 00
0f 33 90 00 06 -> 0f 33 90 30 00
0f 33 90 00 07 -> 0f 33 90 30 00
0f 33 90 00 08 -> 0f 33 90 00 00

0F 3A C0 00 06 -> 0F 3A C0 30 00
0F 3A C0 00 07 -> 0F 3A C0 32 00
0F 3A C0 00 08 -> 0F 3A C0 2E 00
0F 3A C0 00 09 -> 0F 3A C0 31 00
0F 3A C0 00 0A -> 0F 3A C0 33 00

Genau das ist es auch, was ich mit dem AM machen will.
Außerdem möchte ich den Strom des Mähmotors im Betrieb abfragen. Dadurch sollte sich die Timereinstellungen ändern. Bei hohem Strom Timerzeit länger und umgekehrt.

@BestEx:
Register x01 xf1 ist nur zum lesen.

Ich vermute mal hoher Stromverbrauch gleich hohes Gras

Ja, bei hohem Stromverbrauch hohes Gras, bzw. WEnn er nichts zu mähen hat, dann hat er fast keinen Strom am Mähmotor. Dann kann man den AM einfach nach hause schicken.

wenn ich 022d schicke bekomme ich von der gleichen Adresse eine dezimale 12 zurück bei stehendem Motor

Csck_sendtext(24124/*[Automower]*/, "\x0f\x02\x2d\x00\x00");  //Strom Verbrauch

Habe eine Grafik mit Strom Werten beim Mähen hinzugefügt

Könnte es sein, dass die werte nur bei laufenden Motor aktualisiert werden?
Oder bleibt bei stehendem Motor immer eine 12 stehen?
Oder ist der Mähmotorverbrauch auf 004d?

Jetzt schlaft mein AM. Ich werde morgen oder am Freitag mal schauen, was meiner so ausgibt.

@BestEx: Was hast du für einen AM? Ich habe einen 230Acx. Ich bin mir auch nicht ganz sicher, ob die Register beim 230 und 220 gleich sind.

ich habe den 220… Schau dir die Grafik in meinem vorherigen Posting an. Der Stromverbrauch des Messer Motors wird schön angezeigt

Ok, dann passt das mit dem Stromverbrauch auf 022d.
Nur wird hald bei stillstand nicht 0 sonder 12 angezeigt, wenn ich das richtig verstehe

Unter diesem Link gibt es ein VB Program zur Steuerung des AM : Tweak Automower PC

Voraussetzungen :

WLAN Anbindung, Client Socket in IPS Anlegen (IP Adresse + Port 10001), Cutter in IPS anlegen : 5 Byte 0F sync, Register Variable anlegen das das Auswertungs Script ansteuert.

Jede Menge Integer variable zum Speichern der Stati die aus dem Register ausgelesen werden. Eine String Variable zum Anzeigen der Timer und 8 IPS Timer zum einstellen der Rasenmäher Timer (2 Werktags Timer und 2 Wochenend Timer jeweils Startzeit und Stopzeit)

Das folgende Script liest die Zeiten der 8 Timer aus und schreibt schickt diese zum Rasenmäher. Die Dummy Variable auf das Webfront legen um die Timer einstellen zu können. Das folgende Script ebenso um den Schreibvorgang manuell starten zu können

<?
/* 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 = [13735,18389 ,20801,47634,28575,37203,39091,39178]; /* 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(24124/*[Automower]*/,$Header.$adresse.chr($Zeit_Array[$key]).$Footer); /* Client Socket ID eintragen */
}


sleep(1);
IPS_Runscript(35524 /*[Scripte\Automower\Timer  abfragen]*/); /* ID des Abfragescripts eintragen um die Anzeige der Timer im WF zu aktualisieren */

?&gt;

Im nächsten Schritt ein Script das den Rasenmäher auffordert die Inhalte der Timer aus dem Rasenmäher an IPS zu schicken. Ich starte das script verzögert (1 sec.) über das Timer schreib script.

<?

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

/* Timer Adressen sind in diesem Fall die Adressen im Rasenmaeher */

$Timer_adressen = [chr(0x38),chr(0x3a),chr(0x3c),chr(0x3e),chr(0x40),chr(0x42),chr(0x44),chr(0x46)];


foreach ($Timer_adressen as  $adresse)
{

  Csck_sendtext(24124/*[Automower]*/,$Header.$adresse.$Footer);

}



?>

Das folgende Script habe ich von Garfi35 übernommen und etwas erweitert um eine Reihe von Daten des Rasenmähers anzuzeigen unter anderem auch die Timer Einstellungen. Für dieses Script müssen eine Reihe von variablen angelegt werden die als speicher für die Register Daten genutzt werden. Das Script wird über die Registervariable gestartet.

<?
$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));
    switch ($pos2)
	 {

       case chr(0x2e).chr(0xea):    if ((int)$werte < 3000){setvalue(57060 /*[Eigene Globale Variablen\Automower\Drehzahl]*/,(int)$werte);}break;
       case chr(0x02).chr(0x2d):    setvalue(11216 /*[Eigene Globale Variablen\Automower\Stromverbrauch Blade Motor]*/,((int)$werte)); break;
       case chr(0x12).chr(0x8e):    setvalue(54766 /*[Eigene Globale Variablen\Automower\Blade Motor Current II]*/,((int)$werte)); break;

       case chr(0x4a).chr(0x38):    setvalue(11078 /*[Eigene Globale Variablen\Automower\Timer\1]*/,  ord(substr($data,3,1))); setvalue(56659 /*[Eigene Globale Variablen\Automower\Timer\2]*/ , ord(substr($data,4,1))); break;
       case chr(0x4a).chr(0x3a):    setvalue(37082 /*[Eigene Globale Variablen\Automower\Timer\3]*/,  ord(substr($data,3,1))); setvalue(36581 /*[Eigene Globale Variablen\Automower\Timer\4]*/, ord(substr($data,4,1))); break;
       case chr(0x4a).chr(0x3c):    setvalue(11963 /*[Eigene Globale Variablen\Automower\Timer\5]*/,  ord(substr($data,3,1))); setvalue(16115 /*[Eigene Globale Variablen\Automower\Timer\6]*/, ord(substr($data,4,1))); break;
       case chr(0x4a).chr(0x3e):    setvalue(22336 /*[Eigene Globale Variablen\Automower\Timer\7]*/,  ord(substr($data,3,1))); setvalue(51097 /*[Eigene Globale Variablen\Automower\Timer\8]*/, ord(substr($data,4,1)));  break;
       case chr(0x4a).chr(0x40):    setvalue(18414 /*[Eigene Globale Variablen\Automower\Timer\9]*/,  ord(substr($data,3,1))); setvalue(10594 /*[Eigene Globale Variablen\Automower\Timer\10]*/, ord(substr($data,4,1)));  break;
       case chr(0x4a).chr(0x42):    setvalue(12627 /*[Eigene Globale Variablen\Automower\Timer\11]*/, ord(substr($data,3,1))); setvalue(45721 /*[Eigene Globale Variablen\Automower\Timer\12]*/, ord(substr($data,4,1))); break;
       case chr(0x4a).chr(0x44):    setvalue(20143 /*[Eigene Globale Variablen\Automower\Timer\13]*/, ord(substr($data,3,1))); setvalue(46202 /*[Eigene Globale Variablen\Automower\Timer\14]*/, ord(substr($data,4,1))); break;
       case chr(0x4a).chr(0x46):    setvalue(14574 /*[Eigene Globale Variablen\Automower\Timer\15]*/, ord(substr($data,3,1))); setvalue(51688 /*[Eigene Globale Variablen\Automower\Timer\16]*/, ord(substr($data,4,1)));break;

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

$Start_t1_s = GetValue(11078 /*[Eigene Globale Variablen\Automower\Timer\1]*/);
$Start_t1_m = GetValue(56659 /*[Eigene Globale Variablen\Automower\Timer\2]*/);
$Stop_t1_s  = GetValue(37082 /*[Eigene Globale Variablen\Automower\Timer\3]*/);
$Stop_t1_m  = GetValue(36581 /*[Eigene Globale Variablen\Automower\Timer\4]*/);

$Start_t2_s = GetValue(18414 /*[Eigene Globale Variablen\Automower\Timer\9]*/);
$Start_t2_m = GetValue(10594 /*[Eigene Globale Variablen\Automower\Timer\10]*/);
$Stop_t2_s  = GetValue(12627 /*[Eigene Globale Variablen\Automower\Timer\11]*/);
$Stop_t2_m  = GetValue(45721 /*[Eigene Globale Variablen\Automower\Timer\12]*/);

$Start_wt1_s = GetValue(11963 /*[Eigene Globale Variablen\Automower\Timer\5]*/);
$Start_wt1_m = GetValue(16115 /*[Eigene Globale Variablen\Automower\Timer\6]*/);
$Stop_wt1_s  = GetValue(22336 /*[Eigene Globale Variablen\Automower\Timer\7]*/);
$Stop_wt1_m  = GetValue(51097 /*[Eigene Globale Variablen\Automower\Timer\8]*/);

$Start_wt2_s = GetValue(20143 /*[Eigene Globale Variablen\Automower\Timer\13]*/);
$Start_wt2_m = GetValue(46202 /*[Eigene Globale Variablen\Automower\Timer\14]*/);
$Stop_wt2_s  = GetValue(14574 /*[Eigene Globale Variablen\Automower\Timer\15]*/);
$Stop_wt2_m  = GetValue(51688 /*[Eigene Globale Variablen\Automower\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(56280 /*[Eigene Globale Variablen\Automower\Timer\Anzeige\Timer ]*/,$text);

?>

Viel Spass

Noch schöner und lesbarer, wäre dein Code wenn Du ihn in den richtigen Tag setzt. Nimm mal den PHP-Tag und nicht den Code-Tag. :wink:

Danke für den Tipp man lernt nie aus :slight_smile:

Habe noch einen Statuscode beizutragen

52 = Kein Kontakt in der Ladestation

Mein Robbie hat schon richtige Spurrillen vor der Ladestation gegraben, und jetzt kommt er manchmal nicht mehr hoch … da muss ich wohl mal aufschütten oder eine Platte legen oÄ.