[Modul] Husqvarna Automower Connect

den satz habe ich gerade erst gelesen.

ich speichere die position komplett als json-struktur in einer variablen
die muss nan beim karte zeichnen entsprechen zerlegen.
gab ich exemplarisch schon gemacht.

die positionsänderung zeichne ich übrigens nur auf, wenn der mäher fährt oder mäht. ich hatte den interessanten effekt beobachtet, das mein mäher beim laden mehrere meter hin und her „gehüpft“ ist. das gps ist halt nicht ganz so präzise.

wüsste ich nicht, aber ich sehe nicht das problem. denn wenn er fährt, ändert er ja permanent seine position; ist also immer eine Änderung der variablen.

Bei mir ist es so, dass in ca 1-2% der Fälle sich nur eine der beiden Variablen ändert. Und dann läuft natürlich alles aus dem Ruder…
Allerdings habe ich bis jetzt immer aufgezeichnet. Vielleicht sind die Probleme ja entstanden als er parkte…

Ich habe nun eine Option zum Modul hinzugefügt: Position speichern.
Ist diese Option aktiviert, wird die jeweils letzte Position des Mähers als json-kodierter String mit Longitude und Latitude gespeichert.
Diese Variable sollte sann auf Protokollierung stehen.

Dann kann man alle Postionen des Mähers darstellen. Als einfaches Beispiel kann dieses Script dienen:


<?

// allgemeine Angaben zur Karte
$map = [];

$map['zoom'] = 20;
$map['size'] = '640x640';
$map['scale'] = 1;
$map['maptype'] = 'satellite';

// aktuelle Position
$markers = [];

$marker_points = [];

$point = [
		'lat' => GetValueFloat(17701 /*[Rasenmäher\Automower\letzter Breitengrad]*/),
		'lng' => GetValueFloat(40825 /*[Rasenmäher\Automower\letzter Längengrad]*/),
	];

$marker_points[0] = $point;

$activity = GetValueInteger(30160 /*[Rasenmäher\Automower\Aktivität]*/);
$activity_label = [ 'E', 'D', 'P', 'L', 'S', 'F', 'M' ];
$label = $activity_label[$activity + 1];

$markers[] = [
        'color'     => 'green',
		'label'		=> $label,
        'points'    => $marker_points,
    ];

$map['markers'] = $markers;

// Fahrten der letzten 3 Tage
$paths = [];

$paths_color = [ '0xFF4040', '0x67B68EE', '0x00FF00' ];
			
$dt = new DateTime(date('d.m.Y 00:00:00', time()));
$now = $dt->format('U');

for ($i = 2; $i >= 0; $i--) {
	$from = $now - ($i * 24 * 60 * 60);
	$until = $from + (24 * 60 * 60) - 1;

	$values = AC_GetLoggedValues(17849 /*[Archive]*/, 54501 /*[Rasenmäher\Automower\Position]*/, $from, $until, 0);

	$points = [];
	foreach ($values as $value) {
		$pos = json_decode($value['Value'], true);
    	$points[] = [
				'lat' => $pos['latitude'],
				'lng' => $pos['longitude'],
			];
	}

	$paths[] = [
    		'color'     => $paths_color[$i],
			'weight'    => 2,
			'points'    => $points,
   		];
}

$map['paths'] = $paths;

$url = GoogleMaps_GenerateStaticMap(44269 /*[GoogleMaps]*/, json_encode($map));

$html = '<img width="500", height="500" src="' . $url . '" />';
SetValueString(12495 /*[GoogleMaps\Karte]*/, $html);

Die Variable-ID#s müssen natürlich durch die eigenen ID’s ersetzt werden; die Variable GoogleMaps\Karte muss vom Typ String/~HTML-Box sein und enthält dann die Karte mit den Mähvorgängen der letzten 3 Tage in drei Farben.
Ist ein ganz einfaches Beispiel, das nur die Systematik darstellen soll.

Hallo demel,

ich hatte das hier schon mal gepostet. Nach jedem Update von IPS (bei 4.x aber auch bei 5.xBeta) sind sind deine Module (nutzte Automower und Netatmos) fehlerhaft, Bei anderen Modulen hab ich das noch nicht beobachtet, Hat noch jemand das Problem oder hast du ne Idee wo ich ansetzten kann? Ist etwas nervig, wenn ich nach jedem Update deine Module löschen und neu einbinden muss.

