Passagen- bzw. Flächenschaltung

Hier kannst Du Dich über die Einbindung in Deine Hausautomatisierung austauschen.
Antworten
pap@nak
Beiträge: 1
Registriert: Mi 8. Jun 2016, 11:35
Mäher: Gardena R70Li
Firmware des Mähers (MSW): MSW 6.xx.xx
Herstellungsjahr: 2016
Robonect Firmware: V1.0 Beta 3

Passagen- bzw. Flächenschaltung

Beitrag von pap@nak » Fr 18. Mai 2018, 12:11

Passagenschaltung, Flächenschaltung mit Robonect, Fhem, MQTT, ESP8266

Aufgabe:
Ein schattiger, trockener Teil des Rasens soll für den Rasenroboter gesperrt werden. Der Mäher ist so konfiguriert, dass er immer abwechselnd an der Ladestation und am Fernstartpunkt (bei 42m) mit dem mähen beginnt:
Fernstart1 42m Mittel
Fernstart2 0m nie

Lösung:
Da Robonect jetzt auch MQTT kann und es eine ganze Anzahl von MQTT fähigen WLAN-Devices auf Basis ESP8266 und passende Open-Source-Firmware (Tasmota oder ESPeasy) gibt und ich sowieso eine FHEM Installation mit reichlich MQTT Schaltern (sonoff) betreibe, lag es nahe, auch eine Flächenschaltung für den Rasenmäher mit dieser Technik zu realisieren.
Es wird über einen ferngesteuerten Umschalter (Relais) ein zusätzlicher Begrenzungsdraht zu- bzw. abgeschaltet. D.h. wann immer der Mäher im Status 'mähen' (mqtt-Status=2) ist, wird die Zusatzschleife (rot) zugeschaltet: Der Mäher ist also jeweils im linken bzw. rechten Gartenteil 'eingesperrt'. Wechselt der mqtt-Status auf <> 2 ist die Zusatzschleife aus und der Mäher kann dem Suchdraht folgen.

Bild

