Meine FHEM Anbindung
Verfasst: Di 2. Mai 2017, 15:10
Mit Hilfe von duese51 fährt mein Gardena mit der größeren Battiere nun deutlich länger. Das Feature soll zwar bald in die Firmware vom Robonect eingepflegt werden, an dieser Stelle trotzdem ein wenig Copy&Paste für FHEM, um das Feature schon vorher zu realieren:
1.
Zunächst das Device im FHEM anlegen. Dafür wird das FHEM Device "Robonect" genutzt.
Statt x.x.x.x die Ziel-IP vom Mäher. Statt "basicAuth" die eigenen Login-Daten.
2.
Ein Hilfsobjekt für den Battiere-Status anlegen. Eine direkte Abfrage über das Robonect Device ist leider (noch) nicht möglich.
Statt user/pass/ip in der ersten Zeile bitte die echten Daten eingeben
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.
4.
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
5.
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.
===== 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:
Morgens fährt er eigenständig los, wenn A) die Außensteckdose Strom hat, B) es seit Mitternacht nicht geregnet hat, C) mindestens 8 Grad sind, D) die PV mindestens 500 Watt liefert, also die Sonne scheint. Ich nutze hierfür eine NetAtmo.
Getriggert wird das über die PV, wenn mindestens 500 Watt anliegen und es zwischen 8 und 12 Uhr ist, also Vormittags:
Dann wird folgende Funktion aufgerufen. Hier werden weitere Parameter geprüft und sichergestellt, dass der Aufruf nur einmal in 12 Stunden erfolgt. Hintergrund: Nach dem automatischen Start kann man den Mäher nach Hause schicken und er fährt erst am nächsten Tag wieder automatisch los.
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");
};
};
};
}