Gru0
hardlog

Danke für die neue Version. Komme leider frühestens am Wochenende zu testen.

hallo,

hab ich noch nie beobachtet, aber dem muss man ja auf die Spur kommen. Ich denke, das in den Meldungen irgendeine Fehlermeldung auftauchen müsste, sonst würde das Modul nicht als fehlerhaft markiert werden.Kannst du mal Deine Meldungen durchgehen?

Nur damit wir uns richtig verstehen, meinst Du ein Update von IPS selbst oder meinst Du ein Modul-Update?

demel

Guten Morgen,

ja, das Problem taucht nach jedem IPS-Update auf.
Hier mal 2 Screenshots (einmal Automover-Modul und einmal Netatmos)


Gruß
hardlog

ich sehe, das Du ein Windows-Basiertes IPS laufen hast, insofern ist meine Erfahrung nicht vergleichbar, bei mir läuft das auf eine raspi.
Ich habe heute morgen ein Update auf IPS-5 RC3 gemacht, das lieft ohne Probleme durch. Auf meinem 4.4’er IPS steht kein Update an, daher konnte ich da nichts testen.

Was an den beiden Module ggfs. besonders ist, ist das in dem Konfigurationsformular Daten per von den Servern (netatmo, Husqvarna) geholt werden, damit die Auswahl-Box in dem Formular gefüllt ist.
Aber wie gesagt, das ist bei mir bisher kein Problem gewesen.

Kannst Du das mal ausprobieren? (die ID ist die Objekt-ID von Kern-Instanzen -> Modules).


MC_ReloadModule(31892 /*[Modules]*/, 'IPSymconNetatmoWeather');
MC_ReloadModule(31892 /*[Modules]*/, 'IPSymconAutomowerConnect');

nzi: ich habe vorhin zufällig gesehen, das die Karte u.U. nicht mehr dargestellt wird. Grund: ab dem 3. Tag sind das bei mir soviel Punkte, das die maximal URL-Größe von 8192 Bytes überschritten wird. Ich habe pro Tag eine Mähzeit von knapp 3h.

Ich habe es noch nicht mit DynamicMap probiert, aber da gibt es keine Limitierungen …

nzi: ich habe vorhin zufällig gesehen, das die Karte u.U. nicht mehr dargestellt wird. Grund: ab dem 3. Tag sind das bei mir soviel Punkte, das die maximal URL-Größe von 8192 Bytes überschritten wird. Ich habe pro Tag eine Mähzeit von knapp 3h.

Oh, das wird bei mir dann garantiert ein Problem, denn er mäht bei mir fast 8h pro Tag. Wenn Du eine Dynamic Map Implementation hast, würdest Du sie dann posten?

Das wäre dann so

<?

// allgemeine Angaben zur Karte
$map = [];

$point = [
		'lat' => GetValueFloat(17701 /*[Rasenmäher\Automower\letzter Breitengrad]*/),
		'lng' => GetValueFloat(40825 /*[Rasenmäher\Automower\letzter Längengrad]*/),
	];

// Zentrum der Karte
$map['center'] = $point;

// Optionen für google.maps.Map
$map_options = [
        'zoom'      => 20,              // 1: World, 5: Landmass/continent, 10: City, 15: Streets, 20: Buildings
        'tilt'      => 0,               // 0..45
        'mapTypeId' => 'satellite',     // roadmap, terrain, hybrid, satellite
    ];
$map['map_options'] = $map_options;

// Standard-Optionen für google.maps.InfoWindow
$infowindow_options = [
        'maxWidth'  => 200,				// pixel
    ];
$map['infowindow_options'] = $infowindow_options;


// Karte mit Positionen
$markers = [];
a
$marker = [];

$marker_points = [];
$marker_points[0] = $point;

// Text eines Punktes für google.maps.InfoWindow
$marker_points[0]['info'] = GetValueFormatted(30160 /*[Rasenmäher\Automower\Aktivität]*/);

// Ican dazu
$activity = GetValueInteger(30160 /*[Rasenmäher\Automower\Aktivität]*/);
$activity_label = [ 'E', 'D', 'P', 'L', 'S', 'F', 'M' ];
$url = 'http://maps.google.com/mapfiles/kml/paddle/' . $activity_label[$activity + 1] . '.png';

