AutomowerConnect: Unterschied zwischen den Versionen

Aus FHEMWiki
 
(106 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
{{Baustelle}}
{{Infobox Modul|
{{Infobox Modul|
|ModPurpose=Steuerung eines Husqvarna Mähroboter mit Connect Modul und Host für weitere Husqvarna Mähroboter
|ModPurpose=Steuerung eines Husqvarna Mähroboters mit Connect Modul
|ModType=x
|ModType=d
|ModForumArea=Sonstige Systeme
|ModForumArea=Sonstige Systeme
|ModTechName=74_AutomowerConnect.pm
|ModTechName=74_AutomowerConnect.pm
|ModOwner=Ellert}}
|ModOwner=Ellert|ModFTopic=131661|ModCmdRef=AutomowerConnect}}
[[Datei:AutomowerConnectSymbol.svg|links|71x71px]]
'''AutomowerConnect''' ist ein Modul zur Steuerung eines  Husqvarna Mähroboters mit Connect Modul (SIM) über Husqvarnas OpenAPI.


'''AutomowerConnect''' ist ein Modul zur Steuerung eines  Husqvarna Mähroboter mit Connect Modul (SIM) über Husqvarnas OpenAPI und dient als Host für weitere Husqvarna Mähroboter.
Eine vollständige Beschreibung der Module enthält die Befehlsreferenz [https://commandref.fhem.de/commandref_DE.html#AutomowerConnect AutomowerConnect].


'''AutomowerConnectDevice''' ist ein Modul zur Steuerung weiterer  Husqvarna Mähroboter mit Connect Modul (SIM), wenn sie unter dem gleichen Account registriert sind. Das Modul erstellt Client-Geräte und benutzt ein Gerät des AutomowerConnect Moduls als Host.
Die Forenbeiträge sind unter {{Link2Forum|LinkText=74_AutomowerConnect, Husqvarnas OpenAPI |Topic=131661|Message=1258321}} zu finden.


Eine vollständige Beschreibung der Module enthält die Befehlsreferenz {{Link2CmdRef|Anker=AutomowerConnect |Lang=DE |Label=AutomowerConnect}} und {{Link2CmdRef|Anker=AutomowerConnectDevice |Lang=DE |Label=AutomowerConnectDevice}}.
== 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.


Die Forenbeiträge sind unter {{Link2Forum|Area=Sonstige Systeme |Topic=131661.0 |LinkText=[Neue Module] 74_AutomowerConnect, 75_AutomowerConnectDevice, Husqvarnas OpenAPI }} zu finden.
== 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].
* 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 ==
* <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>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>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>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.


== Erstellung einer Karte mit Hintergrundbild, Grundstücksgrenze, Mähbereich und zurückgelegtem Pfad des Mähroboters. ==
== 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.
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 ==
== 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 35: 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 Eart Web, folgendes ist dabei zusätzlich zu beachten:
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).
* Unter <code>Tools</code> <code>Optionen</code> <code>Navigation</code> ''Beim zoomen nicht automatisch neigen'' auswählen.
* Unter <code>Tools</code> <code>Optionen</code> <code>Navigation</code> ''Beim zoomen nicht automatisch neigen'' auswählen.
* Vor dem Zeichnen der Linie von der linken oberen Ecke zur rechten unteren Ecke unter <code>Datei</code> <code>Speichern</code> <code>Bild speichern...</code> 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 ==
== Grenzen darstellen ==
[[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 [[Attribut|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 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 ===
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. <code>hullCalculate"</code> schaltet die Berechnung ein ("1") oder aus (""). Mit <code>hullResolution</code> wird die Brechung des Polygons verändert.


=== Zweck der Darstellung der Mähflächengrenze ===
=== 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.
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 [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.


=== Grenzpunkte der Grundstücksgrenze ===
=== 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 <code>mapImageWidthHeight</code> nicht angegeben ist, wird '350 650' verwendet.
 
Wenn <code>mapImageCoordinatesToRegister</code> nicht angegeben ist, werden die Extremwerte der vorhandenen Positionsdaten genutzt.
 
Wenn <code>scaleToMeterXY</code> nicht angegeben ist, dann wird die Skalierung verwendet, die in der Mitte Deutschlands gilt (67425, 108886).


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.
Wenn <code>mapImageCoordinatesUTM</code> angegeben wird und vorher <code>mapImageCoordinatesToRegister</code> angegeben wurde dann wird <code>scaleToMeterXY</code> für die Lage des Mähbereiches berechnet.


== 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.
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 ==
[[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 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.
 
'''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 ==
Ü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.
 
  &lt;!-- ON_TOP --&gt;
 
Ein Befehle wird im <code>command</code> Attribut angegeben, ohne <code>set &lt;name&gt; </code>.
 
<code>command="Start 210"</code> statt <code>command="set &lt;name&gt; Start 210"</code>
 
=== Beispiele für die Darstellung ===
[[Datei:MowerPanel.png|none|Panel auf der Karte]]
 
Panel auf der Karte (518px x 909px):
 
<syntaxhighlight lang="html">
<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>
</syntaxhighlight>
 
[[Datei:MowerPanel0.png|none|Panel unterhalb der Karte]]
 
Panel unterhalb der Karte mit Zeilenumbruch:
 
<syntaxhighlight lang="html">
<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>
</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. &lt;device name&gt; 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>
</syntaxhighlight>
 
== Bearbeitung des Mähplan ==
[[Datei:Mower_schedule_editor.png|Editor zur Bearbeitung des Mähplan|mini]]
Über den Button <code>&ensp;Mower Schedule&ensp;</code>  kann eine Benutzeroberfläche zur Bearbeitung des Mähplans geöffnet werden.
 
* Eintrag zufügen/ändern: Die gewünschten Angaben eintragen und <code>&ensp;&plusmn;&ensp;</code> betätigen.
* Eintrag löschen: Alle Wochentage abwählen und <code>&ensp;&plusmn;&ensp;</code> betätigen.
* Eintrag zurücksetzen: Irgend ein Zeitfeld mit <code>&ensp;--&ensp;</code> füllen und <code>&ensp;&plusmn;&ensp;</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==
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.
In den folgenden Beispielen muss <device name> durch den Namen des [[Gerät|Gerätes]] ersetzt werden, das einen Automower steuert.
 
===DOIF, uiTable ===
siehe [[DOIF/uiTable]] u. [[DOIF/uiTable_Schnelleinstieg]]
<syntaxhighlight lang="perl">
defmod map DOIF {}
attr map room Test
attr map uiTable fhem('get <device name> html', 1)
</syntaxhighlight>
 
===FHEMWEB, weblink===
<syntaxhighlight lang="perl">
defmod map_1 weblink htmlCode { fhem('get <device name> html', 1) }
attr map_1 room Test
</syntaxhighlight>
 
===Tablet-UI/FTUI Version 2===
 
Das Widget kann aus dem SVN geladen werden, wie hier beschrieben: [<nowiki/>[[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ät|Gerätes]] zu ersetzen, das den Mäher abbildet.
 
Die Einbindung erfolgt auf folgende Weise:
<syntaxhighlight lang="html">
<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>
</syntaxhighlight>
 
===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ät|Gerätes]] zu ersetzen, das den Mäher abbildet.
 
Die Einbindung erfolgt auf folgende Weise:
<syntaxhighlight lang="html">
<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>
</syntaxhighlight>
 
===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==
[[Datei:Frontend.png|mini|404x404px|Frontendbeispiel mit den Attributen webCmd und webCmdLabel]]
Die Attribute können über [[Raw definition]] eingespielt werden, wenn der Gerätename geändert wird.
<pre>
attr <device name> webCmd Pause:ParkUntilFurtherNotice:Park:ParkUntilNextSchedule:Start:ResumeSchedule:cuttingHeight:headlight
attr <device name> webCmdLabel Stop:\
:Park for:min\
:Run for:min&emsp;;&emsp;;&emsp;;\
:Height (1,5+:x0,5) cm Light
</pre>
 
==Readings ergänzen==
[[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.
Als Trigger gibt es vier grundsätzliche Möglichkeiten:
 
*device_state: connected - alles was nur nachts aktualisiert wird ( [https://developer.husqvarnagroup.cloud/apis/automower-connect-api#openapi Automower Connect API: OpenAPI: Get data for a mower linked to a user] )
* mower_wsEvent: status-event - alle Daten, die mit Statusevents geliefert werden ( [https://developer.husqvarnagroup.cloud/apis/automower-connect-api#websocket Webesocket: status-event] )
*mower_wsEvent: positions-event - alle Daten, die mit Positonsevents geliefert werden ( [https://developer.husqvarnagroup.cloud/apis/automower-connect-api#websocket Webesocket: positions-event] )
*mower_wsEvent: settings-event - alle Daten, die mit Settingsevents geliefert werden ( [https://developer.husqvarnagroup.cloud/apis/automower-connect-api#websocket Webesocket: settings-event] )
 
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 <code>{Dumper $defs{<name>}{helper}{mower}</code>.
 
'''Beispiel 1''': Erzeugen des Reading <code>serialnumber</code> mit dem Pfad des Gerätehashes <code>$hash->{helper}{mower}{attributes}{system}{serialNumber}</code>
<pre>
attr <device name> userReadings serialnumber:device_state:.connected {$defs{$name}->{helper}{mower}{attributes}{system}{serialNumber}}
</pre>
 
'''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>
attr <name> userReadings lastLatitude:mower_wsEvent:.positions-event {$defs{$name}->{helper}{mower}{attributes}{positions}[0]{latitude}},\
lastLongitude:mower_wsEvent:.positions-event {$defs{$name}->{helper}{mower}{attributes}{positions}[0]{longitude}}
</pre>
 
==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 [[Modul|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 <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&colon;;&emsp;;Websocket:Mower API:Authentification\
:Enable after / h
</syntaxhighlight>
 
==Links==
*[[Mähroboter_überwachen]]
*[https://developer.husqvarnagroup.cloud/ Husqvarna Cloud]
*[https://geoportal.de/Anwendungen/Geoportale%20der%20L%C3%A4nder.html GEO-Portale der Länder]
*[https://gdz.bkg.bund.de/koordinatentransformation GEO-Datenzentrums des Bundeamtes für Kartographie und Geodäsie, Koordinatenumrechnung]
*[https://www.google.de/intl/de/earth/index.html Google Earth]
*[[DOIF/uiTable]]
*[[DOIF/uiTable_Schnelleinstieg]]
*[[FHEM Tablet UI]]
*[[weblink]]
*[[FLOORPLAN]]
*[[Floorplan Installations-Leitfaden]]
*[[Dashboard]]
 
==Referenzen==
<references />
 
[[Kategorie:Mähroboter]]

Aktuelle Version vom 12. Juni 2024, 22:47 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!
AutomowerConnectSymbol.svg

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 Zeitstempel status_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 Attribut mapImageWidthHeight 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

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 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

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 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

GPS Koordinaten als Punkte

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

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

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

Editor zur 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

Frontendbeispiel mit den Attributen webCmd und webCmdLabel

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

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. Als Trigger gibt es vier grundsätzliche Möglichkeiten:

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 {$defs{$name}->{helper}{mower}{attributes}{positions}[0]{latitude}},\
lastLongitude:mower_wsEvent:.positions-event {$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&colon;;&emsp;;Websocket:Mower API:Authentification\
:Enable after / h

Links

Referenzen