Es werden folgende Komponenten benötigt:
Hardware:
1. Robonect mit aktueller Firmware (> V1.0 Beta ) wegen mqtt Fähigkeit
2. Raspberry Pi mit Fhem und installiertem mqtt broker (z.B. Mosquitto)
3. Wemos D1 mini mit Relaisshield
D1 mini mit relais schield (https://www.wemos.cc/) gibts reichlich bei Amazon oder ebay

Bild

Software:
1. Aktuelle Firmware auf Robonect installieren.
Kommunikation -> MQTT Client konfigurieren und aktivieren.
Robonect schickt die mqtt Nachrichten an den mqtt broker unter 192.168.42.102

2. Auf dem Raspi den Mosquitto mqtt broker installieren und testen
https://www.open-homeautomation.com/de/ ... pberry-pi/

3. In FHEM mqtt einrichten
https://wiki.fhem.de/wiki/Sonoff
(siehe fhem.cfg und 99_myUtils.pm weiter unten)

4. Auf dem D1 mini wird die Tasmota Software installiert:
Atom installieren und einrichten für Tasmota
https://github.com/arendst/Sonoff-Tasmo ... ware-Build

Tasmota konfigurieren für Wemos D1 mini
https://github.com/arendst/Sonoff-Tasmo ... 0D1%20Mini

Konfigurieren des D1 mini:

Bild
Bild
Bild

Siehe im Folgenden meine Einträge in fhem.cfg und 99_myUtils.pm
Ich werte nur die mqtt Nachrichten 'status' und 'charge' aus. In diesem Beispiel ist zusätzlich eine Routine zum umwandeln der Statuscodes vom Robonectcode in Textform und loggen desselben. Außerdem wird in den fhem devices FSC (FernStartCounter) und LSC (LadeStationCounter) die Häufigkeit der Fernstarts und Ladestationstarts mitgezählt (Ich habe den Einstellungen im Mäher nicht getraut und wollte es mal genau wissen).

#----- begin fhem.cfg ---------------------------------------------
# MQTT Broker anlegen
define myBroker MQTT localhost:1883
attr myBroker verbose 1

# mqtt HorstSeinSchaf
define HorstSeinSchaf MQTT_DEVICE
attr HorstSeinSchaf IODev myBroker
attr HorstSeinSchaf event-on-change-reading .*
attr HorstSeinSchaf group Schaf
attr HorstSeinSchaf qos at-least-once
attr HorstSeinSchaf retain 1
attr HorstSeinSchaf room Rasenmaeher
attr HorstSeinSchaf stateFormat status
attr HorstSeinSchaf subscribeReading_charge HorstSeinSchaf/mower/battery/charge
attr HorstSeinSchaf subscribeReading_status HorstSeinSchaf/mower/status
attr HorstSeinSchaf verbose 0

define Schaf_Batterie readingsProxy HorstSeinSchaf:charge
attr Schaf_Batterie group Schaf
attr Schaf_Batterie room Rasenmaeher

# Die Passage ist geschlossen wenn das Schaf am mähen ist, ansonsten offen, damit es auf jeden Fall heim findet.
# Anmerkung: sonoff114 ist mein Wemos D1 mini Relais
define SwitchPassage DOIF ([HorstSeinSchaf:status] eq 2 ) (set sonoff114 On) DOELSE (set sonoff114 Off)

# dient zum zählen der Fernstarts
define FSC dummy
attr FSC group Schaf
attr FSC room Rasenmaeher

# dient zum zählen der Ladestationstarts
define LSC dummy
attr LSC group Schaf
attr LSC room Rasenmaeher

# Status als Textausgabe erzeugen
define Schaf_TextStatus dummy
attr Schaf_TextStatus event-on-change-reading state.*
attr Schaf_TextStatus group Schaf
attr Schaf_TextStatus room Rasenmaeher

# Umwandeln des Statuscodes in Text und zählen der Startpositionen
define SchafStatusNotify notify HorstSeinSchaf:status.* {\
my $CodeStatus = (ReadingsVal("HorstSeinSchaf", "status", 0));;\
my $TextStatus = Schaf_TextStatus($CodeStatus);;\
fhem("set Schaf_TextStatus $TextStatus");;\
my $fsc = ReadingsVal("FSC", "state", 0);;\
my $lsc = ReadingsVal("LSC", "state", 0);;\
($fsc, $lsc) = FScount($CodeStatus,$fsc,$lsc);;\
fhem("set FSC $fsc");;\
fhem("set LSC $lsc");;\
}

# Log-Datei mit Textstatus
define FileLog_Schaf FileLog ./log/Schaf.log Schaf_TextStatus.*
attr FileLog_Schaf group Schaf
attr FileLog_Schaf logtype text
attr FileLog_Schaf nrarchive 3
attr FileLog_Schaf room Rasenmaeher
#----- ende fhem.cfg ----------------------------------------------

#----- begin 99_myUtils.pm ----------------------------------------
package main;
use strict;
use warnings;
use POSIX;
use 5.010;

sub
myUtils_Initialize($$)
{
my ($hash) = @_;
}
# Enter you functions below _this_ line.

sub Schaf_TextStatus($) {
my ($CodeNo) = @_;
my $TextStatus = "unknown";

if ($CodeNo == 0) { $TextStatus = "(0) Status wird ermittelt"; }
elsif ($CodeNo == 1) { $TextStatus = "(1) parken"; }
elsif ($CodeNo == 2) { $TextStatus = "(2) maehen"; }
elsif ($CodeNo == 3) { $TextStatus = "(3) suchen (in)"; }
elsif ($CodeNo == 4) { $TextStatus = "(4) laden"; }
elsif ($CodeNo == 5) { $TextStatus = "(5) suchen (out)"; }
elsif ($CodeNo == 7) { $TextStatus = "(7) Fehlerstatus"; }
elsif ($CodeNo == 8) { $TextStatus = "(8) Schleifensignal verloren"; }
elsif ($CodeNo == 16) { $TextStatus = "(16) Maeher abgeschaltet"; }
elsif ($CodeNo == 17) { $TextStatus = "(17) schlafen"; }
return $TextStatus;
}
sub FScount {
my $Status = $_[0];
my $fsc = $_[1];
my $lsc = $_[2];
my $actTime;
my $diff;

state $lstTime = 0;
state $lstStatus = 0;
$actTime = time;
$diff = $actTime - $lstTime;

if ($Status == 2 and $lstStatus == 5) # von 5 = suchen (out) nach 2 (maehen)
{
if ( $diff > 60) { $fsc++; }
else { $lsc++; }
}

$lstTime = $actTime;
$lstStatus = $Status;

return ($fsc,$lsc);
}
1;
#----- ende 99_myUtils.pm -----------------------------------
"Das Fliegen, sagt der Reiseführer Per Anhalter durch die Galaxis ist eine Kunst oder vielmehr ein Trick. Der Trick besteht darin, daß man lernt, wie man sich auf den Boden schmeißt, aber daneben."

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste