Skip to content
  • Home
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Tester
  4. Test Adapter Husqvarna Automower v0.3.x

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.7k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.2k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    16
    1
    3.1k

Test Adapter Husqvarna Automower v0.3.x

Scheduled Pinned Locked Moved Tester
husqvarnaautomower
439 Posts 73 Posters 106.1k Views 62 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • A ArnoD

    @ghifunk
    Was steht dann im LOG, wenn du das auf debug einstellst?
    Werden die Daten richtig zum Server geschickt ?

    "data":"{\"data\":{\"type\":\"calendar\",\"attributes\":{\"tasks\":[{\"start\":1020,\"duration\":240,\"monday\":false,\"tuesday\":true,\"wednesday\":false,\"thursday\":false,\"friday\":true,\"saturday\":false,\"sunday\":false}]}}}"};
    

    und wie sieht die Antwort aus ?

    [wss.on - message]: {"id":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","type":"settings-event","attributes":{"calendar":{"tasks":[{"start":1020,"duration":240,"monday":false,"tuesday":true,"wednesday":false,"thursday":false,"friday":true,"saturday":false,"sunday":false}]}}}
    
    G Offline
    G Offline
    ghifunk
    wrote on last edited by ghifunk
    #336

    @arnod
    im Log finde ich nichts, was mit Wochentagen oder Zeiten dazu zu tun hat ?
    oder ich suche an der falschen Stelle.

    A 1 Reply Last reply
    0
    • G ghifunk

      @arnod
      im Log finde ich nichts, was mit Wochentagen oder Zeiten dazu zu tun hat ?
      oder ich suche an der falschen Stelle.

      A Online
      A Online
      ArnoD
      wrote on last edited by
      #337

      @ghifunk
      Wird bei dir überhaupt was übertragen oder fehlen nur die Timer?

      G 1 Reply Last reply
      0
      • G Offline
        G Offline
        ghifunk
        wrote on last edited by
        #338

        wie ich sehe, wird nichts übertragen, was mit timern oder zeiten zu tun hat.
        ich habe den Adapter auf debug eingestellt und dann im Log danach gesucht.

        G 1 Reply Last reply
        0
        • G ghifunk

          wie ich sehe, wird nichts übertragen, was mit timern oder zeiten zu tun hat.
          ich habe den Adapter auf debug eingestellt und dann im Log danach gesucht.

          G Offline
          G Offline
          ghifunk
          wrote on last edited by ghifunk
          #339

          @ghifunk ich habe gerade nochmal in den scheduler-Werten gesehen, daß alle Werte rot sind. hat das was zu bedeuten?
          Wenn ich dann auf Speichern drücke, geht der "Speichern" -Wert kurz af True (grün) und dann wieder auf rot

          jetzt ha ich im Log doch noch was gefunden:
          "Content-Length":191},"method":" post","url":"https://api.amc.husqvarna.dev/v1/mowers/xxxxxxxx-xxxx-xxxx -xxxx-xxxxxxxxxxxx/calendar","data":"{"data":{ "type":"calendar","attributes":{"tasks":[{"start":540,"duration":360,"monday":true ,"Dienstag":wahr,"Mittwoch":falsch,"Donnerstag":wahr,"Freitag":falsch,"Samstag":wahr,"Sonntag":falsch}] }}}"}axios/0.27.2","Content-Length":191},"method":"post","url":"https://api.amc.husqvarna.dev/v1/mowers/xxxxxxxx-xxxx-xxxx -xxxx-xxxxxxxxxxxx/calendar","data":"{"data":{"type":"calendar","attributes":{"tasks":[{" start":540,"dauer":360,"montag":wahr,"dienstag":wahr,"mittwoch":falsch,"donnerstag":wahr,"freitag\ ":false,"samstag":true,"sonntag":false}]}}}"}axios/0.27.2","Content-Length":191},"method":"post","url":"https://api.amc.husqvarna.dev/v1/mowers/xxxxxxxx-xxxx-xxxx -xxxx-xxxxxxxxxxxx/calendar","data":"{"data":{"type":"calendar","attributes":{"tasks":[{" start":540,"dauer":360,"montag":wahr,"dienstag":wahr,"mittwoch":falsch,"donnerstag":wahr,"freitag\ ":false,"samstag":true,"sonntag":false}]}}}"}"Kalender","Attribute":{"Aufgaben":[{"Start":540,"Dauer":360,"Montag":true,"Dienstag" :true,"mittwoch":false,"donnerstag":true,"freitag":false,"samstag":true,"sonntag":false}]}}}"}"Kalender","Attribute":{"Aufgaben":[{"Start":540,"Dauer":360,"Montag":true,"Dienstag" :true,"mittwoch":false,"donnerstag":true,"freitag":false,"samstag":true,"sonntag":false}]}}}"}

          1 Reply Last reply
          0
          • A ArnoD

            @baddik
            Dafür findest du auf Github ein Script, das diese Werte berechnet.
            Funktioniert aber nicht sehr gut und muss noch mal optimiert werden.
            Habe ich mir mal vorgenommen, wenn ich mehr Zeit habe.

            B Offline
            B Offline
            Baddik
            wrote on last edited by
            #340

            @arnod Vielen Dank - habe es gefunden 👍

            1 Reply Last reply
            0
            • A ArnoD

              @ghifunk
              Wird bei dir überhaupt was übertragen oder fehlen nur die Timer?

              G Offline
              G Offline
              ghifunk
              wrote on last edited by ghifunk
              #341

              @arnod hallo,
              ich habe eben nochmal die Daten etwas aufgeschlüsselt:
              Ich denke mal, da ist was durcheinander... ist original so aus dem Log kopiert!

              Content-Length":607},"method":" post","url":"https://api.amc.husqvarna.dev/v1/mowers/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/calendar","data":"{"data":{ "type":"calendar","attributes":{"tasks":

              [{"start":540,"duration":360,"monday":true ,"Dienstag":wahr,"Mittwoch":falsch,"Donnerstag":wahr,"Freitag":falsch,"Samstag":wahr,"Sonntag":falsch},

              {"Start":420,"Dauer":360,"Montag":false,"Dienstag":true,"Mittwoch":false,"donnerstag":wahr,"freitag":falsch,"samstag":wahr,"sonntag":falsch},

              {"start":300,"dauer":120," Montag":wahr,"Dienstag":falsch,"Mittwoch":wahr,"Donnerstag":falsch,"Freitag":wahr,"Samstag":falsch,"Sonntag\ ":true},

              {"Start":600,"Dauer":120,"Montag":false,"Dienstag":true,"Mittwoch":false,"Donnerstag\ ":true,"freitag":false,"samstag":false,"sonntag":true}]}}}"}donnerstag":falsch,"freitag":true,"samstag":falsch,"sonntag":true},

              {"start":600,"dauer":120," Montag":falsch,"Dienstag":wahr,"Mittwoch":falsch,"Donnerstag":wahr,"Freitag":falsch,"Samstag":falsch,"Sonntag\ ":Stimmt}]}}}"}donnerstag":falsch,"freitag":true,"samstag":falsch,"sonntag":true},

              {"start":600,"dauer":120," Montag":falsch,"Dienstag":wahr,"Mittwoch":falsch,"Donnerstag":wahr,"Freitag":falsch,"Samstag":falsch,"Sonntag\ ":Stimmt}]}}}"}

              dazu die Eingabemaske:

              31-08-_2022_15-12-40.jpg

              [onStateChange]: HTTP-Statusantwort: 400; headers: {"content-type":"application/vnd.api+json","
              content-length":"435","connection":"close","date":"Mi, 31. Aug. 2022 13:03 :16 GMT","
              x-amzn-requestid":"zzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz","
              x-amzn-remapped-content-length":"435","x-amzn-remapped-connection" :"keep-alive","
              x-amz-apigw-id":"XutTTFnQjoEFW0g=","x-amzn-remapped-date":"Mi, 31. August 2022 13:03:16 GMT","
              x-cache ":"Fehler von cloudfront","via":"1.1 b88825ad151091557d336c3519215162.cloudfront.net (CloudFront)","
              x-amz-cf-pop":"TXL52-C1","x-amz-cf-id": " r4Pv0Um_UADmOY2-N1yfx3SIGAGv12Kbd3RlfL9iJo8if3HOqad0Lg=="};
              Daten: {"errors":[{"id":"yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy","status":"400","code":"
              invalid.mower. schedule.format","title":"Ungültiges Mähplanformat","detail":"Ungültiges Planformat im Anfragetext.
              Parsing-Nachricht: Mehr als zwei Aufgaben betreffen den Dienstag. Entstand beim Hinzufügen: MowerSchedule.
              Task[start=600,duration=120,monday=false,tuesday=true,wednesday=false,thursday=true,friday=false,saturday=false,sunday=true,missionId=<null>] "}]}
              Ungültiges Mähplanformat","detail":"Ungültiges Planformat im Anfragetext.
              Parsing-Nachricht: Mehr als zwei Aufgaben betreffen den Dienstag. Entstand beim Hinzufügen:
              MowerSchedule.Task[start=600,duration=120,monday=false,tuesday=true,wednesday=false,thursday=true,friday=false,saturday=false,sunday=true,missionId=<null>] "}]}
              Ungültiges Mähplanformat","detail":"Ungültiges Planformat im Anfragetext.
              Parsing-Nachricht: Mehr als zwei Aufgaben betreffen den Dienstag. Entstand beim Hinzufügen: MowerSchedule.
              Task[start=600,duration=120,monday=false,tuesday=true,wednesday=false,thursday=true,friday=false,saturday=false,sunday=true,missionId=<null>] "}]}

              A 1 Reply Last reply
              0
              • G ghifunk

                @arnod hallo,
                ich habe eben nochmal die Daten etwas aufgeschlüsselt:
                Ich denke mal, da ist was durcheinander... ist original so aus dem Log kopiert!

                Content-Length":607},"method":" post","url":"https://api.amc.husqvarna.dev/v1/mowers/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/calendar","data":"{"data":{ "type":"calendar","attributes":{"tasks":

                [{"start":540,"duration":360,"monday":true ,"Dienstag":wahr,"Mittwoch":falsch,"Donnerstag":wahr,"Freitag":falsch,"Samstag":wahr,"Sonntag":falsch},

                {"Start":420,"Dauer":360,"Montag":false,"Dienstag":true,"Mittwoch":false,"donnerstag":wahr,"freitag":falsch,"samstag":wahr,"sonntag":falsch},

                {"start":300,"dauer":120," Montag":wahr,"Dienstag":falsch,"Mittwoch":wahr,"Donnerstag":falsch,"Freitag":wahr,"Samstag":falsch,"Sonntag\ ":true},

                {"Start":600,"Dauer":120,"Montag":false,"Dienstag":true,"Mittwoch":false,"Donnerstag\ ":true,"freitag":false,"samstag":false,"sonntag":true}]}}}"}donnerstag":falsch,"freitag":true,"samstag":falsch,"sonntag":true},

                {"start":600,"dauer":120," Montag":falsch,"Dienstag":wahr,"Mittwoch":falsch,"Donnerstag":wahr,"Freitag":falsch,"Samstag":falsch,"Sonntag\ ":Stimmt}]}}}"}donnerstag":falsch,"freitag":true,"samstag":falsch,"sonntag":true},

                {"start":600,"dauer":120," Montag":falsch,"Dienstag":wahr,"Mittwoch":falsch,"Donnerstag":wahr,"Freitag":falsch,"Samstag":falsch,"Sonntag\ ":Stimmt}]}}}"}

                dazu die Eingabemaske:

                31-08-_2022_15-12-40.jpg

                [onStateChange]: HTTP-Statusantwort: 400; headers: {"content-type":"application/vnd.api+json","
                content-length":"435","connection":"close","date":"Mi, 31. Aug. 2022 13:03 :16 GMT","
                x-amzn-requestid":"zzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz","
                x-amzn-remapped-content-length":"435","x-amzn-remapped-connection" :"keep-alive","
                x-amz-apigw-id":"XutTTFnQjoEFW0g=","x-amzn-remapped-date":"Mi, 31. August 2022 13:03:16 GMT","
                x-cache ":"Fehler von cloudfront","via":"1.1 b88825ad151091557d336c3519215162.cloudfront.net (CloudFront)","
                x-amz-cf-pop":"TXL52-C1","x-amz-cf-id": " r4Pv0Um_UADmOY2-N1yfx3SIGAGv12Kbd3RlfL9iJo8if3HOqad0Lg=="};
                Daten: {"errors":[{"id":"yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy","status":"400","code":"
                invalid.mower. schedule.format","title":"Ungültiges Mähplanformat","detail":"Ungültiges Planformat im Anfragetext.
                Parsing-Nachricht: Mehr als zwei Aufgaben betreffen den Dienstag. Entstand beim Hinzufügen: MowerSchedule.
                Task[start=600,duration=120,monday=false,tuesday=true,wednesday=false,thursday=true,friday=false,saturday=false,sunday=true,missionId=<null>] "}]}
                Ungültiges Mähplanformat","detail":"Ungültiges Planformat im Anfragetext.
                Parsing-Nachricht: Mehr als zwei Aufgaben betreffen den Dienstag. Entstand beim Hinzufügen:
                MowerSchedule.Task[start=600,duration=120,monday=false,tuesday=true,wednesday=false,thursday=true,friday=false,saturday=false,sunday=true,missionId=<null>] "}]}
                Ungültiges Mähplanformat","detail":"Ungültiges Planformat im Anfragetext.
                Parsing-Nachricht: Mehr als zwei Aufgaben betreffen den Dienstag. Entstand beim Hinzufügen: MowerSchedule.
                Task[start=600,duration=120,monday=false,tuesday=true,wednesday=false,thursday=true,friday=false,saturday=false,sunday=true,missionId=<null>] "}]}

                A Online
                A Online
                ArnoD
                wrote on last edited by ArnoD
                #342

                @ghifunk

                Werden die anderen Objekt ID's vom Adapter befüllt oder bleiben alle leer?

                Ich würde mal mit einem Timer anfangen und alle anderen löschen.
                Prüfe mal, ob beim Ändern der Tage in der ersten Zeile in VIS auch die entsprechenden ID's vom Adapter geändert werden (...calendar.0.monday bis sundday), wenn ja, dann mal speichern und im LOG schauen, wie die Antwort von Husqvarna ist, ob die Werte übernommen wurden.
                Versuch es mal nur mit einem Tag und prüfe, ob die Rückantwort von Husqvarna passt.

                G 1 Reply Last reply
                0
                • A ArnoD

                  @ghifunk

                  Werden die anderen Objekt ID's vom Adapter befüllt oder bleiben alle leer?

                  Ich würde mal mit einem Timer anfangen und alle anderen löschen.
                  Prüfe mal, ob beim Ändern der Tage in der ersten Zeile in VIS auch die entsprechenden ID's vom Adapter geändert werden (...calendar.0.monday bis sundday), wenn ja, dann mal speichern und im LOG schauen, wie die Antwort von Husqvarna ist, ob die Werte übernommen wurden.
                  Versuch es mal nur mit einem Tag und prüfe, ob die Rückantwort von Husqvarna passt.

                  G Offline
                  G Offline
                  ghifunk
                  wrote on last edited by
                  #343

                  @arnod
                  Hallo, habe jetzt nur den ersten timer stehen gelassen. Es erfolgt auch nur die entsprechende Ausgabe, welche zumindest die richtigen Werte beinhaltet. Es erfolgt aber wieder eine Fehlermeldung.
                  Ich weiß nicht was ich noch machen kann? Oder braucht der 415X ein anders Datenformat?
                  Vielleicht ist doch jemand hier der auch einen 415X hat und evtl. das gleiche Problem...

                  hier der entsprechende Log-Auszug:
                  "Content-Length":191},"method":"post","url":"https://api.amc.husqvarna.dev/v1/mowers/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/calendar","data":"{"data":{"type":"calendar","attributes":{"tasks":
                  [{"start":540,"duration":360,"monday":true,"tuesday":true,"wednesday":false,"thursday":true,"friday":false,"saturday":true,"sunday":false}]}}}"}

                  husqvarna-automower.0
                  2022-08-31 20:33:54.473 info This mower use missions and can not be updated by this endpoint Nothing set

                  [onStateChange]: HTTP status response: 400; headers: {"content-type":"application/vnd.api+json","content-length":"201","connection":"close","date":"Wed, 31 Aug 2022 18:33:54 GMT","
                  x-amzn-requestid":"yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy","x-amzn-remapped-content-length":"201","
                  x-amzn-remapped-connection":"keep-alive","
                  x-amz-apigw-id":"Xvdu7HYxDoEFmmw=","
                  x-amzn-remapped-date":"Wed, 31 Aug 2022 18:33:54 GMT","
                  x-cache":"Error from cloudfront","via":"1.1 969e7c67b62bdfae78f727a06e4512c2.cloudfront.net (CloudFront)","
                  x-amz-cf-pop":"TXL52-C1","x-amz-cf-id":"LPrXqGEaWud_7zyvx6nyYadgtVgNL2mEEuP0giMSJ73MA8MeNuzM7g=="}; data: {"errors":[{"id":"zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzz","
                  status":"400","code":"illegal.argument","title":"Illegal argument","detail":"This mower use missions and can not be updated by this endpoint"}]}

                  A 1 Reply Last reply
                  0
                  • K Kaschi68

                    @thomas-braun

                    Alles erledigt, aber Werte ändern sich nur bei Neustart des Adapters. Selbst wenn der Mower unterwegs ist ändert sich nichts. Developer Acc hat ice987 für mich geprüft. Der ist iO angelegt und verknüpft.

                    Es handelt sich bei den Mower um den AM 415X mit neuster Firmware.

                    Im App werden die Daten ständig aktualisiert, im Adapter nur bei Neustart des Adapters.

                    js-controller ist jetzt 4.0.23 und node bei 16.

                    G Offline
                    G Offline
                    ghifunk
                    wrote on last edited by
                    #344

                    @kaschi68
                    Hallo Kaschi68,
                    ich habe gerade gelesen, daß du auch einen 415X hast. Ich habe ein Problem mit der Übertragung des Zeitplanes an den Mäher..
                    Hast du schon mal ausprobiert ob das bei dir funktioniert? Das würde mich sehr interessieren.
                    Gruß Gerhard

                    K 1 Reply Last reply
                    0
                    • G ghifunk

                      @arnod
                      Hallo, habe jetzt nur den ersten timer stehen gelassen. Es erfolgt auch nur die entsprechende Ausgabe, welche zumindest die richtigen Werte beinhaltet. Es erfolgt aber wieder eine Fehlermeldung.
                      Ich weiß nicht was ich noch machen kann? Oder braucht der 415X ein anders Datenformat?
                      Vielleicht ist doch jemand hier der auch einen 415X hat und evtl. das gleiche Problem...

                      hier der entsprechende Log-Auszug:
                      "Content-Length":191},"method":"post","url":"https://api.amc.husqvarna.dev/v1/mowers/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/calendar","data":"{"data":{"type":"calendar","attributes":{"tasks":
                      [{"start":540,"duration":360,"monday":true,"tuesday":true,"wednesday":false,"thursday":true,"friday":false,"saturday":true,"sunday":false}]}}}"}

                      husqvarna-automower.0
                      2022-08-31 20:33:54.473 info This mower use missions and can not be updated by this endpoint Nothing set

                      [onStateChange]: HTTP status response: 400; headers: {"content-type":"application/vnd.api+json","content-length":"201","connection":"close","date":"Wed, 31 Aug 2022 18:33:54 GMT","
                      x-amzn-requestid":"yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy","x-amzn-remapped-content-length":"201","
                      x-amzn-remapped-connection":"keep-alive","
                      x-amz-apigw-id":"Xvdu7HYxDoEFmmw=","
                      x-amzn-remapped-date":"Wed, 31 Aug 2022 18:33:54 GMT","
                      x-cache":"Error from cloudfront","via":"1.1 969e7c67b62bdfae78f727a06e4512c2.cloudfront.net (CloudFront)","
                      x-amz-cf-pop":"TXL52-C1","x-amz-cf-id":"LPrXqGEaWud_7zyvx6nyYadgtVgNL2mEEuP0giMSJ73MA8MeNuzM7g=="}; data: {"errors":[{"id":"zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzz","
                      status":"400","code":"illegal.argument","title":"Illegal argument","detail":"This mower use missions and can not be updated by this endpoint"}]}

                      A Online
                      A Online
                      ArnoD
                      wrote on last edited by
                      #345

                      @ghifunk
                      Kann auch sein, dass dein Mäher das über die API nicht unterstützt.
                      Du kannst ja mal auf der Husqvarna API Seite mit deiner Mower ID direkt versuchen, ob das funktioniert.
                      Dazu einfach unter POST /mowers/{id}/calendar auf der Seite im Feld ID deine ID eintragen:
                      Husqvarna Connect API

                      1 Reply Last reply
                      0
                      • G ghifunk

                        @kaschi68
                        Hallo Kaschi68,
                        ich habe gerade gelesen, daß du auch einen 415X hast. Ich habe ein Problem mit der Übertragung des Zeitplanes an den Mäher..
                        Hast du schon mal ausprobiert ob das bei dir funktioniert? Das würde mich sehr interessieren.
                        Gruß Gerhard

                        K Offline
                        K Offline
                        Kaschi68
                        wrote on last edited by
                        #346

                        @ghifunk
                        Hallo Gerhard, ich nutze den Mähplan aus dem Adapter nicht. Ich hatte ihn mal getestet, aber bei mir wurden die Mähzeiten (auch) nicht übertragen.
                        Dazu muss ich aber sagen das ich noch ein grösseres Problem hatte. Meine Objekte haben sich nur nach Adapter Neustart aktualisiert.
                        Heute den Fehler gefunden. Ist bisher nicht aufgefallen bei anderen Adaptern. Meine Ordner-Rechte müssen nicht gepasst haben. Nach dem Durchlaufen vom ioBroker Fixer wurden jetzt im Betrieb alle Objekte aktualisiert.
                        Den Mähplan organisiere ich anders, da mein Rolltor auf sein muss, bevor der Mower startet.
                        Ich starte und stoppe über den Adapter Zeitschaltuhr in VIS. Alles andere hat nicht geklappt, da es zu Verzögerungen mit den Statusmeldungen kommt und der Mower sonst das Rolltor einfährt.

                        Gruß und schönen Abend,
                        Kaschi

                        1 Reply Last reply
                        0
                        • A ArnoD

                          @ghifunk sagte in Test Adapter Husqvarna Automower v0.3.x:

                          @arnod
                          Jetzt sehe ich gerade, daß bei mir im Ordner unter dem Ordner schedule nochmal einer mit "0" angelegt ist...!!30-08-_2022_21-45-24.jpg
                          Da passt doch glaube ich was nicht?

                          Das ist so in Ordnung.
                          Es sind vier Timer, die eingestellt werden können, von 0 bis 3.

                          L Offline
                          L Offline
                          lustig29
                          wrote on last edited by
                          #347

                          @arnod Ich bekomme bei irgendwie nur den Datenpunkt Distance from Charingstation angezeigt. Müssten das nicht mehr sein?

                          A 1 Reply Last reply
                          0
                          • L lustig29

                            @arnod Ich bekomme bei irgendwie nur den Datenpunkt Distance from Charingstation angezeigt. Müssten das nicht mehr sein?

                            A Online
                            A Online
                            ArnoD
                            wrote on last edited by
                            #348

                            @lustig29
                            Welches Script verwendest du?
                            Das originale von Github oder das geänderte von mir?
                            Beim Script von Github wurden anscheinend alle Tageswerte entfernt, sei dem im Adapter die "Statistics" Werte hinzugefügt wurden.
                            Wenn ich mein Script optimiert habe, werde ich ice987987 mal fragen, ob er das auf seiner Github Seite verwenden will.

                            Bei meinem Script, das ich ursprünglich von ice987987 übernommen habe, werden noch folgende Objekt ID's angelegt:
                            drivenDistanceToday
                            drivenDistanceTotal
                            chargingTimeToday
                            mowingTimeToday
                            GoogleMapsLink

                            Es werden auch ID's für die Timer angelegt und die Urzeit umgerechnet für die Adapter ID's
                            .calendar.0.duration und .calendar.0.start.

                            Was noch nicht richtig funktioniert, ist die Berechnung der Ladezeiten und gefahrene Distanz.

                            L 1 Reply Last reply
                            0
                            • A ArnoD

                              @lustig29
                              Welches Script verwendest du?
                              Das originale von Github oder das geänderte von mir?
                              Beim Script von Github wurden anscheinend alle Tageswerte entfernt, sei dem im Adapter die "Statistics" Werte hinzugefügt wurden.
                              Wenn ich mein Script optimiert habe, werde ich ice987987 mal fragen, ob er das auf seiner Github Seite verwenden will.

                              Bei meinem Script, das ich ursprünglich von ice987987 übernommen habe, werden noch folgende Objekt ID's angelegt:
                              drivenDistanceToday
                              drivenDistanceTotal
                              chargingTimeToday
                              mowingTimeToday
                              GoogleMapsLink

                              Es werden auch ID's für die Timer angelegt und die Urzeit umgerechnet für die Adapter ID's
                              .calendar.0.duration und .calendar.0.start.

                              Was noch nicht richtig funktioniert, ist die Berechnung der Ladezeiten und gefahrene Distanz.

                              L Offline
                              L Offline
                              lustig29
                              wrote on last edited by
                              #349

                              @arnod Kannst du mir dein Script eventuell zur Verfügung stellen?

                              A 1 Reply Last reply
                              0
                              • L lustig29

                                @arnod Kannst du mir dein Script eventuell zur Verfügung stellen?

                                A Online
                                A Online
                                ArnoD
                                wrote on last edited by
                                #350

                                @lustig29
                                Kein Problem:

                                //***************************************************************************************************
                                //++++++++++++++++++++++++++++++++++++++++  USER ANPASSUNGEN ++++++++++++++++++++++++++++++++++++++++
                                
                                const instanz = '0_userdata.0.';                                // Hier kann die Instanz angepasst werden
                                const PfadEbene1 = 'Husqvarna.';                                // Hier kann der Pfad angepasst werden
                                const PfadEbene2 = ['Statistik.', 'Zeiten.', 'Allgemein.'];     // Hier kann der Pfad angepasst werden
                                const Mower_ID = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'         // Mower ID vom Husqvarna Adapter
                                const sID_Regensensor = 'hm-rpc.3.1.RAINING'                    // Pfad Regensensor true = Regen
                                
                                //++++++++++++++++++++++++++++++++++++++ ENDE USER ANPASSUNGEN ++++++++++++++++++++++++++++++++++++++
                                //***************************************************************************************************
                                
                                
                                let drivenDistanceToday,drivenDistanceTotal,drivenDistance = 0,chargingTimeToday,chargingTimeTotal,chargingTime = 0,mowingTimeToday,mowingTimeTotal,mowingTime = 0;
                                let chargingStationLatitude = 0,chargingStationLongitude = 0,distanceFromChargingStation = 0;
                                
                                // create required folders and states
                                CreateState();
                                async function CreateState(){
                                    for (let i = 0; i <= 3; i++) {
                                        createStateAsync(instanz + PfadEbene1 + PfadEbene2[1] + 'StartZeit_'+i, '00:00', false, {name: 'Schedule '+i+' Start Zeit ', desc: 'Start Zeit Timer '+i, role: 'value', type: 'string', read: true, write: true, def: '00:00', unit: 'Uhr'});
                                        createStateAsync(instanz + PfadEbene1 + PfadEbene2[1] + 'EndZeit_'+i, '00:00', false, {name: 'Schedule '+i+' Ende Zeit ', desc: 'Ende Zeit Timer '+i, role: 'value', type: 'string', read: true, write: true, def: '00:00', unit: 'Uhr'});
                                    }
                                    await createStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'drivenDistanceToday', 0, false, {name: 'Driven Distance Today', desc: 'Driven Distance Today', role: 'state', type: 'number', read: true, write: true, def: 0, unit: 'km'});
                                    await createStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'drivenDistanceTotal', 0, false, {name: 'Driven Distance Total', desc: 'Driven Distance Total', role: 'state', type: 'number', read: true, write: true, def: 0, unit: 'km'});
                                    await createStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'chargingTimeToday', 0, false, {name: 'Charging Time Today', desc: 'Charging Time Today', role: 'state', type: 'number', read: true, write: true, def: 0, unit: 'ms'});
                                    await createStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'mowingTimeToday', 0, false, {name: 'Mowing Time Total', desc: 'Mowing Time Total', role: 'state', type: 'number', read: true, write: true, def: 0, unit: 'ms'});
                                    await createStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'distanceFromChargingStation', 0, false, {name: 'Distance from charging station', desc: 'Distance from charging station', role: 'state', type: 'number', read: true, write: true, def: 0, unit: 'm'});
                                    await createStateAsync(instanz + PfadEbene1 + PfadEbene2[2] + 'GoogleMapsLink', '', false, {name: 'Link für Google Maps', desc: 'Link für Google Maps', role: 'value', type: 'string', read: true, write: true, def: ''});
                                    log('-==== Alle Ordner und State wurden erstellt ====-')
                                    drivenDistanceToday = (await getStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'drivenDistanceToday')).val;
                                    drivenDistanceTotal = (await getStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'drivenDistanceTotal')).val;
                                    chargingTimeToday = (await getStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'chargingTimeToday')).val;
                                    mowingTimeToday = (await getStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'mowingTimeToday')).val;
                                }
                                //******************************************************* Adapter Husqvarna-Automower *******************************************************/
                                const sID_Mower_activity = 'husqvarna-automower.0.' + Mower_ID + '.mower.activity'
                                const sID_Latlong = 'husqvarna-automower.0.' + Mower_ID + '.positions.latlong'
                                const sID_PARKUNTILNEXTSCHEDULE = 'husqvarna-automower.0.' + Mower_ID + '.ACTIONS.PARKUNTILNEXTSCHEDULE'
                                const sID_MoverLatLong = 'husqvarna-automower.0.'+Mower_ID+'.positions.latlong'
                                //************************************************************ Script Husqvarna *************************************************************/
                                const sID_drivenDistanceToday = instanz + PfadEbene1 + PfadEbene2[0] + 'drivenDistanceToday';
                                const sID_drivenDistanceTotal = instanz + PfadEbene1 + PfadEbene2[0] + 'drivenDistanceTotal';
                                const sID_distanceFromChargingStation = instanz + PfadEbene1 + PfadEbene2[0] + 'distanceFromChargingStation';
                                const sID_chargingTimeToday = instanz + PfadEbene1 + PfadEbene2[0] + 'chargingTimeToday';
                                const sID_mowingTimeToday = instanz + PfadEbene1 + PfadEbene2[0] + 'mowingTimeToday';
                                const sID_GoogleLink = instanz + PfadEbene1 + PfadEbene2[2] + 'GoogleMapsLink';
                                const sID_StartZeit_0 = instanz + PfadEbene1 + PfadEbene2[1] + 'StartZeit_0';
                                const sID_EndeZeit_0 = instanz + PfadEbene1 + PfadEbene2[1] + 'EndZeit_0';
                                const sID_StartZeit_1 = instanz + PfadEbene1 + PfadEbene2[1] + 'StartZeit_1';
                                const sID_EndeZeit_1 = instanz + PfadEbene1 + PfadEbene2[1] + 'EndZeit_1';
                                const sID_StartZeit_2 = instanz + PfadEbene1 + PfadEbene2[1] + 'StartZeit_2';
                                const sID_EndeZeit_2 = instanz + PfadEbene1 + PfadEbene2[1] + 'EndZeit_2';
                                const sID_StartZeit_3 = instanz + PfadEbene1 + PfadEbene2[1] + 'StartZeit_3';
                                const sID_EndeZeit_3 = instanz + PfadEbene1 + PfadEbene2[1] + 'EndZeit_3';
                                const arrayID_Zeiten =[sID_StartZeit_0,sID_EndeZeit_0,sID_StartZeit_1,sID_EndeZeit_1,sID_StartZeit_2,sID_EndeZeit_2,sID_StartZeit_3,sID_EndeZeit_3];
                                
                                
                                // reset variables "[...]Today" every midnight
                                schedule('0 0 * * *', function () {
                                    drivenDistanceToday = 0;
                                    setState(sID_drivenDistanceToday, drivenDistanceToday, true);
                                    chargingTimeToday = 0;
                                    setState(sID_chargingTimeToday, chargingTimeToday, true);
                                    mowingTimeToday = 0;
                                    setState(sID_mowingTimeToday, mowingTimeToday, true);
                                });
                                
                                // get chargingTimeToday and chargingTimeTotal
                                on({id: sID_Mower_activity, oldVal: 'CHARGING'}, function (obj) {
                                    chargingTime = obj.state.ts - obj.oldState.ts;
                                    log('chargingTime: ' + chargingTime/1000 + 's', 'debug');
                                    chargingTimeToday = chargingTime + chargingTimeToday;
                                    setState(sID_chargingTimeToday, chargingTimeToday, true);
                                });
                                
                                // get mowingTimeToday and mowingTimeTotal
                                on({id: sID_Mower_activity, oldVal: 'MOWING'}, function (obj) {
                                    mowingTime = obj.state.ts - obj.oldState.ts;
                                    log('mowingTime: ' + mowingTime/1000 + 's', 'debug');
                                    mowingTimeToday = mowingTime + mowingTimeToday;
                                    setState(sID_mowingTimeToday, mowingTimeToday, true);
                                });
                                
                                // get distance from automower to charging station, drivenDistanceToday and drivenDistanceTotal
                                on({id: sID_Latlong, change: 'ne'}, async function (obj) {
                                    if (getState(sID_Mower_activity).val === 'CHARGING' || getState(sID_Mower_activity).val === 'PARKED_IN_CS') {
                                        if (chargingStationLatitude !== 0 && chargingStationLongitude !== 0) {
                                            chargingStationLatitude = (Number(obj.state.val.split(';')[0]) + Number(chargingStationLatitude)) / 2;
                                            chargingStationLongitude = (Number(obj.state.val.split(';')[1]) + Number(chargingStationLongitude)) / 2;
                                        } else {
                                            chargingStationLatitude = obj.state.val.split(';')[0];
                                            chargingStationLongitude = obj.state.val.split(';')[1];
                                        }
                                    } 
                                    distanceFromChargingStation = 1000 * 6378.388 * Math.acos(Math.sin(obj.state.val.split(';')[0] * (Math.PI / 180)) * Math.sin(chargingStationLatitude * (Math.PI / 180)) + Math.cos(obj.state.val.split(';')[0] * (Math.PI / 180)) * Math.cos(chargingStationLatitude * (Math.PI / 180)) * Math.cos(chargingStationLongitude * (Math.PI / 180) - obj.state.val.split(';')[1] * (Math.PI / 180))); // reference: https://www.kompf.de/gps/distcalc.html
                                    log('distanceFromChargingStation: ' + distanceFromChargingStation + 'm', 'debug');
                                    await setStateAsync(sID_distanceFromChargingStation, distanceFromChargingStation, true);
                                    
                                    if (getState(sID_Mower_activity).val === 'MOWING' || getState(sID_Mower_activity).val === 'GOING_HOME' || getState(sID_Mower_activity).val === 'LEAVING') {
                                        drivenDistance = 6378.388 * Math.acos(Math.sin(obj.state.val.split(';')[0] * (Math.PI / 180)) * Math.sin(obj.oldState.val.split(';')[0] * (Math.PI / 180)) + Math.cos(obj.state.val.split(';')[0] * (Math.PI / 180)) * Math.cos(obj.oldState.val.split(';')[0] * (Math.PI / 180)) * Math.cos(obj.oldState.val.split(';')[1] * (Math.PI / 180) - obj.state.val.split(';')[1] * (Math.PI / 180))); // reference: https://www.kompf.de/gps/distcalc.html
                                        log('distanceDriven: ' + drivenDistance + 'km', 'debug');
                                        drivenDistanceToday = drivenDistanceToday + drivenDistance;
                                        drivenDistanceTotal = drivenDistanceTotal + drivenDistance;
                                        await setStateAsync(sID_drivenDistanceToday, round(drivenDistanceToday,2), true);
                                        await setStateAsync(sID_drivenDistanceTotal, round(drivenDistanceTotal,2), true);
                                    }
                                });
                                
                                // Uhrzeiten für StartZeit und EndZeit in Minuten umrechnen und Adapter ID's ändern
                                on({id: arrayID_Zeiten, change: 'ne'}, async function (obj) {
                                    let arryObj_ID = obj.id.split('.')
                                    let ScheduleNr = arryObj_ID[4].substring(arryObj_ID[4].length-1,arryObj_ID[4].length)
                                    let Dauer_min =0, Start_min=0;        
                                    let StartZeit=(await getStateAsync(instanz + PfadEbene1 + PfadEbene2[1] + 'StartZeit_'+ScheduleNr)).val;
                                    let EndeZeit=(await getStateAsync(instanz + PfadEbene1 + PfadEbene2[1] + 'EndZeit_'+ScheduleNr)).val;
                                    
                                    // Uhrzeit wird in Stunden und Minuten geteilt
                                    let arrayStartZeit = StartZeit.split(":");
                                    let arrayEndeZeit = EndeZeit.split(":");
                                    let StartZeit_Stunden = arrayStartZeit[0];   
                                    let EndeZeit_Stunden = arrayEndeZeit[0];   
                                    let StartZeit_Minuten = arrayStartZeit[1];   
                                    let EndeZeit_Minuten = arrayEndeZeit[1];   
                                    
                                    // Umrechnen der Uhrzeit in Minuten seit Tagesbeginn
                                    Start_min = (StartZeit_Stunden *60)+ parseInt(StartZeit_Minuten)
                                    // Umrechnen der Uhrzeit in Minuten von Start bis Ende Zeit (Dauer)
                                    Dauer_min = ((EndeZeit_Stunden *60)+ parseInt(EndeZeit_Minuten))-Start_min
                                    if(Dauer_min <0){Dauer_min = 0;}
                                    await setStateAsync('husqvarna-automower.0.' + Mower_ID + '.ACTIONS.schedule.'+ScheduleNr+'.start',Start_min)
                                    await setStateAsync('husqvarna-automower.0.' + Mower_ID + '.ACTIONS.schedule.'+ScheduleNr+'.duration',Dauer_min)
                                });
                                
                                //Google Maps Link aktualisieren, wenn sich die Koordinaten ändern.
                                on({id: sID_MoverLatLong, change: "ne"}, async function (obj) {
                                    let arryLatLong = getState(obj.id).val.split(';');
                                    let GoogleLink = 'https://www.google.com/maps/place/'+arryLatLong[0]+','+arryLatLong[1]+'/@?hl=de';
                                    await setStateAsync(sID_GoogleLink,GoogleLink);
                                });
                                
                                
                                // Bei Regen Parken bis zum nächsten Start
                                on({id: sID_Regensensor, change: 'ne', val: true}, async function (obj) {
                                   await setStateAsync(sID_PARKUNTILNEXTSCHEDULE,true);
                                   log('-==== Es regnet, Mäher wird geparkt ====-','warn')
                                });
                                
                                // Runden. Parameter float wert, int dez Anzahl der Stellen
                                function round(wert, dez) {
                                    let umrechnungsfaktor = Math.pow(10,dez);
                                    return Math.round(wert * umrechnungsfaktor) / umrechnungsfaktor;
                                } 
                                
                                
                                L 2 Replies Last reply
                                0
                                • A ArnoD

                                  @lustig29
                                  Kein Problem:

                                  //***************************************************************************************************
                                  //++++++++++++++++++++++++++++++++++++++++  USER ANPASSUNGEN ++++++++++++++++++++++++++++++++++++++++
                                  
                                  const instanz = '0_userdata.0.';                                // Hier kann die Instanz angepasst werden
                                  const PfadEbene1 = 'Husqvarna.';                                // Hier kann der Pfad angepasst werden
                                  const PfadEbene2 = ['Statistik.', 'Zeiten.', 'Allgemein.'];     // Hier kann der Pfad angepasst werden
                                  const Mower_ID = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'         // Mower ID vom Husqvarna Adapter
                                  const sID_Regensensor = 'hm-rpc.3.1.RAINING'                    // Pfad Regensensor true = Regen
                                  
                                  //++++++++++++++++++++++++++++++++++++++ ENDE USER ANPASSUNGEN ++++++++++++++++++++++++++++++++++++++
                                  //***************************************************************************************************
                                  
                                  
                                  let drivenDistanceToday,drivenDistanceTotal,drivenDistance = 0,chargingTimeToday,chargingTimeTotal,chargingTime = 0,mowingTimeToday,mowingTimeTotal,mowingTime = 0;
                                  let chargingStationLatitude = 0,chargingStationLongitude = 0,distanceFromChargingStation = 0;
                                  
                                  // create required folders and states
                                  CreateState();
                                  async function CreateState(){
                                      for (let i = 0; i <= 3; i++) {
                                          createStateAsync(instanz + PfadEbene1 + PfadEbene2[1] + 'StartZeit_'+i, '00:00', false, {name: 'Schedule '+i+' Start Zeit ', desc: 'Start Zeit Timer '+i, role: 'value', type: 'string', read: true, write: true, def: '00:00', unit: 'Uhr'});
                                          createStateAsync(instanz + PfadEbene1 + PfadEbene2[1] + 'EndZeit_'+i, '00:00', false, {name: 'Schedule '+i+' Ende Zeit ', desc: 'Ende Zeit Timer '+i, role: 'value', type: 'string', read: true, write: true, def: '00:00', unit: 'Uhr'});
                                      }
                                      await createStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'drivenDistanceToday', 0, false, {name: 'Driven Distance Today', desc: 'Driven Distance Today', role: 'state', type: 'number', read: true, write: true, def: 0, unit: 'km'});
                                      await createStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'drivenDistanceTotal', 0, false, {name: 'Driven Distance Total', desc: 'Driven Distance Total', role: 'state', type: 'number', read: true, write: true, def: 0, unit: 'km'});
                                      await createStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'chargingTimeToday', 0, false, {name: 'Charging Time Today', desc: 'Charging Time Today', role: 'state', type: 'number', read: true, write: true, def: 0, unit: 'ms'});
                                      await createStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'mowingTimeToday', 0, false, {name: 'Mowing Time Total', desc: 'Mowing Time Total', role: 'state', type: 'number', read: true, write: true, def: 0, unit: 'ms'});
                                      await createStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'distanceFromChargingStation', 0, false, {name: 'Distance from charging station', desc: 'Distance from charging station', role: 'state', type: 'number', read: true, write: true, def: 0, unit: 'm'});
                                      await createStateAsync(instanz + PfadEbene1 + PfadEbene2[2] + 'GoogleMapsLink', '', false, {name: 'Link für Google Maps', desc: 'Link für Google Maps', role: 'value', type: 'string', read: true, write: true, def: ''});
                                      log('-==== Alle Ordner und State wurden erstellt ====-')
                                      drivenDistanceToday = (await getStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'drivenDistanceToday')).val;
                                      drivenDistanceTotal = (await getStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'drivenDistanceTotal')).val;
                                      chargingTimeToday = (await getStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'chargingTimeToday')).val;
                                      mowingTimeToday = (await getStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'mowingTimeToday')).val;
                                  }
                                  //******************************************************* Adapter Husqvarna-Automower *******************************************************/
                                  const sID_Mower_activity = 'husqvarna-automower.0.' + Mower_ID + '.mower.activity'
                                  const sID_Latlong = 'husqvarna-automower.0.' + Mower_ID + '.positions.latlong'
                                  const sID_PARKUNTILNEXTSCHEDULE = 'husqvarna-automower.0.' + Mower_ID + '.ACTIONS.PARKUNTILNEXTSCHEDULE'
                                  const sID_MoverLatLong = 'husqvarna-automower.0.'+Mower_ID+'.positions.latlong'
                                  //************************************************************ Script Husqvarna *************************************************************/
                                  const sID_drivenDistanceToday = instanz + PfadEbene1 + PfadEbene2[0] + 'drivenDistanceToday';
                                  const sID_drivenDistanceTotal = instanz + PfadEbene1 + PfadEbene2[0] + 'drivenDistanceTotal';
                                  const sID_distanceFromChargingStation = instanz + PfadEbene1 + PfadEbene2[0] + 'distanceFromChargingStation';
                                  const sID_chargingTimeToday = instanz + PfadEbene1 + PfadEbene2[0] + 'chargingTimeToday';
                                  const sID_mowingTimeToday = instanz + PfadEbene1 + PfadEbene2[0] + 'mowingTimeToday';
                                  const sID_GoogleLink = instanz + PfadEbene1 + PfadEbene2[2] + 'GoogleMapsLink';
                                  const sID_StartZeit_0 = instanz + PfadEbene1 + PfadEbene2[1] + 'StartZeit_0';
                                  const sID_EndeZeit_0 = instanz + PfadEbene1 + PfadEbene2[1] + 'EndZeit_0';
                                  const sID_StartZeit_1 = instanz + PfadEbene1 + PfadEbene2[1] + 'StartZeit_1';
                                  const sID_EndeZeit_1 = instanz + PfadEbene1 + PfadEbene2[1] + 'EndZeit_1';
                                  const sID_StartZeit_2 = instanz + PfadEbene1 + PfadEbene2[1] + 'StartZeit_2';
                                  const sID_EndeZeit_2 = instanz + PfadEbene1 + PfadEbene2[1] + 'EndZeit_2';
                                  const sID_StartZeit_3 = instanz + PfadEbene1 + PfadEbene2[1] + 'StartZeit_3';
                                  const sID_EndeZeit_3 = instanz + PfadEbene1 + PfadEbene2[1] + 'EndZeit_3';
                                  const arrayID_Zeiten =[sID_StartZeit_0,sID_EndeZeit_0,sID_StartZeit_1,sID_EndeZeit_1,sID_StartZeit_2,sID_EndeZeit_2,sID_StartZeit_3,sID_EndeZeit_3];
                                  
                                  
                                  // reset variables "[...]Today" every midnight
                                  schedule('0 0 * * *', function () {
                                      drivenDistanceToday = 0;
                                      setState(sID_drivenDistanceToday, drivenDistanceToday, true);
                                      chargingTimeToday = 0;
                                      setState(sID_chargingTimeToday, chargingTimeToday, true);
                                      mowingTimeToday = 0;
                                      setState(sID_mowingTimeToday, mowingTimeToday, true);
                                  });
                                  
                                  // get chargingTimeToday and chargingTimeTotal
                                  on({id: sID_Mower_activity, oldVal: 'CHARGING'}, function (obj) {
                                      chargingTime = obj.state.ts - obj.oldState.ts;
                                      log('chargingTime: ' + chargingTime/1000 + 's', 'debug');
                                      chargingTimeToday = chargingTime + chargingTimeToday;
                                      setState(sID_chargingTimeToday, chargingTimeToday, true);
                                  });
                                  
                                  // get mowingTimeToday and mowingTimeTotal
                                  on({id: sID_Mower_activity, oldVal: 'MOWING'}, function (obj) {
                                      mowingTime = obj.state.ts - obj.oldState.ts;
                                      log('mowingTime: ' + mowingTime/1000 + 's', 'debug');
                                      mowingTimeToday = mowingTime + mowingTimeToday;
                                      setState(sID_mowingTimeToday, mowingTimeToday, true);
                                  });
                                  
                                  // get distance from automower to charging station, drivenDistanceToday and drivenDistanceTotal
                                  on({id: sID_Latlong, change: 'ne'}, async function (obj) {
                                      if (getState(sID_Mower_activity).val === 'CHARGING' || getState(sID_Mower_activity).val === 'PARKED_IN_CS') {
                                          if (chargingStationLatitude !== 0 && chargingStationLongitude !== 0) {
                                              chargingStationLatitude = (Number(obj.state.val.split(';')[0]) + Number(chargingStationLatitude)) / 2;
                                              chargingStationLongitude = (Number(obj.state.val.split(';')[1]) + Number(chargingStationLongitude)) / 2;
                                          } else {
                                              chargingStationLatitude = obj.state.val.split(';')[0];
                                              chargingStationLongitude = obj.state.val.split(';')[1];
                                          }
                                      } 
                                      distanceFromChargingStation = 1000 * 6378.388 * Math.acos(Math.sin(obj.state.val.split(';')[0] * (Math.PI / 180)) * Math.sin(chargingStationLatitude * (Math.PI / 180)) + Math.cos(obj.state.val.split(';')[0] * (Math.PI / 180)) * Math.cos(chargingStationLatitude * (Math.PI / 180)) * Math.cos(chargingStationLongitude * (Math.PI / 180) - obj.state.val.split(';')[1] * (Math.PI / 180))); // reference: https://www.kompf.de/gps/distcalc.html
                                      log('distanceFromChargingStation: ' + distanceFromChargingStation + 'm', 'debug');
                                      await setStateAsync(sID_distanceFromChargingStation, distanceFromChargingStation, true);
                                      
                                      if (getState(sID_Mower_activity).val === 'MOWING' || getState(sID_Mower_activity).val === 'GOING_HOME' || getState(sID_Mower_activity).val === 'LEAVING') {
                                          drivenDistance = 6378.388 * Math.acos(Math.sin(obj.state.val.split(';')[0] * (Math.PI / 180)) * Math.sin(obj.oldState.val.split(';')[0] * (Math.PI / 180)) + Math.cos(obj.state.val.split(';')[0] * (Math.PI / 180)) * Math.cos(obj.oldState.val.split(';')[0] * (Math.PI / 180)) * Math.cos(obj.oldState.val.split(';')[1] * (Math.PI / 180) - obj.state.val.split(';')[1] * (Math.PI / 180))); // reference: https://www.kompf.de/gps/distcalc.html
                                          log('distanceDriven: ' + drivenDistance + 'km', 'debug');
                                          drivenDistanceToday = drivenDistanceToday + drivenDistance;
                                          drivenDistanceTotal = drivenDistanceTotal + drivenDistance;
                                          await setStateAsync(sID_drivenDistanceToday, round(drivenDistanceToday,2), true);
                                          await setStateAsync(sID_drivenDistanceTotal, round(drivenDistanceTotal,2), true);
                                      }
                                  });
                                  
                                  // Uhrzeiten für StartZeit und EndZeit in Minuten umrechnen und Adapter ID's ändern
                                  on({id: arrayID_Zeiten, change: 'ne'}, async function (obj) {
                                      let arryObj_ID = obj.id.split('.')
                                      let ScheduleNr = arryObj_ID[4].substring(arryObj_ID[4].length-1,arryObj_ID[4].length)
                                      let Dauer_min =0, Start_min=0;        
                                      let StartZeit=(await getStateAsync(instanz + PfadEbene1 + PfadEbene2[1] + 'StartZeit_'+ScheduleNr)).val;
                                      let EndeZeit=(await getStateAsync(instanz + PfadEbene1 + PfadEbene2[1] + 'EndZeit_'+ScheduleNr)).val;
                                      
                                      // Uhrzeit wird in Stunden und Minuten geteilt
                                      let arrayStartZeit = StartZeit.split(":");
                                      let arrayEndeZeit = EndeZeit.split(":");
                                      let StartZeit_Stunden = arrayStartZeit[0];   
                                      let EndeZeit_Stunden = arrayEndeZeit[0];   
                                      let StartZeit_Minuten = arrayStartZeit[1];   
                                      let EndeZeit_Minuten = arrayEndeZeit[1];   
                                      
                                      // Umrechnen der Uhrzeit in Minuten seit Tagesbeginn
                                      Start_min = (StartZeit_Stunden *60)+ parseInt(StartZeit_Minuten)
                                      // Umrechnen der Uhrzeit in Minuten von Start bis Ende Zeit (Dauer)
                                      Dauer_min = ((EndeZeit_Stunden *60)+ parseInt(EndeZeit_Minuten))-Start_min
                                      if(Dauer_min <0){Dauer_min = 0;}
                                      await setStateAsync('husqvarna-automower.0.' + Mower_ID + '.ACTIONS.schedule.'+ScheduleNr+'.start',Start_min)
                                      await setStateAsync('husqvarna-automower.0.' + Mower_ID + '.ACTIONS.schedule.'+ScheduleNr+'.duration',Dauer_min)
                                  });
                                  
                                  //Google Maps Link aktualisieren, wenn sich die Koordinaten ändern.
                                  on({id: sID_MoverLatLong, change: "ne"}, async function (obj) {
                                      let arryLatLong = getState(obj.id).val.split(';');
                                      let GoogleLink = 'https://www.google.com/maps/place/'+arryLatLong[0]+','+arryLatLong[1]+'/@?hl=de';
                                      await setStateAsync(sID_GoogleLink,GoogleLink);
                                  });
                                  
                                  
                                  // Bei Regen Parken bis zum nächsten Start
                                  on({id: sID_Regensensor, change: 'ne', val: true}, async function (obj) {
                                     await setStateAsync(sID_PARKUNTILNEXTSCHEDULE,true);
                                     log('-==== Es regnet, Mäher wird geparkt ====-','warn')
                                  });
                                  
                                  // Runden. Parameter float wert, int dez Anzahl der Stellen
                                  function round(wert, dez) {
                                      let umrechnungsfaktor = Math.pow(10,dez);
                                      return Math.round(wert * umrechnungsfaktor) / umrechnungsfaktor;
                                  } 
                                  
                                  
                                  L Offline
                                  L Offline
                                  lustig29
                                  wrote on last edited by
                                  #351

                                  @arnod Super, vielen Dank 👍🏻

                                  1 Reply Last reply
                                  0
                                  • A ArnoD

                                    @lustig29
                                    Kein Problem:

                                    //***************************************************************************************************
                                    //++++++++++++++++++++++++++++++++++++++++  USER ANPASSUNGEN ++++++++++++++++++++++++++++++++++++++++
                                    
                                    const instanz = '0_userdata.0.';                                // Hier kann die Instanz angepasst werden
                                    const PfadEbene1 = 'Husqvarna.';                                // Hier kann der Pfad angepasst werden
                                    const PfadEbene2 = ['Statistik.', 'Zeiten.', 'Allgemein.'];     // Hier kann der Pfad angepasst werden
                                    const Mower_ID = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'         // Mower ID vom Husqvarna Adapter
                                    const sID_Regensensor = 'hm-rpc.3.1.RAINING'                    // Pfad Regensensor true = Regen
                                    
                                    //++++++++++++++++++++++++++++++++++++++ ENDE USER ANPASSUNGEN ++++++++++++++++++++++++++++++++++++++
                                    //***************************************************************************************************
                                    
                                    
                                    let drivenDistanceToday,drivenDistanceTotal,drivenDistance = 0,chargingTimeToday,chargingTimeTotal,chargingTime = 0,mowingTimeToday,mowingTimeTotal,mowingTime = 0;
                                    let chargingStationLatitude = 0,chargingStationLongitude = 0,distanceFromChargingStation = 0;
                                    
                                    // create required folders and states
                                    CreateState();
                                    async function CreateState(){
                                        for (let i = 0; i <= 3; i++) {
                                            createStateAsync(instanz + PfadEbene1 + PfadEbene2[1] + 'StartZeit_'+i, '00:00', false, {name: 'Schedule '+i+' Start Zeit ', desc: 'Start Zeit Timer '+i, role: 'value', type: 'string', read: true, write: true, def: '00:00', unit: 'Uhr'});
                                            createStateAsync(instanz + PfadEbene1 + PfadEbene2[1] + 'EndZeit_'+i, '00:00', false, {name: 'Schedule '+i+' Ende Zeit ', desc: 'Ende Zeit Timer '+i, role: 'value', type: 'string', read: true, write: true, def: '00:00', unit: 'Uhr'});
                                        }
                                        await createStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'drivenDistanceToday', 0, false, {name: 'Driven Distance Today', desc: 'Driven Distance Today', role: 'state', type: 'number', read: true, write: true, def: 0, unit: 'km'});
                                        await createStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'drivenDistanceTotal', 0, false, {name: 'Driven Distance Total', desc: 'Driven Distance Total', role: 'state', type: 'number', read: true, write: true, def: 0, unit: 'km'});
                                        await createStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'chargingTimeToday', 0, false, {name: 'Charging Time Today', desc: 'Charging Time Today', role: 'state', type: 'number', read: true, write: true, def: 0, unit: 'ms'});
                                        await createStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'mowingTimeToday', 0, false, {name: 'Mowing Time Total', desc: 'Mowing Time Total', role: 'state', type: 'number', read: true, write: true, def: 0, unit: 'ms'});
                                        await createStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'distanceFromChargingStation', 0, false, {name: 'Distance from charging station', desc: 'Distance from charging station', role: 'state', type: 'number', read: true, write: true, def: 0, unit: 'm'});
                                        await createStateAsync(instanz + PfadEbene1 + PfadEbene2[2] + 'GoogleMapsLink', '', false, {name: 'Link für Google Maps', desc: 'Link für Google Maps', role: 'value', type: 'string', read: true, write: true, def: ''});
                                        log('-==== Alle Ordner und State wurden erstellt ====-')
                                        drivenDistanceToday = (await getStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'drivenDistanceToday')).val;
                                        drivenDistanceTotal = (await getStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'drivenDistanceTotal')).val;
                                        chargingTimeToday = (await getStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'chargingTimeToday')).val;
                                        mowingTimeToday = (await getStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'mowingTimeToday')).val;
                                    }
                                    //******************************************************* Adapter Husqvarna-Automower *******************************************************/
                                    const sID_Mower_activity = 'husqvarna-automower.0.' + Mower_ID + '.mower.activity'
                                    const sID_Latlong = 'husqvarna-automower.0.' + Mower_ID + '.positions.latlong'
                                    const sID_PARKUNTILNEXTSCHEDULE = 'husqvarna-automower.0.' + Mower_ID + '.ACTIONS.PARKUNTILNEXTSCHEDULE'
                                    const sID_MoverLatLong = 'husqvarna-automower.0.'+Mower_ID+'.positions.latlong'
                                    //************************************************************ Script Husqvarna *************************************************************/
                                    const sID_drivenDistanceToday = instanz + PfadEbene1 + PfadEbene2[0] + 'drivenDistanceToday';
                                    const sID_drivenDistanceTotal = instanz + PfadEbene1 + PfadEbene2[0] + 'drivenDistanceTotal';
                                    const sID_distanceFromChargingStation = instanz + PfadEbene1 + PfadEbene2[0] + 'distanceFromChargingStation';
                                    const sID_chargingTimeToday = instanz + PfadEbene1 + PfadEbene2[0] + 'chargingTimeToday';
                                    const sID_mowingTimeToday = instanz + PfadEbene1 + PfadEbene2[0] + 'mowingTimeToday';
                                    const sID_GoogleLink = instanz + PfadEbene1 + PfadEbene2[2] + 'GoogleMapsLink';
                                    const sID_StartZeit_0 = instanz + PfadEbene1 + PfadEbene2[1] + 'StartZeit_0';
                                    const sID_EndeZeit_0 = instanz + PfadEbene1 + PfadEbene2[1] + 'EndZeit_0';
                                    const sID_StartZeit_1 = instanz + PfadEbene1 + PfadEbene2[1] + 'StartZeit_1';
                                    const sID_EndeZeit_1 = instanz + PfadEbene1 + PfadEbene2[1] + 'EndZeit_1';
                                    const sID_StartZeit_2 = instanz + PfadEbene1 + PfadEbene2[1] + 'StartZeit_2';
                                    const sID_EndeZeit_2 = instanz + PfadEbene1 + PfadEbene2[1] + 'EndZeit_2';
                                    const sID_StartZeit_3 = instanz + PfadEbene1 + PfadEbene2[1] + 'StartZeit_3';
                                    const sID_EndeZeit_3 = instanz + PfadEbene1 + PfadEbene2[1] + 'EndZeit_3';
                                    const arrayID_Zeiten =[sID_StartZeit_0,sID_EndeZeit_0,sID_StartZeit_1,sID_EndeZeit_1,sID_StartZeit_2,sID_EndeZeit_2,sID_StartZeit_3,sID_EndeZeit_3];
                                    
                                    
                                    // reset variables "[...]Today" every midnight
                                    schedule('0 0 * * *', function () {
                                        drivenDistanceToday = 0;
                                        setState(sID_drivenDistanceToday, drivenDistanceToday, true);
                                        chargingTimeToday = 0;
                                        setState(sID_chargingTimeToday, chargingTimeToday, true);
                                        mowingTimeToday = 0;
                                        setState(sID_mowingTimeToday, mowingTimeToday, true);
                                    });
                                    
                                    // get chargingTimeToday and chargingTimeTotal
                                    on({id: sID_Mower_activity, oldVal: 'CHARGING'}, function (obj) {
                                        chargingTime = obj.state.ts - obj.oldState.ts;
                                        log('chargingTime: ' + chargingTime/1000 + 's', 'debug');
                                        chargingTimeToday = chargingTime + chargingTimeToday;
                                        setState(sID_chargingTimeToday, chargingTimeToday, true);
                                    });
                                    
                                    // get mowingTimeToday and mowingTimeTotal
                                    on({id: sID_Mower_activity, oldVal: 'MOWING'}, function (obj) {
                                        mowingTime = obj.state.ts - obj.oldState.ts;
                                        log('mowingTime: ' + mowingTime/1000 + 's', 'debug');
                                        mowingTimeToday = mowingTime + mowingTimeToday;
                                        setState(sID_mowingTimeToday, mowingTimeToday, true);
                                    });
                                    
                                    // get distance from automower to charging station, drivenDistanceToday and drivenDistanceTotal
                                    on({id: sID_Latlong, change: 'ne'}, async function (obj) {
                                        if (getState(sID_Mower_activity).val === 'CHARGING' || getState(sID_Mower_activity).val === 'PARKED_IN_CS') {
                                            if (chargingStationLatitude !== 0 && chargingStationLongitude !== 0) {
                                                chargingStationLatitude = (Number(obj.state.val.split(';')[0]) + Number(chargingStationLatitude)) / 2;
                                                chargingStationLongitude = (Number(obj.state.val.split(';')[1]) + Number(chargingStationLongitude)) / 2;
                                            } else {
                                                chargingStationLatitude = obj.state.val.split(';')[0];
                                                chargingStationLongitude = obj.state.val.split(';')[1];
                                            }
                                        } 
                                        distanceFromChargingStation = 1000 * 6378.388 * Math.acos(Math.sin(obj.state.val.split(';')[0] * (Math.PI / 180)) * Math.sin(chargingStationLatitude * (Math.PI / 180)) + Math.cos(obj.state.val.split(';')[0] * (Math.PI / 180)) * Math.cos(chargingStationLatitude * (Math.PI / 180)) * Math.cos(chargingStationLongitude * (Math.PI / 180) - obj.state.val.split(';')[1] * (Math.PI / 180))); // reference: https://www.kompf.de/gps/distcalc.html
                                        log('distanceFromChargingStation: ' + distanceFromChargingStation + 'm', 'debug');
                                        await setStateAsync(sID_distanceFromChargingStation, distanceFromChargingStation, true);
                                        
                                        if (getState(sID_Mower_activity).val === 'MOWING' || getState(sID_Mower_activity).val === 'GOING_HOME' || getState(sID_Mower_activity).val === 'LEAVING') {
                                            drivenDistance = 6378.388 * Math.acos(Math.sin(obj.state.val.split(';')[0] * (Math.PI / 180)) * Math.sin(obj.oldState.val.split(';')[0] * (Math.PI / 180)) + Math.cos(obj.state.val.split(';')[0] * (Math.PI / 180)) * Math.cos(obj.oldState.val.split(';')[0] * (Math.PI / 180)) * Math.cos(obj.oldState.val.split(';')[1] * (Math.PI / 180) - obj.state.val.split(';')[1] * (Math.PI / 180))); // reference: https://www.kompf.de/gps/distcalc.html
                                            log('distanceDriven: ' + drivenDistance + 'km', 'debug');
                                            drivenDistanceToday = drivenDistanceToday + drivenDistance;
                                            drivenDistanceTotal = drivenDistanceTotal + drivenDistance;
                                            await setStateAsync(sID_drivenDistanceToday, round(drivenDistanceToday,2), true);
                                            await setStateAsync(sID_drivenDistanceTotal, round(drivenDistanceTotal,2), true);
                                        }
                                    });
                                    
                                    // Uhrzeiten für StartZeit und EndZeit in Minuten umrechnen und Adapter ID's ändern
                                    on({id: arrayID_Zeiten, change: 'ne'}, async function (obj) {
                                        let arryObj_ID = obj.id.split('.')
                                        let ScheduleNr = arryObj_ID[4].substring(arryObj_ID[4].length-1,arryObj_ID[4].length)
                                        let Dauer_min =0, Start_min=0;        
                                        let StartZeit=(await getStateAsync(instanz + PfadEbene1 + PfadEbene2[1] + 'StartZeit_'+ScheduleNr)).val;
                                        let EndeZeit=(await getStateAsync(instanz + PfadEbene1 + PfadEbene2[1] + 'EndZeit_'+ScheduleNr)).val;
                                        
                                        // Uhrzeit wird in Stunden und Minuten geteilt
                                        let arrayStartZeit = StartZeit.split(":");
                                        let arrayEndeZeit = EndeZeit.split(":");
                                        let StartZeit_Stunden = arrayStartZeit[0];   
                                        let EndeZeit_Stunden = arrayEndeZeit[0];   
                                        let StartZeit_Minuten = arrayStartZeit[1];   
                                        let EndeZeit_Minuten = arrayEndeZeit[1];   
                                        
                                        // Umrechnen der Uhrzeit in Minuten seit Tagesbeginn
                                        Start_min = (StartZeit_Stunden *60)+ parseInt(StartZeit_Minuten)
                                        // Umrechnen der Uhrzeit in Minuten von Start bis Ende Zeit (Dauer)
                                        Dauer_min = ((EndeZeit_Stunden *60)+ parseInt(EndeZeit_Minuten))-Start_min
                                        if(Dauer_min <0){Dauer_min = 0;}
                                        await setStateAsync('husqvarna-automower.0.' + Mower_ID + '.ACTIONS.schedule.'+ScheduleNr+'.start',Start_min)
                                        await setStateAsync('husqvarna-automower.0.' + Mower_ID + '.ACTIONS.schedule.'+ScheduleNr+'.duration',Dauer_min)
                                    });
                                    
                                    //Google Maps Link aktualisieren, wenn sich die Koordinaten ändern.
                                    on({id: sID_MoverLatLong, change: "ne"}, async function (obj) {
                                        let arryLatLong = getState(obj.id).val.split(';');
                                        let GoogleLink = 'https://www.google.com/maps/place/'+arryLatLong[0]+','+arryLatLong[1]+'/@?hl=de';
                                        await setStateAsync(sID_GoogleLink,GoogleLink);
                                    });
                                    
                                    
                                    // Bei Regen Parken bis zum nächsten Start
                                    on({id: sID_Regensensor, change: 'ne', val: true}, async function (obj) {
                                       await setStateAsync(sID_PARKUNTILNEXTSCHEDULE,true);
                                       log('-==== Es regnet, Mäher wird geparkt ====-','warn')
                                    });
                                    
                                    // Runden. Parameter float wert, int dez Anzahl der Stellen
                                    function round(wert, dez) {
                                        let umrechnungsfaktor = Math.pow(10,dez);
                                        return Math.round(wert * umrechnungsfaktor) / umrechnungsfaktor;
                                    } 
                                    
                                    
                                    L Offline
                                    L Offline
                                    lustig29
                                    wrote on last edited by
                                    #352

                                    @arnod said in Test Adapter Husqvarna Automower v0.3.x:

                                                                                                                                                                //***************************************************************************************************                                                                                                                                                                            //++++++++++++++++++++++++++++++++++++++++  USER ANPASSUNGEN ++++++++++++++++++++++++++++++++++++++++                                                                                                                                                                                                                                                                                                                                                         const instanz = '0_userdata.0.';                                // Hier kann die Instanz angepasst werden                                                                                                                                                                            const PfadEbene1 = 'Husqvarna.';                                // Hier kann der Pfad angepasst werden                                                                                                                                                                            const PfadEbene2 = ['Statistik.', 'Zeiten.', 'Allgemein.'];     // Hier kann der Pfad angepasst werden                                                                                                                                                                            const Mower_ID = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'         // Mower ID vom Husqvarna Adapter                                                                                                                                                                            const sID_Regensensor = 'hm-rpc.3.1.RAINING'                    // Pfad Regensensor true = Regen                                                                                                                                                                                                                                                                                                                                                         //++++++++++++++++++++++++++++++++++++++ ENDE USER ANPASSUNGEN ++++++++++++++++++++++++++++++++++++++                                                                                                                                                                            //***************************************************************************************************                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      let drivenDistanceToday,drivenDistanceTotal,drivenDistance = 0,chargingTimeToday,chargingTimeTotal,chargingTime = 0,mowingTimeToday,mowingTimeTotal,mowingTime = 0;                                                                                                                                                                            let chargingStationLatitude = 0,chargingStationLongitude = 0,distanceFromChargingStation = 0;                                                                                                                                                                                                                                                                                                                                                         // create required folders and states                                                                                                                                                                            CreateState();                                                                                                                                                                            async function CreateState(){                                                                                                                                                                                for (let i = 0; i <= 3; i++) {                                                                                                                                                                                    createStateAsync(instanz + PfadEbene1 + PfadEbene2[1] + 'StartZeit_'+i, '00:00', false, {name: 'Schedule '+i+' Start Zeit ', desc: 'Start Zeit Timer '+i, role: 'value', type: 'string', read: true, write: true, def: '00:00', unit: 'Uhr'});                                                                                                                                                                                    createStateAsync(instanz + PfadEbene1 + PfadEbene2[1] + 'EndZeit_'+i, '00:00', false, {name: 'Schedule '+i+' Ende Zeit ', desc: 'Ende Zeit Timer '+i, role: 'value', type: 'string', read: true, write: true, def: '00:00', unit: 'Uhr'});                                                                                                                                                                                }                                                                                                                                                                                await createStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'drivenDistanceToday', 0, false, {name: 'Driven Distance Today', desc: 'Driven Distance Today', role: 'state', type: 'number', read: true, write: true, def: 0, unit: 'km'});                                                                                                                                                                                await createStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'drivenDistanceTotal', 0, false, {name: 'Driven Distance Total', desc: 'Driven Distance Total', role: 'state', type: 'number', read: true, write: true, def: 0, unit: 'km'});                                                                                                                                                                                await createStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'chargingTimeToday', 0, false, {name: 'Charging Time Today', desc: 'Charging Time Today', role: 'state', type: 'number', read: true, write: true, def: 0, unit: 'ms'});                                                                                                                                                                                await createStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'mowingTimeToday', 0, false, {name: 'Mowing Time Total', desc: 'Mowing Time Total', role: 'state', type: 'number', read: true, write: true, def: 0, unit: 'ms'});                                                                                                                                                                                await createStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'distanceFromChargingStation', 0, false, {name: 'Distance from charging station', desc: 'Distance from charging station', role: 'state', type: 'number', read: true, write: true, def: 0, unit: 'm'});                                                                                                                                                                                await createStateAsync(instanz + PfadEbene1 + PfadEbene2[2] + 'GoogleMapsLink', '', false, {name: 'Link für Google Maps', desc: 'Link für Google Maps', role: 'value', type: 'string', read: true, write: true, def: ''});                                                                                                                                                                                log('-==== Alle Ordner und State wurden erstellt ====-')                                                                                                                                                                                drivenDistanceToday = (await getStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'drivenDistanceToday')).val;                                                                                                                                                                                drivenDistanceTotal = (await getStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'drivenDistanceTotal')).val;                                                                                                                                                                                chargingTimeToday = (await getStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'chargingTimeToday')).val;                                                                                                                                                                                mowingTimeToday = (await getStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'mowingTimeToday')).val;                                                                                                                                                                            }                                                                                                                                                                            //******************************************************* Adapter Husqvarna-Automower *******************************************************/                                                                                                                                                                            const sID_Mower_activity = 'husqvarna-automower.0.' + Mower_ID + '.mower.activity'                                                                                                                                                                            const sID_Latlong = 'husqvarna-automower.0.' + Mower_ID + '.positions.latlong'                                                                                                                                                                            const sID_PARKUNTILNEXTSCHEDULE = 'husqvarna-automower.0.' + Mower_ID + '.ACTIONS.PARKUNTILNEXTSCHEDULE'                                                                                                                                                                            const sID_MoverLatLong = 'husqvarna-automower.0.'+Mower_ID+'.positions.latlong'                                                                                                                                                                            //************************************************************ Script Husqvarna *************************************************************/                                                                                                                                                                            const sID_drivenDistanceToday = instanz + PfadEbene1 + PfadEbene2[0] + 'drivenDistanceToday';                                                                                                                                                                            const sID_drivenDistanceTotal = instanz + PfadEbene1 + PfadEbene2[0] + 'drivenDistanceTotal';                                                                                                                                                                            const sID_distanceFromChargingStation = instanz + PfadEbene1 + PfadEbene2[0] + 'distanceFromChargingStation';                                                                                                                                                                            const sID_chargingTimeToday = instanz + PfadEbene1 + PfadEbene2[0] + 'chargingTimeToday';                                                                                                                                                                            const sID_mowingTimeToday = instanz + PfadEbene1 + PfadEbene2[0] + 'mowingTimeToday';                                                                                                                                                                            const sID_GoogleLink = instanz + PfadEbene1 + PfadEbene2[2] + 'GoogleMapsLink';                                                                                                                                                                            const sID_StartZeit_0 = instanz + PfadEbene1 + PfadEbene2[1] + 'StartZeit_0';                                                                                                                                                                            const sID_EndeZeit_0 = instanz + PfadEbene1 + PfadEbene2[1] + 'EndZeit_0';                                                                                                                                                                            const sID_StartZeit_1 = instanz + PfadEbene1 + PfadEbene2[1] + 'StartZeit_1';                                                                                                                                                                            const sID_EndeZeit_1 = instanz + PfadEbene1 + PfadEbene2[1] + 'EndZeit_1';                                                                                                                                                                            const sID_StartZeit_2 = instanz + PfadEbene1 + PfadEbene2[1] + 'StartZeit_2';                                                                                                                                                                            const sID_EndeZeit_2 = instanz + PfadEbene1 + PfadEbene2[1] + 'EndZeit_2';                                                                                                                                                                            const sID_StartZeit_3 = instanz + PfadEbene1 + PfadEbene2[1] + 'StartZeit_3';                                                                                                                                                                            const sID_EndeZeit_3 = instanz + PfadEbene1 + PfadEbene2[1] + 'EndZeit_3';                                                                                                                                                                            const arrayID_Zeiten =[sID_StartZeit_0,sID_EndeZeit_0,sID_StartZeit_1,sID_EndeZeit_1,sID_StartZeit_2,sID_EndeZeit_2,sID_StartZeit_3,sID_EndeZeit_3];                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      // reset variables "[...]Today" every midnight                                                                                                                                                                            schedule('0 0 * * *', function () {                                                                                                                                                                                drivenDistanceToday = 0;                                                                                                                                                                                setState(sID_drivenDistanceToday, drivenDistanceToday, true);                                                                                                                                                                                chargingTimeToday = 0;                                                                                                                                                                                setState(sID_chargingTimeToday, chargingTimeToday, true);                                                                                                                                                                                mowingTimeToday = 0;                                                                                                                                                                                setState(sID_mowingTimeToday, mowingTimeToday, true);                                                                                                                                                                            });                                                                                                                                                                                                                                                                                                                                                         // get chargingTimeToday and chargingTimeTotal                                                                                                                                                                            on({id: sID_Mower_activity, oldVal: 'CHARGING'}, function (obj) {                                                                                                                                                                                chargingTime = obj.state.ts - obj.oldState.ts;                                                                                                                                                                                log('chargingTime: ' + chargingTime/1000 + 's', 'debug');                                                                                                                                                                                chargingTimeToday = chargingTime + chargingTimeToday;                                                                                                                                                                                setState(sID_chargingTimeToday, chargingTimeToday, true);                                                                                                                                                                            });                                                                                                                                                                                                                                                                                                                                                         // get mowingTimeToday and mowingTimeTotal                                                                                                                                                                            on({id: sID_Mower_activity, oldVal: 'MOWING'}, function (obj) {                                                                                                                                                                                mowingTime = obj.state.ts - obj.oldState.ts;                                                                                                                                                                                log('mowingTime: ' + mowingTime/1000 + 's', 'debug');                                                                                                                                                                                mowingTimeToday = mowingTime + mowingTimeToday;                                                                                                                                                                                setState(sID_mowingTimeToday, mowingTimeToday, true);                                                                                                                                                                            });                                                                                                                                                                                                                                                                                                                                                         // get distance from automower to charging station, drivenDistanceToday and drivenDistanceTotal                                                                                                                                                                            on({id: sID_Latlong, change: 'ne'}, async function (obj) {                                                                                                                                                                                if (getState(sID_Mower_activity).val === 'CHARGING' || getState(sID_Mower_activity).val === 'PARKED_IN_CS') {                                                                                                                                                                                    if (chargingStationLatitude !== 0 && chargingStationLongitude !== 0) {                                                                                                                                                                                        chargingStationLatitude = (Number(obj.state.val.split(';')[0]) + Number(chargingStationLatitude)) / 2;                                                                                                                                                                                        chargingStationLongitude = (Number(obj.state.val.split(';')[1]) + Number(chargingStationLongitude)) / 2;                                                                                                                                                                                    } else {                                                                                                                                                                                        chargingStationLatitude = obj.state.val.split(';')[0];                                                                                                                                                                                        chargingStationLongitude = obj.state.val.split(';')[1];                                                                                                                                                                                    }                                                                                                                                                                                }                                                                                                                                                                                 distanceFromChargingStation = 1000 * 6378.388 * Math.acos(Math.sin(obj.state.val.split(';')[0] * (Math.PI / 180)) * Math.sin(chargingStationLatitude * (Math.PI / 180)) + Math.cos(obj.state.val.split(';')[0] * (Math.PI / 180)) * Math.cos(chargingStationLatitude * (Math.PI / 180)) * Math.cos(chargingStationLongitude * (Math.PI / 180) - obj.state.val.split(';')[1] * (Math.PI / 180))); // reference: https://www.kompf.de/gps/distcalc.html                                                                                                                                                                                log('distanceFromChargingStation: ' + distanceFromChargingStation + 'm', 'debug');                                                                                                                                                                                await setStateAsync(sID_distanceFromChargingStation, distanceFromChargingStation, true);                                                                                                                                                                                                                                                                                                                                                                if (getState(sID_Mower_activity).val === 'MOWING' || getState(sID_Mower_activity).val === 'GOING_HOME' || getState(sID_Mower_activity).val === 'LEAVING') {                                                                                                                                                                                    drivenDistance = 6378.388 * Math.acos(Math.sin(obj.state.val.split(';')[0] * (Math.PI / 180)) * Math.sin(obj.oldState.val.split(';')[0] * (Math.PI / 180)) + Math.cos(obj.state.val.split(';')[0] * (Math.PI / 180)) * Math.cos(obj.oldState.val.split(';')[0] * (Math.PI / 180)) * Math.cos(obj.oldState.val.split(';')[1] * (Math.PI / 180) - obj.state.val.split(';')[1] * (Math.PI / 180))); // reference: https://www.kompf.de/gps/distcalc.html                                                                                                                                                                                    log('distanceDriven: ' + drivenDistance + 'km', 'debug');                                                                                                                                                                                    drivenDistanceToday = drivenDistanceToday + drivenDistance;                                                                                                                                                                                    drivenDistanceTotal = drivenDistanceTotal + drivenDistance;                                                                                                                                                                                    await setStateAsync(sID_drivenDistanceToday, round(drivenDistanceToday,2), true);                                                                                                                                                                                    await setStateAsync(sID_drivenDistanceTotal, round(drivenDistanceTotal,2), true);                                                                                                                                                                                }                                                                                                                                                                            });                                                                                                                                                                                                                                                                                                                                                         // Uhrzeiten für StartZeit und EndZeit in Minuten umrechnen und Adapter ID's ändern                                                                                                                                                                            on({id: arrayID_Zeiten, change: 'ne'}, async function (obj) {                                                                                                                                                                                let arryObj_ID = obj.id.split('.')                                                                                                                                                                                let ScheduleNr = arryObj_ID[4].substring(arryObj_ID[4].length-1,arryObj_ID[4].length)                                                                                                                                                                                let Dauer_min =0, Start_min=0;                                                                                                                                                                                        let StartZeit=(await getStateAsync(instanz + PfadEbene1 + PfadEbene2[1] + 'StartZeit_'+ScheduleNr)).val;                                                                                                                                                                                let EndeZeit=(await getStateAsync(instanz + PfadEbene1 + PfadEbene2[1] + 'EndZeit_'+ScheduleNr)).val;                                                                                                                                                                                                                                                                                                                                                                // Uhrzeit wird in Stunden und Minuten geteilt                                                                                                                                                                                let arrayStartZeit = StartZeit.split(":");                                                                                                                                                                                let arrayEndeZeit = EndeZeit.split(":");                                                                                                                                                                                let StartZeit_Stunden = arrayStartZeit[0];                                                                                                                                                                                   let EndeZeit_Stunden = arrayEndeZeit[0];                                                                                                                                                                                   let StartZeit_Minuten = arrayStartZeit[1];                                                                                                                                                                                   let EndeZeit_Minuten = arrayEndeZeit[1];                                                                                                                                                                                                                                                                                                                                                                   // Umrechnen der Uhrzeit in Minuten seit Tagesbeginn                                                                                                                                                                                Start_min = (StartZeit_Stunden *60)+ parseInt(StartZeit_Minuten)                                                                                                                                                                                // Umrechnen der Uhrzeit in Minuten von Start bis Ende Zeit (Dauer)                                                                                                                                                                                Dauer_min = ((EndeZeit_Stunden *60)+ parseInt(EndeZeit_Minuten))-Start_min                                                                                                                                                                                if(Dauer_min <0){Dauer_min = 0;}                                                                                                                                                                                await setStateAsync('husqvarna-automower.0.' + Mower_ID + '.ACTIONS.schedule.'+ScheduleNr+'.start',Start_min)                                                                                                                                                                                await setStateAsync('husqvarna-automower.0.' + Mower_ID + '.ACTIONS.schedule.'+ScheduleNr+'.duration',Dauer_min)                                                                                                                                                                            });                                                                                                                                                                                                                                                                                                                                                         //Google Maps Link aktualisieren, wenn sich die Koordinaten ändern.                                                                                                                                                                            on({id: sID_MoverLatLong, change: "ne"}, async function (obj) {                                                                                                                                                                                let arryLatLong = getState(obj.id).val.split(';');                                                                                                                                                                                let GoogleLink = 'https://www.google.com/maps/place/'+arryLatLong[0]+','+arryLatLong[1]+'/@?hl=de';                                                                                                                                                                                await setStateAsync(sID_GoogleLink,GoogleLink);                                                                                                                                                                            });                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      // Bei Regen Parken bis zum nächsten Start                                                                                                                                                                            on({id: sID_Regensensor, change: 'ne', val: true}, async function (obj) {                                                                                                                                                                               await setStateAsync(sID_PARKUNTILNEXTSCHEDULE,true);                                                                                                                                                                               log('-==== Es regnet, Mäher wird geparkt ====-','warn')                                                                                                                                                                            });                                                                                                                                                                                                                                                                                                                                                         // Runden. Parameter float wert, int dez Anzahl der Stellen                                                                                                                                                                            function round(wert, dez) {                                                                                                                                                                                let umrechnungsfaktor = Math.pow(10,dez);                                                                                                                                                                                return Math.round(wert * umrechnungsfaktor) / umrechnungsfaktor;                                                                                                                                                                            }                                                                                                                                                                                                                          
                                    

                                    Nochmal danke für dein Skript. Hat auch funktioniert. Datenpunkte wurden agelegt. Aber leider sind sie nicht beschrieben wurden. Muss ich in dem Skript ausser der Mover Id noch was eingeben?

                                    A 1 Reply Last reply
                                    0
                                    • L lustig29

                                      @arnod said in Test Adapter Husqvarna Automower v0.3.x:

                                                                                                                                                                  //***************************************************************************************************                                                                                                                                                                            //++++++++++++++++++++++++++++++++++++++++  USER ANPASSUNGEN ++++++++++++++++++++++++++++++++++++++++                                                                                                                                                                                                                                                                                                                                                         const instanz = '0_userdata.0.';                                // Hier kann die Instanz angepasst werden                                                                                                                                                                            const PfadEbene1 = 'Husqvarna.';                                // Hier kann der Pfad angepasst werden                                                                                                                                                                            const PfadEbene2 = ['Statistik.', 'Zeiten.', 'Allgemein.'];     // Hier kann der Pfad angepasst werden                                                                                                                                                                            const Mower_ID = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'         // Mower ID vom Husqvarna Adapter                                                                                                                                                                            const sID_Regensensor = 'hm-rpc.3.1.RAINING'                    // Pfad Regensensor true = Regen                                                                                                                                                                                                                                                                                                                                                         //++++++++++++++++++++++++++++++++++++++ ENDE USER ANPASSUNGEN ++++++++++++++++++++++++++++++++++++++                                                                                                                                                                            //***************************************************************************************************                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      let drivenDistanceToday,drivenDistanceTotal,drivenDistance = 0,chargingTimeToday,chargingTimeTotal,chargingTime = 0,mowingTimeToday,mowingTimeTotal,mowingTime = 0;                                                                                                                                                                            let chargingStationLatitude = 0,chargingStationLongitude = 0,distanceFromChargingStation = 0;                                                                                                                                                                                                                                                                                                                                                         // create required folders and states                                                                                                                                                                            CreateState();                                                                                                                                                                            async function CreateState(){                                                                                                                                                                                for (let i = 0; i <= 3; i++) {                                                                                                                                                                                    createStateAsync(instanz + PfadEbene1 + PfadEbene2[1] + 'StartZeit_'+i, '00:00', false, {name: 'Schedule '+i+' Start Zeit ', desc: 'Start Zeit Timer '+i, role: 'value', type: 'string', read: true, write: true, def: '00:00', unit: 'Uhr'});                                                                                                                                                                                    createStateAsync(instanz + PfadEbene1 + PfadEbene2[1] + 'EndZeit_'+i, '00:00', false, {name: 'Schedule '+i+' Ende Zeit ', desc: 'Ende Zeit Timer '+i, role: 'value', type: 'string', read: true, write: true, def: '00:00', unit: 'Uhr'});                                                                                                                                                                                }                                                                                                                                                                                await createStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'drivenDistanceToday', 0, false, {name: 'Driven Distance Today', desc: 'Driven Distance Today', role: 'state', type: 'number', read: true, write: true, def: 0, unit: 'km'});                                                                                                                                                                                await createStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'drivenDistanceTotal', 0, false, {name: 'Driven Distance Total', desc: 'Driven Distance Total', role: 'state', type: 'number', read: true, write: true, def: 0, unit: 'km'});                                                                                                                                                                                await createStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'chargingTimeToday', 0, false, {name: 'Charging Time Today', desc: 'Charging Time Today', role: 'state', type: 'number', read: true, write: true, def: 0, unit: 'ms'});                                                                                                                                                                                await createStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'mowingTimeToday', 0, false, {name: 'Mowing Time Total', desc: 'Mowing Time Total', role: 'state', type: 'number', read: true, write: true, def: 0, unit: 'ms'});                                                                                                                                                                                await createStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'distanceFromChargingStation', 0, false, {name: 'Distance from charging station', desc: 'Distance from charging station', role: 'state', type: 'number', read: true, write: true, def: 0, unit: 'm'});                                                                                                                                                                                await createStateAsync(instanz + PfadEbene1 + PfadEbene2[2] + 'GoogleMapsLink', '', false, {name: 'Link für Google Maps', desc: 'Link für Google Maps', role: 'value', type: 'string', read: true, write: true, def: ''});                                                                                                                                                                                log('-==== Alle Ordner und State wurden erstellt ====-')                                                                                                                                                                                drivenDistanceToday = (await getStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'drivenDistanceToday')).val;                                                                                                                                                                                drivenDistanceTotal = (await getStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'drivenDistanceTotal')).val;                                                                                                                                                                                chargingTimeToday = (await getStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'chargingTimeToday')).val;                                                                                                                                                                                mowingTimeToday = (await getStateAsync(instanz + PfadEbene1 + PfadEbene2[0] + 'mowingTimeToday')).val;                                                                                                                                                                            }                                                                                                                                                                            //******************************************************* Adapter Husqvarna-Automower *******************************************************/                                                                                                                                                                            const sID_Mower_activity = 'husqvarna-automower.0.' + Mower_ID + '.mower.activity'                                                                                                                                                                            const sID_Latlong = 'husqvarna-automower.0.' + Mower_ID + '.positions.latlong'                                                                                                                                                                            const sID_PARKUNTILNEXTSCHEDULE = 'husqvarna-automower.0.' + Mower_ID + '.ACTIONS.PARKUNTILNEXTSCHEDULE'                                                                                                                                                                            const sID_MoverLatLong = 'husqvarna-automower.0.'+Mower_ID+'.positions.latlong'                                                                                                                                                                            //************************************************************ Script Husqvarna *************************************************************/                                                                                                                                                                            const sID_drivenDistanceToday = instanz + PfadEbene1 + PfadEbene2[0] + 'drivenDistanceToday';                                                                                                                                                                            const sID_drivenDistanceTotal = instanz + PfadEbene1 + PfadEbene2[0] + 'drivenDistanceTotal';                                                                                                                                                                            const sID_distanceFromChargingStation = instanz + PfadEbene1 + PfadEbene2[0] + 'distanceFromChargingStation';                                                                                                                                                                            const sID_chargingTimeToday = instanz + PfadEbene1 + PfadEbene2[0] + 'chargingTimeToday';                                                                                                                                                                            const sID_mowingTimeToday = instanz + PfadEbene1 + PfadEbene2[0] + 'mowingTimeToday';                                                                                                                                                                            const sID_GoogleLink = instanz + PfadEbene1 + PfadEbene2[2] + 'GoogleMapsLink';                                                                                                                                                                            const sID_StartZeit_0 = instanz + PfadEbene1 + PfadEbene2[1] + 'StartZeit_0';                                                                                                                                                                            const sID_EndeZeit_0 = instanz + PfadEbene1 + PfadEbene2[1] + 'EndZeit_0';                                                                                                                                                                            const sID_StartZeit_1 = instanz + PfadEbene1 + PfadEbene2[1] + 'StartZeit_1';                                                                                                                                                                            const sID_EndeZeit_1 = instanz + PfadEbene1 + PfadEbene2[1] + 'EndZeit_1';                                                                                                                                                                            const sID_StartZeit_2 = instanz + PfadEbene1 + PfadEbene2[1] + 'StartZeit_2';                                                                                                                                                                            const sID_EndeZeit_2 = instanz + PfadEbene1 + PfadEbene2[1] + 'EndZeit_2';                                                                                                                                                                            const sID_StartZeit_3 = instanz + PfadEbene1 + PfadEbene2[1] + 'StartZeit_3';                                                                                                                                                                            const sID_EndeZeit_3 = instanz + PfadEbene1 + PfadEbene2[1] + 'EndZeit_3';                                                                                                                                                                            const arrayID_Zeiten =[sID_StartZeit_0,sID_EndeZeit_0,sID_StartZeit_1,sID_EndeZeit_1,sID_StartZeit_2,sID_EndeZeit_2,sID_StartZeit_3,sID_EndeZeit_3];                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      // reset variables "[...]Today" every midnight                                                                                                                                                                            schedule('0 0 * * *', function () {                                                                                                                                                                                drivenDistanceToday = 0;                                                                                                                                                                                setState(sID_drivenDistanceToday, drivenDistanceToday, true);                                                                                                                                                                                chargingTimeToday = 0;                                                                                                                                                                                setState(sID_chargingTimeToday, chargingTimeToday, true);                                                                                                                                                                                mowingTimeToday = 0;                                                                                                                                                                                setState(sID_mowingTimeToday, mowingTimeToday, true);                                                                                                                                                                            });                                                                                                                                                                                                                                                                                                                                                         // get chargingTimeToday and chargingTimeTotal                                                                                                                                                                            on({id: sID_Mower_activity, oldVal: 'CHARGING'}, function (obj) {                                                                                                                                                                                chargingTime = obj.state.ts - obj.oldState.ts;                                                                                                                                                                                log('chargingTime: ' + chargingTime/1000 + 's', 'debug');                                                                                                                                                                                chargingTimeToday = chargingTime + chargingTimeToday;                                                                                                                                                                                setState(sID_chargingTimeToday, chargingTimeToday, true);                                                                                                                                                                            });                                                                                                                                                                                                                                                                                                                                                         // get mowingTimeToday and mowingTimeTotal                                                                                                                                                                            on({id: sID_Mower_activity, oldVal: 'MOWING'}, function (obj) {                                                                                                                                                                                mowingTime = obj.state.ts - obj.oldState.ts;                                                                                                                                                                                log('mowingTime: ' + mowingTime/1000 + 's', 'debug');                                                                                                                                                                                mowingTimeToday = mowingTime + mowingTimeToday;                                                                                                                                                                                setState(sID_mowingTimeToday, mowingTimeToday, true);                                                                                                                                                                            });                                                                                                                                                                                                                                                                                                                                                         // get distance from automower to charging station, drivenDistanceToday and drivenDistanceTotal                                                                                                                                                                            on({id: sID_Latlong, change: 'ne'}, async function (obj) {                                                                                                                                                                                if (getState(sID_Mower_activity).val === 'CHARGING' || getState(sID_Mower_activity).val === 'PARKED_IN_CS') {                                                                                                                                                                                    if (chargingStationLatitude !== 0 && chargingStationLongitude !== 0) {                                                                                                                                                                                        chargingStationLatitude = (Number(obj.state.val.split(';')[0]) + Number(chargingStationLatitude)) / 2;                                                                                                                                                                                        chargingStationLongitude = (Number(obj.state.val.split(';')[1]) + Number(chargingStationLongitude)) / 2;                                                                                                                                                                                    } else {                                                                                                                                                                                        chargingStationLatitude = obj.state.val.split(';')[0];                                                                                                                                                                                        chargingStationLongitude = obj.state.val.split(';')[1];                                                                                                                                                                                    }                                                                                                                                                                                }                                                                                                                                                                                 distanceFromChargingStation = 1000 * 6378.388 * Math.acos(Math.sin(obj.state.val.split(';')[0] * (Math.PI / 180)) * Math.sin(chargingStationLatitude * (Math.PI / 180)) + Math.cos(obj.state.val.split(';')[0] * (Math.PI / 180)) * Math.cos(chargingStationLatitude * (Math.PI / 180)) * Math.cos(chargingStationLongitude * (Math.PI / 180) - obj.state.val.split(';')[1] * (Math.PI / 180))); // reference: https://www.kompf.de/gps/distcalc.html                                                                                                                                                                                log('distanceFromChargingStation: ' + distanceFromChargingStation + 'm', 'debug');                                                                                                                                                                                await setStateAsync(sID_distanceFromChargingStation, distanceFromChargingStation, true);                                                                                                                                                                                                                                                                                                                                                                if (getState(sID_Mower_activity).val === 'MOWING' || getState(sID_Mower_activity).val === 'GOING_HOME' || getState(sID_Mower_activity).val === 'LEAVING') {                                                                                                                                                                                    drivenDistance = 6378.388 * Math.acos(Math.sin(obj.state.val.split(';')[0] * (Math.PI / 180)) * Math.sin(obj.oldState.val.split(';')[0] * (Math.PI / 180)) + Math.cos(obj.state.val.split(';')[0] * (Math.PI / 180)) * Math.cos(obj.oldState.val.split(';')[0] * (Math.PI / 180)) * Math.cos(obj.oldState.val.split(';')[1] * (Math.PI / 180) - obj.state.val.split(';')[1] * (Math.PI / 180))); // reference: https://www.kompf.de/gps/distcalc.html                                                                                                                                                                                    log('distanceDriven: ' + drivenDistance + 'km', 'debug');                                                                                                                                                                                    drivenDistanceToday = drivenDistanceToday + drivenDistance;                                                                                                                                                                                    drivenDistanceTotal = drivenDistanceTotal + drivenDistance;                                                                                                                                                                                    await setStateAsync(sID_drivenDistanceToday, round(drivenDistanceToday,2), true);                                                                                                                                                                                    await setStateAsync(sID_drivenDistanceTotal, round(drivenDistanceTotal,2), true);                                                                                                                                                                                }                                                                                                                                                                            });                                                                                                                                                                                                                                                                                                                                                         // Uhrzeiten für StartZeit und EndZeit in Minuten umrechnen und Adapter ID's ändern                                                                                                                                                                            on({id: arrayID_Zeiten, change: 'ne'}, async function (obj) {                                                                                                                                                                                let arryObj_ID = obj.id.split('.')                                                                                                                                                                                let ScheduleNr = arryObj_ID[4].substring(arryObj_ID[4].length-1,arryObj_ID[4].length)                                                                                                                                                                                let Dauer_min =0, Start_min=0;                                                                                                                                                                                        let StartZeit=(await getStateAsync(instanz + PfadEbene1 + PfadEbene2[1] + 'StartZeit_'+ScheduleNr)).val;                                                                                                                                                                                let EndeZeit=(await getStateAsync(instanz + PfadEbene1 + PfadEbene2[1] + 'EndZeit_'+ScheduleNr)).val;                                                                                                                                                                                                                                                                                                                                                                // Uhrzeit wird in Stunden und Minuten geteilt                                                                                                                                                                                let arrayStartZeit = StartZeit.split(":");                                                                                                                                                                                let arrayEndeZeit = EndeZeit.split(":");                                                                                                                                                                                let StartZeit_Stunden = arrayStartZeit[0];                                                                                                                                                                                   let EndeZeit_Stunden = arrayEndeZeit[0];                                                                                                                                                                                   let StartZeit_Minuten = arrayStartZeit[1];                                                                                                                                                                                   let EndeZeit_Minuten = arrayEndeZeit[1];                                                                                                                                                                                                                                                                                                                                                                   // Umrechnen der Uhrzeit in Minuten seit Tagesbeginn                                                                                                                                                                                Start_min = (StartZeit_Stunden *60)+ parseInt(StartZeit_Minuten)                                                                                                                                                                                // Umrechnen der Uhrzeit in Minuten von Start bis Ende Zeit (Dauer)                                                                                                                                                                                Dauer_min = ((EndeZeit_Stunden *60)+ parseInt(EndeZeit_Minuten))-Start_min                                                                                                                                                                                if(Dauer_min <0){Dauer_min = 0;}                                                                                                                                                                                await setStateAsync('husqvarna-automower.0.' + Mower_ID + '.ACTIONS.schedule.'+ScheduleNr+'.start',Start_min)                                                                                                                                                                                await setStateAsync('husqvarna-automower.0.' + Mower_ID + '.ACTIONS.schedule.'+ScheduleNr+'.duration',Dauer_min)                                                                                                                                                                            });                                                                                                                                                                                                                                                                                                                                                         //Google Maps Link aktualisieren, wenn sich die Koordinaten ändern.                                                                                                                                                                            on({id: sID_MoverLatLong, change: "ne"}, async function (obj) {                                                                                                                                                                                let arryLatLong = getState(obj.id).val.split(';');                                                                                                                                                                                let GoogleLink = 'https://www.google.com/maps/place/'+arryLatLong[0]+','+arryLatLong[1]+'/@?hl=de';                                                                                                                                                                                await setStateAsync(sID_GoogleLink,GoogleLink);                                                                                                                                                                            });                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      // Bei Regen Parken bis zum nächsten Start                                                                                                                                                                            on({id: sID_Regensensor, change: 'ne', val: true}, async function (obj) {                                                                                                                                                                               await setStateAsync(sID_PARKUNTILNEXTSCHEDULE,true);                                                                                                                                                                               log('-==== Es regnet, Mäher wird geparkt ====-','warn')                                                                                                                                                                            });                                                                                                                                                                                                                                                                                                                                                         // Runden. Parameter float wert, int dez Anzahl der Stellen                                                                                                                                                                            function round(wert, dez) {                                                                                                                                                                                let umrechnungsfaktor = Math.pow(10,dez);                                                                                                                                                                                return Math.round(wert * umrechnungsfaktor) / umrechnungsfaktor;                                                                                                                                                                            }                                                                                                                                                                                                                          
                                      

                                      Nochmal danke für dein Skript. Hat auch funktioniert. Datenpunkte wurden agelegt. Aber leider sind sie nicht beschrieben wurden. Muss ich in dem Skript ausser der Mover Id noch was eingeben?

                                      A Online
                                      A Online
                                      ArnoD
                                      wrote on last edited by
                                      #353

                                      @lustig29
                                      Eigentlich nicht, außer der Adapter Husqvarna hat bei dir eine andere Instanz als 0, dann musst du das noch bei

                                      //******************************************************* Adapter Husqvarna-Automower *******************************************************/
                                      

                                      Einstellen und husqvarna-automower.0. in husqvarna-automower.1. ändern.

                                      1 Reply Last reply
                                      0
                                      • greyhoundG greyhound

                                        Möchte euch meinen ersten Adapter vorstellen. Die Idee, mein Skript vom Vorjahr mal schnell in einen Adapter zu transferieren, hat sich dann doch schnell als größere Aufgabe mit Missverständnissen und viel Lesen herausgestellt. Danke auch an die Unterstützer, als mich die Blindheit schlug.

                                        Ich habe den Adapter jetzt mit 2 Mähern im produktiven Einsatz.

                                        Voraussetzung ist ein Automower mit Connectmodul und ein Konto bei Husqvarna, welches auch für die Nutzung der Handy-App benötigt wird.

                                        Ich habe mir ein spezielles Konto für ioBroker angelegt und die Mäher hinzugefügt, weil es des öfteren vor kam, dass ich in der Handy-App abgemeldet war, was aber auch an meinen vielen Tests mit an- und abmelden gelegen haben kann.

                                        Zu finden ist der Adapter unter https://github.com/truegreyhound/ioBrok … -automower

                                        Ich hoffe, ich habe die Vorgaben der Adapter-Entwicklung eingehalten. Habe aber nicht so ganz verstanden, was der Unterschied zwischen index.html und index_m.html sein soll. Alter/neuer ioBroker.admin?

                                        Final müssten wohl auch noch einige Übersetzungen in word.js ergänzt werden, englisch und deutsch ist zumindest enthalten.

                                        Bei bestimmten Ereignissen werden speziell formatierte Nachrichten in den State mower.sendMessage geschrieben. Ggf. kann das intelligenter gelöst werden. In meinem Skript habe ich an den Stellen prioritätsabhängig Messages via Telegram versendet. Diese Funktionalität bilde ich nun mit einem kleinen Skript mit einer Subscription auf diesen State nach.

                                        Über Kritik, Anregungen und Fehlermeldungen werde ich gern hinwegsehen. :shock: ;)

                                        Ne, bin ich gespannt und offen.

                                        Bin gerade an der Überarbeitung meiner Views, werde demnächst ein paar Screenshots reinstellen.

                                        Gruß

                                        GH

                                        S Offline
                                        S Offline
                                        schmidti
                                        wrote on last edited by schmidti
                                        #354

                                        @greyhound

                                        Hi,
                                        ich wollte das Modul in Betrieb nehmen, leider kommt diese Fehlermeldung.

                                        updateStatus mower object is NULL
                                        

                                        Kann mir jemand sagen, was das sein könnte?

                                        VG
                                        Schmidti

                                        1 Reply Last reply
                                        0
                                        • A Offline
                                          A Offline
                                          AndreasW63
                                          wrote on last edited by
                                          #355

                                          Hallo,

                                          ich würde gerne den Adapter "husqvarna-automower v0.3.3-beta.1"
                                          mit unserem Husqvarna Automower 405x "Firmware 5995776-12D_P16-SwPkg_47.11 (2023-03)" in Betrieb nehmen.

                                          Der verwendete iobroker ist in folgender Version vorhanden:
                                          iobroker Admin v6.3.5
                                          Node.js: v16.18.1
                                          NPM: 8.19.2

                                          Einen Application-Key und ein Application-Secret habe ich mir bei developer.husqvarana.com erstellt.

                                          Die Instanz wird gestartet und scheint auch Daten abzurufen, allerdings bleibt der Status der Instanz immer bei einem
                                          gelben Ausrufenzeichen.

                                          Sind Einstellungen an den Instanzen Websocket und Socket.io generell notwendig, oder nur dann, wenn ich Daten an den 405x senden möchte?

                                          Gruß Andreas

                                          C 1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          803

                                          Online

                                          32.4k

                                          Users

                                          81.5k

                                          Topics

                                          1.3m

                                          Posts
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Home
                                          • Recent
                                          • Tags
                                          • Unread 0
                                          • Categories
                                          • Unreplied
                                          • Popular
                                          • GitHub
                                          • Docu
                                          • Hilfe