Seite 1 von 3

Rasenmähroboter Steuerung mittels Robonect

Verfasst: Sa Apr 11, 2020 7:13 pm
von Advenoni
Hallo zusammen,

ein paar von euch kennen ja evtl die Steuerplatine von Robonect für Gardena und Husqvarna Mähroboter.
Die Platine erlaubt ja schon diverse Zusatzfunktionen, nur war mit die Wettersteuerung zu ungenau bzw. hatte ich das Problem, dass der Timer nicht erweitert wird, wenn der Roboter nicht mähen darf da es regnet. Ist der Timer z.B. von 8:00 bis 12:00 eingestellt und es hat in der Zeit geregnet, aber am Nachmittag war es trocken, so wurde nicht gemäht.
Aus diesem Grund habe ich im TWS nun eine Logik gemacht, die die reine Mähtzeit berücksichtigt. Kommuniziert wird derzeit über OpenHab mittels diesem Robonect Binding. MQTT ist zwar auch möglich, aber dies wäre dann die nächste Stufe.
Zunächst die benötigten Einstellungen im OpenHab:
things: mower.things

Code: Alles auswählen

Thing robonect:mower:automower "Mower" @ "Garden" [ host="x.x.x.x", pollInterval=5, user="user", password = "password"]
items: mower.items

Code: Alles auswählen

String    mowerName            "Mower name"                                    {channel="robonect:mower:automower:name"}
Number    mowerBattery         "Mower battery [%d %%]" <energy>                {channel="robonect:mower:automower:battery"}
Number    mowerHours           "Mower operation hours [%d h]" <clock>          {channel="robonect:mower:automower:mowing-hours"}
Number    mowerDuration        "Duration of current mode"                      {channel="robonect:mower:automower:status-duration"}
String    mowerMode            "Mower mode [MAP(robonect_mode.map):%s]"        {channel="robonect:mower:automower:mode"}
Number    mowerStatus          "Mower Status [MAP(robonect_status.map):%s]"    {channel="robonect:mower:automower:status"}
Switch    mowerStarted         "Mower started"                                 {channel="robonect:mower:automower:started"}
String    mowerTimerStatus     "Mower timer status"                            {channel="robonect:mower:automower:timer-status"}
DateTime  mowerNextTimer       "Next timer [%1$td/%1$tm %1$tH:%1$tM]" <clock>  {channel="robonect:mower:automower:timer-next"}
Number    mowerWlanSignal      "WLAN signal [%d dB ]"                          {channel="robonect:mower:automower:wlan-signal"}
Number    mowerErrorCode       "Error code"                                    {channel="robonect:mower:automower:error-code"}
String    mowerErrorMessage    "Error message"                                 {channel="robonect:mower:automower:error-message"}
DateTime  mowerErrorDate       "Error date [%1$td/%1$tm %1$tH:%1$tM]"          {channel="robonect:mower:automower:error-date"}
Number    mowerTemp            "Mower temperatur [%d °C]"                      {channel="robonect:mower:automower:health-temperature"}
transform: robonect_mode.map

Code: Alles auswählen

1=Auto
2=Manuell
3=Home
4=Feierabend
transform: robonect_status.map

Code: Alles auswählen

0=Schläft
1=Geparkt
2=Mäht
3=Sucht die Ladestation
4=Lädt
5=Sucht
7=Fehlerstatus
8=Schleifsignal verloren
16=Automower abgeschaltet
17=Automower schläft
rules: RM.rules

Code: Alles auswählen

	var int currentTemp = mowerTemp.state
	var int currentWLAN = mowerWlanSignal.state as DecimalType
	var int currentStatus = mowerStatus.state

	rule "Temperatur Maeher"
	when
		Item mowerTemp changed
	then
		currentTemp = mowerTemp.state
		RM_Temperatur.sendCommand(currentTemp)
	end

	rule "WLAN Maeher"
	when
		Time cron "0 0/15 * 1/1 * ? *"
	then {
		currentWLAN = mowerWlanSignal.state
		RM_WLAN.sendCommand(currentWLAN)
	}
	end

	rule "Status Maeher"
	when 
		Item mowerStatus changed or Time cron "0 0 * 1/1 * ? *"
	then {
		currentStatus = mowerStatus.state
		RM_Status.sendCommand(currentStatus)
	}
	end
	
	rule "Mode Maeher"
	when 
		Item mowerMode changed or Time cron "0 0 * 1/1 * ? *"
	then {
		if (mowerMode.state == "HOME")
		{
			RM_Mode.sendCommand(1)
		}
		if (mowerMode.state == "AUTO")
		{
			RM_Mode.sendCommand(2)
		}
		if (mowerMode.state == "MANUAL")
		{
			RM_Mode.sendCommand(3)
		}
		if (mowerMode.state == "EOD")
		{
			RM_Mode.sendCommand(4)
		}
	}
	end

	rule "Mode Maeher Steuerung"
	when Item RM_Mode changed
	then {
		if (RM_Mode.state == 1.0)
		{
			mowerMode.sendCommand("HOME")
		}
		if (RM_Mode.state == 2.0)
		{
			mowerMode.sendCommand("AUTO")
		}
		if (RM_Mode.state == 3.0)
		{
			mowerMode.sendCommand("MANUAL")
		}
		if (RM_Mode.state == 4.0)
		{
			mowerMode.sendCommand("EOD")
		}
	}
	end
Bei den Rules werden "Temperatur Maeher" bzw. "WLAN Maeher" nur benötigt wenn man diese möchte.
Und noch die zugehörigen Thingsauf der KNX-Seite:

Code: Alles auswählen

		//---> Rasenmäher
		Type number : RM_Temperatur			"Temperatur"			[ ga="9.001:1/1/155" ]
		Type number : RM_WLAN				"WLAN Signal"			[ ga="6.010:1/1/147" ]
		Type switch : RM_Fehler				"Fehler"			[ ga="1/1/157" ]
		Type number : RM_Status				"Status"			[ ga="5.005:1/1/150" ]
		Type number : RM_Modus				"Modus"				[ ga="5.005:1/1/149" ]
Und die Items:

Code: Alles auswählen

//---> Rasenmäher
Number RM_Temperatur			"Mäher Temperatur [%.0f °C]"	<temperature>	(gRM)	{ channel="knx:device:bridge:aktor1:RM_Temperatur" }
Number RM_WLAN				"Mäher WLAN [%.0f dB]"				(gRM)	{ channel="knx:device:bridge:aktor1:RM_WLAN" }
Switch RM_Fehler			"Mäher Fehler"					(gRM)	{ channel="knx:device:bridge:aktor1:RM_Fehler" }
Number RM_Status			"Mäher Status [MAP(robonect_status.map):%s]"	(gRM)	{ channel="knx:device:bridge:aktor1:RM_Status" }
Number RM_Mode				"Mäher Modus [MAP(robonect_modue.map):%s]"	(gRM)	{ channel="knx:device:bridge:aktor1:RM_Modus" }
Zunächst wurde die Logik mit einzelnen Bausteinen erstellt:
RM_vorher.PNG
Nachdem das ganze soweit funktioniert hat wurde dann daraus eine Costum-Logik:
RM_nacher.PNG
Der Code hierzu:

Code: Alles auswählen

// Steuerung Rasenmährooter Gardena Sileno City mit Robonect (https://www.robonect-shop.de/) und OpenHab

