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"]
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"}
Code: Alles auswählen
1=Auto
2=Manuell
3=Home
4=Feierabend
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
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
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" ]
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" }
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."
- 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
["$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
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