AutomowerConnect: Unterschied zwischen den Versionen
Trelle (Diskussion | Beiträge) |
Trelle (Diskussion | Beiträge) (→Readings ergänzen: Websocketevents V2) |
||
(20 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 13: | Zeile 13: | ||
== Eigenschaften == | == Eigenschaften == | ||
* Dieses Modul etabliert eine Kommunikation zwischen der Husqvarna Cloud und FHEM, um einen Husqvarna Automower zu steuern, der mit einem Connect Modul (SIM) betrieben wird. | * Dieses [[Modul]] etabliert eine Kommunikation zwischen der Husqvarna Cloud und [[FHEM]], um einen Husqvarna Automower zu steuern, der mit einem Connect Modul (SIM) betrieben wird. | ||
* Es arbeitet als | * Es arbeitet als [[Gerät]] für einen Mähroboter. Für zusätzliche in der API registrierte Mähroboter ist für jeden Mäher ein extra Appilcation Key mit Application Secret zu verwenden. | ||
* Der Pfad des Mähroboters wird in der Detailansicht des FHEMWEB Frontends angezeigt. | * Der Pfad des Mähroboters wird in der Detailansicht des [[FHEMWEB]] Frontends angezeigt. | ||
* Im Gegensatz zur Smartphone App können mehr als die 50 letzten Wegpunkte angezeigt werden, zu einer möglichen Kontrolle der Mähbereichsabdeckung. | * Im Gegensatz zur Smartphone App können mehr als die 50 letzten Wegpunkte angezeigt werden, zu einer möglichen Kontrolle der Mähbereichsabdeckung. | ||
* Der Pfad kann mit einer beliebigen Karte hinterlegt werden. | * Der Pfad kann mit einer beliebigen Karte hinterlegt werden. | ||
Zeile 29: | Zeile 29: | ||
== Anforderungen == | == Anforderungen == | ||
* Für den Zugriff auf die API muss eine Application angelegt werden, im [https://developer.husqvarnagroup.cloud/docs/get-started Husqvarna Developer Portal: Get Started]. | * Für den Zugriff auf die API muss eine Application angelegt werden, im [https://developer.husqvarnagroup.cloud/docs/get-started Husqvarna Developer Portal: Get Started]. | ||
* Währenddessen wird ein Application Key (client_id) und ein Application Secret (client secret) bereitgestellt. Diese sind für | * Währenddessen wird ein Application Key (client_id) und ein Application Secret (client secret) bereitgestellt. Diese sind für das [[Modul]] zu nutzen. | ||
* Das Modul verwendet Client Credentials als Granttype zur Authentifizierung, die Redirect URL wird für diesen Authentifizierungstyp nicht benötigt (ggf. localhost (http://127.0.0.1) eintragen). | * Das [[Modul]] verwendet Client Credentials als Granttype zur Authentifizierung, die Redirect URL wird für diesen Authentifizierungstyp nicht benötigt (ggf. localhost (http://127.0.0.1) eintragen). | ||
== Bedeutung der Werte des Reading device_state == | == Bedeutung der Werte des Reading device_state == | ||
* <code>defined</code> Das Gerät wurde erfolgreich definiert, z.B. nach dem es erzeugt wurde oder nach einem Neustart. | * <code>defined</code> Das [[Gerät]] wurde erfolgreich definiert, z.B. nach dem es erzeugt wurde oder nach einem Neustart. | ||
* <code>authentification</code> Das Gerät leitet die Authentifizierung ein und fordert ein Access Token an. | * <code>authentification</code> Das [[Gerät]] leitet die Authentifizierung ein und fordert ein Access Token an. | ||
* <code>authenticated</code> Das Gerät wurde authentifiziert und hat ein Access Token erhalten und die Daten werden das erste Mal nach der Authentifizierung aus der API gelesen. | * <code>authenticated</code> Das [[Gerät]] wurde authentifiziert und hat ein Access Token erhalten und die Daten werden das erste Mal nach der Authentifizierung aus der API gelesen. | ||
* <code>update</code> Das Gerät erneuert die Daten aus der API. Wann die Daten in der API zuletzt geändert wurden ist am Zeitstempel <code>status_Timestamp</code> abzulesen. <code>status_TimestampDiff</code> zeigt die Zeitspanne zwischen den letzten beiden Statusänderungen an. | * <code>update</code> Das [[Gerät]] erneuert die Daten aus der API. Wann die Daten in der API zuletzt geändert wurden ist am Zeitstempel <code>status_Timestamp</code> abzulesen. <code>status_TimestampDiff</code> zeigt die Zeitspanne zwischen den letzten beiden Statusänderungen an. | ||
* <code>connected</code> Alles ist in Ordnung. Nur in diesem Zustand können Befehle gesendet werden. | * <code>connected</code> Alles ist in Ordnung. Nur in diesem Zustand können Befehle gesendet werden. | ||
* <code>disabled</code> Das Gerät ist inaktiv. Es werden keine Befehle gesendet und keine Daten über die API geholt. | * <code>disabled</code> Das [[Gerät]] ist inaktiv. Es werden keine Befehle gesendet und keine Daten über die API geholt. | ||
* <code>initialized</code> Das Gerät ist aktiv und beginnt zu arbeiten. | * <code>initialized</code> Das [[Gerät]] ist aktiv und beginnt zu arbeiten. | ||
* <code>error</code> Während der Authentifizierung, des Updates oder des Sendens ist ein Fehler aufgetreten, mehr dazu steht in der Logdatei. | * <code>error</code> Während der Authentifizierung, des Updates oder des Sendens ist ein Fehler aufgetreten, mehr dazu steht in der Logdatei. | ||
Zeile 46: | Zeile 46: | ||
== Flächenregistrierung == | == Flächenregistrierung == | ||
Zur Registrierung der Fläche auf dem Frontend und der Fläche auf der Erde dienen die Attribute <code>mapImageWidthHeight</code> und <code>mapImageCoordinatesToRegister</code>. Das Attribut <code>mapImageWidthHeight</code> legt die Flächengröße in Pixel fest, durch die Angabe der Breite und Höhe der Fläche. Die Angaben werden durch ein einziges Leerzeichen getrennt. Das Attribut <code>mapImageCoordinatesToRegister</code> legt die Fläche auf der Erde fest, in dem die GEO-Koordinaten der linken oberen Ecke und der rechten unteren Ecke der Fläche angegeben werden, auf der die Punkte der GEO-Datensätze liegen, die vom Mähroboter geliefert werden. Longitude und Latitude werden durch ein einziges Leerzeichen getrennt, so dass ein Datensatz einer Zeile entspricht. Beim Ermitteln der Eckpunkte kann gleichzeitig ein Bild als Hintergrund gespeichert werden. | Zur Registrierung der Fläche auf dem Frontend und der Fläche auf der Erde dienen die [[Attribut|Attribute]] <code>mapImageWidthHeight</code> und <code>mapImageCoordinatesToRegister</code>. Das [[Attribut]] <code>mapImageWidthHeight</code> legt die Flächengröße in Pixel fest, durch die Angabe der Breite und Höhe der Fläche. Die Angaben werden durch ein einziges Leerzeichen getrennt. Das Attribut <code>mapImageCoordinatesToRegister</code> legt die Fläche auf der Erde fest, in dem die GEO-Koordinaten der linken oberen Ecke und der rechten unteren Ecke der Fläche angegeben werden, auf der die Punkte der GEO-Datensätze liegen, die vom Mähroboter geliefert werden. Longitude und Latitude werden durch ein einziges Leerzeichen getrennt, so dass ein Datensatz einer Zeile entspricht. Beim Ermitteln der Eckpunkte kann gleichzeitig ein Bild als Hintergrund gespeichert werden. | ||
=== Koordinaten ermitteln mit Google Earth Web === | === Koordinaten ermitteln mit Google Earth Web === | ||
Zeile 60: | Zeile 60: | ||
* Optional die Linie ausblenden und den durch die Linie markierten Bereich als Bildschirmausschnitt speichern. | * Optional die Linie ausblenden und den durch die Linie markierten Bereich als Bildschirmausschnitt speichern. | ||
* Optional die Bildgröße in Pixel ermitteln, die Bilddatei wenn möglich als webp-Datei speichern um die Dateigröße zu reduzieren. Empfohlene Größe der Bilddatei sollte unter 100 kB liegen. | * Optional die Bildgröße in Pixel ermitteln, die Bilddatei wenn möglich als webp-Datei speichern um die Dateigröße zu reduzieren. Empfohlene Größe der Bilddatei sollte unter 100 kB liegen. | ||
* Optional das Bild in einem für FHEM zugänglichen Pfad ablegen. Im Dateinamen die Bildgröße angeben, z.B. map700x1200.webp, dann wird beim Setzen des Attributes <code>mapImagePath</code> das Attribut <code>mapImageWidthHeight</code> auf die Bildgröße gesetzt. | * Optional das Bild in einem für [[FHEM]] zugänglichen Pfad ablegen. Im Dateinamen die Bildgröße angeben, z.B. map700x1200.webp, dann wird beim Setzen des Attributes <code>mapImagePath</code> das [[Attribut]] <code>mapImageWidthHeight</code> auf die Bildgröße gesetzt. | ||
* Die kml-Datei mit einem Texteditor öffnen und die Koordinaten kopieren und im richtigen Format in das Attribut <code>mapImageCoordinatesToRegister</code> eintragen. | * Die kml-Datei mit einem Texteditor öffnen und die Koordinaten kopieren und im richtigen Format in das [[Attribut]] <code>mapImageCoordinatesToRegister</code> eintragen. | ||
* Dabei beachten, dass in der kml-Datei drei Werte je Datensatz enthalten sind (Longitude, Latitude, und Altitude) die Höhendaten (Altitude) weglassen, Longitude und Latitude durch ein einziges Leerzeichen trennen und jeden Datensatz in eine eigene Zeile kopieren. | * Dabei beachten, dass in der kml-Datei drei Werte je Datensatz enthalten sind (Longitude, Latitude, und Altitude) die Höhendaten (Altitude) weglassen, Longitude und Latitude durch ein einziges Leerzeichen trennen und jeden Datensatz in eine eigene Zeile kopieren. | ||
=== Koordinaten ermitteln mit Google Earth Pro === | === Koordinaten ermitteln mit Google Earth Pro === | ||
Mit Google Earth Pro kann die perspektivische Verzerrung minimiert werden und so ein genauerer Eindruck von der Lage eingezeichneter GEO-Datensätze erzeugt werden. Die Vorgehensweise ist ähnlich der mit Google | Mit Google Earth Pro kann die perspektivische Verzerrung minimiert werden und so ein genauerer Eindruck von der Lage eingezeichneter GEO-Datensätze erzeugt werden. Die Vorgehensweise ist ähnlich der mit Google Earth Web, folgendes ist dabei zusätzlich zu beachten: | ||
* Unter <code>Tools</code> <code>Optionen</code> <code>3D-Ansicht</code> ''Dezimalgrad'' auswählen, ''Höhenverstärkung'' auf den kleinsten Wert setzen (0.01). | * Unter <code>Tools</code> <code>Optionen</code> <code>3D-Ansicht</code> ''Dezimalgrad'' auswählen, ''Höhenverstärkung'' auf den kleinsten Wert setzen (0.01). | ||
Zeile 73: | Zeile 73: | ||
== Grenzen darstellen == | == Grenzen darstellen == | ||
[[Datei:Karte ohne Hintergrund.png|mini|322x322px|Darstellungsbeispiel]] | [[Datei:Karte ohne Hintergrund.png|mini|322x322px|Darstellungsbeispiel]] | ||
Die Grenzen des Mähbereiches können eingezeichnet werden. Je nach Vorarbeit (ausmessen von Lage und Länge der Begrenzungabschnitte, oder Orientierung an Geländepunkten wie Bäume, Mauern, Wege, Zäune, markante Grenzpunkte, usw.) kann die Begrenzung mehr oder weniger genau in Google Earth eingezeichnet werden. Die Koordinaten können wieder über eine kml-Datei gewonnen werden und je nach Art der Grenze in die Attribute <code>mowingAreaLimits</code> zur Darstellung der Mähflächengrenze oder <code>propertyLimits</code> zur Darstellung der Grundstücksgrenze, eingetragen werden | Die Grenzen des Mähbereiches können eingezeichnet werden. Je nach Vorarbeit (ausmessen von Lage und Länge der Begrenzungabschnitte, oder Orientierung an Geländepunkten wie Bäume, Mauern, Wege, Zäune, markante Grenzpunkte, usw.) kann die Begrenzung mehr oder weniger genau in Google Earth eingezeichnet werden. Die Koordinaten können wieder über eine kml-Datei gewonnen werden und je nach Art der Grenze in die [[Attribut|Attribute]] <code>mowingAreaLimits</code> zur Darstellung der Mähflächengrenze oder <code>propertyLimits</code> zur Darstellung der Grundstücksgrenze, eingetragen werden | ||
=== Darstellung des berechneten Hüllenpolygon der Mähfläche === | === Darstellung des berechneten Hüllenpolygon der Mähfläche === | ||
Zeile 82: | Zeile 82: | ||
=== Grenzpunkte der Grundstücksgrenze === | === Grenzpunkte der Grundstücksgrenze === | ||
Die Darstellung der Grundstücksgrenze dient zur besseren Ermittlung der Mähbereichsgrenze. Wenn die Mähbereichsgrenze in Google Earth zur Koordinatenermittlung eingezeichnet wird, dann ist die Darstellung der Grundstücksgrenze eine Hilfe zur Orientierung. Die Grundstücksgrenzen können über die [https://geoportal.de/Anwendungen/Geoportale%20der%20L%C3%A4nder.html GEO-Portale der Länder] ermittelt werden. Je nach Ausgestaltung der Portale können an den Grenzpunkten Markierungen angebracht werden und dort die Koordinaten abgelesen werden oder kopiert werden. Die Koordinaten dieser Punkte können dann in das Attribut <code>propertyLimits</code> übernommen werden, teilweise Zentimeter genau. Und die ermittelte Grenzpunkte können in eine kml-Datei eingetragen werden und so die Grenze exakt in Google Earth dargestellt werden. | Die Darstellung der Grundstücksgrenze dient zur besseren Ermittlung der Mähbereichsgrenze. Wenn die Mähbereichsgrenze in Google Earth zur Koordinatenermittlung eingezeichnet wird, dann ist die Darstellung der Grundstücksgrenze eine Hilfe zur Orientierung. Die Grundstücksgrenzen können über die [https://geoportal.de/Anwendungen/Geoportale%20der%20L%C3%A4nder.html GEO-Portale der Länder] ermittelt werden. Je nach Ausgestaltung der Portale können an den Grenzpunkten Markierungen angebracht werden und dort die Koordinaten abgelesen werden oder kopiert werden. Die Koordinaten dieser Punkte können dann in das [[Attribut]] <code>propertyLimits</code> übernommen werden, teilweise Zentimeter genau. Und die ermittelte Grenzpunkte können in eine kml-Datei eingetragen werden und so die Grenze exakt in Google Earth dargestellt werden. | ||
=== Aufbau der Kartendarstellung === | === Aufbau der Kartendarstellung === | ||
Beim Laden der Detailansicht werden die mapDesignAttributes übertragen, die Ladestationskoordinaten, die Grundstücksgrenzkoordinaten, die Mähbereichsgrenzkoordinaten und die Koordinaten des bereits vorhanden Mäherpfades. | Beim Laden der Detailansicht werden die mapDesignAttributes übertragen, die Ladestationskoordinaten, die Grundstücksgrenzkoordinaten, die Mähbereichsgrenzkoordinaten und die Koordinaten des bereits vorhanden Mäherpfades. | ||
Wenn es neue Positionsdaten oder eine Fehlermeldung gibt werden nur diese Positionsdaten oder Fehlerdaten zur Aktualisierung der Karte übertragen. | Wenn es neue Positionsdaten oder eine Fehlermeldung gibt werden nur diese Positionsdaten oder Fehlerdaten zur Aktualisierung der Karte übertragen. | ||
Die Skalierung der GPS Daten auf die Bildgröße erfolgt mit den zum jeweiligen Darstellungszeitpunkt im Modul vorliegenden Umrechnungsfaktoren. | Die Skalierung der GPS Daten auf die Bildgröße erfolgt mit den zum jeweiligen Darstellungszeitpunkt im [[Modul]] vorliegenden Umrechnungsfaktoren. | ||
=== Zusammenspiel der zur Registrierung, Skalierung und Positionierung genutzten Attribute === | === Zusammenspiel der zur Registrierung, Skalierung und Positionierung genutzten Attribute === | ||
Zeile 102: | Zeile 102: | ||
== Statistische Daten ermitteln == | == Statistische Daten ermitteln == | ||
[[Datei:Koordinatentransformation Grad in Meter.png|rand|rechts|445x445px|Koordinatentransformaton auf der Webseite vom GDZ des BKG ]] | [[Datei:Koordinatentransformation Grad in Meter.png|rand|rechts|445x445px|Koordinatentransformaton auf der Webseite vom GDZ des BKG ]] | ||
Damit statistische Daten, wie Streckenlänge, überfahrene Fläche und Geschwindigkeit berechnet werden können, muss eine Umrechnung der GEO-Daten von Grad in Meter erfolgen. Da die Erde ein Elipsoid ist, ist der Umfang der Erde vom Standort abhängig. Da ein Grad immer 1/360 des Umfangs ist und der Umfang vom Standort abhängt, hängt auch der Umrechnungsfaktor Meter pro Grad vom Standort ab. Deshalb muss ein Umrechnungsfaktor immer für den bestimmten Standort als Differenzenquotient berechnet werden und kann dann dort bei den kleinen Streckenlängen eines Mähbereiches ohne nennenswerten Fehler als konstant angenommen werden. Die Berechnung führt das Modul durch. Als Grundlage müssen jedoch die zu den Koordinaten des Attributes <code>mapImageCoordinatesToRegister</code> in Dezimalgrad, die passenden Koordinaten in Meter in das Attribut <code>mapImageCoordinatesUTM</code> eingetragen werden. Die Umrechnung kann auf der Website des [https://gdz.bkg.bund.de/koordinatentransformation GEO-Datenzentrums des Bundeamtes für Kartographie und Geodäsie, Koordinatenumrechnung] kostenlos durchgeführt werden, auch als Liste in Form einer Textdatei. Bei den Einstellungen ist die Reihenfolge der Koordinaten zu beachten (Longitude, Latitude). Stehen die zeilenweise umzurechnenden Daten in einer Textdatei ist das Windows-Zeilenende (CRLF) erforderlich. Höhenunterschiede werden bei den Berechnungen nicht berücksichtigt. | Damit statistische Daten, wie Streckenlänge, überfahrene Fläche und Geschwindigkeit berechnet werden können, muss eine Umrechnung der GEO-Daten von Grad in Meter erfolgen. Da die Erde ein Elipsoid ist, ist der Umfang der Erde vom Standort abhängig. Da ein Grad immer 1/360 des Umfangs ist und der Umfang vom Standort abhängt, hängt auch der Umrechnungsfaktor Meter pro Grad vom Standort ab. Deshalb muss ein Umrechnungsfaktor immer für den bestimmten Standort als Differenzenquotient berechnet werden und kann dann dort bei den kleinen Streckenlängen eines Mähbereiches ohne nennenswerten Fehler als konstant angenommen werden. Die Berechnung führt das Modul durch. Als Grundlage müssen jedoch die zu den Koordinaten des [[Attribut|Attributes]] <code>mapImageCoordinatesToRegister</code> in Dezimalgrad, die passenden Koordinaten in Meter in das [[Attribut]] <code>mapImageCoordinatesUTM</code> eingetragen werden. Die Umrechnung kann auf der Website des [https://gdz.bkg.bund.de/koordinatentransformation GEO-Datenzentrums des Bundeamtes für Kartographie und Geodäsie, Koordinatenumrechnung] kostenlos durchgeführt werden, auch als Liste in Form einer Textdatei. Bei den Einstellungen ist die Reihenfolge der Koordinaten zu beachten (Longitude, Latitude). Stehen die zeilenweise umzurechnenden Daten in einer Textdatei ist das Windows-Zeilenende (CRLF) erforderlich. Höhenunterschiede werden bei den Berechnungen nicht berücksichtigt. | ||
== Design der Karte ändern == | == Design der Karte ändern == | ||
[[Datei:mowerpath_dots_nobg.png|mini|200x315px|GPS Koordinaten als Punkte]] | [[Datei:mowerpath_dots_nobg.png|mini|200x315px|GPS Koordinaten als Punkte]] | ||
Mit <code> set <name> defaultDesignAttributesToAttribute </code> werden die internen HTML-Attribute in das FHEM | Mit <code> set <name> defaultDesignAttributesToAttribute </code> werden die internen HTML-Attribute in das FHEM Attribut <code>mapDesignAttributes</code> geschrieben. | ||
In diesem Attribut können die HTML-Attribute geändert werden, um z.B. die Linienstärke, -farbe oder -stil anzupassen. Solange das Attribut gesetzt ist, werden die dort enthaltenen HTML-Attribute verwendet. Das Attribut muss nur die geänderten HTML-Attribute enthalten. | In diesem [[Attribut]] können die HTML-Attribute geändert werden, um z.B. die Linienstärke, -farbe oder -stil anzupassen. Solange das [[Attribut]] gesetzt ist, werden die dort enthaltenen HTML-Attribute verwendet. Das [[Attribut]] muss nur die geänderten HTML-Attribute enthalten. | ||
'''Beispiel:''' Statt Linien sollen die GPS-Koordinaten als Punkte dargestellt werden dazu ist <code>mowingPathUseDots="1"</code> zu setzen. Mit dieser Einstellung wird die Verteilung der Wegpunkte sichtbar. | '''Beispiel:''' Statt Linien sollen die GPS-Koordinaten als Punkte dargestellt werden dazu ist <code>mowingPathUseDots="1"</code> zu setzen. Mit dieser Einstellung wird die Verteilung der Wegpunkte sichtbar. | ||
== Bedienpanel einfügen == | == Bedienpanel einfügen == | ||
Über das Attribut 'mowerPanel' kann HTML Kode in die Detailansicht eingefügt werden. Der dort enthaltene HTML Kode kann z.B. Kurzbefehle enthalten. | Über das [[Attribut]] 'mowerPanel' kann HTML Kode in die Detailansicht eingefügt werden. Der dort enthaltene HTML Kode kann z.B. Kurzbefehle enthalten. | ||
Er wird unterhalb der Karte angezeigt, kann aber über CSS positioniert werden. Wenn die erste Zeile ein Kommentar ist, kann dort mit dem Schlüsselwort <code>ON_TOP</code> der HTML Kode über der Karte angezeigt werden. | Er wird unterhalb der Karte angezeigt, kann aber über CSS positioniert werden. Wenn die erste Zeile ein Kommentar ist, kann dort mit dem Schlüsselwort <code>ON_TOP</code> der HTML Kode über der Karte angezeigt werden. | ||
Zeile 149: | Zeile 149: | ||
<button class="amc_panel_button" command="ParkUntilNextSchedule" >Parken bis nächsten Termin</button> | <button class="amc_panel_button" command="ParkUntilNextSchedule" >Parken bis nächsten Termin</button> | ||
<button class="amc_panel_button" command="ParkUntilNextSchedule" >Parken bis auf Weiteres</button> | <button class="amc_panel_button" command="ParkUntilNextSchedule" >Parken bis auf Weiteres</button> | ||
</div> | |||
</syntaxhighlight> | |||
== Speichern und Laden von Wegpunkten == | |||
Wenn es sinvoll erscheint, können vor einem Update die vorhandenen Wegpunkte gespeichert werden und nach dem Update zurück geladen werden. | |||
Dazu können die nachstehenden Kodeschnipsel genutzt werden wenn sie in die Datei 99_MyUtils.pm integriert werden. | |||
<syntaxhighlight lang="perl"> | |||
use Storable; | |||
sub store_areapos { | |||
my ( $name ) = @_; | |||
my $hash = $defs{$name}; | |||
my @items = qw( areapos ); # ggf. ergänzen mit z.B. statistics mapZones | |||
for my $item (@items) { | |||
store \$hash->{helper}{$item}, $item if ( defined $hash->{helper}{$item} ); | |||
} | |||
} | |||
sub retrieve_areapos { | |||
my ( $name ) = @_; | |||
my $hash = $defs{$name}; | |||
my @items = qw( areapos ); # ggf. ergänzen mit z.B. statistics mapZones | |||
my $ref = 0; | |||
for my $item (@items) { | |||
if (-e $item ) { | |||
$ref = retrieve( $item ); | |||
$hash->{helper}{$item} = $$ref; | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
Das Speichern und Laden kann über Buttons im [[AutomowerConnect#Bedienpanel_einf%C3%BCgen|mowerPanel]] eingebunden werden. <device name> muss durch den jeweiligen Gerätenamen ersetzt werden. | |||
<syntaxhighlight lang="html"> | |||
<div ... > | |||
. | |||
. | |||
. | |||
<button class="amc_panel_button" onclick="FW_cmd(FW_root+'cmd={store_areapos \'<device name>\'}&XHR=1')" >Save Waypoints</button> | |||
<button class="amc_panel_button" onclick="FW_cmd(FW_root+'cmd={retrieve_areapos \'<device name>\'}&XHR=1')" >Load Waypoints</button> | |||
. | |||
. | |||
. | |||
</div> | </div> | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Zeile 159: | Zeile 204: | ||
* Eintrag löschen: Alle Wochentage abwählen und <code> ± </code> betätigen. | * Eintrag löschen: Alle Wochentage abwählen und <code> ± </code> betätigen. | ||
* Eintrag zurücksetzen: Irgend ein Zeitfeld mit <code> -- </code> füllen und <code> ± </code> betätigen. | * Eintrag zurücksetzen: Irgend ein Zeitfeld mit <code> -- </code> füllen und <code> ± </code> betätigen. | ||
Beispiel, wie der Button ins [[AutomowerConnect#Bedienpanel_einf%C3%BCgen|Bedienpanel]] eingefügt werden kann | |||
<syntaxhighlight lang="html"> | |||
<div ... > | |||
. | |||
. | |||
. | |||
<button class="amc_panel_button" onclick="AutomowerConnectSchedule( '<device name>')" >Mower Schedule</button> | |||
. | |||
. | |||
. | |||
</div> | |||
</syntaxhighlight> | |||
Über das Designattribut <code>hideSchedulerButton="1"</code> kann der Standartbutton ausgeblendet werden. | |||
==Einbindung der Karte in verschiedene Frontends== | ==Einbindung der Karte in verschiedene Frontends== | ||
Das Modul AutomowerConnect stellt den Befehl <code>get <Gerätename> html</code> zur Verfügung, um den HTML-Kode für die Karte zu liefern. | Das [[Modul]] AutomowerConnect stellt den Befehl <code>get <Gerätename> html</code> zur Verfügung, um den HTML-Kode für die Karte zu liefern. | ||
Mit dieser Methode erfolgt die Einbindung in verschiedene Frontends. | Mit dieser Methode erfolgt die Einbindung in verschiedene Frontends. | ||
In den folgenden Beispielen muss <device name> durch den Namen des Gerätes ersetzt werden, das einen Automower steuert. | In den folgenden Beispielen muss <device name> durch den Namen des [[Gerät|Gerätes]] ersetzt werden, das einen Automower steuert. | ||
===DOIF, uiTable === | ===DOIF, uiTable === | ||
Zeile 185: | Zeile 245: | ||
Die Dateien jquery.min.js und automowerconnect.js aus dem Verzeichnis pgm2 müssen im Head-Tag eingebunden werden und das Widget wie üblich als Div-Tag im Body. | Die Dateien jquery.min.js und automowerconnect.js aus dem Verzeichnis pgm2 müssen im Head-Tag eingebunden werden und das Widget wie üblich als Div-Tag im Body. | ||
<device name> ist durch den Namen des | <device name> ist durch den Namen des [[Gerät|Gerätes]] zu ersetzen, das den Mäher abbildet. | ||
Die Einbindung erfolgt auf folgende Weise: | Die Einbindung erfolgt auf folgende Weise: | ||
Zeile 220: | Zeile 280: | ||
Die Dateien jquery.min.js und automowerconnect.js aus dem Verzeichnis pgm2 müssen im Head-Tag eingebunden werden und die Karte als ftui-content im Body angelegt werden. | Die Dateien jquery.min.js und automowerconnect.js aus dem Verzeichnis pgm2 müssen im Head-Tag eingebunden werden und die Karte als ftui-content im Body angelegt werden. | ||
<device name> ist durch den Namen des | <device name> ist durch den Namen des [[Gerät|Gerätes]] zu ersetzen, das den Mäher abbildet. | ||
Die Einbindung erfolgt auf folgende Weise: | Die Einbindung erfolgt auf folgende Weise: | ||
Zeile 275: | Zeile 335: | ||
[[Datei:Statistics.png|mini|Beispiel für eine Liste mit den Pfaden des Gerätehashes.]] | [[Datei:Statistics.png|mini|Beispiel für eine Liste mit den Pfaden des Gerätehashes.]] | ||
Wenige Werte der Mowerdaten werden in [[Readings]] angezeigt. Wenn das nicht genügt, können [[Readings]] über das Attribut [[userReadings]] ergänzt werden. | Wenige Werte der Mowerdaten werden in [[Readings]] angezeigt. Wenn das nicht genügt, können [[Readings]] über das Attribut [[userReadings]] ergänzt werden. | ||
Als Trigger gibt es | Als Trigger gibt es zwei grundsätzliche Möglichkeiten: | ||
*device_state: connected - alles was nur nachts aktualisiert wird ( [https://developer.husqvarnagroup.cloud/apis/automower-connect-api | *device_state: connected - alles was nur nachts aktualisiert wird ( [https://developer.husqvarnagroup.cloud/apis/automower-connect-api?tab=openapi Automower Connect API] ) | ||
* mower_wsEvent: ( [https://developer.husqvarnagroup.cloud/apis/automower-connect-api?tab=websocket%20v2 Webesocket Events V2] ) | |||
*mower_wsEvent: | |||
Welche Daten, wie geliefert werden, ist aus den vorstehenden Links ersichtlich. | Welche Daten, wie geliefert werden, ist aus den vorstehenden Links ersichtlich. | ||
Zeile 293: | Zeile 351: | ||
'''Beispiel 2''': Erzeugen der [[Readings]] <code>lastLongitude</code> und <code>lastLatitude</code> mit dem Pfad des Gerätehashes <code>$hash->{helper}{mower}{attributes}{positions}[0]</code> zu den letzten bekannten Koordinaten. | '''Beispiel 2''': Erzeugen der [[Readings]] <code>lastLongitude</code> und <code>lastLatitude</code> mit dem Pfad des Gerätehashes <code>$hash->{helper}{mower}{attributes}{positions}[0]</code> zu den letzten bekannten Koordinaten. | ||
<pre> | <pre> | ||
attr <name> userReadings lastLatitude:mower_wsEvent:.positions-event {$defs{$name}->{helper}{mower}{attributes}{positions}[0]{latitude}},\ | attr <name> userReadings lastLatitude:mower_wsEvent:.positions-event-v2 {$defs{$name}->{helper}{mower}{attributes}{positions}[0]{latitude}},\ | ||
lastLongitude:mower_wsEvent:.positions-event {$defs{$name}->{helper}{mower}{attributes}{positions}[0]{longitude}} | lastLongitude:mower_wsEvent:.positions-event-v2 {$defs{$name}->{helper}{mower}{attributes}{positions}[0]{longitude}} | ||
</pre> | </pre> | ||
==Steigerung der Rate für Positionsevents == | ==Steigerung der Rate für Positionsevents == | ||
Bei der Benutzung des Modul 98_AMConnectTools.pm wird ca. alle 30s während der Aktivitäten LEAVING, MOWING und GOING_HOME über die Websocketverbindung ein Positonsevent empfangen. | Bei der Benutzung des [[Modul]] 98_AMConnectTools.pm wird ca. alle 30s während der Aktivitäten LEAVING, MOWING und GOING_HOME über die Websocketverbindung ein Positonsevent empfangen. | ||
Das bedeutet es wird während des Mähens alle 30 s eine Position gesendet. | Das bedeutet es wird während des Mähens alle 30 s eine Position gesendet. | ||
Um die Eventrate aufrecht zu erhalten, wird die inoffizielle API für den 1. Mäher alle 440 s abgefragt. | Um die Eventrate aufrecht zu erhalten, wird die inoffizielle API für den 1. Mäher alle 440 s abgefragt. | ||
Das Modul schaltet sich inaktiv wenn sich alle Mäher in der Ladestation befinden. | Das [[Modul]] schaltet sich inaktiv wenn sich alle Mäher in der Ladestation befinden. | ||
Es ist nur aktiv, wenn mindestens ein Mäher die Station verlässt bis sich alle Mäher in der Station befinden. | Es ist nur aktiv, wenn mindestens ein Mäher die Station verlässt bis sich alle Mäher in der Station befinden. | ||
Zeile 310: | Zeile 368: | ||
Die Datei 98_AMConnectTools.pm aus dem SVN laden. mit dem folgenden Befehl für die FHEM Befehlszeile. | Die Datei 98_AMConnectTools.pm aus dem SVN laden. mit dem folgenden Befehl für die FHEM Befehlszeile. | ||
{ Svn_GetFile('contrib/AutomowerConnect/98_AMConnectTools.pm', 'FHEM/98_AMConnectTools.pm') } | { Svn_GetFile('contrib/AutomowerConnect/98_AMConnectTools.pm', 'FHEM/98_AMConnectTools.pm') } | ||
Danach reicht ein Reload des Moduls damit das Gerät definiert werden kann. | Danach reicht ein Reload des [[Modul|Moduls]] damit das [[Gerät]] definiert werden kann. | ||
reload 98_AMConnectTools.pm | reload 98_AMConnectTools.pm | ||
Zeile 316: | Zeile 374: | ||
define AMConnectTools AMConnectTools <Emailadresse> | define AMConnectTools AMConnectTools <Emailadresse> | ||
set AMConnectTools password <Passwort> | set AMConnectTools password <Passwort> | ||
== Modul bei gehäuften Verbindungsfehlern automatisch deaktivieren == | |||
Bei einem Netzwerkausfall, Internetausfall uä. versucht das [[Modul]] wiederholt eine Verbindung zum Husquvarna Server herzustellen, das kann sich störend im System bemerkbar machen. Eine eventuelle Störung kann minimiert werden, wenn das [[Modul]] automatisch deaktiviert wird. Bei Bedarf kann das [[Modul]] nach längerer Zeit automatisch wieder aktiviert werden. | |||
Das Beispiel zeigt einen Vorschlag, wie dieses Verhalten mit einem [[DOIF]] erreicht werden kann. | |||
Das Beispiel kann per [[Raw definition]] in [[FHEM]] eingespielt werden. Dabei ist zu beachten, dass der Name des Mähers im Beispiel <code>am430x1</code> durch einen real existierenden Namen einer Mäherdefinition zu ersetzen ist. | |||
<syntaxhighlight lang="perl"> | |||
defmod disOnError DOIF ## 1\ | |||
(["^am430x1$:^WEBSOCKET ERROR$"])\ | |||
(setreading $SELF ws_err_cnt {([$SELF:ws_err_cnt]+1)},\ | |||
IF ([$SELF:ws_err_cnt] > ReadingsNum('$SELF','ws_err_threshold',0)) \ | |||
( attr am430x1 disable 1,\ | |||
setreading $SELF ws_err_cnt 0,\ | |||
setreading $SELF enable_at {(POSIX::strftime('%T',localtime(time + [$SELF:enable_after_hours] * 3600)))}\ | |||
)\ | |||
)\ | |||
## 2\ | |||
DOELSEIF (["^am430x1$:^MOWERAPI ERROR$"]) \ | |||
(setreading $SELF api_err_cnt {([$SELF:api_err_cnt]+1)},\ | |||
IF ([$SELF:api_err_cnt] > ReadingsNum('$SELF','api_err_threshold',0)) \ | |||
( attr am430x1 disable 1,\ | |||
setreading $SELF api_err_cnt 0,\ | |||
setreading $SELF enable_at {(POSIX::strftime('%T',localtime(time + [$SELF:enable_after_hours] * 3600)))}\ | |||
)\ | |||
)\ | |||
## 3\ | |||
DOELSEIF (["^am430x1$:^AUTHENTICATION ERROR$"])\ | |||
(setreading $SELF auth_err_cnt {([$SELF:auth_err_cnt]+1)},\ | |||
IF ([$SELF:auth_err_cnt] > ReadingsNum('$SELF','auth_err_threshold',0)) \ | |||
( attr am430x1 disable 1,\ | |||
setreading $SELF auth_err_cnt 0,\ | |||
setreading $SELF enable_at {(POSIX::strftime('%T',localtime(time + [$SELF:enable_after_hours] * 3600)))}\ | |||
)\ | |||
)\ | |||
## 4\ | |||
DOELSEIF ([[$SELF:enable_at]] and AttrVal('am430x1','disable',0) == 1)\ | |||
( attr am430x1 disable 0,\ | |||
setreading $SELF ws_err_cnt 0,\ | |||
setreading $SELF api_err_cnt 0,\ | |||
setreading $SELF auth_err_cnt 0\ | |||
)\ | |||
## 5\ | |||
DOELSEIF ([23:57:07] and AttrVal('am430x1','disable',0) == 0)\ | |||
( setreading $SELF ws_err_cnt 0,\ | |||
setreading $SELF api_err_cnt 0,\ | |||
setreading $SELF auth_err_cnt 0\ | |||
)\ | |||
attr disOnError do always | |||
attr disOnError readingList ws_err_threshold api_err_threshold auth_err_threshold enable_after_hours | |||
attr disOnError room 0_Test | |||
attr disOnError setList ws_err_threshold:0,1,2,4,8,16,32,64\ | |||
api_err_threshold:0,1,2,4,8,16,32,64\ | |||
auth_err_threshold:0,1,2,4,8,16,32,64\ | |||
enable_after_hours:selectnumbers,1,1,24,0,lin | |||
attr disOnError webCmd ws_err_threshold:api_err_threshold:auth_err_threshold:enable_after_hours | |||
attr disOnError webCmdLabel Threshold / error events:; ;Websocket:Mower API:Authentification\ | |||
:Enable after / h | |||
</syntaxhighlight> | |||
==Links== | ==Links== |
Aktuelle Version vom 7. Dezember 2024, 12:31 Uhr
AutomowerConnect | |
---|---|
Zweck / Funktion | |
Steuerung eines Husqvarna Mähroboters mit Connect Modul | |
Allgemein | |
Typ | Gerätemodul |
Details | |
Dokumentation | EN / DE Thema |
Support (Forum) | Sonstige Systeme |
Modulname | 74_AutomowerConnect.pm |
Ersteller | Ellert |
Wichtig: sofern vorhanden, gilt im Zweifel immer die (englische) Beschreibung in der commandref! |
AutomowerConnect ist ein Modul zur Steuerung eines Husqvarna Mähroboters mit Connect Modul (SIM) über Husqvarnas OpenAPI.
Eine vollständige Beschreibung der Module enthält die Befehlsreferenz AutomowerConnect.
Die Forenbeiträge sind unter 74_AutomowerConnect, Husqvarnas OpenAPI zu finden.
Eigenschaften
- Dieses Modul etabliert eine Kommunikation zwischen der Husqvarna Cloud und FHEM, um einen Husqvarna Automower zu steuern, der mit einem Connect Modul (SIM) betrieben wird.
- Es arbeitet als Gerät für einen Mähroboter. Für zusätzliche in der API registrierte Mähroboter ist für jeden Mäher ein extra Appilcation Key mit Application Secret zu verwenden.
- Der Pfad des Mähroboters wird in der Detailansicht des FHEMWEB Frontends angezeigt.
- Im Gegensatz zur Smartphone App können mehr als die 50 letzten Wegpunkte angezeigt werden, zu einer möglichen Kontrolle der Mähbereichsabdeckung.
- Der Pfad kann mit einer beliebigen Karte hinterlegt werden.
- Eine Grundstücks- und eine Mähbereichsgrenze kann dargestellt werden.
- Die Lage der Ladestation kann gekennzeichnet werden.
- Die Karte muss als Rasterbild im webp, png oder jpg Format vorliegen.
- Es ist möglich alles was die API anbietet zu steuern, z.B. Mähplan, Scheinwerfer, Schnitthöhe und Aktionen wie, Start, Pause, Parken usw.
- Die letzten aus der API sind im Gerätehash gespeichert, eine Weiterverarbeitung ist daher möglich.
- Berechnung statistischer Daten (Geschwindigkeit; gefahrene Strecke und übermähte Fläche für den aktuellen Tag, die aktuelle Woche, sowie für den letzten Tag und die letzte Woche.
- Es können eigene Zonen definiert werden.
- Die Schnitthöhe kann je Zone vorgegeben werden. Sie wird automatisch eingestellt, wenn der Mäher sich in der Zone befindet.
Anforderungen
- Für den Zugriff auf die API muss eine Application angelegt werden, im Husqvarna Developer Portal: Get Started.
- Währenddessen wird ein Application Key (client_id) und ein Application Secret (client secret) bereitgestellt. Diese sind für das Modul zu nutzen.
- Das Modul verwendet Client Credentials als Granttype zur Authentifizierung, die Redirect URL wird für diesen Authentifizierungstyp nicht benötigt (ggf. localhost (http://127.0.0.1) eintragen).
Bedeutung der Werte des Reading device_state
defined
Das Gerät wurde erfolgreich definiert, z.B. nach dem es erzeugt wurde oder nach einem Neustart.authentification
Das Gerät leitet die Authentifizierung ein und fordert ein Access Token an.authenticated
Das Gerät wurde authentifiziert und hat ein Access Token erhalten und die Daten werden das erste Mal nach der Authentifizierung aus der API gelesen.update
Das Gerät erneuert die Daten aus der API. Wann die Daten in der API zuletzt geändert wurden ist am Zeitstempelstatus_Timestamp
abzulesen.status_TimestampDiff
zeigt die Zeitspanne zwischen den letzten beiden Statusänderungen an.connected
Alles ist in Ordnung. Nur in diesem Zustand können Befehle gesendet werden.disabled
Das Gerät ist inaktiv. Es werden keine Befehle gesendet und keine Daten über die API geholt.initialized
Das Gerät ist aktiv und beginnt zu arbeiten.error
Während der Authentifizierung, des Updates oder des Sendens ist ein Fehler aufgetreten, mehr dazu steht in der Logdatei.
Erstellung einer Karte mit Hintergrundbild, Grundstücksgrenze, Mähbereich und zurückgelegtem Pfad des Mähroboters.
Der Mähroboter liefert regelmäßig einen GPS-Datensatz von seinem Standort auf der Erde. Dieser GEO-Datensatz je ein Wert für die Longitude (Längengrad) und die Latitude (Breitengrad), ist nach WGS84 als Dezimalgrad angegeben. Damit ein GEO-Datensatz auf einem Bereich des Frontends dargestellt werden kann, muss eine Verbindung zwischen einer rechteckigen Fläche auf dem Frontend und einer rechteckigen Fläche auf der Erde in der auch jeder GEO-Datensatz liegen wird, hergestellt werden. Das entspricht der Registrierung in der digitalen Bildverarbeitung.
Flächenregistrierung
Zur Registrierung der Fläche auf dem Frontend und der Fläche auf der Erde dienen die Attribute mapImageWidthHeight
und mapImageCoordinatesToRegister
. Das Attribut mapImageWidthHeight
legt die Flächengröße in Pixel fest, durch die Angabe der Breite und Höhe der Fläche. Die Angaben werden durch ein einziges Leerzeichen getrennt. Das Attribut mapImageCoordinatesToRegister
legt die Fläche auf der Erde fest, in dem die GEO-Koordinaten der linken oberen Ecke und der rechten unteren Ecke der Fläche angegeben werden, auf der die Punkte der GEO-Datensätze liegen, die vom Mähroboter geliefert werden. Longitude und Latitude werden durch ein einziges Leerzeichen getrennt, so dass ein Datensatz einer Zeile entspricht. Beim Ermitteln der Eckpunkte kann gleichzeitig ein Bild als Hintergrund gespeichert werden.
Koordinaten ermitteln mit Google Earth Web
Dies ist die einfachste und schnellste Vorgehensweise. Da sich in Google Earth Web die Höhenverstärkung nicht abschalten lässt wird die Landschaft perspektivisch verzerrt, sodass eingezeichnete GEO-Datensätze als nicht korrekt positioniert erscheinen. Besser wird es, wenn Google Earth lokal installiert wird.
- Google Earth starten.
- Alle nicht benötigten Ebenen auschalten.
- Den Standort der Mähfläche anzeigen.
- In der 3D-Ansicht das Browserfenster und den Zoom so einstellen, dass die Mähfläche wie gewünscht angezeigt wird und die Nordausrichtung sicherstellen.
- Ein neues Projekt anlegen
- Eine Linie von der linken oberen Ecke in die rechte untere Ecke zeichnen.
- Das Projekt als kml-Datei exportieren
- Optional die Linie ausblenden und den durch die Linie markierten Bereich als Bildschirmausschnitt speichern.
- Optional die Bildgröße in Pixel ermitteln, die Bilddatei wenn möglich als webp-Datei speichern um die Dateigröße zu reduzieren. Empfohlene Größe der Bilddatei sollte unter 100 kB liegen.
- Optional das Bild in einem für FHEM zugänglichen Pfad ablegen. Im Dateinamen die Bildgröße angeben, z.B. map700x1200.webp, dann wird beim Setzen des Attributes
mapImagePath
das AttributmapImageWidthHeight
auf die Bildgröße gesetzt. - Die kml-Datei mit einem Texteditor öffnen und die Koordinaten kopieren und im richtigen Format in das Attribut
mapImageCoordinatesToRegister
eintragen. - Dabei beachten, dass in der kml-Datei drei Werte je Datensatz enthalten sind (Longitude, Latitude, und Altitude) die Höhendaten (Altitude) weglassen, Longitude und Latitude durch ein einziges Leerzeichen trennen und jeden Datensatz in eine eigene Zeile kopieren.
Koordinaten ermitteln mit Google Earth Pro
Mit Google Earth Pro kann die perspektivische Verzerrung minimiert werden und so ein genauerer Eindruck von der Lage eingezeichneter GEO-Datensätze erzeugt werden. Die Vorgehensweise ist ähnlich der mit Google Earth Web, folgendes ist dabei zusätzlich zu beachten:
- Unter
Tools
Optionen
3D-Ansicht
Dezimalgrad auswählen, Höhenverstärkung auf den kleinsten Wert setzen (0.01). - Unter
Tools
Optionen
Navigation
Beim zoomen nicht automatisch neigen auswählen. - Vor dem Zeichnen der Linie von der linken oberen Ecke zur rechten unteren Ecke unter
Datei
Speichern
Bild speichern...
Die Toolbar zum Bild speichern einschalten. Wenn das nicht gemacht wird, stimmen die Koordinaten der Linie nicht mit dem gespeicherten Bild überein, weil der Teil des Bildes, den die Toolbar verdeckt nicht gespeichert wird.
Grenzen darstellen
Die Grenzen des Mähbereiches können eingezeichnet werden. Je nach Vorarbeit (ausmessen von Lage und Länge der Begrenzungabschnitte, oder Orientierung an Geländepunkten wie Bäume, Mauern, Wege, Zäune, markante Grenzpunkte, usw.) kann die Begrenzung mehr oder weniger genau in Google Earth eingezeichnet werden. Die Koordinaten können wieder über eine kml-Datei gewonnen werden und je nach Art der Grenze in die Attribute mowingAreaLimits
zur Darstellung der Mähflächengrenze oder propertyLimits
zur Darstellung der Grundstücksgrenze, eingetragen werden
Darstellung des berechneten Hüllenpolygon der Mähfläche
Zusätzlich oder alternativ zur Mähflächengrenze kann das berechnete Hüllenpolygon (blaue Linie) der Mähfläche dargestellt werden. Die Darstellung wird mit den Designattributen angepasst. hullCalculate"
schaltet die Berechnung ein ("1") oder aus (""). Mit hullResolution
wird die Brechung des Polygons verändert.
Zweck der Darstellung der Mähflächengrenze
Die Darstellung der Mähflächengrenze zusammen mit dem Fahrweg des Mähroboters über einen längeren Zeitraum soll Aufschluss geben wie gleichmäßig die Fläche überfahrenen und gemäht wird.
Grenzpunkte der Grundstücksgrenze
Die Darstellung der Grundstücksgrenze dient zur besseren Ermittlung der Mähbereichsgrenze. Wenn die Mähbereichsgrenze in Google Earth zur Koordinatenermittlung eingezeichnet wird, dann ist die Darstellung der Grundstücksgrenze eine Hilfe zur Orientierung. Die Grundstücksgrenzen können über die GEO-Portale der Länder ermittelt werden. Je nach Ausgestaltung der Portale können an den Grenzpunkten Markierungen angebracht werden und dort die Koordinaten abgelesen werden oder kopiert werden. Die Koordinaten dieser Punkte können dann in das Attribut propertyLimits
übernommen werden, teilweise Zentimeter genau. Und die ermittelte Grenzpunkte können in eine kml-Datei eingetragen werden und so die Grenze exakt in Google Earth dargestellt werden.
Aufbau der Kartendarstellung
Beim Laden der Detailansicht werden die mapDesignAttributes übertragen, die Ladestationskoordinaten, die Grundstücksgrenzkoordinaten, die Mähbereichsgrenzkoordinaten und die Koordinaten des bereits vorhanden Mäherpfades. Wenn es neue Positionsdaten oder eine Fehlermeldung gibt werden nur diese Positionsdaten oder Fehlerdaten zur Aktualisierung der Karte übertragen. Die Skalierung der GPS Daten auf die Bildgröße erfolgt mit den zum jeweiligen Darstellungszeitpunkt im Modul vorliegenden Umrechnungsfaktoren.
Zusammenspiel der zur Registrierung, Skalierung und Positionierung genutzten Attribute
Als Koordinaten der Ladestation wird zuerst die Mitte Deutschlands angenommen, wenn es Koordinaten des Mähers in der Ladestation gibt, dann wird der Mittelwert verwendet. Falls aber das Attribut für die Ladestationskoordinaten gesetzt ist, dann wird die Ladestation mit diesen Koordinaten angezeigt. Die berechnete Position der Ladestation verändert sich nur, wenn die Detailansicht neu geladen wird.
Wenn die Bildgröße mapImageWidthHeight
nicht angegeben ist, wird '350 650' verwendet.
Wenn mapImageCoordinatesToRegister
nicht angegeben ist, werden die Extremwerte der vorhandenen Positionsdaten genutzt.
Wenn scaleToMeterXY
nicht angegeben ist, dann wird die Skalierung verwendet, die in der Mitte Deutschlands gilt (67425, 108886).
Wenn mapImageCoordinatesUTM
angegeben wird und vorher mapImageCoordinatesToRegister
angegeben wurde dann wird scaleToMeterXY
für die Lage des Mähbereiches berechnet.
Statistische Daten ermitteln
Damit statistische Daten, wie Streckenlänge, überfahrene Fläche und Geschwindigkeit berechnet werden können, muss eine Umrechnung der GEO-Daten von Grad in Meter erfolgen. Da die Erde ein Elipsoid ist, ist der Umfang der Erde vom Standort abhängig. Da ein Grad immer 1/360 des Umfangs ist und der Umfang vom Standort abhängt, hängt auch der Umrechnungsfaktor Meter pro Grad vom Standort ab. Deshalb muss ein Umrechnungsfaktor immer für den bestimmten Standort als Differenzenquotient berechnet werden und kann dann dort bei den kleinen Streckenlängen eines Mähbereiches ohne nennenswerten Fehler als konstant angenommen werden. Die Berechnung führt das Modul durch. Als Grundlage müssen jedoch die zu den Koordinaten des Attributes mapImageCoordinatesToRegister
in Dezimalgrad, die passenden Koordinaten in Meter in das Attribut mapImageCoordinatesUTM
eingetragen werden. Die Umrechnung kann auf der Website des GEO-Datenzentrums des Bundeamtes für Kartographie und Geodäsie, Koordinatenumrechnung kostenlos durchgeführt werden, auch als Liste in Form einer Textdatei. Bei den Einstellungen ist die Reihenfolge der Koordinaten zu beachten (Longitude, Latitude). Stehen die zeilenweise umzurechnenden Daten in einer Textdatei ist das Windows-Zeilenende (CRLF) erforderlich. Höhenunterschiede werden bei den Berechnungen nicht berücksichtigt.
Design der Karte ändern
Mit set <name> defaultDesignAttributesToAttribute
werden die internen HTML-Attribute in das FHEM Attribut mapDesignAttributes
geschrieben.
In diesem Attribut können die HTML-Attribute geändert werden, um z.B. die Linienstärke, -farbe oder -stil anzupassen. Solange das Attribut gesetzt ist, werden die dort enthaltenen HTML-Attribute verwendet. Das Attribut muss nur die geänderten HTML-Attribute enthalten.
Beispiel: Statt Linien sollen die GPS-Koordinaten als Punkte dargestellt werden dazu ist mowingPathUseDots="1"
zu setzen. Mit dieser Einstellung wird die Verteilung der Wegpunkte sichtbar.
Bedienpanel einfügen
Über das Attribut 'mowerPanel' kann HTML Kode in die Detailansicht eingefügt werden. Der dort enthaltene HTML Kode kann z.B. Kurzbefehle enthalten.
Er wird unterhalb der Karte angezeigt, kann aber über CSS positioniert werden. Wenn die erste Zeile ein Kommentar ist, kann dort mit dem Schlüsselwort ON_TOP
der HTML Kode über der Karte angezeigt werden.
<!-- ON_TOP -->
Ein Befehle wird im command
Attribut angegeben, ohne set <name>
.
command="Start 210"
statt command="set <name> Start 210"
Beispiele für die Darstellung
Panel auf der Karte (518px x 909px):
<style>
.amc_panel_button {height:50px; width:150px;}
.amc_panel_div {position:relative; left:348px; top:-330px; z-index: 2; width:150px; height:1px}
</style>
<div class="amc_panel_div" data-amc_panel_inroom="" >
<button class="amc_panel_button" command="Start 210" >Start für 3 1/2 h</button>
<button class="amc_panel_button" command="Pause" >Pause bis auf Weiteres</button>
<button class="amc_panel_button" command="ResumeSchedule" >Weiter nach Plan</button>
<button class="amc_panel_button" command="ParkUntilNextSchedule" >Parken bis nächsten Termin</button>
<button class="amc_panel_button" command="ParkUntilNextSchedule" >Parken bis auf Weiteres</button>
</div>
Panel unterhalb der Karte mit Zeilenumbruch:
<div data-amc_panel_inroom="" >
<button class="amc_panel_button" command="Start 210" >Start für 3 1/2 h</button><br />
<button class="amc_panel_button" command="ParkUntilNextSchedule" >Parken bis nächsten Termin</button>
<button class="amc_panel_button" command="ParkUntilNextSchedule" >Parken bis auf Weiteres</button>
</div>
Speichern und Laden von Wegpunkten
Wenn es sinvoll erscheint, können vor einem Update die vorhandenen Wegpunkte gespeichert werden und nach dem Update zurück geladen werden.
Dazu können die nachstehenden Kodeschnipsel genutzt werden wenn sie in die Datei 99_MyUtils.pm integriert werden.
use Storable;
sub store_areapos {
my ( $name ) = @_;
my $hash = $defs{$name};
my @items = qw( areapos ); # ggf. ergänzen mit z.B. statistics mapZones
for my $item (@items) {
store \$hash->{helper}{$item}, $item if ( defined $hash->{helper}{$item} );
}
}
sub retrieve_areapos {
my ( $name ) = @_;
my $hash = $defs{$name};
my @items = qw( areapos ); # ggf. ergänzen mit z.B. statistics mapZones
my $ref = 0;
for my $item (@items) {
if (-e $item ) {
$ref = retrieve( $item );
$hash->{helper}{$item} = $$ref;
}
}
}
Das Speichern und Laden kann über Buttons im mowerPanel eingebunden werden. <device name> muss durch den jeweiligen Gerätenamen ersetzt werden.
<div ... >
.
.
.
<button class="amc_panel_button" onclick="FW_cmd(FW_root+'cmd={store_areapos \'<device name>\'}&XHR=1')" >Save Waypoints</button>
<button class="amc_panel_button" onclick="FW_cmd(FW_root+'cmd={retrieve_areapos \'<device name>\'}&XHR=1')" >Load Waypoints</button>
.
.
.
</div>
Bearbeitung des Mähplan
Über den Button Mower Schedule
kann eine Benutzeroberfläche zur Bearbeitung des Mähplans geöffnet werden.
- Eintrag zufügen/ändern: Die gewünschten Angaben eintragen und
±
betätigen. - Eintrag löschen: Alle Wochentage abwählen und
±
betätigen. - Eintrag zurücksetzen: Irgend ein Zeitfeld mit
--
füllen und±
betätigen.
Beispiel, wie der Button ins Bedienpanel eingefügt werden kann
<div ... >
.
.
.
<button class="amc_panel_button" onclick="AutomowerConnectSchedule( '<device name>')" >Mower Schedule</button>
.
.
.
</div>
Über das Designattribut hideSchedulerButton="1"
kann der Standartbutton ausgeblendet werden.
Einbindung der Karte in verschiedene Frontends
Das Modul AutomowerConnect stellt den Befehl get <Gerätename> html
zur Verfügung, um den HTML-Kode für die Karte zu liefern.
Mit dieser Methode erfolgt die Einbindung in verschiedene Frontends.
In den folgenden Beispielen muss <device name> durch den Namen des Gerätes ersetzt werden, das einen Automower steuert.
DOIF, uiTable
siehe DOIF/uiTable u. DOIF/uiTable_Schnelleinstieg
defmod map DOIF {}
attr map room Test
attr map uiTable fhem('get <device name> html', 1)
FHEMWEB, weblink
defmod map_1 weblink htmlCode { fhem('get <device name> html', 1) }
attr map_1 room Test
Tablet-UI/FTUI Version 2
Das Widget kann aus dem SVN geladen werden, wie hier beschrieben: [Update#Einzelne Dateien aus dem SVN holen]
Die Dateien jquery.min.js und automowerconnect.js aus dem Verzeichnis pgm2 müssen im Head-Tag eingebunden werden und das Widget wie üblich als Div-Tag im Body.
<device name> ist durch den Namen des Gerätes zu ersetzen, das den Mäher abbildet.
Die Einbindung erfolgt auf folgende Weise:
<head>
.
.
.
<script src="../pgm2/jquery.min.js"></script>
<script src="../pgm2/automowerconnect.js"></script>
.
.
.
</head>
<body>
.
.
.
<div
data-type="automowerconnect"
data-device="<device name>"
data-jsonurl="/fhem/AutomowerConnect/<device name>/json"
>
</div>
.
.
.
</body>
Tablet-UI/FTUI Version 3
Die Dateien jquery.min.js und automowerconnect.js aus dem Verzeichnis pgm2 müssen im Head-Tag eingebunden werden und die Karte als ftui-content im Body angelegt werden.
<device name> ist durch den Namen des Gerätes zu ersetzen, das den Mäher abbildet.
Die Einbindung erfolgt auf folgende Weise:
<head>
.
.
.
<script src="../pgm2/jquery.min.js"></script>
<script src="../pgm2/automowerconnect.js"></script>
.
.
.
</head>
<body>
.
.
.
<ftui-grid-tile row="1" col="1" >
<ftui-content id="amc_automowerconnect" [content]="<device name>:system_name | getHTML('<device name>')" ></ftui-content>
</ftui-grid-tile>
<script type="text/javascript">
$(document).ready(function(){
setTimeout(AutomowerConnectUpdateJsonFtui, 2000, '/fhem/AutomowerConnect/<device name>/json');
setInterval(AutomowerConnectUpdateJsonFtui, 30000, '/fhem/AutomowerConnect/<device name>/json');
});
</script>
.
.
.
</body>
FLOORPLAN
Die Darstellung erfolgt über das Modul weblink. Siehe auch FLOORPLAN und Floorplan Installations-Leitfaden.
Dashboard
Siehe Dashboard
Einfaches Frontend für die FHEMWEB-Raumansicht
Die Attribute können über Raw definition eingespielt werden, wenn der Gerätename geändert wird.
attr <device name> webCmd Pause:ParkUntilFurtherNotice:Park:ParkUntilNextSchedule:Start:ResumeSchedule:cuttingHeight:headlight attr <device name> webCmdLabel Stop:\ :Park for:min\ :Run for:min ; ; ;\ :Height (1,5+:x0,5) cm Light
Readings ergänzen
Wenige Werte der Mowerdaten werden in Readings angezeigt. Wenn das nicht genügt, können Readings über das Attribut userReadings ergänzt werden. Als Trigger gibt es zwei grundsätzliche Möglichkeiten:
- device_state: connected - alles was nur nachts aktualisiert wird ( Automower Connect API )
- mower_wsEvent: ( Webesocket Events V2 )
Welche Daten, wie geliefert werden, ist aus den vorstehenden Links ersichtlich.
Den Hashpfad findet man in den Listen MowerData und StatisticsData oder über den in die Befehlszeile eingegebenen Befehl {Dumper $defs{<name>}{helper}{mower}
.
Beispiel 1: Erzeugen des Reading serialnumber
mit dem Pfad des Gerätehashes $hash->{helper}{mower}{attributes}{system}{serialNumber}
attr <device name> userReadings serialnumber:device_state:.connected {$defs{$name}->{helper}{mower}{attributes}{system}{serialNumber}}
Beispiel 2: Erzeugen der Readings lastLongitude
und lastLatitude
mit dem Pfad des Gerätehashes $hash->{helper}{mower}{attributes}{positions}[0]
zu den letzten bekannten Koordinaten.
attr <name> userReadings lastLatitude:mower_wsEvent:.positions-event-v2 {$defs{$name}->{helper}{mower}{attributes}{positions}[0]{latitude}},\ lastLongitude:mower_wsEvent:.positions-event-v2 {$defs{$name}->{helper}{mower}{attributes}{positions}[0]{longitude}}
Steigerung der Rate für Positionsevents
Bei der Benutzung des Modul 98_AMConnectTools.pm wird ca. alle 30s während der Aktivitäten LEAVING, MOWING und GOING_HOME über die Websocketverbindung ein Positonsevent empfangen. Das bedeutet es wird während des Mähens alle 30 s eine Position gesendet. Um die Eventrate aufrecht zu erhalten, wird die inoffizielle API für den 1. Mäher alle 440 s abgefragt. Das Modul schaltet sich inaktiv wenn sich alle Mäher in der Ladestation befinden. Es ist nur aktiv, wenn mindestens ein Mäher die Station verlässt bis sich alle Mäher in der Station befinden.
Der Benutzername bzw. Emailadresse und das Passwort der Smartphoneapp wird für die Definition benötigt.
Vorbereitung Die Datei 98_AMConnectTools.pm aus dem SVN laden. mit dem folgenden Befehl für die FHEM Befehlszeile.
{ Svn_GetFile('contrib/AutomowerConnect/98_AMConnectTools.pm', 'FHEM/98_AMConnectTools.pm') }
Danach reicht ein Reload des Moduls damit das Gerät definiert werden kann.
reload 98_AMConnectTools.pm
Definition
define AMConnectTools AMConnectTools <Emailadresse> set AMConnectTools password <Passwort>
Modul bei gehäuften Verbindungsfehlern automatisch deaktivieren
Bei einem Netzwerkausfall, Internetausfall uä. versucht das Modul wiederholt eine Verbindung zum Husquvarna Server herzustellen, das kann sich störend im System bemerkbar machen. Eine eventuelle Störung kann minimiert werden, wenn das Modul automatisch deaktiviert wird. Bei Bedarf kann das Modul nach längerer Zeit automatisch wieder aktiviert werden.
Das Beispiel zeigt einen Vorschlag, wie dieses Verhalten mit einem DOIF erreicht werden kann.
Das Beispiel kann per Raw definition in FHEM eingespielt werden. Dabei ist zu beachten, dass der Name des Mähers im Beispiel am430x1
durch einen real existierenden Namen einer Mäherdefinition zu ersetzen ist.
defmod disOnError DOIF ## 1\
(["^am430x1$:^WEBSOCKET ERROR$"])\
(setreading $SELF ws_err_cnt {([$SELF:ws_err_cnt]+1)},\
IF ([$SELF:ws_err_cnt] > ReadingsNum('$SELF','ws_err_threshold',0)) \
( attr am430x1 disable 1,\
setreading $SELF ws_err_cnt 0,\
setreading $SELF enable_at {(POSIX::strftime('%T',localtime(time + [$SELF:enable_after_hours] * 3600)))}\
)\
)\
## 2\
DOELSEIF (["^am430x1$:^MOWERAPI ERROR$"]) \
(setreading $SELF api_err_cnt {([$SELF:api_err_cnt]+1)},\
IF ([$SELF:api_err_cnt] > ReadingsNum('$SELF','api_err_threshold',0)) \
( attr am430x1 disable 1,\
setreading $SELF api_err_cnt 0,\
setreading $SELF enable_at {(POSIX::strftime('%T',localtime(time + [$SELF:enable_after_hours] * 3600)))}\
)\
)\
## 3\
DOELSEIF (["^am430x1$:^AUTHENTICATION ERROR$"])\
(setreading $SELF auth_err_cnt {([$SELF:auth_err_cnt]+1)},\
IF ([$SELF:auth_err_cnt] > ReadingsNum('$SELF','auth_err_threshold',0)) \
( attr am430x1 disable 1,\
setreading $SELF auth_err_cnt 0,\
setreading $SELF enable_at {(POSIX::strftime('%T',localtime(time + [$SELF:enable_after_hours] * 3600)))}\
)\
)\
## 4\
DOELSEIF ([[$SELF:enable_at]] and AttrVal('am430x1','disable',0) == 1)\
( attr am430x1 disable 0,\
setreading $SELF ws_err_cnt 0,\
setreading $SELF api_err_cnt 0,\
setreading $SELF auth_err_cnt 0\
)\
## 5\
DOELSEIF ([23:57:07] and AttrVal('am430x1','disable',0) == 0)\
( setreading $SELF ws_err_cnt 0,\
setreading $SELF api_err_cnt 0,\
setreading $SELF auth_err_cnt 0\
)\
attr disOnError do always
attr disOnError readingList ws_err_threshold api_err_threshold auth_err_threshold enable_after_hours
attr disOnError room 0_Test
attr disOnError setList ws_err_threshold:0,1,2,4,8,16,32,64\
api_err_threshold:0,1,2,4,8,16,32,64\
auth_err_threshold:0,1,2,4,8,16,32,64\
enable_after_hours:selectnumbers,1,1,24,0,lin
attr disOnError webCmd ws_err_threshold:api_err_threshold:auth_err_threshold:enable_after_hours
attr disOnError webCmdLabel Threshold / error events:; ;Websocket:Mower API:Authentification\
:Enable after / h
Links
- Mähroboter_überwachen
- Husqvarna Cloud
- GEO-Portale der Länder
- GEO-Datenzentrums des Bundeamtes für Kartographie und Geodäsie, Koordinatenumrechnung
- Google Earth
- DOIF/uiTable
- DOIF/uiTable_Schnelleinstieg
- FHEM Tablet UI
- weblink
- FLOORPLAN
- Floorplan Installations-Leitfaden
- Dashboard