Skip to content

JavaScript

Hilfe für Skripterstellung mit JavaScript

2.5k Themen 48.9k Beiträge

NEWS

  • Cannot find module 'googleapis' / Authentifizierungsproblem

    5
    0 Stimmen
    5 Beiträge
    361 Aufrufe
    M
    @codierknecht das hat schonmal geholfen. Danke dafür. Zum Laufen bekomme ich den Code aber leider noch nicht. Ich will einmal wöchentlich die Bilder einer gesamten Woche bei Google Fotos von vor 1226 Tagen in ein Album taggen. // Zugriff auf Google Fotos API const {google} = require('googleapis'); const Photos = require('googlephotos'); const CronJob = require('cron').CronJob; // Authentifizierung mit OAuth 2.0 const OAuth2 = google.auth.OAuth2; const oauth2Client = new OAuth2(); oauth2Client.setCredentials({ access_token: '', refresh_token: '', client_id: '', client_secret: '', }); // Funktion zum Prüfen der OAuth2-Autorisierung async function checkAuthorization() { try { // Access Token prüfen if (!oauth2Client.credentials || !oauth2Client.credentials.access_token) { console.error('Kein Access Token vorhanden. Autorisierung fehlgeschlagen.'); return false; } // Gültigkeit des Access Tokens prüfen const expiryDate = new Date(oauth2Client.credentials.expiry_date); if (expiryDate < new Date()) { console.error('Access Token abgelaufen. Autorisierung fehlgeschlagen.'); return false; } console.info('OAuth2-Autorisierung erfolgreich!'); return true; } catch (error) { console.error(`Autorisierungsfehler: ${error.message}`); return false; } } // Aktuelles Datum const today = new Date(); const todayStr = today.toLocaleDateString('de-DE'); // Albumname für die Bilder der Woche const albumName = `Woche vom ${todayStr}`; // Funktion zum Abrufen der Fotos von vor 1226 Tagen async function getPhotosFrom1226DaysAgo() { const startDate = new Date(today.getFullYear(), today.getMonth(), today.getDate() - 1226); const endDate = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate() + 7); try { const response = await Photos.mediaItems.list({ auth: oauth2Client, searchQuery: `date >= '${startDate.toISOString()}' AND date <= '${endDate.toISOString()}'`, pageSize: 100, // Anzahl der Fotos pro Seite }); // Extrahieren der Foto-IDs aus der Antwort const photoIds = response.data.mediaItems.map(item => item.id); return photoIds; } catch (error) { console.error(`Fehler beim Abrufen von Fotos: ${error.message}`); return []; // Leere Liste zurückgeben, falls Fehler auftreten } } // Funktion zum Erstellen eines neuen Albums async function createAlbum(albumName) { const createAlbumRequest = { album: { title: albumName, }, }; const response = await Photos.albums.create(createAlbumRequest); return response.data.id; } // Funktion zum Taggen der Fotos mit dem neuen Album async function tagPhotosWithAlbum(albumId, photoIds) { const tagPhotosRequest = { albumId: albumId, newMediaItemIds: photoIds, }; await Photos.mediaItems.batchAddMediaItemsToAlbum(tagPhotosRequest); } // Hauptfunktion async function main() { // Prüfung der OAuth2-Autorisierung const isAuthorized = await checkAuthorization // Fotos von vor 1226 Tagen abrufen const photos = await getPhotosFrom1226DaysAgo(); // Neues Album erstellen const albumId = await createAlbum(albumName); // Fotos mit dem neuen Album taggen await tagPhotosWithAlbum(albumId, photos.map((photo) => photo.id)); console.info('Die Bilder der Woche wurden erfolgreich in das neue Album ' + albumName + ' getaggt.'); } // Cron-Job-Zeitsteuerung const cronJob = new CronJob('05 21 * * *', async function() { await main(); }); // Starten des Cron-Jobs cronJob.start(); Die Credentials sind dabei natürlich gepflegt. Raus kommt dabei 21:28:00.018 error javascript.0 (831843) script.js.Dev.Google_Fotos: Fehler beim Abrufen von Fotos: Cannot read properties of undefined (reading 'list') 21:28:00.021 error javascript.0 (831843) script.js.Dev.Google_Fotos: TypeError: Cannot read properties of undefined (reading 'create') 21:28:00.021 error javascript.0 (831843) at createAlbum (script.js.Dev.Google_Fotos:54:40) 21:28:00.021 error javascript.0 (831843) at main (script.js.Dev.Google_Fotos:75:25) 21:28:00.023 error javascript.0 (831843) at CronJob.<anonymous> (script.js.Dev.Google_Fotos:86:3) Also ich glaube die Authentifizierung klappt nicht. Ich sehe auch keinen Traffic in der Google Cloud. Vielleicht weil ich keine Authorisierte JS Quelle angegeben habe? [image: 1709670470214-00c645db-5618-47f6-a017-e321dd74f9f2-image.png] Aber mein iobroker hängt nicht öffentlich im Netz und hat keine Portfreigabe (hoffe ich). Hab da keine URL
  • [gelöst] Datum von Gestern ermitteln

    13
    0 Stimmen
    13 Beiträge
    877 Aufrufe
    mickymM
    @michihorn Gibt meines Erachtens keinen, Die Bibliothek heißt moment.js auch, so wie man node.js sagt, aber moment und node meint. Das js kommt einfach von Javascript. https://momentjs.com/docs/#/use-it/ [image: 1709585094759-4fd84c43-023b-4f6f-bd92-1a83a3444daf-image.png] [image: 1709585141166-98921c5f-cac6-4fe3-9bc2-90423cabe8de-image.png] Insofern gibts da keinen Unterschied und meint dieselbe Bibliothek.
  • (gelöst)state von DP umbenennen

    5
    0 Stimmen
    5 Beiträge
    301 Aufrufe
    Chris76eC
    @paul53 Danke
  • asynch funktion

    29
    0 Stimmen
    29 Beiträge
    924 Aufrufe
    CodierknechtC
    @haus-automatisierung Da war ich tatsächlich schon. Hatte aber nach sowas wie "formatTime()" gesucht und bin dann bei "formatTimeDiff()" gelandet. Ein bisschen hochscrollen hätte das Problem gelöst. Manchmal ist es soooooo einfach :grin:
  • JS Script optimieren

    8
    0 Stimmen
    8 Beiträge
    566 Aufrufe
    ubeckerU
    @paul53 kurze Info, es funktioniert wie es soll. Von meinem langen code sind nur noch ein paar Zeilen übrig geblieben. Ein DP wurde nicht aktualisiert, lange gesucht warum. War ein Schreibfehler im Namen des Datenpunktes. "alias.0.z-wave.1_brightness", "alias.0.mqtt.1_brigthness" :blush: Danke für die hilfe
  • [gelöst] Zwischenresultate aus Datenpunkten loggen

    3
    0 Stimmen
    3 Beiträge
    111 Aufrufe
    D
    @codierknecht Super. Vielen Dank! Ich versuch das mal umzusetzen. Hat prima geklappt! :+1:
  • Android TV in Kombination mit KNX schalten

    3
    0 Stimmen
    3 Beiträge
    116 Aufrufe
    F
    Danke für die schnelle Antwort. Kann ich mir das dann so vorstellen das der Trigger dann wirklich nur ausgelöst wird, wenn sich der Status der Steckdose ändert? Es kann aber dennoch passieren, wenn ich einschalte, dass er gleich wieder ausschaltet, weil der Status von der Box noch nicht geändert ist? Dann müsste man doch eigentlich noch ein bisschen nach dem Einschalten warten, bis man das "Freigabe-Flag" (flag_switch_tv) setzt um den entgegenzuwirken oder?
  • gelöst Awtrix Display Spielstand per JS Post senden

    blockly javascript
    3
    1
    0 Stimmen
    3 Beiträge
    299 Aufrufe
    Ralla66R
    @paul53 sagte in Awtrix Display Spielstand per JS Post senden: body: JSON.stringify({text: Spielstand}) Danke, damit läuft es. Top Als Info noch, wer es in Tasmota Scripting benötigt gehts hiermit: =>WebQuery http://meine IP/api/notify POST {"text":"%var%"}
  • [GELÖST] Skript gibt [objekt Objekt] aus

    javascript
    51
    0 Stimmen
    51 Beiträge
    5k Aufrufe
    fischi87F
    @paul53 [image: 1708980784102-bildschirmfoto-2024-02-26-um-21.52.28.png]
  • Lidl Zigbee Zwischenstecker per sendTo zurücksetzen

    2
    0 Stimmen
    2 Beiträge
    317 Aufrufe
    P
    @wowbaggger Was meldet denn der Zigbee zurück? Ein Beispiel mit Callback gibt es hier
  • setState findet manuell erzeugtes Objekt nicht

    javascript
    19
    2
    0 Stimmen
    19 Beiträge
    1k Aufrufe
    S
    @shai0hulud Vorschlag funktioniert, konnte "idSetPrefix" aus der Funktion so natürlich entfernen, brauche jetzt nur noch 2 Optionen für die Funktion und hab mir von ChatGPT mit den Datumsformaten helfen lassen, da bei der restlichen Funktion ein anderes Datumsformat genutzt wurde und damit die Differenz in Tagen extrem groß wurde (knapp 20000 Tage statt nur 400 z.B.). Danke nochmal! Dass mit dem Schedule statt Timeout schaue ich mir auch noch an.
  • [gelöst] Script findet Datenpunkt nicht

    2
    2
    0 Stimmen
    2 Beiträge
    98 Aufrufe
    paul53P
    @delphinis Du versuchst, zwei nicht deklarierte Variablen zu addieren. Richtig: log(add(getState('0_userdata.0.MeinOrdner.Zahl_5').val, getState('0_userdata.0.MeinOrdner.Zahl_8').val)); EDIT: Funktionen des Javascript-Adapters.
  • Script in vis HTML Widget einbinden

    javascript
    6
    0 Stimmen
    6 Beiträge
    591 Aufrufe
    D
    @glasfaser said in Script in vis HTML Widget einbinden: a:modbus.0.inputRegisters.31255_Netzspannung_Phase Kurze Frage: Es ist wohl so, dass wenn ich einen Wert hier der Variablen a zuordne, dass dieser gleich in einen String gewandelt wird. Meist will man diese Werte weiterverrechnen und muss sie dann eben mit parseX() wieder in eine Zahl wandeln. Parsen ist aber eine teure funktion. Kann man die Werte nicht gleich als Zahl weiterverarbeiten, oder kommen die schon mit dem Parameter als Datenpunkt (modbus.0.inputRegisters.31253_Netzspannung_Phase_L1) rein?
  • HTMLTabelle UnifiClients-newAdapter

    javascript
    93
    3
    4 Stimmen
    93 Beiträge
    10k Aufrufe
    D
    @liv-in-sky Danke das wars
  • Auflistung von Zuständen einer bestimmten Funktion

    15
    0 Stimmen
    15 Beiträge
    352 Aufrufe
    Ben1983B
    @martinp ok. Kann ich verstehen… wobei ich nur an 1-2 dropdowns gedacht hätte… aber ok.
  • persist timer

    javascript
    4
    0 Stimmen
    4 Beiträge
    382 Aufrufe
    M
    Ich habe mir jetzt folgendes gebastelt. Damit übersteht das verzögerte Schalten auch nach Neutstart von ioBroker function clearStateDelayed_persist(id) { clearStateDelayed(id) setState(id+"_timer",JSON.stringify([])) } function setStateDelayed_persist(id,val,delay,clearRunning) { setStateDelayed(id,val,delay,clearRunning) var timer = getStateDelayed(id) var persist = [] for (var i = 0;i < timer.length;i++) { var timestamp = new Date(new Date().getTime() + timer[i].delay) var date = timestamp.toISOString() persist.push({"date":date,"val":val,"clearRunning":clearRunning}) } setState(id+"_timer",JSON.stringify(persist)) } function restore_setStateDelayed(id) { clearStateDelayed(id) var timer = JSON.parse(get(id + "_timer")) for (var i = 0;i < timer.length;i++) { var persist = timer[i] var delay = new Date(persist.date).getTime() - new Date().getTime() if (delay > 0) setStateDelayed(id,persist.val,delay,persist.clearRunning) } } /* Damit das Bespiel läuft muss der Datenpunkt 1. '0_userdata.0.Test.test_boolean' und 2. '0_userdata.0.Test.test_boolean_timer' vorhanden sein. */ var id = '0_userdata.0.Test.test_boolean' setStateDelayed_persist(id,false,2000) setStateDelayed_persist(id,false,3000,false) //clearStateDelayed_persist(id) setTimeout(function(){restore_setStateDelayed(id)},1000) on({ id: id, change: "any"}, function (obj) { log("getriggert") })
  • [gelöst] Alexa und doNotDisturb

    Verschoben javascript
    9
    0 Stimmen
    9 Beiträge
    638 Aufrufe
    H
    funktioniert...dankeschön!
  • wLED-Abfrage

    13
    1
    0 Stimmen
    13 Beiträge
    1k Aufrufe
    paul53P
    @haus-automatisierung sagte: Der Selector-Code ist ja etwas... undurchsichtig. Laut der Log-Ausgabe funktioniert der $Selector auch bei @baluderbär. @baluderbär Was ergibt im Log? var cacheSelectorwled = $('state[id=*.on](functions=Licht)[role=switch.light]'); cacheSelectorwled.each(function(id, i) { log(id); }); Es müssten 14 IDs untereinander erscheinen.
  • JS Problem Weather Script Air Quality :-(

    9
    0 Stimmen
    9 Beiträge
    517 Aufrufe
    M
    @olli_m So es wie aussieht hat es in dem Bereich ein Datenübertragungsproblem gegeben. Ich vermute, dass die Daten bald wieder gemeldet werden, ansonsten musst du eine andere Station in der Nähe suchen. [image: 1708199115445-581a64e6-e54c-430e-80b6-7da035399654-image.png]
  • Parser: TV-Sender Fußball Keine Daten mehr ....

    javascript
    1
    2
    0 Stimmen
    1 Beiträge
    174 Aufrufe
    Niemand hat geantwortet

696

Online

32.6k

Benutzer

82.1k

Themen

1.3m

Beiträge