{
    "Level": [
        // Levels allgemein
        ["$tr","bool",true],
        // Levels Betriebsart
        ["$In_Status","int",0],
        ["$Parken","bool",false],
        ["$Maeht","bool",false],
        ["$Suchen","bool",false],
        ["$Laden","bool",false],
        ["$Ausfahren","bool",false],
        ["$Fehler","bool",false],
        ["$Schlafen","bool",false],
        //Levels Betriebsstunden
		["$Reset","bool",false],	
		["$Maehzeit_Ist","float",0.0],
		["$Maehzeit_Soll","float",0.0],
		["$Interval","float",60.0],
		["$StartZeitTag","string","2 0 0 * * *"],
		["$Maehzeit_erreicht","bool",false],
		// Levels Freigabe Zeit
        ["$StartZeit","string","0 0 7 * * 1-6"],	// Anpassung Startzeit Roboter
        ["$StopZeit","string","0 0 22 * * 1-6"],	// Anpassung Endzeit Roboter
        ["$Set","bool",false],
        ["$Res","bool",false],
        ["$Stat","int",0],
        ["$Freigabe_Zeit","bool",false],
        // Levels Freigabe Temperatur
		["$Solltemp","float",5.0],
		["$Isttemp","float",0.0],
        ["$Freigabe_Temp","bool",false],
        // Level Freigabe Regen
        ["$Regen","bool",false],
        ["$Nachlaufzeit","float",3600.0],
        ["$Sperre_Regen","bool",false],
        ["$Freigabe_Regen","bool",false],
        // Levels Freigabe
        ["$Freigabe","bool",false],
        ["$Sperre","bool",false],
        // Levels Modus
        ["$Freigabe_int","int",0],
        ["$Wert_Maehen","int",2],
        ["$Wert_Home","int",1],
        ["$Modus","int",0],
        
        ["$VAR<Inhibit?>", "bool", false]
    ],
    "Module": [
        ["Break", ["$VAR<Inhibit?>"]  ],
        // Module Betriebsart
        ["Multiplexer",[0,"$tr",0],"$Parken","$In_Status"],
        ["Multiplexer",[0,0,"$tr",0],"$Maeht","$In_Status"],
        ["Multiplexer",[0,0,0,"$tr",0],"$Suchen","$In_Status"],
        ["Multiplexer",[0,0,0,0,"$tr",0],"$Laden","$In_Status"],
        ["Multiplexer",[0,0,0,0,0,"$tr",0],"$Ausfahren","$In_Status"],
        ["Multiplexer",[0,0,0,0,0,0,0,"$tr",0],"$Fehler","$In_Status"],
        ["Multiplexer",[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"$tr",0],"$Schlafen","$In_Status"],
        // Module Mähzeit Tag
		// Zähler Rücksetzen
		["Cron","$tr","$Reset",0,"$StartZeitTag"],
		// Betriebsdauer aktualisieren
		["HobbsMeter","$Maeht","$Maehzeit_Ist","$Reset"],
		// ResetTag auf false setzen
		["Multiplexer",["$Reset","-$tr"],"$Reset","$Reset"],
		// Clocksignal für Sendeintervall
		["Clocksignal","$Maeht",0,"$Interval"],
		// Mähzeit erreicht
		["Comparator", "$Maehzeit_Ist","$Maehzeit_erreicht","$Maehzeit_Soll"],
        // Module Freigabe Zeit
        ["Cron","$tr","$Set",0,"$StartZeit"],
        ["Cron","$tr","$Res",0,"$StopZeit"],
        ["BinaryMultiplexer",["$Set","$Res"],"$Stat"],
        ["Multiplexer",["$Freigabe_Zeit","$tr","-$tr"],"$Freigabe_Zeit","$Stat"],
        // Module Freigabe Temperatur
		["Comparator","$Isttemp","$Freigabe_Temp","$Solltemp"],
		// Module Freigabe Regen
		["Monoflop","$Regen",0,"$Sperre_Regen","$Nachlaufzeit",5],
		["And",["-$Regen","-$Sperre_Regen"],"$Freigabe_Regen"],
		// Module Freigabe
		["And",["-$Sperre","-$Maehzeit_erreicht","$Freigabe_Zeit","$Freigabe_Regen","$Freigabe_Temp"],"$Freigabe"],
        // Module Modus		
    	["BinaryMultiplexer",["$Freigabe"],"$Freigabe_int"],
        ["Multiplexer",["$Wert_Home", "$Wert_Maehen"],"$Modus","$Freigabe_int"]
    ],
    "Input": [
        ["Sperre","Sperre Automatik","$Sperre","c"],
        ["In_Status","Eingang Status","$In_Status","c"],
        ["Mähzeit","Mähzeit Soll","$Maehzeit_Soll","c"],
        ["Solltemperatur","Solltemperatur","$Solltemp","u"],
        ["Isttemperatur","Isttemperatur","$Isttemp","c"],
        ["Regen","Regensensor","$Regen?","c"],
        ["Nachlaufzeit","Nachlaufzeit Regen","$Nachlaufzeit?","c"],
        ["Inhibit", "INHIBIT", "$VAR<Inhibit?>", "u" ]
    ],
    "Output": [
        ["Parken","Parken","$Parken?","c"],
        ["Mäht","Mäht","$Maeht?","c"],
        ["Suchen","Ladestation Suchen","$Suchen?","c"],
        ["Laden","Laden","$Laden?","c"],
        ["Ausfahren","Mäher fährt aus Ladestation raus","$Ausfahren?","c"],
        ["Fehler","Fehler","$Fehler?","c"],
        ["Schlafen","Schlafen","$Schlafen?","c"],
	["Aktuelle Mähzeit","Mähzeit in h heute","$Maehzeit_Ist?","ct"],
        ["Freigabe","Freigabe","$Freigabe?","c"],
        ["Modus","Modus","$Modus","c"]

    ]
}

