Skip to content

JavaScript

Hilfe für Skripterstellung mit JavaScript

2.5k Themen 49.1k Beiträge

NEWS

  • IP Devices im Netzwerk - HTML Tabelle vis, Iqontrol

    javascript template
    493
    3
    9 Stimmen
    493 Beiträge
    108k Aufrufe
    O
    @liv-in-sky Super, danke dir
  • [gelöst] Ersetzen eines json Array elements

    22
    0 Stimmen
    22 Beiträge
    942 Aufrufe
    Ben1983B
    @ticaki OK, da bin ich ja beruhigt. Hier mein Komplettes Skript zum Zuweisen: // Id Deklaration der States (für spätere Abrufe) const idOffeneTueren = "0_userdata.0.Produktiv.Tueren.Innen.offeneTueren"; const idGeschlosseneTueren = "0_userdata.0.Produktiv.Tueren.Innen.geschlosseneTueren"; const idTueren = "0_userdata.0.Produktiv.Tueren.Innen.tueren"; // Türobjekte definieren let tueren = {}; let offeneTueren = {}; let geschlosseneTueren = {}; //Arrays bei Skriptstart anlegen $(`state(${enumtypeFunctions}=${enumTuerInnen})`).each((id)=>{ //objekt und state holen let obj = getObject(id); let state = getState(id); // Objekte zuweisen assignObject(obj,state); // Arrays beschreiben setState(idTueren,JSON.stringify(Object.values(tueren)),true); setState(idOffeneTueren,JSON.stringify(Object.values(offeneTueren)),true); setState(idGeschlosseneTueren,JSON.stringify(Object.values(geschlosseneTueren)),true); }); // Objekte zuweisen function assignObject(obj,state){ // Zuweisen des allgemeinen Türobjekts tueren[obj._id] = {name:obj.common.name, zustand: state.val?"geschlossen": "offen"}; // Zuweisen des Objekts für die offenen oder geschlossenen Türen if(state.val){ geschlosseneTueren[obj._id] = tueren[obj._id]; delete offeneTueren[obj._id]; } else { offeneTueren[obj._id] = tueren[obj._id]; delete geschlosseneTueren[obj._id]; } } /********************************************************************************************************* * *********************************** Ab hier bei Änderungen ******************************************** ******************************************************************************************************* */ // Abfrage, ob sich ein Türzustand geändert hat $(`state(${enumtypeFunctions}=${enumTuerInnen})`).on((dp)=>{ // Objekt holen und zuweisen let obj = getObject(dp.id); assignObject(obj,dp.state); // Arrays beschreiben setState(idTueren,JSON.stringify(Object.values(tueren)),true); setState(idOffeneTueren,JSON.stringify(Object.values(offeneTueren)),true); setState(idGeschlosseneTueren,JSON.stringify(Object.values(geschlosseneTueren)),true); });
  • Script fürTabelle der Batterie Zustände

    javascript monitoring template
    1k
    27
    15 Stimmen
    1k Beiträge
    518k Aufrufe
    hg6806H
    An alle die Probleme mit der Aktualisierung der Homematic Fensterkontakte haben, hier der Workaround. Danke an @liv-in-sky für die Unterstützung. Problem, zumindest bei mir, ist, dass die Fensterkontakte 2x "LowBat" Datenpunkte haben. 1x unter xxxx.0 und 1x unter xxxx.1 Das Script schaut aber normalerweise unter : $('hm-rpc.*.0.LOWBAT').each(function(id,....... Der LowBat Wert wird aber unter xxxx.1 aktualisiert. Wenn man jetzt die Zeile auf $('hm-rpc.*.1.LOWBAT').each(function(id...... ändert funktionieren allerdings die anderen nicht mehr. Also muss man auf $('hm-rpc...*.LOWBAT').each(function(id,...... setzen und die Fensterkontakte, die nun doppelt aufgeführt filtern unter: var filterArray=["hm-rpc.0.NEQ0xxxxx.0.LOWBAT","hm-rpc.0.NEQ06xxxxx.0.L.......... rausfiltern. Also die Nuller. Seltsamerweise hatte es ja mal ursprünglich funktioniert. Ich weiß jetzt nicht wo was geändert wurde. In der Zentrale CCU.x oder im HM.RPC Adapter.
  • Aufrufende Webseite ermitteln

    1
    0 Stimmen
    1 Beiträge
    153 Aufrufe
    Niemand hat geantwortet
  • Pullen mehrerer DP aus history via Javascript

    7
    0 Stimmen
    7 Beiträge
    392 Aufrufe
    jmeister79J
    @haus-automatisierung ja das ist natürlich sehr viel eleganter. danke dir. Ich hab dieses Prinzip damals aus unwissenheit begonnen und das nun überall so, ist natürlich auch mal zeit das aufzuräumen.
  • Gültigkeitsbereich Variablen

    8
    0 Stimmen
    8 Beiträge
    516 Aufrufe
    haus-automatisierungH
    @spider_01 Du musst sendToAsync nutzen. Nicht mehr sendTo. Nur die erste liefert ein Promise zurück. sendTo arbeitet ja mit Callback.
  • Datenpunkt überschreiben

    2
    0 Stimmen
    2 Beiträge
    220 Aufrufe
    O
    @woostel ich bin jetzt nicht der große Experte was programmieren angeht, aber wie ich das sehe, holst du dir in der Zeile 17 das mit Daten befüllte JSON in eine Variable und pusht danach in deiner "getData Funktion" drauf.
  • Aternative Methode für getObjectList

    7
    0 Stimmen
    7 Beiträge
    589 Aufrufe
    paul53P
    @flying-bolt const ids = $('hm-rpc.0.0000*'); ids.each(function(id) { log(id); });
  • Cannot find module 'googleapis' / Authentifizierungsproblem

    5
    0 Stimmen
    5 Beiträge
    402 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
    962 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
    324 Aufrufe
    Chris76eC
    @paul53 Danke
  • asynch funktion

    29
    0 Stimmen
    29 Beiträge
    925 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
    596 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
    311 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
    321 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
    99 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.

688

Online

32.7k

Benutzer

82.5k

Themen

1.3m

Beiträge