Skip to content

JavaScript

Hilfe für Skripterstellung mit JavaScript

2.5k Topics 48.5k Posts

NEWS

  • controller.js frist Ram und javascript.X bei >90%

    14
    1
    0 Votes
    14 Posts
    982 Views
    CodierknechtC
    @tasuanetrukiat sagte in controller.js frist Ram und javascript.X bei >90%: da ich das mit den Blockly Skripten noch nicht vollständig verstanden habe Lesestoff: https://forum.iobroker.net/topic/70481/blockly-for-dummies-starthilfe-und-tipps Ganz wichtig: "Trigger in Trigger" - nicht machen, niemals, never ever!
  • [Skript] Atlantic Wärmepumpe über Cozytouch abfragen

    107
    3 Votes
    107 Posts
    20k Views
    Samson71S
    @ricki-1337 sagte in [Skript] Atlantic Wärmepumpe über Cozytouch abfragen: genannten Platine in HA einbinden. Falsches Forum? Wir sind hier bei ioBroker, nicht bei HA. Du solltest Dich mit der Fragestellung an das HA-Forum wenden und/oder ggf. auf GitHub nachfragen.
  • zig gleiche Einträge in JS-Protokollanzeige

    18
    3
    0 Votes
    18 Posts
    931 Views
    OliverIOO
    @ticaki ja, hab gerade ausprobiert. dann ist das relativ neu. das war früher nicht so. da gab es immer wieder fälle, das sich das aufmultipliziert hat
  • HttpGet Balkonkraftwerk => Nachts Errors in Protokoll

    14
    1
    0 Votes
    14 Posts
    1k Views
    O
    @fichtenmoped82 , bei einer ähnlichen Fragestellung habe ich den Radar Adapter zu Hilfe genommen. Damit können Geräte (der WR in Deinem Fall) auf Anwesenheit überwacht werden. Dann kannst Du die HTTP Abfrage gegen den WR nur ausführen, wenn Radar für den WR ein „true“ in den zugehörigen DP schreibt. In etwa so, wie @MartinP weiter oben schreibt, nur ohne Ping. Spart neben den Log Einträgen auch noch Rechenleistung -;) Gruß
  • Cannot redeclare block-scoped variable

    36
    0 Votes
    36 Posts
    3k Views
    H
    @oliverio hast Recht. Hätte gleich ein paar Hardcopys machen sollen.
  • [gelöst] Bug in Javascript?

    17
    1
    0 Votes
    17 Posts
    1k Views
    I
    @haus-automatisierung Nein, der Adapter kann nichts dafür, der DP ist string. Ich hab den mal gelöscht und beim wiedererstellen hab ich das offenbar nicht wieder auf bool geändert.
  • MS-SQL Daten in State schreiben

    13
    0 Votes
    13 Posts
    800 Views
    B
    @paul53 Try´n Error hats gebracht....Total simpel when man SQL Coden kann :grinning: ich kanns jedenfalls nicht. +1 Tag (+1 an der Stelle im Skript einfügen) 'use sag SELECT validfrom, comfortcode FROM dbo.tgcs WHERE DATEADD(DAY, 0, DATEDIFF(DAY, 0, validfrom)) = DATEADD(DAY, 0, DATEDIFF(DAY, 0, GETDATE()))+1', function (result) { 2 Tage 'use sag SELECT validfrom, comfortcode FROM dbo.tgcs WHERE DATEADD(DAY, 0, DATEDIFF(DAY, 0, validfrom)) = DATEADD(DAY, 0, DATEDIFF(DAY, 0, GETDATE()))+2', function (result) { Edit: Ich versuche gerade das Skript nach einem Zeitplan auszuführen, bekomme es aber irgenwie nicht hin. Habe oben rechts über die Uhr sowohl den Wizard, als auch Einfach versucht. Zum test auch jede Minute. Tut sich aber nichts. Ich hab auch versucht den javascript Adapter alle Minute neuzustarten....Das klappt ist aber nicht ganz Sinn der Sache. (Denke ich) Hat jemand eine Idee? '{"time":{"exactTime":true,"start":"01:00"},"period":{"days":1,"dows":"[1, 2, 3, 4, 5]"}}' sendTo('sql.0', 'query', 'use sag SELECT validfrom, comfortcode FROM dbo.tgcs WHERE DATEADD(DAY, 0, DATEDIFF(DAY, 0, validfrom)) = DATEADD(DAY, 0, DATEDIFF(DAY, 0, GETDATE()))', function (result) { if (result.error) { console.error(result.error); } else { // show result console.log('Rows: ' + JSON.stringify(result.result)); setState('0_userdata.0.heutiges_datum.validfrom', formatDate(result.result[0].validfrom, 'DD.MM.YY'), true); setState('0_userdata.0.heutiges_datum.comfortcode', result.result[0].comfortcode, true); } }); @paul53 hast du mir hier ein Tipp?
  • getIDs() Funktion nicht verfügbar

    12
    0 Votes
    12 Posts
    663 Views
    haus-automatisierungH
    @kamikaze Habs mal angepasst: https://github.com/ioBroker/ioBroker.javascript/pull/1829
  • Shellypw/ mqtt einstellungen ändern.

    1
    0 Votes
    1 Posts
    102 Views
    No one has replied
  • [gelöst] Axios implementieren

    14
    1
    0 Votes
    14 Posts
    655 Views
    T
    @ben1983 Ja, aber wie oben geschrieben,wenn du den wled adapter von mir nimmst, gibt es einen State in dem du das Json rein wirst und es wird dann über die websocket verbindung vom wled adapter versendet: https://github.com/ticaki/ioBroker.wled Die PR ist ist beim Dutchman eingereicht, mal sehen wann er es added. mich hats genervt das "an" "helligkeit" "preset" in 3 Stufen ausgeführt wird... Deshalb nen State eingebaut dem ich dann so die Daten übergebe: setState(`${light.id}.action`, JSON.stringify({ "bri": bri, "on": lOn, 'ps': cArray[2], 'transition': 1 })) Das sollte auch für Steuerung von einzelnen LED's gut sein.
  • Fenster offen Script

    11
    0 Votes
    11 Posts
    850 Views
    T
    ich würde ja in so Skripts noch ein schedule('1 1 * * *', () => {startScript(name);} einbauen - dann braucht man auch nicht ans neustarten zu denken, wenn man 6 Monate später mal nen Sensor austauscht :)
  • Skript PING

    15
    1
    3 Votes
    15 Posts
    1k Views
    E
    ich habe aber generell noch eine Frage zu dem script. Ich habe daraus jetzt 3 script gemacht. Da ich Kameras, Lan und Wlan einzeln angezeigt bekommen möchte. Die funktionieren auch Alle soweit ich würde gerne daraus ein script machen. Datenpunkte werden dann auch Alle richtig angelegt. Was ich nicht hinbekommen ist die Ping Abfrage Momentan ist da so meine Einstellungen //Version 1.0.0 - 04.10.2024 //Ersteller Ro75. //https://forum.iobroker.net/topic/77249/skript-ping //Voraussetzungen (Version 1.0.0 getestet mit) //NodeJS: 20.x //Javascript-Adapter: 8.7.6 //Admin-Adapter: 7.0.23 //JS-Controller: 6.0.11 //https://forum.iobroker.net/topic/77249/skript-ping //"normale" Geräte ("Computer, Router, Switch, HUB, NAS, WLAN-Steckdosen, Android-Smartphone, Android-Tablet, etc.") //Amazon Echos, SKY-Geräte und diverse Konsolen (einfach probieren) funktionieren nicht. const ping = require('ping'); //Im Javascript-Adapter einzutragen (Zusätzliche NPM-Module) const sMainPathKamera = '0_userdata.0.Netzwerkgeräte-Test.Kamera.'; //zentraler Datenpunkt const sMainPathKameras = '0_userdata.0.Netzwerkgeräte-Test.Kameras'; const sMainPathLan = '0_userdata.0.Netzwerkgeräte-Test.Lan.'; //zentraler Datenpunkt const sMainPathLangeraete = '0_userdata.0.Netzwerkgeräte-Test.Lan-Geräte'; const sMainPathWlan = '0_userdata.0.Netzwerkgeräte-Test.Wlan.'; //zentraler Datenpunkt const sMainPathWlangeraete = '0_userdata.0.Netzwerkgeräte-Test.Wlan-Geräte'; //Konfiguration der abzufragenden Geräte. Geräte werden duch "Doppelpunkt" (:) getrennt. //Jedes Geräte besteht aus zwei Werten. Die Werte werden durch Komma (,) getrennt. //Links vom Komma die Bezeichnung und rechts vom Komma die IP-Adresse const cDevicePingKamera = 'Kamera-Garage,192.168.178.50'; //bitte anpassen const cDevicePingLan = 'Lan-Geraete,192.168.178.60'; //bitte anpassen const cDevicePingWlan = 'Wlan-Geraete,192.168.178.70'; //bitte anpassen //Kamera Datenpunkte anlegen function PingInitalisierungKamera(){ let sDevice = cDevicePingKamera.split(':'); for (let i = 0; i <= sDevice.length-1; i++) { let device_data = sDevice[i].split(','); createState(sMainPathKamera+device_data[0], '', {name: device_data[1],read: true, write: true}); createState(sMainPathKamera+device_data[0]+'.Ping.alive', false, {name: 'Pingstatus' ,type: 'boolean', read: true, write: true}); createState(sMainPathKamera+device_data[0]+'.Ping.time', 0, {name: 'Zeit' ,type: 'number', read: true, write: true, unit: 'ms'}); createState(sMainPathKamera+device_data[0]+'.Ping.status', '', {name: 'Status' ,type: 'string', read: true, write: true}); createState(sMainPathKameras, 0, {name: 'Onlinestatus' ,type: 'number', read: true, write: true}); } } //Lan Datenpunkte anlegen function PingInitalisierungLan(){ let sDevice = cDevicePingLan.split(':'); for (let i = 0; i <= sDevice.length-1; i++) { let device_data = sDevice[i].split(','); createState(sMainPathLan+device_data[0], '', {name: device_data[1],read: true, write: true}); createState(sMainPathLan+device_data[0]+'.Ping.alive', false, {name: 'Pingstatus' ,type: 'boolean', read: true, write: true}); createState(sMainPathLan+device_data[0]+'.Ping.time', 0, {name: 'Zeit' ,type: 'number', read: true, write: true, unit: 'ms'}); createState(sMainPathLan+device_data[0]+'.Ping.status', '', {name: 'Status' ,type: 'string', read: true, write: true}); createState(sMainPathLangeraete, 0, {name: 'Onlinestatus' ,type: 'number', read: true, write: true}); } } //Wlan Datenpunkte anlegen function PingInitalisierungWlan(){ let sDevice = cDevicePingWlan.split(':'); for (let i = 0; i <= sDevice.length-1; i++) { let device_data = sDevice[i].split(','); createState(sMainPathWlan +device_data[0], '', {name: device_data[1],read: true, write: true}); createState(sMainPathWlan +device_data[0]+'.Ping.alive', false, {name: 'Pingstatus' ,type: 'boolean', read: true, write: true}); createState(sMainPathWlan +device_data[0]+'.Ping.time', 0, {name: 'Zeit' ,type: 'number', read: true, write: true, unit: 'ms'}); createState(sMainPathWlan +device_data[0]+'.Ping.status', '', {name: 'Status' ,type: 'string', read: true, write: true}); createState(sMainPathWlangeraete, 0, {name: 'Onlinestatus' ,type: 'number', read: true, write: true}); } } //START PingInitalisierungKamera(); async function pingHost(host,sDesc) { try { const res = await ping.promise.probe(host, {timeout: 2, deadline: 2, packetSize: 16}); setState(sMainPathKamera+sDesc+'.Ping.alive', JSON.parse(JSON.stringify(res)).alive, true); setState(sMainPathKamera+sDesc+'.Ping.time', parseFloat(JSON.parse(JSON.stringify(res)).time), true); setState(sMainPathKamera+sDesc+'.Ping.status', 'OK', true); } catch (error) { setState(sMainPathKamera+sDesc+'.Ping.status', 'ERROR', true); } } PingInitalisierungLan(); async function pingHost(host,sDesc) { try { const res = await ping.promise.probe(host, {timeout: 2, deadline: 2, packetSize: 16}); setState(sMainPathLan+sDesc+'.Ping.alive', JSON.parse(JSON.stringify(res)).alive, true); setState(sMainPathLan+sDesc+'.Ping.time', parseFloat(JSON.parse(JSON.stringify(res)).time), true); setState(sMainPathLan+sDesc+'.Ping.status', 'OK', true); } catch (error) { setState(sMainPathLan+sDesc+'.Ping.status', 'ERROR', true); } } PingInitalisierungWlan(); async function pingHost(host,sDesc) { try { const res = await ping.promise.probe(host, {timeout: 2, deadline: 2, packetSize: 16}); setState(sMainPathWlan+sDesc+'.Ping.alive', JSON.parse(JSON.stringify(res)).alive, true); setState(sMainPathWlan+sDesc+'.Ping.time', parseFloat(JSON.parse(JSON.stringify(res)).time), true); setState(sMainPathWlan+sDesc+'.Ping.status', 'OK', true); } catch (error) { setState(sMainPathWlan+sDesc+'.Ping.status', 'ERROR', true); } } //Ping aller 10 Sekunden - kann angepasst werden - kleinerer Wert nicht empfohlen //damit das Intervall (wenn zu niedrig) nicht "gesprengt" wird: Schleife sperren und am Ende wieder freigeben let bPingSperreKamera = false; schedule('*/20 * * * * *', async function StartPing() { if (bPingSperreKamera == false) { bPingSperreKamera = true; let sDevice = cDevicePingKamera.split(':'); for (let i = 0; i <= sDevice.length-1; i++) { await pingHost(sDevice[i].split(',')[1],sDevice[i].split(',')[0]); } bPingSperreKamera = false; } }); let bPingSperreLan = false; schedule('*/30 * * * * *', async function StartPing() { if (bPingSperreLan == false) { bPingSperreLan = true; let sDevice = cDevicePingLan.split(':'); for (let i = 0; i <= sDevice.length-1; i++) { await pingHost(sDevice[i].split(',')[1],sDevice[i].split(',')[0]); } bPingSperreLan= false; } }); //Ping aller 10 Sekunden - kann angepasst werden - kleinerer Wert nicht empfohlen //damit das Intervall (wenn zu niedrig) nicht "gesprengt" wird: Schleife sperren und am Ende wieder freigeben let bPingSperreWlan = false; schedule('*/40 * * * * *', async function StartPing() { if (bPingSperreWlan == false) { bPingSperreWlan = true; let sDevice = cDevicePingWlan.split(':'); for (let i = 0; i <= sDevice.length-1; i++) { await pingHost(sDevice[i].split(',')[1],sDevice[i].split(',')[0]); } bPingSperreWlan = false; } }); der Part ist so nicht richtig. Da bräuchte ich Hilfe //START PingInitalisierungKamera(); async function pingHost(host,sDesc) { try { const res = await ping.promise.probe(host, {timeout: 2, deadline: 2, packetSize: 16}); setState(sMainPathKamera+sDesc+'.Ping.alive', JSON.parse(JSON.stringify(res)).alive, true); setState(sMainPathKamera+sDesc+'.Ping.time', parseFloat(JSON.parse(JSON.stringify(res)).time), true); setState(sMainPathKamera+sDesc+'.Ping.status', 'OK', true); } catch (error) { setState(sMainPathKamera+sDesc+'.Ping.status', 'ERROR', true); } } PingInitalisierungLan(); async function pingHost(host,sDesc) { try { const res = await ping.promise.probe(host, {timeout: 2, deadline: 2, packetSize: 16}); setState(sMainPathLan+sDesc+'.Ping.alive', JSON.parse(JSON.stringify(res)).alive, true); setState(sMainPathLan+sDesc+'.Ping.time', parseFloat(JSON.parse(JSON.stringify(res)).time), true); setState(sMainPathLan+sDesc+'.Ping.status', 'OK', true); } catch (error) { setState(sMainPathLan+sDesc+'.Ping.status', 'ERROR', true); } } PingInitalisierungWlan(); async function pingHost(host,sDesc) { try { const res = await ping.promise.probe(host, {timeout: 2, deadline: 2, packetSize: 16}); setState(sMainPathWlan+sDesc+'.Ping.alive', JSON.parse(JSON.stringify(res)).alive, true); setState(sMainPathWlan+sDesc+'.Ping.time', parseFloat(JSON.parse(JSON.stringify(res)).time), true); setState(sMainPathWlan+sDesc+'.Ping.status', 'OK', true); } catch (error) { setState(sMainPathWlan+sDesc+'.Ping.status', 'ERROR', true); } } //Ping aller 10 Sekunden - kann angepasst werden - kleinerer Wert nicht empfohlen //damit das Intervall (wenn zu niedrig) nicht "gesprengt" wird: Schleife sperren und am Ende wieder freigeben let bPingSperreKamera = false; schedule('*/20 * * * * *', async function StartPing() { if (bPingSperreKamera == false) { bPingSperreKamera = true; let sDevice = cDevicePingKamera.split(':'); for (let i = 0; i <= sDevice.length-1; i++) { await pingHost(sDevice[i].split(',')[1],sDevice[i].split(',')[0]); } bPingSperreKamera = false; } }); let bPingSperreLan = false; schedule('*/30 * * * * *', async function StartPing() { if (bPingSperreLan == false) { bPingSperreLan = true; let sDevice = cDevicePingLan.split(':'); for (let i = 0; i <= sDevice.length-1; i++) { await pingHost(sDevice[i].split(',')[1],sDevice[i].split(',')[0]); } bPingSperreLan= false; } }); //Ping aller 10 Sekunden - kann angepasst werden - kleinerer Wert nicht empfohlen //damit das Intervall (wenn zu niedrig) nicht "gesprengt" wird: Schleife sperren und am Ende wieder freigeben let bPingSperreWlan = false; schedule('*/40 * * * * *', async function StartPing() { if (bPingSperreWlan == false) { bPingSperreWlan = true; let sDevice = cDevicePingWlan.split(':'); for (let i = 0; i <= sDevice.length-1; i++) { await pingHost(sDevice[i].split(',')[1],sDevice[i].split(',')[0]); } bPingSperreWlan = false; } }); Edit: nach der ersten Pingabfrage kommt dann das javascript.0 12:35:20.027 warn at async Object.StartPing (script.js.common.Netzwerkstatus.Test1:121:13) javascript.0 12:35:20.028 warn at pingHost (script.js.common.Netzwerkstatus.Test1:105:9) javascript.0 12:35:20.028 warn at async Object.StartPing (script.js.common.Netzwerkstatus.Test1:121:13) javascript.0 12:35:20.029 warn at pingHost (script.js.common.Netzwerkstatus.Test1:106:9) javascript.0 12:35:20.029 warn at async Object.StartPing (script.js.common.Netzwerkstatus.Test1:121:13) javascript.0 12:35:20.051 warn at pingHost (script.js.common.Netzwerkstatus.Test1:104:9) javascript.0 12:35:20.051 warn at async Object.StartPing (script.js.common.Netzwerkstatus.Test1:121:13) javascript.0 12:35:20.053 warn at pingHost (script.js.common.Netzwerkstatus.Test1:105:9) javascript.0 12:35:20.053 warn at async Object.StartPing (script.js.common.Netzwerkstatus.Test1:121:13) javascript.0 12:35:20.054 warn at pingHost (script.js.common.Netzwerkstatus.Test1:106:9) javascript.0 12:35:20.054 warn at async Object.StartPing (script.js.common.Netzwerkstatus.Test1:121:13) javascript.0 12:35:20.077 warn at pingHost (script.js.common.Netzwerkstatus.Test1:104:9) javascript.0 12:35:20.078 warn at async Object.StartPing (script.js.common.Netzwerkstatus.Test1:121:13) javascript.0 12:35:20.079 warn at pingHost (script.js.common.Netzwerkstatus.Test1:105:9) javascript.0 12:35:20.080 warn at async Object.StartPing (script.js.common.Netzwerkstatus.Test1:121:13) javascript.0 12:35:20.081 warn at pingHost (script.js.common.Netzwerkstatus.Test1:106:9) javascript.0 12:35:20.081 warn at async Object.StartPing (script.js.common.Netzwerkstatus.Test1:121:13) javascript.0 12:35:20.102 warn at pingHost (script.js.common.Netzwerkstatus.Test1:104:9) javascript.0 12:35:20.103 warn at async Object.StartPing (script.js.common.Netzwerkstatus.Test1:121:13) javascript.0 12:35:20.104 warn at pingHost (script.js.common.Netzwerkstatus.Test1:105:9) javascript.0 12:35:20.104 warn at async Object.StartPing (script.js.common.Netzwerkstatus.Test1:121:13) javascript.0 12:35:20.106 warn at pingHost (script.js.common.Netzwerkstatus.Test1:106:9) javascript.0 12:35:20.106 warn at async Object.StartPing (script.js.common.Netzwerkstatus.Test1:121:13) javascript.0 12:35:20.136 warn at pingHost (script.js.common.Netzwerkstatus.Test1:104:9) javascript.0 12:35:20.137 warn at async Object.StartPing (script.js.common.Netzwerkstatus.Test1:121:13) javascript.0 12:35:20.138 warn at pingHost (script.js.common.Netzwerkstatus.Test1:105:9) javascript.0 12:35:20.138 warn at async Object.StartPing (script.js.common.Netzwerkstatus.Test1:121:13) javascript.0 12:35:20.139 warn at pingHost (script.js.common.Netzwerkstatus.Test1:106:9) javascript.0 12:35:20.140 warn at async Object.StartPing (script.js.common.Netzwerkstatus.Test1:121:13) javascript.0 12:35:20.197 warn at pingHost (script.js.common.Netzwerkstatus.Test1:104:9) javascript.0 12:35:20.197 warn at async Object.StartPing (script.js.common.Netzwerkstatus.Test1:121:13) javascript.0 12:35:20.198 warn at pingHost (script.js.common.Netzwerkstatus.Test1:105:9) javascript.0 12:35:20.198 warn at async Object.StartPing (script.js.common.Netzwerkstatus.Test1:121:13) javascript.0 12:35:20.199 warn at pingHost (script.js.common.Netzwerkstatus.Test1:106:9) javascript.0 12:35:20.200 warn at async Object.StartPing (script.js.common.Netzwerkstatus.Test1:121:13)
  • Syrlex Plus 10 connect SL - App reverse engineering

    15
    1
    1 Votes
    15 Posts
    1k Views
    ?
    @tombox 1000 Dank!!!
  • Java Script - Objekt JSON

    8
    0 Votes
    8 Posts
    374 Views
    OliverIOO
    @schmidiv Da es jetzt noch nicht so deutlich da stand. Du legst einen Datenpunkt unter 0_userdata mit Typ String/Text an Den Wert kannst du mit getState und setState lesen und schreiben. Ein json Objekt das als Text vorliegt kannst du mit JSON.parse in ein Objekt umwandeln und vor dem Schreiben wieder mit JSON.stringify in Text umwandeln. Das ist einfacher wie mit getObject und extendObject zu hantieren.
  • JavaScript-Methode für das Auslesen des Objekt-Namens

    8
    1
    0 Votes
    8 Posts
    568 Views
    G
    @ticaki Danke dafür. Das sieht sehr interessant aus. Ich werde wohl auch noch Einiges an Syntax von JS/TS lernen. Ich schau es mir nächste Woche im Detail an - diese Woche komme ich nicht mehr dazu
  • Zeiten filtern Array

    53
    0 Votes
    53 Posts
    5k Views
    D
    @ticaki @paul53 hab den Fehler bei mir im Code gefunden, danke euch für eure Hilfe!
  • Dateigröße mit Bordmitteln

    15
    0 Votes
    15 Posts
    677 Views
    wcag22W
    @asgothian sagte in Dateigröße mit Bordmitteln: Erst einmal danke für die Rückmeldung und die Erklärung. Du musst das was oben steht durchaus auch 'korrekt' umsetzen: Ja klar :-) , aber das war ja eben mein Verständnisproblem Mit dem 'import' befehl importierst du eine Bibliothek. Damit ersetzt import fs from 'fs' nur var fs = require('fs') In der muss dann die Funktion aufgerufen werden die die Daten liefert:: Ok, das haste gut erklärt. Wieder was gelernt. Also danke-danke...
  • This topic is deleted!

    0
    0 Votes
    0 Posts
    2 Views
    No one has replied
  • [Gelöst] Self signed certificate ignorieren

    3
    1
    0 Votes
    3 Posts
    246 Views
    D
    @codierknecht super das war einfach wenn man es weiss 😄 Danke für die Hilfe
  • Fehler bei httpGet(), aber kein Fehlercode

    6
    0 Votes
    6 Posts
    449 Views
    ?
    @homoran Ja, das ist nichts geheimes. Kann sich jeder dort einen Token für die API generieren. @Codierknecht Nehme ich eine andere URL (z. B. http://www.aws32.de/) funktioniert alles. (Das ist nur eine meiner leeren Domains)

418

Online

32.5k

Users

81.6k

Topics

1.3m

Posts