[Modul] Husqvarna Automower Connect

Ich habe mal einen raschen Blick hineingeworfen und mit ist aufgefallen, das dort ein Script läuft (C:\IP-Symcon\scripts\FLOS_Konfiguration.ips.php) bevor die Initialisierung vom IPS abgeschlossen ist.

In diesem Script wird auch u.A. auch NetatmoWeatherConfig_Doit() aufgerufen, Automower dito. Weil die Module zu diesem Zeitpunkt noch nicht geladen sind, bricht das Script ab und die Module werden wieder entfernt.

Ichwürde meinen, das man ein solches Script erst durchführen darf, wenn IPS betriebsbereit ist.

Um meinen Verdacht zu prüfen wäre es sinnvoll, wenn du das Script temporär mal deaktivieren würdest um zu schauen, was dann passiert.

gruß
demel

Hi demel,

Danke für die Mühe.
Ich lade über die __autoload.php zwei script. Ich weis schon nicht mehr wie die dahin kommen. Bzw. wer mir den Tipp dazu gegeben hat?! :wink:
Habs mal aus kommentiert -> Läuft jetzt nach dem Neustart fehlerfrei ! DANKE

Gegenfrage: Wo kann ich in allen php-scripts gültige Konstanten vordefinieren. Habe in o.g. Script eigentlich nur die ID des Webfront-Konfigurators als PHP-Konstante definiert?

Habs gefunden: Ich hab das aus der Doku von IPS PHP — IP-Symcon :: Automatisierungssoftware

Gruß
hardlog

Hallo demel

Du machst ein IPS 5-Update

Hab ich gemacht. Jetzt sieht alles deutlich besser aus.

Allerdings steht beim Zeitpunkt des letzten Fehlers und beim Nächsten Start immer noch 1/1/1970 drin. Aber das ist mir erstmal wurscht.

Zum richtigen Implementieren der Karten komme ich aber erst heute abend oder morgen. Dann melde ich mich evtl nochmal. Aber soweit schon mal herzlichen Dank.

Gruss

gros_ibou

ich aktualisiere die Variablen nur, wenn ein Fehlercode geliefert wurde (was ich noch nie hatte); so richtig habe ich keine Idee, was da kommen könnte.
Bei IPS 4.4 steht da allerdings ein ‚-‘, wenn das Datum nicht gesetzt ist (Hintergrund: die Unix-Timestamp beginnen mit dem 1.1.1970 und das ist der Wert 0) - wäre dann ein geändertes Verhalten des Variablenprofils ~UnixTimstamp in IPS 5. Schaue ich mir mal an und melde das ggfs. an Symcon

Ich denke, du kannst diese beiden Variable auch verbergen.

gruss
demel

ich denke für Konstanten und für die Definition von globalen Funktionen st die __autoload.php schon der richtige Ansatzpunkt, aber nicht für dynamische Daten, die ein laufendes IPS voraussetzen.
Was steht denn da so drin zw. was machst Du damit?
Die dynamischen Daten sind ja (soweit es Automower und NetamoWeather abgeht) nicht wirklich dynamisch, aber bei anderen Geräten ist vielleicht mehr Bewegung drin. Wäre es nicht besser eine Funktion zu haben, die alle diese Daten bei Bedarf und dann aktuell liefert?
Ansonsten könntest Du diese Daten ja zur Laufzeit in einer Datei im symcon/user-Verzeichnis ablegen und diese Datei durch __autostart.php auswerten. Aber das bedeutet ja auf jeden Fall, das Änderungen erst bei Neustart vom IPS ausgewertet werden.

Kann leider momentan nicht da ich arbeite in die autoload schauen, ich meine ich hab irgendwann nur mal testweise einzig die ID des webfront-konfigurators als php-konstante hinterlegt. Bin nicht sicher ob ich es überhaupt an irgendeiner stelle nutze. Ich schaue später nach und melde mich.

Noch vielen Dank für die Hilfe.

Hardlog

Hallo,

ich ermittel in der autoload bzw. von dort aufgerufen in einem anderen script die connectURL wie folgt:


<?
/*******************************************************************************
  Hier können global verfürbare Definitionen etc festgelegt werden
  Dieses script wird beim start von IPS mitgeladen (autoinclude)
*******************************************************************************/
   
// KONSTANTEN ermitteln und global bereitstellen

 define ("ID_WFC",46366 /*[WebFront]*/); // ID des WebFront-Konfigurators

// ****************** ConnectURL ermitteln *************************************
 $InstanzenListe = IPS_GetInstanceListByModuleID("{9486D575-BE8C-4ED8-B5B5-20930E26DE6F}");
 foreach ($InstanzenListe as $InstanzID) {
     $ConnectControl = $InstanzID;
 }
 $connectinfo = CC_GetUrl($ConnectControl); 
 //var_dump($connectinfo);
 define ("FLOS_ConnectURL",$connectinfo);
 
 // ***************************************************************************** 
?>