// Der Schöpfer dieser Custom Logik überträgt die Nutzungsrechte gemäß der TOLL ("Timberwolf Open Logikblock License") die unter https://wrgt.news/TOLL zum Download zur Verfügung steht."
Eingänge:
  • Sperre: Über diesen Eingang kann der Mäher gesperrt werden, wenn z.B. die Kinder im Garten spielen wollen
  • In_Status: Ist der Status des Mähers von Openhab, damit die Logik weiß wann gemäht wird
  • Mähzeit: Vorgabe der Mähzeit die der Mäher an einem Tag mähen soll.
  • Solltemperatur: Mindesttemperatur die erreicht sein muss, damit der Mähe mähen darf (evtl. auch noch Maximaltemp?)
  • Isttemperatur: Vorgabe der aktuellen Aussentemperatur
  • Regen: Eingang für Regensensor, damit der Mähvorgang unterbrochen wird (True=Regen)
  • Nachlaufzeit: Nach negativer Flanke Eingang Regen bleibt der Mäher von für diese Zeit gesperrt
Anpassung der Start und Endzeit, also ab wann bzw. wie lang der Roboter maximal mähe darf muss derzeit noch direkt im Code angepasst werden:
["$StartZeit","string","0 0 7 * * 1-6"], // Anpassung Startzeit Roboter
["$StopZeit","string","0 0 22 * * 1-6"], // Anpassung Endzeit Roboter
Soweit ich weiß es derzeit noch keine Vorgabe von Cron über Eingänge möglich?
Wenn die Logik angelegt wird, darf man sich nicht wundern, wenn keine Freigabe erfolgt, da die Freigabe nur zu dem Startzeitpunkt gesetzt wird. Ist dieser bereits vergangen, so erfolgt die Freigabe erst am nächste Tag! Müsste ich evtl. noch irgendwie anders lösen.
Ausgänge:
  • Parken: Mäher parkt
  • Mäht: Mäher mäht
  • Suchen: Mäher sucht Ladestation
  • Laden: Mäher wird geladen
  • Ausfahren: Mähre fährt aus Ladestation heraus
  • Fehler: Mäher Fehlerstatus
  • Schlafen: Mäher schläft in Ladestation
  • Aktuelle Mähzeit: Zeit die der Mäher heute schon gemäht hat
  • Freigabe: Mäher darf mähen
  • Modus: Modus zur weitergabe an OpenHab
