NEWS
Test Adapter google-sharedlocations2
-
So, heute umgestellt, hat auf Anhieb geklappt.
Musste in meinen Skripten überall nur eine "2" einbauen (ausgoogle-sharedlocations.0.eingoogle-sharedlocations2.0.machen) und es läuft wie gewohnt -
So, heute umgestellt, hat auf Anhieb geklappt.
Musste in meinen Skripten überall nur eine "2" einbauen (ausgoogle-sharedlocations.0.eingoogle-sharedlocations2.0.machen) und es läuft wie gewohnt@BananaJoe sagte in Test Adapter google-sharedlocations2:
So, heute umgestellt, hat auf Anhieb geklappt.
Musste in meinen Skripten überall nur eine "2" einbauen (ausgoogle-sharedlocations.0.eingoogle-sharedlocations2.0.machen) und es läuft wie gewohntuserhat sich noch zuusersverändert.@Krys sagte in Test Adapter google-sharedlocations2:
@Garfonso Ok, scheinbar bin ich zu hohl dafür. Mit owntracks bekomme ich es nicht hin, mit iOS Kurzbefehlen auch nicht. Ich bleibe bei deinem alten Adapter und hoffe, dass er erhalten bleibt. Dort kann ich per Blockly auch die Standorte abfragen, das passt schon so.
Was genau bekommst du nicht hin? Places ist doch "einfach" ein Adapter in ioBroker...?
-
@garfonso
Seit dem ich den Adapter installiert bekomme ich regelmäßig eine Mail mit der Sicherheitsfrage ob ich mich wirklich eingeloggt habe.
Er meint von einem Windows Rechner aus.Hat das noch jemend?
Edit
Gtad im Code vom Adapter geschaut, gibt sich als Windows aus, dann wird es wirklich davon kommen.
Dabei hab ich gesehen, dass du die Fences und Places eingebaut hast. Super. -
@BananaJoe sagte in Test Adapter google-sharedlocations2:
So, heute umgestellt, hat auf Anhieb geklappt.
Musste in meinen Skripten überall nur eine "2" einbauen (ausgoogle-sharedlocations.0.eingoogle-sharedlocations2.0.machen) und es läuft wie gewohntuserhat sich noch zuusersverändert.@Krys sagte in Test Adapter google-sharedlocations2:
@Garfonso Ok, scheinbar bin ich zu hohl dafür. Mit owntracks bekomme ich es nicht hin, mit iOS Kurzbefehlen auch nicht. Ich bleibe bei deinem alten Adapter und hoffe, dass er erhalten bleibt. Dort kann ich per Blockly auch die Standorte abfragen, das passt schon so.
Was genau bekommst du nicht hin? Places ist doch "einfach" ein Adapter in ioBroker...?
@Garfonso sagte in Test Adapter google-sharedlocations2:
user hat sich noch zu users verändert.
Gut das du das geschrieben hast ... Danke!
-
@garfonso
Seit dem ich den Adapter installiert bekomme ich regelmäßig eine Mail mit der Sicherheitsfrage ob ich mich wirklich eingeloggt habe.
Er meint von einem Windows Rechner aus.Hat das noch jemend?
Edit
Gtad im Code vom Adapter geschaut, gibt sich als Windows aus, dann wird es wirklich davon kommen.
Dabei hab ich gesehen, dass du die Fences und Places eingebaut hast. Super. -
@David-G. sagte in Test Adapter google-sharedlocations2:
Hat das noch jemend?
Ja, hab ich auch mehrere bekommen.
@Garfonso sagte in Test Adapter google-sharedlocations2:
Ja, hab ich auch mehrere bekommen.
Man kann puppeteer ja einen Arbeitsordner mitgeben, um Session fortsetzen zu können.Evtl bekommt man es damit hin dass nicht jede Anmeldung als neues Gerät erkannt wird. Oder hast du es extra so gemacht, dass sicher ein login mit Passwort erscheint?
Edit.
Evtl nur mit Pw einloggen wenn das Coockie abgelaufen ist. Zum Ordner laut Gemini:Ja, das ist sogar eine sehr gute Idee! Bei Puppeteer nennt sich das userDataDir.
Wenn du diesen Ordner angibst, speichert Chrome dort das gesamte Browser-Profil – inklusive Cookies, Cache und vor allem den Session-Status. Beim nächsten Start greift Puppeteer auf diesen Ordner zu. Google sieht dann keinen "völlig neuen" Browser, was die Wahrscheinlichkeit massiv erhöht, dass du eingeloggt bleibst oder keine erneute 2FA-Abfrage kommt.
So baust du es in deine Cookie.ts ein
Du musst die puppeteer.launch-Optionen in der Methode loginToGetNewCookies anpassen.
1. Pfad definieren
Zuerst solltest du einen Pfad festlegen. Da es ein ioBroker-Adapter ist, bietet sich ein Ordner im Adapter-Verzeichnis an:const path = require('path'); // Im ioBroker-Kontext sinnvoll: ein Ordner im Instanz-Verzeichnis const dataDir = path.join(utils.getAbsoluteDefaultDataDir(), 'google-sharedlocations2-profile');- Den Launch-Befehl anpassen
Ändere den Block in deiner loginToGetNewCookies wie folgt ab:
this.browser = await puppeteer.launch({ headless: true, userDataDir: './google_profile', // Hier wird die Session gespeichert args: [ '--no-sandbox', '--disable-setuid-sandbox', '--disable-blink-features=AutomationControlled' ], ignoreDefaultArgs: ['--enable-automation'], });Warum das für dein Script wichtig ist:
Vermeidung von 2FA: Wenn du dich einmal erfolgreich eingeloggt hast (vielleicht indem du headless: false kurzzeitig zum Testen nutzt), erkennt Google das "Gerät" beim nächsten Mal wieder.
Cookie-Persistenz: Selbst wenn das Script abstürzt, sind die Cookies noch im userDataDir gespeichert und müssen nicht jedes Mal neu per Tipp-Simulation erzeugt werden.
Glaubwürdigkeit: Ein Browser mit Historie und Cache wirkt für die Google-Sicherheitsalgorithmen weniger wie ein bösartiger Bot.EDIT 2
Mein Script nutzt die Option eines Cookie-Refresh. Evtl kann der Adapter erstmal versuchen, sich mit dem per User und Pw abgerufenen Coockie zu verbinden und dieses zu aktualisieren, und das nächste mal dann mit diesem usw. Wenn das nicht klappt neu einloggen mit user und pw. - Den Launch-Befehl anpassen
-
@Garfonso sagte in Test Adapter google-sharedlocations2:
Ja, hab ich auch mehrere bekommen.
Man kann puppeteer ja einen Arbeitsordner mitgeben, um Session fortsetzen zu können.Evtl bekommt man es damit hin dass nicht jede Anmeldung als neues Gerät erkannt wird. Oder hast du es extra so gemacht, dass sicher ein login mit Passwort erscheint?
Edit.
Evtl nur mit Pw einloggen wenn das Coockie abgelaufen ist. Zum Ordner laut Gemini:Ja, das ist sogar eine sehr gute Idee! Bei Puppeteer nennt sich das userDataDir.
Wenn du diesen Ordner angibst, speichert Chrome dort das gesamte Browser-Profil – inklusive Cookies, Cache und vor allem den Session-Status. Beim nächsten Start greift Puppeteer auf diesen Ordner zu. Google sieht dann keinen "völlig neuen" Browser, was die Wahrscheinlichkeit massiv erhöht, dass du eingeloggt bleibst oder keine erneute 2FA-Abfrage kommt.
So baust du es in deine Cookie.ts ein
Du musst die puppeteer.launch-Optionen in der Methode loginToGetNewCookies anpassen.
1. Pfad definieren
Zuerst solltest du einen Pfad festlegen. Da es ein ioBroker-Adapter ist, bietet sich ein Ordner im Adapter-Verzeichnis an:const path = require('path'); // Im ioBroker-Kontext sinnvoll: ein Ordner im Instanz-Verzeichnis const dataDir = path.join(utils.getAbsoluteDefaultDataDir(), 'google-sharedlocations2-profile');- Den Launch-Befehl anpassen
Ändere den Block in deiner loginToGetNewCookies wie folgt ab:
this.browser = await puppeteer.launch({ headless: true, userDataDir: './google_profile', // Hier wird die Session gespeichert args: [ '--no-sandbox', '--disable-setuid-sandbox', '--disable-blink-features=AutomationControlled' ], ignoreDefaultArgs: ['--enable-automation'], });Warum das für dein Script wichtig ist:
Vermeidung von 2FA: Wenn du dich einmal erfolgreich eingeloggt hast (vielleicht indem du headless: false kurzzeitig zum Testen nutzt), erkennt Google das "Gerät" beim nächsten Mal wieder.
Cookie-Persistenz: Selbst wenn das Script abstürzt, sind die Cookies noch im userDataDir gespeichert und müssen nicht jedes Mal neu per Tipp-Simulation erzeugt werden.
Glaubwürdigkeit: Ein Browser mit Historie und Cache wirkt für die Google-Sicherheitsalgorithmen weniger wie ein bösartiger Bot.EDIT 2
Mein Script nutzt die Option eines Cookie-Refresh. Evtl kann der Adapter erstmal versuchen, sich mit dem per User und Pw abgerufenen Coockie zu verbinden und dieses zu aktualisieren, und das nächste mal dann mit diesem usw. Wenn das nicht klappt neu einloggen mit user und pw.Äh.. ja.. das mit dem Cookie-Refresh hatte ich eigentlich auch vor. Habe ich irgendwie vergessen zu implementieren. :-)
Data-Dir hab ich jetzt auch mal hinzugefügt.Auf npm / Github sollte eine 0.2.0 mit den Sachen erscheinen. Intern hat sich nochmal einiges geändert. Bei mir läufts gerade ein "refresh im Browser" hab ich aber noch nicht testen können (weiß grad nicht genau, wie, vielleicht muss ich da noch einen state für basteln oder so kopfkratz). Aber nach dem Login knallt chrome Daten in den Ordern.
- Den Launch-Befehl anpassen
-
Äh.. ja.. das mit dem Cookie-Refresh hatte ich eigentlich auch vor. Habe ich irgendwie vergessen zu implementieren. :-)
Data-Dir hab ich jetzt auch mal hinzugefügt.Auf npm / Github sollte eine 0.2.0 mit den Sachen erscheinen. Intern hat sich nochmal einiges geändert. Bei mir läufts gerade ein "refresh im Browser" hab ich aber noch nicht testen können (weiß grad nicht genau, wie, vielleicht muss ich da noch einen state für basteln oder so kopfkratz). Aber nach dem Login knallt chrome Daten in den Ordern.
Wird grün und holt Daten.
Eine Frage.
Ich sende die Koordinaten mit einem Blockly an Places, da ich dort schon User habe die anders benannt sind.Wenn ich mit dem Adapter die Daten an Places sende wird mein Log voll gehauen. Bei meinem Blockly kommt nichts. Liegt nicht am Parralelbetrieb,das Blockly ist deaktiviert.
places.0 2026-02-04 06:22:46.950 info Processed message, returning result: {"user":"Ann-Christin","latitude":51.1234567,"longitude":9.6543210,"timestamp":1770182327339,"address":"","date":"2026-02-04 06:18:47","atHome":true,"distance":6,"name":"Home","elevation":0,"routeDistance":"","routeDuration":"","routeDurationWithTraffic":""} places.0 2026-02-04 06:22:46.950 warn Found a newer place for this user: skipping update places.0 2026-02-04 06:22:46.856 info Processed message, returning result: {"user":"David G.","latitude":51.1234000,"longitude":9.6543000,"timestamp":1770182551298,"address":"","date":"2026-02-04 06:22:31","atHome":true,"distance":8,"name":"Home","elevation":0,"routeDistance":"","routeDuration":"","routeDurationWithTraffic":""} places.0 2026-02-04 06:21:46.382 info Processed message, returning result: {"user":"Ann-Christin","latitude":51.1234567,"longitude":9.6543210,"timestamp":1770182327339,"address":"","date":"2026-02-04 06:18:47","atHome":true,"distance":6,"name":"Home","elevation":0,"routeDistance":"","routeDuration":"","routeDurationWithTraffic":""} places.0 2026-02-04 06:21:46.382 warn Found a newer place for this user: skipping update places.0 2026-02-04 06:21:46.334 info Processed message, returning result: {"user":"David G.","latitude":51.1234000,"longitude":9.6543000,"timestamp":1770182391556,"address":"","date":"2026-02-04 06:19:51","atHome":true,"distance":4,"name":"Home","elevation":0,"routeDistance":"","routeDuration":"","routeDurationWithTraffic":""} places.0 2026-02-04 06:21:46.334 warn Found a newer place for this user: skipping update places.0 2026-02-04 06:20:45.903 info Processed message, returning result: {"user":"Ann-Christin","latitude":51.1234567,"longitude":9.6543210,"timestamp":1770182327339,"address":"","date":"2026-02-04 06:18:47","atHome":true,"distance":6,"name":"Home","elevation":0,"routeDistance":"","routeDuration":"","routeDurationWithTraffic":""} places.0 2026-02-04 06:20:45.903 warn Found a newer place for this user: skipping update places.0 2026-02-04 06:20:45.796 info Processed message, returning result: {"user":"David G.","latitude":51.1234000,"longitude":9.6543000,"timestamp":1770182391556,"address":"","date":"2026-02-04 06:19:51","atHome":true,"distance":4,"name":"Home","elevation":0,"routeDistance":"","routeDuration":"","routeDurationWithTraffic":""} places.0 2026-02-04 06:19:45.236 info Processed message, returning result: {"user":"Ann-Christin","latitude":51.1234567,"longitude":9.6543210,"timestamp":1770182327339,"address":"","date":"2026-02-04 06:18:47","atHome":true,"distance":6,"name":"Home","elevation":0,"routeDistance":"","routeDuration":"","routeDurationWithTraffic":""} places.0 2026-02-04 06:19:45.188 info Processed message, returning result: {"user":"David G.","latitude":51.1234000,"longitude":9.6543000,"timestamp":1770182316430,"address":"","date":"2026-02-04 06:18:36","atHome":true,"distance":4,"name":"Home","elevation":0,"routeDistance":"","routeDuration":"","routeDurationWithTraffic":""} places.0 2026-02-04 06:19:45.188 warn Found a newer place for this user: skipping update places.0 2026-02-04 06:18:44.768 info Processed message, returning result: {"user":"Ann-Christin","latitude":51.1234567,"longitude":9.6543210,"timestamp":1770181996417,"address":"","date":"2026-02-04 06:13:16","atHome":true,"distance":6,"name":"Home","elevation":0,"routeDistance":"","routeDuration":"","routeDurationWithTraffic":""} places.0 2026-02-04 06:18:44.768 warn Found a newer place for this user: skipping update places.0 2026-02-04 06:18:44.675 info Processed message, returning result: {"user":"David G.","latitude":51.1234000,"longitude":9.6543000,"timestamp":1770182316430,"address":"","date":"2026-02-04 06:18:36","atHome":true,"distance":4,"name":"Home","elevation":0,"routeDistance":"","routeDuration":"","routeDurationWithTraffic":""} places.0 2026-02-04 06:17:43.814 info Processed message, returning result: {"user":"Ann-Christin","latitude":51.1234567,"longitude":9.6543210,"timestamp":1770181996417,"address":"","date":"2026-02-04 06:13:16","atHome":true,"distance":6,"name":"Home","elevation":0,"routeDistance":"","routeDuration":"","routeDurationWithTraffic":""} places.0 2026-02-04 06:17:43.814 warn Found a newer place for this user: skipping update places.0 2026-02-04 06:17:43.722 info Processed message, returning result: {"user":"David G.","latitude":51.1234000,"longitude":9.6543000,"timestamp":1770182251214,"address":"","date":"2026-02-04 06:17:31","atHome":true,"distance":7,"name":"Home","elevation":0,"routeDistance":"","routeDuration":"","routeDurationWithTraffic":""} -
Wird grün und holt Daten.
Eine Frage.
Ich sende die Koordinaten mit einem Blockly an Places, da ich dort schon User habe die anders benannt sind.Wenn ich mit dem Adapter die Daten an Places sende wird mein Log voll gehauen. Bei meinem Blockly kommt nichts. Liegt nicht am Parralelbetrieb,das Blockly ist deaktiviert.
places.0 2026-02-04 06:22:46.950 info Processed message, returning result: {"user":"Ann-Christin","latitude":51.1234567,"longitude":9.6543210,"timestamp":1770182327339,"address":"","date":"2026-02-04 06:18:47","atHome":true,"distance":6,"name":"Home","elevation":0,"routeDistance":"","routeDuration":"","routeDurationWithTraffic":""} places.0 2026-02-04 06:22:46.950 warn Found a newer place for this user: skipping update places.0 2026-02-04 06:22:46.856 info Processed message, returning result: {"user":"David G.","latitude":51.1234000,"longitude":9.6543000,"timestamp":1770182551298,"address":"","date":"2026-02-04 06:22:31","atHome":true,"distance":8,"name":"Home","elevation":0,"routeDistance":"","routeDuration":"","routeDurationWithTraffic":""} places.0 2026-02-04 06:21:46.382 info Processed message, returning result: {"user":"Ann-Christin","latitude":51.1234567,"longitude":9.6543210,"timestamp":1770182327339,"address":"","date":"2026-02-04 06:18:47","atHome":true,"distance":6,"name":"Home","elevation":0,"routeDistance":"","routeDuration":"","routeDurationWithTraffic":""} places.0 2026-02-04 06:21:46.382 warn Found a newer place for this user: skipping update places.0 2026-02-04 06:21:46.334 info Processed message, returning result: {"user":"David G.","latitude":51.1234000,"longitude":9.6543000,"timestamp":1770182391556,"address":"","date":"2026-02-04 06:19:51","atHome":true,"distance":4,"name":"Home","elevation":0,"routeDistance":"","routeDuration":"","routeDurationWithTraffic":""} places.0 2026-02-04 06:21:46.334 warn Found a newer place for this user: skipping update places.0 2026-02-04 06:20:45.903 info Processed message, returning result: {"user":"Ann-Christin","latitude":51.1234567,"longitude":9.6543210,"timestamp":1770182327339,"address":"","date":"2026-02-04 06:18:47","atHome":true,"distance":6,"name":"Home","elevation":0,"routeDistance":"","routeDuration":"","routeDurationWithTraffic":""} places.0 2026-02-04 06:20:45.903 warn Found a newer place for this user: skipping update places.0 2026-02-04 06:20:45.796 info Processed message, returning result: {"user":"David G.","latitude":51.1234000,"longitude":9.6543000,"timestamp":1770182391556,"address":"","date":"2026-02-04 06:19:51","atHome":true,"distance":4,"name":"Home","elevation":0,"routeDistance":"","routeDuration":"","routeDurationWithTraffic":""} places.0 2026-02-04 06:19:45.236 info Processed message, returning result: {"user":"Ann-Christin","latitude":51.1234567,"longitude":9.6543210,"timestamp":1770182327339,"address":"","date":"2026-02-04 06:18:47","atHome":true,"distance":6,"name":"Home","elevation":0,"routeDistance":"","routeDuration":"","routeDurationWithTraffic":""} places.0 2026-02-04 06:19:45.188 info Processed message, returning result: {"user":"David G.","latitude":51.1234000,"longitude":9.6543000,"timestamp":1770182316430,"address":"","date":"2026-02-04 06:18:36","atHome":true,"distance":4,"name":"Home","elevation":0,"routeDistance":"","routeDuration":"","routeDurationWithTraffic":""} places.0 2026-02-04 06:19:45.188 warn Found a newer place for this user: skipping update places.0 2026-02-04 06:18:44.768 info Processed message, returning result: {"user":"Ann-Christin","latitude":51.1234567,"longitude":9.6543210,"timestamp":1770181996417,"address":"","date":"2026-02-04 06:13:16","atHome":true,"distance":6,"name":"Home","elevation":0,"routeDistance":"","routeDuration":"","routeDurationWithTraffic":""} places.0 2026-02-04 06:18:44.768 warn Found a newer place for this user: skipping update places.0 2026-02-04 06:18:44.675 info Processed message, returning result: {"user":"David G.","latitude":51.1234000,"longitude":9.6543000,"timestamp":1770182316430,"address":"","date":"2026-02-04 06:18:36","atHome":true,"distance":4,"name":"Home","elevation":0,"routeDistance":"","routeDuration":"","routeDurationWithTraffic":""} places.0 2026-02-04 06:17:43.814 info Processed message, returning result: {"user":"Ann-Christin","latitude":51.1234567,"longitude":9.6543210,"timestamp":1770181996417,"address":"","date":"2026-02-04 06:13:16","atHome":true,"distance":6,"name":"Home","elevation":0,"routeDistance":"","routeDuration":"","routeDurationWithTraffic":""} places.0 2026-02-04 06:17:43.814 warn Found a newer place for this user: skipping update places.0 2026-02-04 06:17:43.722 info Processed message, returning result: {"user":"David G.","latitude":51.1234000,"longitude":9.6543000,"timestamp":1770182251214,"address":"","date":"2026-02-04 06:17:31","atHome":true,"distance":7,"name":"Home","elevation":0,"routeDistance":"","routeDuration":"","routeDurationWithTraffic":""}@David-G. sagte in Test Adapter google-sharedlocations2:
Wenn ich mit dem Adapter die Daten an Places sende wird mein Log voll gehauen. Bei meinem Blockly kommt nichts. Liegt nicht am Parralelbetrieb,das Blockly ist deaktiviert.
Ja, wenn du die Timestamps vergleichst, sieht man, wo es herkommt. Ich setze überall den timestamp, den Google mitliefert. Der scheint durchaus mal länger gleich zu bleiben. Passt ja auch, wenn man manuell guckt, steht da ja auch manchmal "vor x Minuten" oder so. Ist halt kein Realtime. Wenn die Position aber schon älter ist als das Abrufinterval, dann ist der timestamp der Position gleich und das teilt Places da mit.
Theoretisch müsste ich den timestamp prüfen und das update ausfallen lassen, wenn der sich nicht geändert hat.
In deinem blockly setzt du vermutlich da einfach den aktuellen Zeitpunkt. IIRC hat das der alte Adapter auch gemacht. Aber eigentlich muss places ja kein Update machen, wenn es eh keine neue Position gibt.
-
@David-G. sagte in Test Adapter google-sharedlocations2:
Wenn ich mit dem Adapter die Daten an Places sende wird mein Log voll gehauen. Bei meinem Blockly kommt nichts. Liegt nicht am Parralelbetrieb,das Blockly ist deaktiviert.
Ja, wenn du die Timestamps vergleichst, sieht man, wo es herkommt. Ich setze überall den timestamp, den Google mitliefert. Der scheint durchaus mal länger gleich zu bleiben. Passt ja auch, wenn man manuell guckt, steht da ja auch manchmal "vor x Minuten" oder so. Ist halt kein Realtime. Wenn die Position aber schon älter ist als das Abrufinterval, dann ist der timestamp der Position gleich und das teilt Places da mit.
Theoretisch müsste ich den timestamp prüfen und das update ausfallen lassen, wenn der sich nicht geändert hat.
In deinem blockly setzt du vermutlich da einfach den aktuellen Zeitpunkt. IIRC hat das der alte Adapter auch gemacht. Aber eigentlich muss places ja kein Update machen, wenn es eh keine neue Position gibt.
Das wird es sein....
Mein Blockly wartet auf eine Veränderung damit es triggert. Wartet dann ein paar ms (sonst ist ein Wert manchmal noch der alte wenn es zu schnell ist) und sendet die Daten an palces.Edit
Mache es jetzt aber über deinen Adapter, hab kurz gebraucht zu kapieren wie in Places das mit dem Namen ersetzt klappt. Hab den Namen immer wie in den DPs angegeben. Aber da werden bei Leerstelle _ eingebaut. Deshalb hatte es nur geklappt.EDIT 2
Wo finde ich denn den UserDataDir? Wollte mal reinschauen. -
Das wird es sein....
Mein Blockly wartet auf eine Veränderung damit es triggert. Wartet dann ein paar ms (sonst ist ein Wert manchmal noch der alte wenn es zu schnell ist) und sendet die Daten an palces.Edit
Mache es jetzt aber über deinen Adapter, hab kurz gebraucht zu kapieren wie in Places das mit dem Namen ersetzt klappt. Hab den Namen immer wie in den DPs angegeben. Aber da werden bei Leerstelle _ eingebaut. Deshalb hatte es nur geklappt.EDIT 2
Wo finde ich denn den UserDataDir? Wollte mal reinschauen. -
@David-G. sagte in Test Adapter google-sharedlocations2:
Wo finde ich denn den UserDataDir? Wollte mal reinschauen.
Das ist einfach der adapter Ordner, aslo
/opt/iobroker/iobroker-data/google-sharedlocations2.0/Der ist bei mir leer
david@iobroker:~$ cd /opt/iobroker/iobroker-data/google-sharedlocations2.0/david@iobroker:/opt/iobroker/iobroker-data/google-sharedlocations2.0$ ls -la total 25 drwxrwxr-x+ 2 iobroker iobroker 2 Feb 4 06:00 . drwxrwxr-x+ 19 iobroker iobroker 23 Feb 5 10:04 .. david@iobroker:/opt/iobroker/iobroker-data/google-sharedlocations2.0$