Das scheint dann das Problem zu sein.
Gibts denn eine andere Möglichekit das irgendwie anders realisieren. Sonst lasse ich es einfach weg geht ja so dann gut.

Gruß
hardlog

Ja, das ganze als Funktion bereitstellen und nicht direkt als Code. Z.b. FLOS_ConnectURL() anstatt als Konstante welche über aktiven Code befüllt wird.

Der wird bei dir aktuell immer sobald IPS irgendwas mit PHP macht, immer wieder neu ausgeführt.
Das dies z.B. beim Starten/Stoppen von IPS oder Update von Modulen für Fehler sorgt ist logisch.
In der IPS Doku steht auch explizit Konstanten und Funktionen.
Funktionen werden ja nur dann ausgeführt wenn du sie dann z.b. mit FLOS_ConnectURL() aufrufst.
Michael

Cool, geht!

Danke Michael.

So, jetzt geht schon das meiste. Dynamische Karte wird dargestellt mit Marker, etc nur fehlen mir die farbigen Linien.

Wenn ich das Script einzeln durchlaufen lass bekomme ich folgenden Output (xxx hab ich eingefügt)

html { height: 100% }
            body { height: 100%; margin: 0; padding: 0 }
            #map-canvas { height: 100% }
        
    
    
        

        
            function initialize() {
                var center = new google.maps.LatLng({"lng":xxx,"lat":xxx});
                var mapOptions = {"zoom":19,"tilt":0,"mapTypeId":"satellite"};
                mapOptions.center = center;
                var map = new google.maps.Map(document.getElementById("map-canvas"), mapOptions);

                var infowindowOptions = {"maxWidth":200};
                if (infowindowOptions == "")
                    infowindowOptions = {};
                var infowindow = new google.maps.InfoWindow();

                var markerLocations = [{"lng":xxx,"lat":xxx,"info":"m\u00e4ht"}];
                for(i = 0; i < markerLocations.length; i++) {
                    var position = new google.maps.LatLng(markerLocations[i]);
                    var markerOptions = {"icon":{"url":"http:\/\/maps.google.com\/mapfiles\/kml\/paddle\/M.png","scaledSize":{"width":32,"height":32}}};
                    if (markerLocations[i]["marker_options"])
                        markerOptions = markerLocations[i]["marker_options"];
                    if (markerOptions == "")
                        markerOptions = {};
                    markerOptions.position = position;
                    markerOptions.map = map;
                    var marker = new google.maps.Marker(markerOptions);
                    google.maps.event.addListener(marker, "click", (function(marker, i) {
                            return function() {
                                if (markerLocations[i]["info"]) {
                                    infowindow.setContent(markerLocations[i]["info"]);
                                    infowindow.setOptions(infowindowOptions);
                                    infowindow.open(map, marker);
                                }
                            }
                        }) (marker, i));
                }

                var polylineOptions = {"strokeColor":"#00FF00","strokeOpacity":1,"strokeWeight":2};
                if (polylineOptions == "")
                    polylineOptions = {};
                polylineOptions.path = [];;
                var polyline = new google.maps.Polyline(polylineOptions);
                polyline.setMap(map);

                var polylineOptions = {"strokeColor":"#7B68EE","strokeOpacity":1,"strokeWeight":2};
                if (polylineOptions == "")
                    polylineOptions = {};
                polylineOptions.path = [];;
                var polyline = new google.maps.Polyline(polylineOptions);
                polyline.setMap(map);

                var polylineOptions = {"strokeColor":"#FF4040","strokeOpacity":1,"strokeWeight":2};
                if (polylineOptions == "")
                    polylineOptions = {};
                polylineOptions.path = [];;
                var polyline = new google.maps.Polyline(polylineOptions);
                polyline.setMap(map);

            }

Der Output hat keine Werte für die polylines (das sind die Linien). Hast Du ggfs. die Variable ‚Position‘ nicht auf ‚Alle Variablenänderungen aufzeichnen‘ gestellt?

Der Marker ist ja die aktuelle Position, für die Linie greift das Script ja auf die archivierten Werte zurück.
=> wenn meine Annahme nicht stimmt (also die Variable aufgezeichnet wird), schau mal bitte nach, welche Werte drin stehen.

Unabhängig davon habe ich auch gerade festgestellt, das ich im IPSymconGoogleMaps mit den letzten Änderungen ein Typproblem hatte. Bitte aktualisieren.

Gruß
demel

=> wenn meine Annahme nicht stimmt (also die Variable aufgezeichnet wird), schau mal bitte nach, welche Werte drin stehen.

Variable wird aufgezeichnet

Es steht drin (z.B.)

{"latitude": "1.111","longitude": "2.222"}

Gruss
gros_ibou

Hast Du schon das Update auf das GoogleMaps-Modul gemacht?

Wenn das nichts bewirkt, poste mal das Script des Webhook.

… in meinem Script werden ja Werte per AC_GetLoggendValues die Werte geholt. Die könntest du dir mal ausgeben lassen um zu sehen, ob Werte gefunden werden.