// Optionen eines Punktes für google.maps.Marker
$marker_options = [
        'icon'		=> [
            'url'        => $url,
            'scaledSize' => [
            		'width'		=> 32,
            		'height'	=> 32
            	]
            ]
    ];
$marker['marker_options'] = $marker_options;

// GPS-Punkte
$marker['points'] = $marker_points;

$markers[] = $marker;

$map['markers'] = $markers;

// Karte mit verbundenen Punkten
$paths = [];

// Fahrten der letzten 3 Tage

$paths_color = [ '#FF4040', '#7B68EE', '#00FF00' ];
			
$dt = new DateTime(date('d.m.Y 00:00:00', time()));
$now = $dt->format('U');

for ($i = 2; $i >= 0; $i--) {
	$from = $now - ($i * 24 * 60 * 60);
	$until = $from + (24 * 60 * 60) - 1;

	$values = AC_GetLoggedValues(17849 /*[Archive]*/, 54501 /*[Rasenmäher\Automower\Position]*/, $from, $until, 0);

	$points = [];
	foreach ($values as $value) {
		$pos = json_decode($value['Value'], true);
    	        $points[] = [
				'lat' => $pos['latitude'],
				'lng' => $pos['longitude'],
			];
	}

	$path = [];

	// GPS-Punkte
	$path['points'] = $points;

	// Optionen für google.maps.Polyline
	$polyline_options = [
			'strokeColor'    => $paths_color[$i],
			'strokeOpacity'  => 1.0,
			'strokeWeight'   => 2,
		];

	$path['polyline_options'] = $polyline_options;

	$paths[] = $path;
}

$map['paths'] = $paths;

$html = GoogleMaps_GenerateDynamicMap(44269 /*[GoogleMaps]*/, json_encode($map));
echo $html;

Achtung: bitte daran denken, das das über ein WebHook gehen muss, siehe auch das README.md und die Beispiele in im GoogleMaps-Modul.

Ich konnte damit auf jeden Fall 3 Tage darstellen. Es ist ja ein Punkt pro Minute, das sind bei mir ~170 Punkte/Tag, bei Dir entsprechend mehr.
Da bei GoogleMapsDynamic die Daten in der (vom WebHook) erzeugten HTML-Seite enthalten sind, dürfte es keine Begrenzung geben.

Ich habe mal in symcon/db geschaut, die Größe der Variable-Datei sind bei mir 42Kb für die letzten 3 Tage, also etwas 3Mb/Jahr (2,5h / Tag an 5 Tagen / Woche).

Hallo,

da habe ich jetzt einige Fragen dazu:

(1)

        'lat' => GetValueFloat(17701 /*[Rasenmäher\Automower\letzter Breitengrad]*/), 
        'lng' => GetValueFloat(40825 /*[Rasenmäher\Automower\letzter Längengrad]*/), 

sind das die Daten die man sich selber mit

AutomowerDevice_GetRawData

sich selber holt?
Aus irgendeinem Grund geht bei mir, seit dem Update des Moduls die Funktion

AutomowerDevice_GetRawData

nicht mehr.

(2)

SetValueString(4711 /[GoogleMaps\Karte (dynamic)]/, $html);
ist das die ID der HTML-Box selber unter der das Skript abgelegt ist?

(3) Bei mir finde ich unter

Automower/Position

keinen JSON String

(4) Was ist

$activity = GetValueInteger(30160 /*[Rasenmäher\Automower\Aktivität]*/); 

? Die Variable gibts bei mir nicht. Das Ähnlichste ist „Aktuelle Aktivität“ Die steht aber auf „Fehler“ obwohl der Mäher wunderbar mäht.

Kommt vielleicht noch mehr, aber wenn das mal geklärt wäre käme ich sicher schon deutlich weiter.

Tausend Dank!

gros_ibou

Hallo,

also im Fall vom AutomoverModul für die Ausführung o.g. Befehls zur Korrektur des Problems.
Für das NetatmoModul leider nicht. Dann kommt die Fehlermeldung:
„Modul IPSymconNetatmoWeather existiert nicht in C:\IP-Symcon\scripts\51405.ips.php on line 2“

Noch ne Idee?

Hardlog

Hmm, da scheint ja etwas ziemlich durcheinander zu sein.

Diese Variablen gibt es in dem Modul - bis auf die optionale „Position“ (siehe Konfigurationssetie) immer alle.

