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.1k

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

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

Test Adapter Husqvarna Automower v0.3.x

Geplant Angeheftet Gesperrt Verschoben Tester
husqvarnaautomower
439 Beiträge 73 Kommentatoren 104.4k 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.
  • 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
            • L lustig29

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

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

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

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

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

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

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

              1 Antwort Letzte Antwort
              0
              • greyhoundG greyhound

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

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

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

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

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

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

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

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

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

                Ne, bin ich gespannt und offen.

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

                Gruß

                GH

                S Offline
                S Offline
                schmidti
                schrieb am zuletzt editiert von schmidti
                #354

                @greyhound

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

                updateStatus mower object is NULL
                

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

                VG
                Schmidti

                1 Antwort Letzte Antwort
                0
                • A Offline
                  A Offline
                  AndreasW63
                  schrieb am zuletzt editiert von
                  #355

                  Hallo,

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

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

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

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

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

                  Gruß Andreas

                  C 1 Antwort Letzte Antwort
                  0
                  • A ArnoD

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

                    Parken für 30 Minuten. Starten für 120 Minuten. Woher kommen die die Daten für 30 und 120 Minuten?
                    Im Button ist hier nichts eingetragen, bzw. wo kann man die Zeit ändern?

                    Dafür habe ich den „materialdesign – Button State Multi“ verwendet, da kann man mehre ID mit Verzögerung ändern.
                    Als Erstes wird ohne Verzögerung ACTIONS.park.parkTime auf 30 gesetzt und dann mit Verzögerung 1000 ms ACTIONS.park.PARK auf true.

                    Diese Änderungen habe ich aber erst nach meinem Upload hier gemacht, sodass der Upload der View weiter oben nicht mehr aktuell ist.

                    Hier noch mal die Importdatei meiner View mit allen Änderungen und Optimierungen:
                    Husqvarna_VIS_View V2.js

                    527c6db5-a3ff-4522-8499-d6f3ecff5d3a-grafik.png

                    R Online
                    R Online
                    RISSN
                    schrieb am zuletzt editiert von
                    #356

                    @arnod guten Morgen, wo bekomme ich denn das Bild für den Husqvarna her? Die Seite kann ich importieren, aber ohne Bilder. Beste Grüße

                    A 1 Antwort Letzte Antwort
                    0
                    • R RISSN

                      @arnod guten Morgen, wo bekomme ich denn das Bild für den Husqvarna her? Die Seite kann ich importieren, aber ohne Bilder. Beste Grüße

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

                      @rissn
                      Da hilft Google. Ein Bild suchen was passt und einfach den Hintergrund (z.B. mit Gimp) ausschneiden, sodass dieser Transparent ist.
                      Oder für ganz Faule, das hier verwenden. 🙂 der-husqvarna-automower-430x.png

                      R 1 Antwort Letzte Antwort
                      0
                      • A ArnoD

                        @rissn
                        Da hilft Google. Ein Bild suchen was passt und einfach den Hintergrund (z.B. mit Gimp) ausschneiden, sodass dieser Transparent ist.
                        Oder für ganz Faule, das hier verwenden. 🙂 der-husqvarna-automower-430x.png

                        R Online
                        R Online
                        RISSN
                        schrieb am zuletzt editiert von
                        #358

                        @arnod vielen Dank, hatte es natürlich auch aus dem Netz gezogen und als png umgewandelt

                        1 Antwort Letzte Antwort
                        0
                        • Martin BöttcherM Offline
                          Martin BöttcherM Offline
                          Martin Böttcher
                          schrieb am zuletzt editiert von Martin Böttcher
                          #359

                          ~~sry leute aber evtl bin ich einfach zu blind oder zu doof.
                          ich habe gerade v0.3.3 installiert.
                          habe auch einen Dev Acc bei Husqvarna erstellt.
                          bekomme nun vom Adpater folgende Meldung:

                          husqvarna-automower.0  	error	Error: No Objects found, no Objects created. Check API (ERR_#008). (ERR_#004)
                          

                          ich denke mir, ja klar kann der nichts finden, der Dev Account kennt ja meine Automower nicht...
                          Jetzt meine Dummyfrage: Wie verbinde ich meine Mäher mit dem Dev Account?~~
                          ok... sry ist spät... wenn ich mich auch mit dem falschen Account anmelde... so geh pennen... n8

                          mcm1957M H 2 Antworten Letzte Antwort
                          0
                          • Martin BöttcherM Martin Böttcher

                            ~~sry leute aber evtl bin ich einfach zu blind oder zu doof.
                            ich habe gerade v0.3.3 installiert.
                            habe auch einen Dev Acc bei Husqvarna erstellt.
                            bekomme nun vom Adpater folgende Meldung:

                            husqvarna-automower.0  	error	Error: No Objects found, no Objects created. Check API (ERR_#008). (ERR_#004)
                            

                            ich denke mir, ja klar kann der nichts finden, der Dev Account kennt ja meine Automower nicht...
                            Jetzt meine Dummyfrage: Wie verbinde ich meine Mäher mit dem Dev Account?~~
                            ok... sry ist spät... wenn ich mich auch mit dem falschen Account anmelde... so geh pennen... n8

                            mcm1957M Online
                            mcm1957M Online
                            mcm1957
                            schrieb am zuletzt editiert von
                            #360

                            @greyhound
                            Wenn der Adapter funktioniert bitte in den Repositories veröffentlichen.
                            Falls Hilfe dazu benötigt wird, bitte Bescheid geben.
                            Danke

                            Entwicklung u Betreuung: envertech-pv, hoymiles-ms, ns-client, pid, snmp Adapter;
                            Support Repositoryverwaltung.

                            Wer Danke sagen will, kann nen Kaffee spendieren: https://paypal.me/mcm1957atiobroker

                            LESEN - gute Forenbeitrage

                            G 1 Antwort Letzte Antwort
                            0
                            • mcm1957M mcm1957

                              @greyhound
                              Wenn der Adapter funktioniert bitte in den Repositories veröffentlichen.
                              Falls Hilfe dazu benötigt wird, bitte Bescheid geben.
                              Danke

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

                              @mcm57
                              Hallo,
                              neue Saison hat begonnen - und gleich ein Problem!
                              Die Entfernung zur Basis wird nicht richtig berechnet, bzw. wird der Nullpunkt in der Ladestation nicht gesetzt.
                              Der Entfernungswert liegt mom. bei 5737207,91m ???
                              Das hat aber schon mal funktioniert.
                              Ich benutze die v0.4.0-beta.3 und das hoffentlich zugehörige "Script for statistics" aus dem GitHub ice987987
                              kann mir jemand dazu helfen?
                              Gruß
                              Gerhard

                              R 1 Antwort Letzte Antwort
                              0
                              • G ghifunk

                                @mcm57
                                Hallo,
                                neue Saison hat begonnen - und gleich ein Problem!
                                Die Entfernung zur Basis wird nicht richtig berechnet, bzw. wird der Nullpunkt in der Ladestation nicht gesetzt.
                                Der Entfernungswert liegt mom. bei 5737207,91m ???
                                Das hat aber schon mal funktioniert.
                                Ich benutze die v0.4.0-beta.3 und das hoffentlich zugehörige "Script for statistics" aus dem GitHub ice987987
                                kann mir jemand dazu helfen?
                                Gruß
                                Gerhard

                                R Online
                                R Online
                                RISSN
                                schrieb am zuletzt editiert von
                                #362

                                @ghifunk das hatte ich auch, nach 2-3x fahren war es dann wieder richtig, also denke ich, die GPS Daten brauchen erstmal ne Weile um gesammelt zu werden.

                                1 Antwort Letzte Antwort
                                0
                                • A AndreasW63

                                  Hallo,

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

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

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

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

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

                                  Gruß Andreas

                                  C Offline
                                  C Offline
                                  crAsh220977
                                  schrieb am zuletzt editiert von
                                  #363

                                  @andreasw63 Hallo. Konntest Du das Problem lösen? Stehe nämlich auch vor diesem Problem. Gruß...

                                  1 Antwort Letzte Antwort
                                  0
                                  • P Offline
                                    P Offline
                                    Pehe28
                                    schrieb am zuletzt editiert von Pehe28
                                    #364

                                    hi zusammen,
                                    ich habe den Adapter "ice987987 / ioBroker.husqvarna-automower" Version 0.5.0-beta.3 installert, aber er läuft nicht richtig.
                                    Folgende Fehlermeldung:
                                    error TypeError: Cannot read properties of undefined (reading 'dirty') (ERR_#004)
                                    Hat jmd eine Idee?
                                    Danke, Peter

                                    R 1 Antwort Letzte Antwort
                                    0
                                    • P Pehe28

                                      hi zusammen,
                                      ich habe den Adapter "ice987987 / ioBroker.husqvarna-automower" Version 0.5.0-beta.3 installert, aber er läuft nicht richtig.
                                      Folgende Fehlermeldung:
                                      error TypeError: Cannot read properties of undefined (reading 'dirty') (ERR_#004)
                                      Hat jmd eine Idee?
                                      Danke, Peter

                                      R Offline
                                      R Offline
                                      reutli
                                      schrieb am zuletzt editiert von
                                      #365

                                      @pehe28
                                      Isuue aufgemacht in Github?

                                      BITTE BEACHTET DOCH DAS: https://forum.iobroker.net/topic/51555/hinweise-für-gute-forenbeiträge
                                      iobroker in Debian-VM auf Proxmox Server (Ryzen 7 / 32GB / 1TB NVMe SSD) als Master - mehrere Raspberry Pis (3+4) als Slaves. InfluxDB V2 und Grafana auf LXC.

                                      *Wer freundlich ist, dem wird freundlich geholfen *

                                      P 1 Antwort Letzte Antwort
                                      0
                                      • R reutli

                                        @pehe28
                                        Isuue aufgemacht in Github?

                                        P Offline
                                        P Offline
                                        Pehe28
                                        schrieb am zuletzt editiert von
                                        #366

                                        @reutli
                                        Nein, noch nicht.

                                        R 1 Antwort Letzte Antwort
                                        0
                                        • P Pehe28

                                          @reutli
                                          Nein, noch nicht.

                                          R Offline
                                          R Offline
                                          reutli
                                          schrieb am zuletzt editiert von
                                          #367

                                          @pehe28

                                          0.5.0-beta.3 WORK IN PROGRESS
                                          

                                          hast Du aber gelesen, oder?

                                          BITTE BEACHTET DOCH DAS: https://forum.iobroker.net/topic/51555/hinweise-für-gute-forenbeiträge
                                          iobroker in Debian-VM auf Proxmox Server (Ryzen 7 / 32GB / 1TB NVMe SSD) als Master - mehrere Raspberry Pis (3+4) als Slaves. InfluxDB V2 und Grafana auf LXC.

                                          *Wer freundlich ist, dem wird freundlich geholfen *

                                          P 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

                                          742

                                          Online

                                          32.4k

                                          Benutzer

                                          81.4k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                          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