Hast Du schon das Update auf das GoogleMaps-Modul gemacht?

Jetzt tut’s. Danke!
gros_ibou

Hallo demel,

ich hab nochmal einen Feature request.

Da ich ein relativ grosses Areal zu mähen habe und die Wiese auch noch nicht so perfekt ist fährt sich mein AutoMower immer mal wieder fest. Durchaus mehrere Male pro Tag. Deshalb wäre es für mich extrem praktisch zu wissen wo die Orte sind wo er immer wieder hängt. Dann könnte ich dort die entsprechenden Löcher in der Wiese begradigen.

Was ich also mache ist immer wenn ein Fehler auftritt die jeweilige Position als JSON String abzuspeichern und den entsprechenden String zu loggen.

Jetzt gilt es noch die Positionen als Marker auf die Karte zu bringen. Entweder man macht eine extra Karte, oder man bringt die entsprechenden Marker (zB mit einem X bezeichnet) zusätzlich in der Karte der Fahrwege unter. Ich habe mich ein bisschen daran versucht, beisse mir aber daran die Zähne aus.

Könntest Du mir dabei evtl auf die Sprünge helfen?

Beste Grüsse

gros_ibou

rein Interesse halber, wie erkennst Du das genau?

ok, dann hast Du ja die Daten, schonmal gut,

Ja, beides hat Vor- und Nachteile.
eine zweite Karte hat natürlich den Vorteil, das man einen längeren Zeitraum betrachten kann und dann die „Hotspots“ erkennt.
DIe Vorgehensweise ist immer gleich

  1. eine Map besteht (unter anderem) aus paths und markers, beides sind Arrays
    path ist ein Polygon, also die Verbindung von mehreren Punkten und marker ein einzelner Punkt mit einem „Fähnchen“.

  2. sowohl paths als auch markers können beliebig viele sein (bei der DynamicMap sowieso, bei der StaticMap ist das durch die Größe der URL begrenzt)

  3. beide Arten sind optional, können also auch weggelassen werden oder nur einer von beiden.

4a). wesentlich Option bei path sind die Angaben zur Linie (also z.B. strokeColor/Opacity/Weight , die sind immer für für alle Punkte eines path gleich, können sich aber von path zu path unterscheiden. In meinem Beispiel sind ja die Linien unterschiedlich gefärbt.

4b) bei maker sind das im wesentlichen die Angabe des Icon. In der API-Beschriebung von Google habe ich keine Aufstellung gefunden aber diese Seite zeigt ein paar Icons. Können natürlich ganz beliebige Icons sein.

Alle points eines marker haben das gleiche Icon.

In IPSymconGoogleMaps/docs/GoogleMaps_GenerateDynamicMap_WebHook.php ist ein Beispiel mit mehreren marker.

schnell skizziert …

Innerhalb der Schleife, wo auch die path gesetzt werden


    $values = AC_GetLoggedValues(17849 /*[Archive]*/, 54501 /* FEHLERPUNKTE */, $from, $until, 0);
    $points = [];
    foreach ($values as $value) {
        $pos = json_decode($value['Value'], true);
        $points[] = [
                'lat' => $pos['latitude'],
                'lng' => $pos['longitude'],
            ];
    }


    $marker_options = [
            'icon'      => [
                'url'        => 'http://maps.google.com/mapfiles/kml/paddle/orange-stars.png',
                'scaledSize' => [
                        'width'     => 32,
                        'height'    => 32
                    ]
                ]
        ];
    $marker['marker_options'] = $marker_options;
    $marker['points'] = $marker_points;
    $markers[] = $marker;

WIchtig: die Anweisung

$map['markers'] = $markers;

muss dann hinter die Schleife.

Dann wäre die Karte um die Fehler-Marker ergänzt.

Will man eine 2. Karte machen, müsste man eine 2. Variable machen, ein 2. WebHook mit dem entsprechenden Script, wo keine paths gesetzt werden sondern nur die markers. Aber von Prinzip her gleich.

Hilft das?

Gruß
demel

Erstmal tausend Dank. Werde es baldmöglichst ausprobieren…

Zu Deiner Frage:

rein Interesse halber, wie erkennst Du das genau?

Einfach wenn die Variable „aktuelle Aktivität“ auf -1 springt

Gruss

gros_ibou

ah ja, -1 ist der Code für ERROR. Steht in der Variable Fehler dann was drin? Ist eine Integervariable mit einem Variablenprofil (mit den paar mir bekannten Fehlern), weis nicht wie die Visualisierung damit umgeht, wenn es ein unbekannter Wert ist.

Bzw. könntest du mir mal ein DebugLog schicken mit einem Fehler drin? Vielleicht gibt’s ja noch was interessanstes im Datensatz.

demel

Tut jetzt. Vielen Dank!
Bis jetzt hatte ich den Debug immer nicht an, wenn er stecken blieb.
Aber ich bleib dran

Gruss
gros_ibou