das erste Projekt, das ich überhaupt mit openHAB je gemacht habe, ist - meinen Mähroboter bei Regen an der Ausfahrt aus seiner Ladestation zu hindern.
Was habe ich benutzt:
Software:
OpenHAB 3.1.0
AVM FRITZ!Box Binding
OpenWeatherMap Binding
Script: Design with Blockly
Hardware:
Raspberry PI 4 im Argon One Pi Gehäuse
AVM FRITZ!Box 7590
AVM FRITZ!DECT 210
GARDENA SILENO life Mähroboter
OK, ich weiß, es gibt Mähroboter, die sind via W-LAN angebunden, lassen sich per GPS und Smartphone steuern und haben im Zweifel eine eigene Wetterstation oder beziehen ihre Wetterinfo aus dem Netz.
Aber ich habe halt einen ganz einfachen Mähroboter, der nix anderes macht, als mähen.
Und das leider bei jedem Wetter! Regnet es tagelang, mäht er einfach still vor sich hin und zerwühlt im Zweifel an den Steigungen den nassen Boden und damit den Rasen.
Nun kann man sich eine Eigenschaft des Roboters zunutze machen: Wenn man die Spannungsversorgung der Ladestation abschaltet, fährt er nicht mehr - auch wenn sein Akku noch voll ist.
Denn über die Ladestation wird die Elektronik für das Grundstücks-Begrenzungskabel mit Spannung versorgt. Wenn der Roboter nicht mehr erkennt, wo die Grundstücksgrenze ist, bleibt er stehen bzw. fährt erst gar nicht los.
Bei lang anhaltendem Regen habe ich in der Vergangenheit einfach dem Roboter (wenn er in seiner Ladestation stand) per Funk-Steckdose mit Handsender die Spannung abgeschaltet. Also blieb er in seiner Ladestation.
Wer aber will jeden Morgen schauen, ob es regnet und was macht man im Urlaub? Gesucht ist also eine vollkommen autonom arbeitende Lösung.
Meine Überlegung war, mit openHAB (läuft bei mir auf einem Raspberry PI 4) zu schauen, ob es regnet. Und zu prüfen, was der Mähroboter gerade macht. Um ihm so gezielt die Spannung abzuschalten und an der Ausfahrt zu hindern.
Dazu habe ich in die Spannungsversorgung des Mähroboter-Netzteiles einen AVM FRITZ!DECT 210 - also eine schaltbare Steckdose geschaltet. Die kommuniziert über die Fritzbox mit openHAB.
Hiermit kann man sehr schön sehen, wie viel Leistung (P) [P = U * I] das Netzteil des Mähroboters aus dem Netz entnimmt.
Dabei kann ich mit der DECT 210 drei Zustände über die Strom-/Leistungsaufnahme des Mähroboter-Netzteils unterscheiden:
1. Mähroboter ist in der Ladestation und wird geladen.
2. Mähroboter ist in der Ladestation und wird nicht geladen.
3. Mähroboter ist unterwegs und mäht.
Durch die Anwendung des OpenWeatherMap Binding kommt ein weiterer Zustand dazu:
4. Es regnet aktuell mehr als x mm
Wenn also eine bestimmte Regenmenge überschritten wird und Zustand 1 oder 2 wird erfasst [sprich: (1 ∧ 4) ∨ (2 ∧ 4) ], kann man dem Roboter die Spannung abschalten und er bleibt zu Hause. Hat es aufgehört zu regnen, schaltet man die Spannung wieder ein.
Ist der Roboter-Akku -nachdem die Spannung wieder eingeschaltet wurde- noch nicht voll, läd er den Akku (von der eigenen Elektronik gesteuert) voll und fährt wieder los.
Wichtig ist nur, ihn nicht im eigentlichen Mähzustand (3) zu unterbrechen, denn sonst fährt er nicht wieder von selbst in seine Ladestation.
Aktuell nutze ich als Regeninformation ausschließlich die OpenWeatherMAP-Info "Wetter_Current_Rain".
Für die Leute, die sich dafür interessieren, habe ich hier ein paar Informationen zusammengestellt.
Leistungsaufnahme an einem normalen Roboter-Arbeitstag ohne Regen:
Leistungsaufnahme unterbrochen von Regen:
Programm:
Code: Alles auswählen
// Rules: Robby vor Regen schützen -> Script Robby-Auswertung
triggers:
- id: "1"
configuration:
itemName: FRITZ210Gartenhutte_Leistung
type: core.ItemStateChangeTrigger
- id: "2"
configuration:
itemName: Wetter_Current_Rain
type: core.ItemStateChangeTrigger
- id: "3"
configuration:
cronExpression: 0 0/3 * * * ? *
type: timer.GenericCronTrigger
conditions: []
actions:
- inputs: {}
id: "4"
configuration:
type: application/javascript
script: |-
var FrameworkUtil = Java.type("org.osgi.framework.FrameworkUtil");
var _bundle = FrameworkUtil.getBundle(scriptExtension.class);
var bundle_context = _bundle.getBundleContext()
var classname = "org.openhab.core.automation.RuleManager"
var RuleManager_Ref = bundle_context.getServiceReference(classname);
var RuleManager = bundle_context.getService(RuleManager_Ref);
RuleManager.runNow("c83fb3fb4b");
type: script.ScriptAction
Code: Alles auswählen
// Script Robby-Auswertung [c029240149]:
if (itemRegistry.getItem('FRITZ210Gartenhutte_Leistung').getState() >= '33.5') {
if (itemRegistry.getItem('Wetter_Current_Rain').getState() >= '0.3') {
events.sendCommand('FRITZ210Gartenhutte_Steckdose', 'OFF');
events.sendCommand('rStatus', 'es regnet zu stark');
} else {
events.sendCommand('rStatus', 'Robby-Akku bald voll');
}
} else if (itemRegistry.getItem('FRITZ210Gartenhutte_Leistung').getState() >= '12') {
events.sendCommand('rStatus', 'Robby wird geladen');
} else if (itemRegistry.getItem('FRITZ210Gartenhutte_Leistung').getState() >= '2.72' && itemRegistry.getItem('FRITZ210Gartenhutte_Leistung').getState() < '3.5') {
if (itemRegistry.getItem('Wetter_Current_Rain').getState() >= '0.3') {
events.sendCommand('FRITZ210Gartenhutte_Steckdose', 'OFF');
events.sendCommand('rStatus', 'es regnet zu stark');
} else {
events.sendCommand('rStatus', 'Robby in der Ladestation');
}
} else if (itemRegistry.getItem('FRITZ210Gartenhutte_Leistung').getState() >= '2.60' && itemRegistry.getItem('FRITZ210Gartenhutte_Leistung').getState() <= '2.71') {
events.sendCommand('rStatus', 'Robby unterwegs');
} else if (itemRegistry.getItem('FRITZ210Gartenhutte_Leistung').getState() >= '0.5' && itemRegistry.getItem('FRITZ210Gartenhutte_Leistung').getState() < '1') {
events.sendCommand('rStatus', 'Reinitialisierung');
} else if (itemRegistry.getItem('FRITZ210Gartenhutte_Leistung').getState() < '0.01') {
if (itemRegistry.getItem('Wetter_Current_Rain').getState() >= '0.3') {
events.sendCommand('rStatus', 'Robby sieht Regen');
} else {
events.sendCommand('FRITZ210Gartenhutte_Steckdose', 'ON');
events.sendCommand('rStatus', 'Regen hat aufgehört');
}
} else {
events.sendCommand('rStatus', 'Status unklar');
}
Im nächsten Schritt kommt noch ein EIN/AUS-Schalter für das Softwaremodul/Mähroboter dazu. Für die ECHTE Bodenfeuchte habe ich einen Bodenfeuchtesensor als Zusatzinformation für die o.a. Software in Bearbeitung. Dazu hatte ich noch ein altes GARDENA Tensiometer, das ich jetzt mit openHAB verheiraten muss.
Bis das Teil läuft, werde ich die "Regenzeit" (also die "Auszeit") durch einen zusätzlichen Timer im Programm verlängern, damit der Rasen bzw. der Boden nach Regen-Ende hinreichend abtrocknet, bevor der Mähroboter wieder fährt.
Nun ja, man kann das Thema auch sicher anderes angehen - andere Hardware nutzen oder die Software anders strukturieren.
Aber es war -wie gesagt- mein aller erstes openHAB-Projekt und es funktioniert sehr gut mit Eurer Hilfe!
Anregungen sind übrigens jederzeit willkommen. Zumal mir die Erfahrung der openHAB 2.x Programmierung vollkommen fehlt, da ich direkt in Version 3.x eingestiegen bin.
Grüße aus dem (aktuell verregneten) Bergischen Land
Stefan