Weiter zum Inhalt

NEWS

  • News and Announcements for ioBroker and around the forum

    91 200
    91 Themen
    200 Beiträge
    HomoranH
    🚨 Dringendes Update: js-controller 7.2.2 Der js-controller 7.2.2 ist jetzt im STABLE-Repository verfügbar. Nutzer der Versionen 7.1.x, 7.2.0 und 7.2.1 sollten bitte schnellstmöglich aktualisieren. Die älteren Versionen erzeugen aktuell sehr viele zentrale Fehlerprotokolle. Dadurch werden die ioBroker-Server stark belastet und die Funktionalität kann für alle Nutzer beeinträchtigt werden. Das Update enthält außerdem wichtige Anpassungen für zukünftige Adapter-Versionen. ⚠️ Bitte wundert euch nicht, wenn ihr die Admin-Information auch nach einem bereits durchgeführten Update angezeigt bekommt. Die Nachricht kann technisch nicht auf bestimmte js-controller-Versionen begrenzt werden und wird daher an alle Nutzer verteilt. Bitte prüft eure Version und aktualisiert euer System bei Bedarf zeitnah. Vielen Dank! 🙏
  • 82k Themen
    1m Beiträge
    icebearI
    @oliverio Ich häng mal das TypeScript dran, dann siehte ja: // ============================================================================= // Konfiguration // ============================================================================= const DP_LAT: string = 'traccar.0.devices.1.latitude'; const DP_LON: string = 'traccar.0.devices.1.longitude'; const DP_MOTION: string = 'traccar.0.devices.1.motion'; const DP_ROUTE_JSON: string = '0_userdata.0.CarLoad.CurrentRouteJSON'; const DP_LAST_DATE: string = '0_userdata.0.CarLoad.LastDriveDate'; const DP_LAST_STOP_TIME: string = '0_userdata.0.CarLoad.LastStopTime'; // Farben für die verschiedenen Fahrten des Tages (max 5) const DRIVE_COLORS: string[] = ['#3d3d5c', '#e65c00', '#009933', '#cc0000', '#9900cc']; // Interfaces für die neue verschachtelte Struktur interface LeafletMarker { latlng: [number, number]; options: { icon: string; title: string; }; tooltip?: string; } interface LeafletIcon { iconUrl: string; iconSize: [number, number]; iconAnchor: [number, number]; popupAnchor?: [number, number]; shadowSize?: [number, number]; shadowAnchor?: [number, number]; } interface PolylineConfig { latlng: [number, number][]; options: { color: string; weight: number }; iobOptions?: { fitBounds: boolean }; } interface MapContent { marker: LeafletMarker[]; icons: { honda: LeafletIcon; }; polyline: PolylineConfig[]; } interface DriveTrip { map: MapContent; } interface LeafletRouteContainer { [isoTimestamp: string]: DriveTrip; } // Erzeugt eine frische Map-Struktur für eine einzelne Fahrt function createNewTripStructure(colorIndex: number): DriveTrip { return { map: { marker: [ { latlng: [0.0, 0.0], options: { icon: "honda", title: "Default" }, tooltip: "Hover me" } ], icons: { honda: { iconUrl: "/vis-2.0/SmartHome/tanken/honda_sv1.png", iconSize: [45, 30], iconAnchor: [15, 30], popupAnchor: [0, -26], shadowSize: [36, 36], shadowAnchor: [15, 30] } }, polyline: [ { latlng: [], options: { color: DRIVE_COLORS[colorIndex % DRIVE_COLORS.length], weight: 3 }, iobOptions: { fitBounds: true } } ] } }; } // ============================================================================= // Initialisierung // ============================================================================= async function init(): Promise<void> { await createStateAsync(DP_LAST_DATE, '', { type: 'string' }); await createStateAsync(DP_LAST_STOP_TIME, 0, { type: 'number', name: 'Zeitstempel letzter Stop' }); if (!(await existsStateAsync(DP_ROUTE_JSON))) { await createStateAsync(DP_ROUTE_JSON, '{}', { name: 'Aktuelle Route für Leaflet', type: 'string', role: 'json' }); } } // ============================================================================= // Logik: Koordinaten hinzufügen mit zeitbasierter Objekt-Struktur // ============================================================================= async function addCoordinateToRoute(lat: number, lon: number): Promise<void> { try { const heute = new Date().toISOString().split('T')[0]; const lastDateState = await getStateAsync(DP_LAST_DATE); const lastDate = lastDateState ? lastDateState.val : ''; const state = await getStateAsync(DP_ROUTE_JSON); let routeData: LeafletRouteContainer = {}; // 1. Reset bei neuem Tag if (lastDate !== heute) { log(`[Traccar-Route] Neuer Tag erkannt. Reset der Route.`); routeData = {}; await setStateAsync(DP_LAST_DATE, heute, true); await setStateAsync(DP_LAST_STOP_TIME, 0, true); } else if (state && typeof state.val === 'string' && state.val !== '') { routeData = JSON.parse(state.val) as LeafletRouteContainer; } // Alle vorhandenen Keys (Fahrten) ermitteln und sortieren let tripKeys = Object.keys(routeData).sort(); const lastStopState = await getStateAsync(DP_LAST_STOP_TIME); const lastStopTime = lastStopState ? (lastStopState.val as number) : 0; const jetzt = Date.now(); let currentTripKey: string; // Prüfen, ob eine neue Fahrt begonnen werden muss const isNewTripNeeded = tripKeys.length === 0 || (lastStopTime > 0 && (jetzt - lastStopTime) > (30 * 60 * 1000)); if (isNewTripNeeded) { if (tripKeys.length < 5) { currentTripKey = new Date().toISOString(); log(`[Traccar-Route] Erstelle neue Fahrt unter Key: ${currentTripKey}`); routeData[currentTripKey] = createNewTripStructure(tripKeys.length); tripKeys.push(currentTripKey); } else { log(`[Traccar-Route] Pause > 30 Min, aber Maximum von 5 Fahrten erreicht. Nutze letzte Fahrt weiter.`, 'warn'); currentTripKey = tripKeys[tripKeys.length - 1]; } await setStateAsync(DP_LAST_STOP_TIME, 0, true); } else { currentTripKey = tripKeys[tripKeys.length - 1]; } // Typisierte Referenz auf die aktive Fahrt holen const activeTrip: MapContent = routeData[currentTripKey].map; // 2. Live-Position des Markers aktualisieren if (activeTrip.marker && activeTrip.marker.length > 0) { activeTrip.marker[0].latlng = [lat, lon]; } // 3. Polyline-Logik const latlngs = activeTrip.polyline[0].latlng; // Dubletten-Check innerhalb der aktuellen Fahrt if (latlngs.length > 0) { const lastPoint = latlngs[latlngs.length - 1]; if (lastPoint[0] === lat && lastPoint[1] === lon) return; } // Punkt hinzufügen latlngs.push([lat, lon]); // Performance-Schutz pro Fahrt if (latlngs.length > 1500) latlngs.shift(); await setStateAsync(DP_ROUTE_JSON, JSON.stringify(routeData), true); } catch (e) { log(`[Leaflet-Route] Fehler beim Hinzufügen der Koordinate: ${e}`, 'error'); } } // ============================================================================= // Trigger // ============================================================================= on({ id: DP_LAT, change: 'ne' }, async (obj) => { const lat = obj.state ? parseFloat(obj.state.val as string) : null; const lonState = await getStateAsync(DP_LON); const motionState = await getStateAsync(DP_MOTION); if (lat !== null && lonState && lonState.val !== null) { const lon = parseFloat(lonState.val as string); const isMoving = motionState ? !!motionState.val : true; if (isMoving && !isNaN(lat) && !isNaN(lon)) { await addCoordinateToRoute(lat, lon); } } }); on({ id: DP_MOTION, change: 'ne' }, async (obj) => { if (obj.state) { const isMoving = !!obj.state.val; if (!isMoving) { log(`[Traccar-Route] Fahrzeug steht. Starte Haltezeit-Überwachung.`); await setStateAsync(DP_LAST_STOP_TIME, Date.now(), true); } else { const lastStopState = await getStateAsync(DP_LAST_STOP_TIME); const lastStopTime = lastStopState ? (lastStopState.val as number) : 0; if (lastStopTime > 0 && (Date.now() - lastStopTime) <= (30 * 60 * 1000)) { log(`[Traccar-Route] Fahrt nach kurzem Zwischenstopp (< 30 Min) fortgesetzt.`); await setStateAsync(DP_LAST_STOP_TIME, 0, true); } } } }); init();
  • 357 Themen
    2k Beiträge
    Q
    @alansru would your adapter also work with a iiyama ProLite TF4339AS-B1AG or similar model ? best regards
  • 633 Themen
    8k Beiträge
    mcm1957M
    @hawkeye Thanks for clearification. I already assumed that goggle translation did not get the conplete context. As I cannot read rusky language, I'll write in english and hope translation is correct. For the technical facts: The maintainer of the adapter did not grant access to npm although request for a long time. So its technical impossible to move the adapter to iobroker-community-adapters. As no maintainance has been done for a long time the adapter has been removed from repositories. It ist still possible to install it directly from nom using url iobroker.megadd. BUT there is some news too. I just detected that there is an adapter iobroker.megadd2. This adapter has been archived too and is not published at repositories. But it has been written by @Bluefox which ist one ofe the active core developers. So maybe he can held - ans as far as I know he can communicate using rusky languge very well. @Bluefox Please respond if you have time to do so. Спасибо за разъяснения. Я уже предполагал, что перевод Google не передал весь контекст. Поскольку я не могу читать на русском языке, напишу на английском и надеюсь, что перевод будет верным. Технические факты: Разработчик адаптера долгое время не предоставлял доступ к npm, несмотря на запрос. Поэтому технически невозможно перенести адаптер в iobroker-community-adapters. Поскольку поддержка не производилась в течение длительного времени, адаптер был удалён из репозиториев. Его всё ещё можно установить напрямую из nom, используя URL iobroker.megadd. НО есть и новости. Я только что обнаружил, что существует адаптер iobroker.megadd2. Этот адаптер тоже заархивирован и не опубликован в репозиториях. Но его написал @Bluefox, один из активных разработчиков ядра. Так что, возможно, он сможет помочь — и, насколько мне известно, он очень хорошо умеет общаться на русском языке. @Bluefox Пожалуйста, ответьте, если у вас есть время.
  • 19 Themen
    111 Beiträge
    Henk-Jan van EsterikH
    @tanelkoth Ik zie dat je deze vraag hebt. Mocht je vraag nog actueel zijn, laat het even weten. Met behulp van een Blockly script kan je eenvoudig dit regelen.
  • Português Fórum de suporte

    4 20
    4 Themen
    20 Beiträge
    ldittmarL
    @polegato Estou devolta aqui :-) ... O exemplo do lobomau é perfeito. Vc tem que instalar o ioBroker.javascript para isso e fazer um Blockly. Com esse Blockly vc pode montar automacao como um quebra cabeca. Muito legal e depois de algums, ja fica bem mais fácil.

434

Online

33.0k

Benutzer

83.4k

Themen

1.3m

Beiträge