Skip to content
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • 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

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo
  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.2k

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

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

Test Adapter Husqvarna Automower v0.3.x

Geplant Angeheftet Gesperrt Verschoben Tester
husqvarnaautomower
439 Beiträge 73 Kommentatoren 104.5k Aufrufe 62 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • 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.

    G Offline
    G Offline
    ghifunk
    schrieb am zuletzt editiert von
    #333

    @arnod zurück, das war der Task0...

    1 Antwort Letzte Antwort
    0
    • G ghifunk

      @arnod
      Hallo, eine Frage:
      Ich habe den Automower 415X und bekomme den Zeitplan auss der Vis nicht an den Mäher übertragen.
      Hat das Problem noch jemand mit dem Gerät oder geht es nur bei mir nicht?
      Die mit der App eingestellten Mähtage werden in den kleinen Markierungen neben den Tagen grün
      eingetragen aber die Werte aus der Visu erreichen den Mäher nicht.
      vieleicht kann jemand helfen?
      Gruß Gerhard

      A Offline
      A Offline
      ArnoD
      schrieb am zuletzt editiert von
      #334

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

      Die mit der App eingestellten Mähtage werden in den kleinen Markierungen neben den Tagen grün
      eingetragen aber die Werte aus der Visu erreichen den Mäher nicht.

      Wenn die kleinen Markierungen grün sind, wurde das auch an den Mäher übertragen.
      Diese Felder verweisen auf die ID husqvarna-automower.0.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxxxxxxx.calendar
      0 bis 3 und das sind Werte die vom Mäher kommen.

      303d6a84-3560-4f2e-908c-23e59dc84689-grafik.png

      G 1 Antwort Letzte Antwort
      0
      • A ArnoD

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

        Die mit der App eingestellten Mähtage werden in den kleinen Markierungen neben den Tagen grün
        eingetragen aber die Werte aus der Visu erreichen den Mäher nicht.

        Wenn die kleinen Markierungen grün sind, wurde das auch an den Mäher übertragen.
        Diese Felder verweisen auf die ID husqvarna-automower.0.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxxxxxxx.calendar
        0 bis 3 und das sind Werte die vom Mäher kommen.

        303d6a84-3560-4f2e-908c-23e59dc84689-grafik.png

        G Offline
        G Offline
        ghifunk
        schrieb am zuletzt editiert von
        #335

        @arnod
        die Markierungen die bei mir erscheinen, sind die welche in der Handy App gesetzt wurden.

        1 Antwort Letzte Antwort
        0
        • 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
          schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
          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 Offline
            A Offline
            ArnoD
            schrieb am zuletzt editiert von
            #337

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

            G 1 Antwort Letzte Antwort
            0
            • G Offline
              G Offline
              ghifunk
              schrieb am zuletzt editiert von
              #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 Antwort Letzte Antwort
              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
                schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
                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
                  schrieb am zuletzt editiert von
                  #340

                  @arnod Vielen Dank - habe es gefunden 👍

                  1 Antwort Letzte Antwort
                  0
                  • A ArnoD

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

                    G Offline
                    G Offline
                    ghifunk
                    schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
                    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 Offline
                      A Offline
                      ArnoD
                      schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
                      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
                        schrieb am zuletzt editiert von
                        #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 Antwort Letzte Antwort
                        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
                          schrieb am zuletzt editiert von
                          #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 Antwort Letzte Antwort
                          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 Offline
                            A Offline
                            ArnoD
                            schrieb am zuletzt editiert von
                            #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 Antwort Letzte Antwort
                            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
                              schrieb am zuletzt editiert von
                              #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 Antwort Letzte Antwort
                              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
                                schrieb am zuletzt editiert von
                                #347

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

                                A 1 Antwort Letzte Antwort
                                0
                                • L lustig29

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

                                  A Offline
                                  A Offline
                                  ArnoD
                                  schrieb am zuletzt editiert von
                                  #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 Antwort Letzte Antwort
                                  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
                                    schrieb am zuletzt editiert von
                                    #349

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

                                    A 1 Antwort Letzte Antwort
                                    0
                                    • L lustig29

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

                                      A Offline
                                      A Offline
                                      ArnoD
                                      schrieb am zuletzt editiert von
                                      #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 Antworten Letzte Antwort
                                      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
                                        schrieb am zuletzt editiert von
                                        #351

                                        @arnod Super, vielen Dank 👍🏻

                                        1 Antwort Letzte Antwort
                                        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
                                          schrieb am zuletzt editiert von
                                          #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 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          374

                                          Online

                                          32.4k

                                          Benutzer

                                          81.4k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe