1.
Zunächst das Device im FHEM anlegen. Dafür wird das FHEM Device "Robonect" genutzt.
Code: Alles auswählen
define Gardena Robonect x.x.x.x
attr Gardena basicAuth xxxxxxxxxx==
attr Gardena event-on-change-reading .*
attr Gardena icon scene_robo_lawnmower
attr Gardena pollInterval 60
2.
Ein Hilfsobjekt für den Battiere-Status anlegen. Eine direkte Abfrage über das Robonect Device ist leider (noch) nicht möglich.
Code: Alles auswählen
define Gardena_Batt HTTPMOD http://user:pass@ip/xml?cmd=battery 0
attr Gardena_Batt userattr reading01Name reading01Regex reading02Name reading02Regex reading03Name reading03Regex reading04Name reading04Regex reading05Name reading05Regex reading06Name reading06Regex
attr Gardena_Batt enableControlSet 1
attr Gardena_Batt reading01Name voltage
attr Gardena_Batt reading01Regex <voltage>([-\d]+)
attr Gardena_Batt reading02Name charge
attr Gardena_Batt reading02Regex <charge>([-\d]+)
attr Gardena_Batt reading03Name current
attr Gardena_Batt reading03Regex <current>([-\d]+)
attr Gardena_Batt reading04Name temperature
attr Gardena_Batt reading04Regex <temperature>([-\d]+)
attr Gardena_Batt reading05Name full
attr Gardena_Batt reading05Regex <full>([-\d]+)
attr Gardena_Batt reading06Name remaining
attr Gardena_Batt reading06Regex <remaining>([-\d]+)
attr Gardena_Batt room Roboter,Aussen
attr Gardena_Batt stateFormat voltage
3.
Damit das Hilfsobjekt (Batterie) akualisiert wird, wird ein DOIF benötigt. Das aktualisiert alle 2 Minuten den Battiere-Status, allerdings nur, wenn der Gardena nicht offline ist.
Code: Alles auswählen
define di_Gardena_poll_Batt DOIF ( ([+:02]) and ([Gardena:state] ne "offline") ) (set Gardena_Batt reread) DOELSE ()
attr di_Gardena_poll_Batt do always
Sobald der Mäh-Vorgang gestartet wurde, wird hiermit automatisch in den manuellen Modus geschaltet. Der Fährt theoretisch bis zum jüngsten Tag oder bis die Batterie leer ist
Code: Alles auswählen
define Gardena.Auto.SwitchToMan DOIF ( ([+:05]) and ([Gardena:state] eq "maehen") and ([Gardena:allgemein-modus] eq "automatik") ) (set Gardena manuell) DOELSE ()
attr Gardena.Auto.SwitchToMan do always
Sobald die Batterie Spannung < 17700 ist, wird der Gardena in den Auto-Modus versetzt, damit fährt er nach Hause. 17700 lässt sich laut duese51 auch auf 17500 senken, allerdings ist unser Garten recht verwinkelt und es kann vorkommen, dass der Gardena etwas länger braucht.
Code: Alles auswählen
define Gardena.Auto.LowBatt DOIF ( ([+:02]) and ([Gardena:state] eq "maehen") and ([Gardena:allgemein-modus] ne "automatik") and ([Gardena_Batt:voltage]<17700) ) (set Gardena auto) DOELSE ()
attr Gardena.Auto.LowBatt do always
===== Nice to have =====
Der Source ist absichtlich so, damit er leserlicher ist. Lässt sich natürlich optimieren, aber darum geht es mir hier nicht.
Abends fährt der Gardena automatisch um spätestens 22 Uhr nach Hause:
Code: Alles auswählen
define Gardena.Auto.Feierabend at *22:00 { if(ReadingsVal("Gardena","state","offline") eq "maehen") { fhem("set Gardena feierabend");; } }
Getriggert wird das über die PV, wenn mindestens 500 Watt anliegen und es zwischen 8 und 12 Uhr ist, also Vormittags:
Code: Alles auswählen
define Sensor.Sonne500Watt notify Fronius:Body_Data_PAC_Values_1:.* { if((ReadingsVal("Fronius","Body_Data_PAC_Values_1","0")>500)&&(($hour>=8)&&($hour<=12))) { ItsSun500Watt() } }
Code: Alles auswählen
sub ItsSun500Watt()
{
# Nur alle 15 Minuten
$data{LastSun500Chk} = 0 unless(defined($data{LastSun500Chk}));
return if( time() < $data{LastSun500Chk}+15*60);
$data{LastSun500Chk} = time();
# Gardena losschicken? Nur wenn Strom an
if(ReadingsVal("Strom.Aussen.Terrasse", "reportedState", "off") eq "on")
{
# Nur wenn letzter autom. Start vor mehr als 12 Stunden (12 Std * 60 Min=720)
$data{LastGardenaStart} = 0 unless(defined($data{LastGardenaStart}));
if( time() > $data{LastGardenaStart}+720*60)
{
my $GardenaState1 = ReadingsVal("Gardena", "winterschlaf", "--"); # Winterschlaf?
my $GardenaState2 = ReadingsVal("Gardena", "allgemein-status", "offline"); # Nur wenn schlafen
my $GardenaState3 = ReadingsVal("NetAtmo.Aussen.Regen", "rain_day", "1"); # Regen muss 0 sein
my $GardenaState4 = ReadingsVal("NetAtmo.Aussen.Temp", "temperature", "0"); # Akt. Temp. muss 8 oder waermer sein
if(($GardenaState1 eq "off")&& (($GardenaState2 eq "schlafen")||($GardenaState2 eq "parken"))&&($GardenaState3==0)&&($GardenaState4>=8))
{
$data{LastGardenaStart} = time();
fhem("set Gardena start");
fhem("sleep 6");
fhem("set Gardena auto");
};
};
};
}