Die meisten Ausgänge habe ich optional eingestellt, da diese ja nicht unbedingt benötigt werden.
Möglich wäre noch die Mähdauer anhand von der Wetterdaten anzupassen, oder auch die Sperrzeit nach Regen anhand von Temperatur, Regenmenge usw. anzupassen, aber da habe ich aktuell noch keine Idee wie ich das ganze berechne, wird aber wahrscheinlich auch schwierig sein auf andere Gärten zu übertragen.
Evtl. kann die Logik ja jemand brauchen :-)
Wünschenswert wäre von meiner Seite aus wie gesagt mal noch die direkte Anbindung über MQTT, aber so läuft es soweit auch mal.

Gruß,
Martin

Re: Rasenmähroboter Steuerung mittels Robonect

Verfasst: Sa Apr 11, 2020 8:32 pm
von Picha
Respekt.
Hab leider noch keinen Robi.
Muss jetzt doch nochmal nach nem Gardena scháuen.

Gruß Markus

Re: Rasenmähroboter Steuerung mittels Robonect

Verfasst: So Apr 12, 2020 8:55 am
von DeLaDope
Alter Schwede... Großen Respekt!
Geht das auch mit einem Worx Landroid? 😉

VG Tobias

Re: Rasenmähroboter Steuerung mittels Robonect

Verfasst: So Apr 12, 2020 9:07 am
von Advenoni
Hallo Tobias @DeLaDope

Dankeschön!
Wird mit dem Worx leider nicht funktionieren, da dieser nicht von Robonect unterstützt wird.

Gruß,
Martin

Re: Rasenmähroboter Steuerung mittels Robonect

Verfasst: So Apr 12, 2020 12:04 pm
von DeLaDope
Ok... Schade.... Trotzdem danke!

Re: Rasenmähroboter Steuerung mittels Robonect

Verfasst: So Apr 12, 2020 12:19 pm
von StefanW
Hallo Martin,

ganz tolle Entwicklung. Zusammen mit usnerer Bewässerungslösung wird da ein "smarter Garden" draus.

lg

Stefan

Re: Rasenmähroboter Steuerung mittels Robonect

Verfasst: So Apr 12, 2020 2:22 pm
von gbglace
Ja sehr schöner Baustein. Die Logik ist natürlich auch Landroid fähig, Bedarf dann aber noch nen geeigneten Kommunikationskanal. Auf der einen Gartenhälfte wird demnächst auch noch ein 700-er Worx eingesetzt, dann Mal googeln ob ich das Ding im Zweifel via NodeRed erstmal anbinden kann.

Re: Rasenmähroboter Steuerung mittels Robonect

Verfasst: So Apr 12, 2020 3:01 pm
von DeLaDope
Das wäre natürlich der Hammer! Würde mich riesig freuen! LG Tobias

Re: Rasenmähroboter Steuerung mittels Robonect

Verfasst: Di Apr 14, 2020 4:15 pm
von adimaster
Hi,
Advenoni hat geschrieben: Sa Apr 11, 2020 7:13 pm ein paar von euch kennen ja evtl die Steuerplatine von Robonect für Gardena und Husqvarna Mähroboter.
Tolle Sache, das habe ich noch nicht gekannt --> schaue ich mir gleich an. Dann werde ich Dein Skript wohl auch mal testen :D

StefanW hat geschrieben: So Apr 12, 2020 12:19 pm Zusammen mit usnerer Bewässerungslösung wird da ein "smarter Garden" draus.
Stefan, was meinst Du damit? Euren geplanten Bodenfeuchte-Sensor?

Grüße
Adi

Re: Rasenmähroboter Steuerung mittels Robonect

Verfasst: Di Apr 14, 2020 4:56 pm
von gbglace
Bodenfeuchtesensor + Aktoren für Magnetventile + TWS für Implementierung weiterer logiken für Bewässerung + via Modbus und später MQTT usw. Integration von Wetterdaten für bessere Bedarfsberechnungen.