Skip to content

Visualisierung

9.5k Topics 104.4k Posts

Hilfe zu Visualisierungen

NEWS

  • Problem bei Installation von vis

    21
    0 Votes
    21 Posts
    721 Views
    HomoranH
    @berlon sagte in Problem bei Installation von vis: rm: cannot remove '/opt/iobroker': Permission denied iobroker fix
  • Suche einfaches Pop-up Widget ohne View zu erstellen

    13
    0 Votes
    13 Posts
    1k Views
    liv-in-skyL
    @hg6806 probier mal den hier - geht autom. zu: [image: 1634923071499-aapossis-145.gif] es hat sich aber etwas geändert - mich hat gestört, dass sich zwei von diesen "widgets" gegenseitig beeinflußt haben - jetzt kann mn so viel im project haben, wie man will du musst aber folgendes in den script- tab kopieren - und in jedem widget deinen datenpunkt eingeben [image: 1634923503022-image-4.png] hier das script: in script-tab des vis-editors kopieren function myFunctionForPOP(widgeet,cl) { console.log(JSON.stringify(cl)); var classList=cl /* console.log("cl von 0 : "+cl[0]);*/ var theID="myPopup"+cl[0].replace("popup","") /* console.log(theID)*/ objID=val='0_userdata.0.CONTROL-OWN.AAATEST.AARolladen'; servConn.getStates(objID, (error, states) => { console.log(states[val].lc); var helper=states[val].lc; console.log("da "+ String(new Date(helper).toLocaleTimeString("de-DE")) + '<br>' + String(new Date(helper).toLocaleDateString("de-DE"))); var ausgabeDP= String(new Date(helper).toLocaleTimeString("de-DE")) + " am " + String(new Date(helper).toLocaleDateString("de-DE")); /* console.log("myPopup"+cl[0]) */ var popup = document.getElementById(theID); /* console.log("popup ausgabe : "+popup) */ $("."+cl[0]+"text").text(ausgabeDP); /* console.log("myfunction"+ ausgabeDP);*/ popup.classList.toggle("show"); setTimeout(function() { document.getElementById(theID).classList.toggle("show"); console.log("wait"); }, 5000); })} widgets für import - du knnst auch 2 davon löschen, wenn nicht gewünscht [{"tpl":"tplHtml","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":true,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":true,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","refreshInterval":"0","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"html":"<style>\n/* Popup container - can be anything you want */\n.popup{wid} {\n position: relative;\n display: inline-block;\n cursor: pointer;\n color: #fff;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n/* The actual popup */\n.popup{wid} .popup{wid}text {\n visibility: hidden;\n width: 260px;\n background-color: #555;\n background: linear-gradient(135deg, #6db3f2 0%,#54a3ee 29%,#3690f0 58%,#1e69de 100%);\n color: #fff;\n text-align: center;\n border-radius: 6px;\n padding: 28px 0;\n position: absolute;\n z-index: 1;\n bottom: 0%;\n left: 50%;\n margin-left: -80px;\n}\n\n/* Popup arrow */\n .popup{wid} .popup{wid}text {\n content: \"\";\n position: absolute;\n top: 100%;\n left: 50%;\n margin-left: -5px;\n border-width: 5px;\n border-style: solid;\n border-color: #555 transparent transparent transparent;\n}\n\n/* Toggle this class - hide and show the popup */\n.popup{wid} .show {\n visibility: visible;\n -webkit-animation: fadeIn 1s;\n animation: fadeIn 1s;\n}\n\n/* Add animation (fade in the popup) */\n@-webkit-keyframes fadeIn {\n from {opacity: 0;} \n to {opacity: 1;}\n}\n\n@keyframes fadeIn {\n from {opacity: 0;}\n to {opacity:1 ;}\n}\n\n .abstand{wid}{\n padding-top: 40px;\n }\n</style>\n\n\n<span class=\"abstand{wid}\">&ensp;</span>\n<span></span>\n<div class=\"popup{wid}\" onclick=\"myFunctionForPOP({wid},classList)\">Datenpunkt Info\n <span class=\"popup{wid}text\" id=\"myPopup{wid}\">123<br>234</span>\n</div>\n","lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0},"style":{"left":"610px","top":"569px","color":"","width":"428px","height":"104px","border-width":"1px","border-style":"dotted","border-color":"#FFFFFF"},"widgetSet":"basic"},{"tpl":"tplHtml","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":true,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":true,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","refreshInterval":"0","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"html":"<style>\n/* Popup container - can be anything you want */\n.popup{wid} {\n position: relative;\n display: inline-block;\n cursor: pointer;\n color: #fff;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n/* The actual popup */\n.popup{wid} .popup{wid}text {\n visibility: hidden;\n width: 260px;\n background-color: #555;\n background: linear-gradient(135deg, #e6f0a3 0%,#d2e638 27%,#d2e638 27%,#c3d825 47%,#c3d825 62%,#dbf043 100%);\n color: #fff;\n text-align: center;\n border-radius: 6px;\n padding: 28px 0;\n position: absolute;\n z-index: 1;\n bottom: 0%;\n left: 50%;\n margin-left: -80px;\n}\n\n/* Popup arrow */\n .popup{wid} .popup{wid}text {\n content: \"\";\n position: absolute;\n top: 100%;\n left: 50%;\n margin-left: -5px;\n border-width: 5px;\n border-style: solid;\n border-color: #555 transparent transparent transparent;\n}\n\n/* Toggle this class - hide and show the popup */\n.popup{wid} .show {\n visibility: visible;\n -webkit-animation: fadeIn 1s;\n animation: fadeIn 1s;\n}\n\n/* Add animation (fade in the popup) */\n@-webkit-keyframes fadeIn {\n from {opacity: 0;} \n to {opacity: 1;}\n}\n\n@keyframes fadeIn {\n from {opacity: 0;}\n to {opacity:1 ;}\n}\n\n .abstand{wid}{\n padding-top: 40px;\n }\n</style>\n\n\n<span class=\"abstand{wid}\">&ensp;</span>\n<span></span>\n<div class=\"popup{wid}\" onclick=\"myFunctionForPOP({wid},classList)\">Datenpunkt Info\n <span class=\"popup{wid}text\" id=\"myPopup{wid}\">123<br>234</span>\n</div>\n","lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0},"style":{"left":"609px","top":"704px","color":"","width":"428px","height":"104px","border-width":"1px","border-style":"dotted","border-color":"#FFFFFF"},"widgetSet":"basic"},{"tpl":"tplHtml","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":true,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":true,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","refreshInterval":"0","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"html":"<style>\n/* Popup container - can be anything you want */\n.popup{wid} {\n position: relative;\n display: inline-block;\n cursor: pointer;\n color: #fff;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n/* The actual popup */\n.popup{wid} .popup{wid}text {\n visibility: hidden;\n width: 260px;\n background-color: #555;\n background: linear-gradient(135deg, #efc5ca 0%,#d24b5a 34%,#ba2737 51%,#f18e99 100%);\n color: #fff;\n text-align: center;\n border-radius: 6px;\n padding: 28px 0;\n position: absolute;\n z-index: 1;\n bottom: 0%;\n left: 50%;\n margin-left: -80px;\n}\n\n/* Popup arrow */\n .popup{wid} .popup{wid}text {\n content: \"\";\n position: absolute;\n top: 100%;\n left: 50%;\n margin-left: -5px;\n border-width: 5px;\n border-style: solid;\n border-color: #555 transparent transparent transparent;\n}\n\n/* Toggle this class - hide and show the popup */\n.popup{wid} .show {\n visibility: visible;\n -webkit-animation: fadeIn 1s;\n animation: fadeIn 1s;\n}\n\n/* Add animation (fade in the popup) */\n@-webkit-keyframes fadeIn {\n from {opacity: 0;} \n to {opacity: 1;}\n}\n\n@keyframes fadeIn {\n from {opacity: 0;}\n to {opacity:1 ;}\n}\n\n .abstand{wid}{\n padding-top: 40px;\n }\n</style>\n\n\n<span class=\"abstand{wid}\">&ensp;</span>\n<span></span>\n<div class=\"popup{wid}\" onclick=\"myFunctionForPOP({wid},classList)\">Datenpunkt Info\n <span class=\"popup{wid}text\" id=\"myPopup{wid}\">123<br>234</span>\n</div>\n","lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0},"style":{"left":"611px","top":"842px","color":"","width":"428px","height":"104px","border-width":"1px","border-style":"dotted","border-color":"#FFFFFF"},"widgetSet":"basic"}]
  • Infofenster als Popup ohne dauerhafte Anzeige im Editor?

    10
    0 Votes
    10 Posts
    799 Views
    DickenD
    @glasfaser sagte in Infofenster als Popup ohne dauerhafte Anzeige im Editor?: @dicken Was wäre hiermit , als Popup Mitteilung https://github.com/Scrounger/ioBroker.vis-materialdesign#alerts Ja, genau sowas hab ich gesucht :) @homoran sagte in Infofenster als Popup ohne dauerhafte Anzeige im Editor?: @Dicken Willst du das Popup auf andere Weise aufrufen? und wenn ja wie? Es soll halt angezeigt werden, wenn ein Datenpunkt zbsp auf true wechselt. Aber ich glaube das was @Glasfaser gepostet hat ist genau das was ich suche :) Danke euch für die Hilfe :)
  • Grafana aktualisiert sich in der vis nicht Nr2.

    7
    3
    0 Votes
    7 Posts
    715 Views
    P
    @guergen Und nehme dann nur den Bereich von http bis zum panelid=4 in meinem Fall Ich habe keinen Pfeil Klasse! Danke für den Tipp
  • Grafana - Zeitformate

    20
    0 Votes
    20 Posts
    1k Views
    DickenD
    @thomas-braun sagte in Grafana - Zeitformate: @dicken Dann nutzt das nicht die Locales, war ja auch nur eine Vermutung. Trotzdem vielen Dank für deine Hilfe. Ich glaub ich mach vllt einfach mal ein Issue auf und frag da mal nach.
  • Icons werden auf dem iPad nicht angezeigt...

    2
    1
    0 Votes
    2 Posts
    85 Views
    KusselinK
    Nach ca. Ner Std. Würden alle angezeigt.
  • Visualisierung des Stromverbrauchs

    Locked Moved
    90
    0 Votes
    90 Posts
    11k Views
    HomoranH
    Thread geschlossen! Bitte für die Sachfremden Dinge in einem neuen Thread weitermachen. Diese werden hier gelöscht
  • ioBroker VIS keine Aktualisierung auf dem Tablet

    2
    0 Votes
    2 Posts
    218 Views
    sigi234S
    @mrichstein Du musst in der App vollständig Synchronisieren
  • [gelöst] HM IP Gerät schaltet nicht mit der Iobroker App

    21
    1
    0 Votes
    21 Posts
    703 Views
    HomoranH
    @luric sagte in [gelöst] HM IP Gerät schaltet nicht mit der Iobroker App: Es funktioniert nun tadellos. so soll es sein! Einfach ohne unnötigen Schnickschnack
  • Flot gemeinsame y-Achse

    3
    2
    0 Votes
    3 Posts
    215 Views
    ChrisNettC
    @homoran danke!
  • FLV-Stream IP-Cam in VIS einbinden? [Reolink RLC-410W]

    vis camera
    10
    2
    0 Votes
    10 Posts
    3k Views
    R
    @mir4g3 Schade, dass noch keine native Lösung für das Thema gefunden wurde. Ich denke grundsätzlich sollte das mit dem flv player schon funktionieren. Diesen kann man sich auch herunterladen und vielleicht wäre es möglich diesen auf dem ioBroker host einzubinden.
  • Pincode Eingabe Alarmanlage

    Moved
    56
    0 Votes
    56 Posts
    15k Views
    Danny 0D
    Hi, danke für den Quellcode. Ich habe ihn noch etwas erweitert. Neue Funktion: Auswahl Zwischen Pin aus der Variablen oder Quellcode Vorschau in der Vis von der eingegebenen Zahl, die dann aber wieder verschwindet nach ein paar Millisekunden Reaktion auf Taste "#" und "-" anstelle von "R" und "E" Nachricht in der VIS wenn der Pin Richtig oder Falsch war // ----------------------------------------------------------------------------- // allgemeine Variablen // ----------------------------------------------------------------------------- var logging = true; // Logging on/off var instanz = 'javascript.0'; instanz = instanz + '.Alarm'; // var pfad0 = 'alarm.Pin.'; // Pfad innerhalb der Instanz // ----------------------------------------------------------------------------- // Variablen für Pin-Abfrage // ----------------------------------------------------------------------------- var PinTast = ""; // Inhalt der Eingabe var PinTemp =""; // Puffer für eingegebe Ziffern var PinLae = 0; // Pin-Länge bei Eingabe var PinState = false ; // Eingabestatus - Eingabe beginnt nach Taste '#' und wird mit Taste '#' abgeschlossen var PinFehl = false; // Statusflag für fehlerhafte Eingabe var PinAnz = ""; // Angezeiger 'Displaytext' z.B. **** var PinAnzStat = 0; // Status der PinAnzeige im Display (0-Ruhe | 1-Start [grau] | 2-richtig [gruen] | 3-falsch [rot]) var PinShowLastState = true ; // Zeigt die letzte eingegeben Zahl in der Variable VisKeyPad an z.B. ***4 diese Verschwindet automatisch nach einer gewissen zeit var PinShowLastStateDelay = 400 ; // Zeit in ms (Millisekunden) die die letzte eingebene Zahl angezeigt wird var PinSoll = getState(pfad0 + 'Pin').val; // Pin die zur Deaktivierung der Alarmanlage benötigt wird // var PinSoll = String("1111"); // Pin die zur Deaktivierung der Alarmanlage benötigt wird var PinUnlockMsg = "unlock" // Text der in PinAnz zu sehen ist wenn der Pin i.O. eingegeben wurde var PinFailureMsg = "failure" // Text der in PinAnz zu sehen ist wenn der Pin i.O. eingegeben wurde // ----------------------------------------------------------------------------- // Objekte // ----------------------------------------------------------------------------- // Objekte für Pin-Eingabe createState(pfad0 + 'disable', false , {name: 'Alarm abschalten'}); createState(pfad0 + 'PinSelect', "" , {name: 'Pin-Eingabe'}); createState(pfad0 + 'Pin', '0000' , {name: 'Pin'}); createState(pfad0 + 'PinFehler', false , {name: 'Pin-Fehler'}); createState(pfad0 + 'PinAnzStat', 1 , {name: 'PinAnzeigeStatus'}); createState(pfad0 + 'PinAnz', '' , {name: 'Pin-Anzeige'}); createState(pfad0 + 'VisKeyPad', '' , {name: 'State für Vis Keypad Sichtbar'}); //State für Vis Keypad Sichtbar wird von Button in Vis beschrieben und bei unscharf zurück gesetzt // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ // ############################################################################# // # # // # Pin-Abfrage # // # # // ############################################################################# on({id: 'javascript.0.alarm.Pin.PinSelect', change: "any"}, function (dp) { if (dp.state.val === 0 || dp.state.val === 1 || dp.state.val === 2 || dp.state.val === 3 || dp.state.val === 4 || dp.state.val === 5 || dp.state.val === 6 || dp.state.val === 7 || dp.state.val === 8 || dp.state.val === 9) { PinTast = dp.state.val; PinEingabe(); } if (dp.state.val === '#') { PinPruef(); } if (dp.state.val === '-') { PinReset(); } }); function PinEingabe () { PinTemp = (String(PinTemp) + String(PinTast)); setState('javascript.0.alarm.Pin.VisKeyPad', PinAnz + PinTast); PinAnz = String(PinAnz + '*'); // setState('javascript.0.alarm.Pin.PinAnz', PinAnz); timeout = setTimeout(async function () {setState('javascript.0.alarm.Pin.VisKeyPad', PinAnz); }, PinShowLastStateDelay); PinLae = (PinLae +1) ; } function unscharf(){ setState('javascript.0.alarm.Pin.PinAnzStat',1); setState('javascript.0.alarm.Pin.disable', true); setState('javascript.0.alarm.Pin.VisKeyPad', PinUnlockMsg); timeout_unscharf = setTimeout(async function () {setState('javascript.0.alarm.Pin.VisKeyPad', ""); }, 2000); if(logging) log('Deaktivierung / Pineingabe erfolgreich'); ///////////////////////////////////////////////////// Hier musst du dann deinen Türöffner auf machen reinschreiben } function PinPruef() { if (PinTemp == PinSoll) { if(logging) log('PinEingabe erfolgreich'); PinAnzStat = 1; unscharf(); // Resette den Pin nach 2 Sekunden setTimeout(function() { PinReset(); }, 2 * 1000); } else { if(logging) log('PinEingabe Fehler'); PinAnzStat = 2; setState('javascript.0.alarm.Pin.PinAnzStat', 2); setState('javascript.0.alarm.Pin.PinFehler', true); setState('javascript.0.alarm.Pin.disable', false); setState('javascript.0.alarm.Pin.VisKeyPad', PinFailureMsg); PinReset(); } } function PinReset() { if (PinTemp == PinSoll) { setState('javascript.0.alarm.Pin.VisKeyPad', ""); } else { timeout_pinpruef = setTimeout(async function () {setState('javascript.0.alarm.Pin.VisKeyPad', ""); }, 1000); } PinLae=0; PinAnzStat=2; PinAnz=""; PinTemp=""; setState('javascript.0.alarm.Pin.PinAnzStat', 2); setState('javascript.0.alarm.Pin.PinAnz', PinAnz); } was noch kommt ... Maximale Falscheingabe des PIN, melde Objekt wenn zu oft falsch eingegeben wurde VG
  • iFrame mit localer Website funktioniert nicht

    11
    0 Votes
    11 Posts
    870 Views
    A
    @andrease112 ok mit einem 2ten Webadater lässt sich zumindest das Zugriffsproblem lösen
  • Zugriff auf VIS-Widget-Attribute src

    vis
    1
    0 Votes
    1 Posts
    232 Views
    No one has replied
  • mein aktuelles VISv7

    vis
    142
    20
    23 Votes
    142 Posts
    30k Views
    D
    @andre-r Du musst mal im Material Design Adapter Einstellungen reinsehen… dort gibt es Farbkombinationen. Da misst du das blau für die Karten ersetzen. Du kannst die die Kacheln einfach in den Kachecl css Einstellungen mit der richtigen Farbe belegen. Ich meine es ist #d5d5d5 Habe derzeit keinen Pc um ein screenshot zu machen
  • [gelöst] JSON Telefonliste Werte austauschen

    8
    1
    0 Votes
    8 Posts
    247 Views
    CinimodC
    @liv-in-sky ja klar, ist ja logisch, hatte es nur nicht in kopf, teste es gleich :) Eigentlich dumm das die FB da nicht direkt was gescheites rein schreibt EDIT: Läuft Prima
  • Verschiedene Positionen in den Views

    4
    2
    0 Votes
    4 Posts
    316 Views
    KusselinK
    @cinimod herrgott....klar...warum einfach wenn´s auch schwierig geht...... o.k. nur wenn ich die Position beibehallten will dann kann ch das mit "Zeige in Vie xyz" klicken..ansonsten wenn ich es verschieden haben will dann kopieren...Danke.
  • [gelöst] vis 1.4.4 export View geht nicht

    14
    0 Votes
    14 Posts
    222 Views
    GlasfaserG
    @wolfgangfb sagte in vis 1.4.4 export View geht nicht: Browser neu starten hat geholfen. Dann setzte den Thread auf [gelöst]
  • Grafana Zeitraum ändern [gelöst]

    9
    0 Votes
    9 Posts
    2k Views
    J
    @crunchip Super! Danke! Genau das war es was ich gesucht habe.
  • IOBroker VIS - Springen innerhalb eines Views

    20
    1
    1 Votes
    20 Posts
    2k Views
    D
    @liv-in-sky coole Sache, darüber hatte ich schon so oft nachgedacht. ich hatte es aus Word gekannt, da heisst es glaube ich "sprungmarken". Danke für die wertvolle Hilfestellung!

388

Online

32.8k

Users

82.9k

Topics

1.3m

Posts