zu 1) das sind die vor- und vorvorletzten Variablen.

AutomowerDevice_GetRawData() gibt es immer noch. Was bedeutet „geht nicht“ - sagt IPS, die Funktion gibt es nicht (ggfs im Script-Editor Autonomer eingeben und dann Crtl+SPace → dann kommen ja alle bekannten Funktionen) oder liefert die Funktion nix zurück?
Nur zur Info - die Funktion liefert erst etwas, wen nach einem IPS-Start 1x eine Nachricht empfangen wurde.

Ggfs. mal eine

MC_ReloadModule(31892 /*[Modules]*/, 'IPSymconAutomowerConnect');

aufrufen.

zu 2) die dynamische GoogleMaps geht ja über einen WebHook. Es gibt also eine HTML-Box, die einmalig gefüllt werden muss und so wie ich das erkenne ist dieser Code damit gemeint. Also ja, das sollte die Variable mit der Grafik sein

zu 3) da steht erst etwas drin, wenn Daten von dem Autonomer übernommen wurden. Das tut er aber nur, wenn die ‚aktelle Aktivität‘ „mäht“ oder „fährt“ ist - und das ist laut #4 ja nicht gegeben.

zu 4) das ist die 5 Variable von oben, ja, heisst (nun) „aktuelle Aktivität“ - hatte in meinem Testsystem die Umbenennung der Variablen nicht nachgezogen und daher falsch in Script stehen.

Wen hier Fehler drin steht, ist das schon merkwürdig, Bedeutet eigentlich, das in der Nachricht von Husqvarna „ERROR“ drin steht.

Kannst Du mir man einen Debug einer Nachricht posten?

Insgesamt scheint mir das Modul aber irgendwie nicht richtig

gruß
cd

Hallo,

wenn ich die (undokumentierte) Funktion richtig verstanden habe ist die Bezeichnung der Verzeichnisnamen des Moduls in /var/lib/symcon/modules bzw. dem korrespondierenden Verzeichnis bei Windows.

Kannst Du mal schauen, ob es das Verzeichnis gibt?

gruß

Diese Variablen gibt es in dem Modul - bis auf die optionale „Position“ (siehe Konfigurationssetie) immer alle.

Ich habe das Reload gemacht, zur SIcherheit auch nochmal eine neue INstanz angelegt und sie sieht nach wie vor so aus

:banghead::banghead:

hallo

ich hätte da noch zwei Ideen
a) was steht in der Konfiguration als „Modell“? Die beiden „letzte Position“ werden nur angelegt, wenn das Modell „G“ ist

ich habe keine Ahnung, was das Modell bedeutet (weil es eben keinerlei Doku gibt), habe das aber als „GPS“ interpretiert. Vielleicht Unsinn, aber das wäre eine Erklärung, Das Modell sollte eigentlich vom Konfigurator gesetzt werden.

Was hast Du da drin stehen?

b) wenn das nichts hilft: ich würde erwarten, das es Einträge im Meldungsfenster gibt - ist da was?

Ich sehe an deinem Snap, das die aktuelle Aktivität „ausser Betrieb“ ist - kann das sein?
Das wären die Stati: ‚OFF_DISABLED‘, ‚OFF_HATCH_OPEN‘ , ‚OFF_HATCH_CLOSED‘
Also zB Abdeckung ist oder war offen und noch nicht wieder auf START gedrückt.

gruß
demel

Bei mir steht als Modell H. Vielleicht ist das tatsächlich des Rätsels Lösung…

Hi,

MC_ReloadModule(31892 /*[Modules]*/, 'NetatmoWeather');  

Der Tipp bzgl. des Verzeichnisses hat mich soweit gebracht, dass mit „NetatmoWeather“ statt „IPSymconNetatmoWeather“
der Befehl durchläuft und das Modul wieder ansprechbar ist.

Bringt mich aber nur bedingt weiter, da ich dann ja nach jedem IPS-Update daran denken muss diese Befehle einmal auszuführen … ist das ein Fehler auf meiner Seite ?

hardlog

Für die fehlenden Variablen auf jeden Fall, wenn du das mal umstellst, sollten die zwei Variablen kommen.
Wahrscheinlich habe ich das Modell „G“ falsch interpretiert, welchen Typ hast Du denn? Ich habe ein 430X.

Wenn noch was unklar ist, melde dich.