Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. Namenskonflikte???

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    16
    1
    1.6k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    864

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.1k

Namenskonflikte???

Geplant Angeheftet Gesperrt Verschoben JavaScript
19 Beiträge 6 Kommentatoren 1.2k Aufrufe 5 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • L Online
    L Online
    legro
    schrieb am zuletzt editiert von legro
    #1

    Seit ein paar Wochen habe ich endlich den Zugang zu JavaScript geschafft. Allerdings sind meine Erfahrungen auf diesem Gebiet natürlich noch sehr gering und so frage ich mich oft, was die eine oder andere Meldung wohl bedeuten mag.

    Hier ein Beispiel ..

    2db0b1e4-6fc5-47c3-8fad-b21e661c0977-image.png

    Meine Frage ..

    Die Variable 'alleMonate' ist garantiert in dem Skript kein weiteres Mal deklariert. Warum erhalte ich diese Meldung?
    Vermutlich verstehe ich nicht, was mit 'scope' alles erfasst wird. Was umfasst also der 'scope' einer in einem separaten Skript deklarierten Variablen? Ist die dann in allen Skripten bekannt?

    Nachtrag: Das hier gezeigte Skript ist nicht etwa im sog. 'common' Verzeichnis deklariert. Bei mir ist diese 'common' Verzeichnis leer.

    Mein bisheriges Verständnis ..

    Deklariere ich eine Variable innerhalb schedule, on, function, .. sind diese nur lokal innerhalb dieser Elemente ( -> scope ) bekannt und ich kann innerhalb eines Skriptes Namen problemlos doppelt verwenden, ohne dass es zu Konflikten kommt.

    Warum erhalte ich also in dem angewählten Beispiel diese Fehlermeldung? Zum Glück wirken sich diese - in meinen Augen unsinnigen Fehlermeldung - nirgendwo innerhalb meines Systems aus.

    Raspberry Pi 5 mit 8GB + 120GB SSD + Coordinator COD-m + ioBroker ..

    M CodierknechtC 2 Antworten Letzte Antwort
    0
    • L legro

      Seit ein paar Wochen habe ich endlich den Zugang zu JavaScript geschafft. Allerdings sind meine Erfahrungen auf diesem Gebiet natürlich noch sehr gering und so frage ich mich oft, was die eine oder andere Meldung wohl bedeuten mag.

      Hier ein Beispiel ..

      2db0b1e4-6fc5-47c3-8fad-b21e661c0977-image.png

      Meine Frage ..

      Die Variable 'alleMonate' ist garantiert in dem Skript kein weiteres Mal deklariert. Warum erhalte ich diese Meldung?
      Vermutlich verstehe ich nicht, was mit 'scope' alles erfasst wird. Was umfasst also der 'scope' einer in einem separaten Skript deklarierten Variablen? Ist die dann in allen Skripten bekannt?

      Nachtrag: Das hier gezeigte Skript ist nicht etwa im sog. 'common' Verzeichnis deklariert. Bei mir ist diese 'common' Verzeichnis leer.

      Mein bisheriges Verständnis ..

      Deklariere ich eine Variable innerhalb schedule, on, function, .. sind diese nur lokal innerhalb dieser Elemente ( -> scope ) bekannt und ich kann innerhalb eines Skriptes Namen problemlos doppelt verwenden, ohne dass es zu Konflikten kommt.

      Warum erhalte ich also in dem angewählten Beispiel diese Fehlermeldung? Zum Glück wirken sich diese - in meinen Augen unsinnigen Fehlermeldung - nirgendwo innerhalb meines Systems aus.

      M Online
      M Online
      MCU
      schrieb am zuletzt editiert von
      #2

      @legro
      javascript-Version?
      admin-Version?

      NUC i7 64GB mit Proxmox ---- Jarvis Infos Aktualisierungen der Doku auf Instagram verfolgen -> mcuiobroker Instagram
      Wenn Euch mein Vorschlag geholfen hat, bitte rechts "^" klicken.

      L 1 Antwort Letzte Antwort
      0
      • M MCU

        @legro
        javascript-Version?
        admin-Version?

        L Online
        L Online
        legro
        schrieb am zuletzt editiert von
        #3

        @mcu sagte in Namenskonflikte???:

        @legro
        javascript-Version?
        admin-Version?

        JavaScript: v8.8.3
        Admin: v7.4.10

        Raspberry Pi 5 mit 8GB + 120GB SSD + Coordinator COD-m + ioBroker ..

        1 Antwort Letzte Antwort
        0
        • L legro

          Seit ein paar Wochen habe ich endlich den Zugang zu JavaScript geschafft. Allerdings sind meine Erfahrungen auf diesem Gebiet natürlich noch sehr gering und so frage ich mich oft, was die eine oder andere Meldung wohl bedeuten mag.

          Hier ein Beispiel ..

          2db0b1e4-6fc5-47c3-8fad-b21e661c0977-image.png

          Meine Frage ..

          Die Variable 'alleMonate' ist garantiert in dem Skript kein weiteres Mal deklariert. Warum erhalte ich diese Meldung?
          Vermutlich verstehe ich nicht, was mit 'scope' alles erfasst wird. Was umfasst also der 'scope' einer in einem separaten Skript deklarierten Variablen? Ist die dann in allen Skripten bekannt?

          Nachtrag: Das hier gezeigte Skript ist nicht etwa im sog. 'common' Verzeichnis deklariert. Bei mir ist diese 'common' Verzeichnis leer.

          Mein bisheriges Verständnis ..

          Deklariere ich eine Variable innerhalb schedule, on, function, .. sind diese nur lokal innerhalb dieser Elemente ( -> scope ) bekannt und ich kann innerhalb eines Skriptes Namen problemlos doppelt verwenden, ohne dass es zu Konflikten kommt.

          Warum erhalte ich also in dem angewählten Beispiel diese Fehlermeldung? Zum Glück wirken sich diese - in meinen Augen unsinnigen Fehlermeldung - nirgendwo innerhalb meines Systems aus.

          CodierknechtC Online
          CodierknechtC Online
          Codierknecht
          Developer Most Active
          schrieb am zuletzt editiert von Codierknecht
          #4

          @legro
          Es fehlen die Semikolons am Ende der Zeilen.

          a479c789-7ce6-461e-b110-b00aaba481a3-image.png

          Die KANN man auch weglassen, aber das ist ganz schlechter Stil und führt schnell mal zu Fehlern.

          In Zeile 11 beziehst Du Dich auf allMonths. Deklariert ist in Zeile 9 aber alleMonate;

          Und Variablen aus nur einem einzelnen Zeichen sind auch suboptimal, solange es keine Laufvariablen für Schleifen sind => https://github.com/Droogans/unmaintainable-code

          BTW: Das einzeln abtippen zu müssen macht's nicht wirklich einfach ;-)

          "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

          Proxmox 9.1.1 LXC|8 GB|Core i7-6700
          HmIP|ZigBee|Tasmota|Unifi
          Zabbix Certified Specialist
          Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

          L 1 Antwort Letzte Antwort
          0
          • CodierknechtC Codierknecht

            @legro
            Es fehlen die Semikolons am Ende der Zeilen.

            a479c789-7ce6-461e-b110-b00aaba481a3-image.png

            Die KANN man auch weglassen, aber das ist ganz schlechter Stil und führt schnell mal zu Fehlern.

            In Zeile 11 beziehst Du Dich auf allMonths. Deklariert ist in Zeile 9 aber alleMonate;

            Und Variablen aus nur einem einzelnen Zeichen sind auch suboptimal, solange es keine Laufvariablen für Schleifen sind => https://github.com/Droogans/unmaintainable-code

            BTW: Das einzeln abtippen zu müssen macht's nicht wirklich einfach ;-)

            L Online
            L Online
            legro
            schrieb am zuletzt editiert von legro
            #5

            @codierknecht sagte in Namenskonflikte???:

            @legro
            Es fehlen die Semikolons am Ende der Zeilen.

            Dann werd ich sie halt künftig setzen. Das bin ich von allen anderen Sprachen, die ich in meinem zurückliegenden Berufsleben nutzte, ohnehin gewohnt.:slightly_smiling_face:

            7b5f7cb7-e79e-482a-b21c-ec1ae7a72534-image.png

            Die ';' habe ich bisher immer nur dann verwendet, wenn ich mehrere Anweisungen in eine Zeile schrieb. Da musste es ja auch sein; ansonsten habe ich stets verwendet, dass ein Zeilenumbruch ';' ersetzen kann.

            In Zeile 11 beziehst Du Dich auf allMonths. Deklariert ist in Zeile 9 aber alleMonate;

            Diese Ungereimtheit bestand nur während meiner Testphase, als ich den Quelltext mehrmals veränderte, um zu erkennen, was ich fragen muss. ;)

            Und Variablen aus nur einem einzelnen Zeichen sind auch suboptimal, solange es keine Laufvariablen für Schleifen sind => https://github.com/Droogans/unmaintainable-code

            Schon klar! Bei mir werden selbstverständlich nur in lokalen Bereichen verwendete 'Hilfsvariablen' mit einem Buchstaben ausgestattet. ;)

            Der in meinem ersten Beitrag nachgefragte Fehler - und ähnliches in vielen weiteren Skripten - verschwindet irgendwann im Laufe der Zeit ohne mein Zutun - mit oder ohne Ergänzung von ';' am Zeilenende. Wie man oben sehen kann, ist dies mittlerweile an dem Beispielcode auch geschehen. Daher maß ich dem Ganzen auch keine sonderliche Beachtung zu, machte sich der vermeintliche Fehler ohnehin nie bemerkbar. Nun wollte ich's jedoch endlich einmal abklären.

            Mit deinen Hinweisen werde ich nun etwas aufmerksamer meinen Programmcode beobachten.

            Raspberry Pi 5 mit 8GB + 120GB SSD + Coordinator COD-m + ioBroker ..

            CodierknechtC 1 Antwort Letzte Antwort
            0
            • L legro

              @codierknecht sagte in Namenskonflikte???:

              @legro
              Es fehlen die Semikolons am Ende der Zeilen.

              Dann werd ich sie halt künftig setzen. Das bin ich von allen anderen Sprachen, die ich in meinem zurückliegenden Berufsleben nutzte, ohnehin gewohnt.:slightly_smiling_face:

              7b5f7cb7-e79e-482a-b21c-ec1ae7a72534-image.png

              Die ';' habe ich bisher immer nur dann verwendet, wenn ich mehrere Anweisungen in eine Zeile schrieb. Da musste es ja auch sein; ansonsten habe ich stets verwendet, dass ein Zeilenumbruch ';' ersetzen kann.

              In Zeile 11 beziehst Du Dich auf allMonths. Deklariert ist in Zeile 9 aber alleMonate;

              Diese Ungereimtheit bestand nur während meiner Testphase, als ich den Quelltext mehrmals veränderte, um zu erkennen, was ich fragen muss. ;)

              Und Variablen aus nur einem einzelnen Zeichen sind auch suboptimal, solange es keine Laufvariablen für Schleifen sind => https://github.com/Droogans/unmaintainable-code

              Schon klar! Bei mir werden selbstverständlich nur in lokalen Bereichen verwendete 'Hilfsvariablen' mit einem Buchstaben ausgestattet. ;)

              Der in meinem ersten Beitrag nachgefragte Fehler - und ähnliches in vielen weiteren Skripten - verschwindet irgendwann im Laufe der Zeit ohne mein Zutun - mit oder ohne Ergänzung von ';' am Zeilenende. Wie man oben sehen kann, ist dies mittlerweile an dem Beispielcode auch geschehen. Daher maß ich dem Ganzen auch keine sonderliche Beachtung zu, machte sich der vermeintliche Fehler ohnehin nie bemerkbar. Nun wollte ich's jedoch endlich einmal abklären.

              Mit deinen Hinweisen werde ich nun etwas aufmerksamer meinen Programmcode beobachten.

              CodierknechtC Online
              CodierknechtC Online
              Codierknecht
              Developer Most Active
              schrieb am zuletzt editiert von
              #6

              @legro sagte in Namenskonflikte???:

              Das bin ich von allen anderen Sprachen, die ich in meinem zurückliegenden Berufsleben nutzte, ohnehin gewohnt.

              Um so besser. Dann muss man sich auch nicht umgewöhnen.

              Der in meinem ersten Beitrag nachgefragte Fehler - und ähnliches in vielen weiteren Skripten - verschwindet irgendwann im Laufe der Zeit ohne mein Zutun

              Das habe ich auch schon mehrfach beobachtet.
              Die tauchen z.B. gerne mal auf, wenn man beim Aufruf von Funktionen wie z.B. myDate.getHours() die runden Klammern vergisst. In einigen Sprachen darf man Funktionen ohne Parameter auch ohne Klammern aufrufen. JS stört sich daran.
              Man sollte auch immer im Hinterkopf behalten, dass der Web-Editor keine vollwertige IDE ist.
              Die Meldungen verschwinden dann später - nicht unmittelbar nachdem ein tatsächlich vorhandener Fehler behoben wurde. Muss man halt mit leben.

              Mit deinen Hinweisen werde ich nun etwas aufmerksamer meinen Programmcode beobachten.

              Hört sich manchmal nach Erbsenzählerei an, aber es zahlt sich aus wenn man zumindest Grundzüge von "CleanCode" anwendet und verinnerlicht.
              Nicht selten steht man irgendwann vor Code und denkt sich "welcher Vollhorst hat das denn verbrochen?" um dann später feststellen zu müssen "Uuups, war ich ja selbst" :grin:

              Einige Grundregeln:

              • Jede Anweisung (und nur eine) in eine eigene Zeile
              • Aussagekräftige Namen verwenden
              • sauber einrücken
              • keine magic numbers - dafür gibt's Konstanten, denen man wieder sinnvolle Namen geben sollte
              • keine überlangen Funktionen (Aufteilen und Unterfunktionen)
              • etc. p.p.

              Und eine ganze Reihe weiterer.
              Die Coding-Conventions in meinem Team umfassen inzwischen einige Seiten. Hält sich nur leider nicht jeder dran :-(

              "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

              Proxmox 9.1.1 LXC|8 GB|Core i7-6700
              HmIP|ZigBee|Tasmota|Unifi
              Zabbix Certified Specialist
              Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

              L 1 Antwort Letzte Antwort
              0
              • CodierknechtC Codierknecht

                @legro sagte in Namenskonflikte???:

                Das bin ich von allen anderen Sprachen, die ich in meinem zurückliegenden Berufsleben nutzte, ohnehin gewohnt.

                Um so besser. Dann muss man sich auch nicht umgewöhnen.

                Der in meinem ersten Beitrag nachgefragte Fehler - und ähnliches in vielen weiteren Skripten - verschwindet irgendwann im Laufe der Zeit ohne mein Zutun

                Das habe ich auch schon mehrfach beobachtet.
                Die tauchen z.B. gerne mal auf, wenn man beim Aufruf von Funktionen wie z.B. myDate.getHours() die runden Klammern vergisst. In einigen Sprachen darf man Funktionen ohne Parameter auch ohne Klammern aufrufen. JS stört sich daran.
                Man sollte auch immer im Hinterkopf behalten, dass der Web-Editor keine vollwertige IDE ist.
                Die Meldungen verschwinden dann später - nicht unmittelbar nachdem ein tatsächlich vorhandener Fehler behoben wurde. Muss man halt mit leben.

                Mit deinen Hinweisen werde ich nun etwas aufmerksamer meinen Programmcode beobachten.

                Hört sich manchmal nach Erbsenzählerei an, aber es zahlt sich aus wenn man zumindest Grundzüge von "CleanCode" anwendet und verinnerlicht.
                Nicht selten steht man irgendwann vor Code und denkt sich "welcher Vollhorst hat das denn verbrochen?" um dann später feststellen zu müssen "Uuups, war ich ja selbst" :grin:

                Einige Grundregeln:

                • Jede Anweisung (und nur eine) in eine eigene Zeile
                • Aussagekräftige Namen verwenden
                • sauber einrücken
                • keine magic numbers - dafür gibt's Konstanten, denen man wieder sinnvolle Namen geben sollte
                • keine überlangen Funktionen (Aufteilen und Unterfunktionen)
                • etc. p.p.

                Und eine ganze Reihe weiterer.
                Die Coding-Conventions in meinem Team umfassen inzwischen einige Seiten. Hält sich nur leider nicht jeder dran :-(

                L Online
                L Online
                legro
                schrieb am zuletzt editiert von legro
                #7

                @codierknecht

                Um die Verwirrung komplett zu machen ..

                d5f176cc-759a-4513-8759-548b4efe9434-image.png

                Wie man sieht, lautet die Fehlermeldung diesmal ganz anders.

                Was er hier anmeckert, ist ein weiter unten definierter Trigger. Die dort deklarierten Variablen sollten jedoch lokal sein, überschreiben also bloß bestenfalls globale gleichen Namens.

                2c1e6966-ce77-42f3-8662-c17155dbf1be-image.png

                Noch verrückter ist ..

                An dem Code wurde nichts verändert, dennoch hat sich die 'Fehlermeldung' (die wohl gar keine ist) verändert. :confused:

                Raspberry Pi 5 mit 8GB + 120GB SSD + Coordinator COD-m + ioBroker ..

                CodierknechtC 1 Antwort Letzte Antwort
                0
                • L legro

                  @codierknecht

                  Um die Verwirrung komplett zu machen ..

                  d5f176cc-759a-4513-8759-548b4efe9434-image.png

                  Wie man sieht, lautet die Fehlermeldung diesmal ganz anders.

                  Was er hier anmeckert, ist ein weiter unten definierter Trigger. Die dort deklarierten Variablen sollten jedoch lokal sein, überschreiben also bloß bestenfalls globale gleichen Namens.

                  2c1e6966-ce77-42f3-8662-c17155dbf1be-image.png

                  Noch verrückter ist ..

                  An dem Code wurde nichts verändert, dennoch hat sich die 'Fehlermeldung' (die wohl gar keine ist) verändert. :confused:

                  CodierknechtC Online
                  CodierknechtC Online
                  Codierknecht
                  Developer Most Active
                  schrieb am zuletzt editiert von
                  #8

                  @legro sagte in Namenskonflikte???:

                  Was er hier anmeckert, ist ein weiter unten definierter Trigger. Die dort deklarierten Variablen sollten jedoch lokal sein, überschreiben also bloß globale gleichen Namens.

                  Und? Funktioniert vermutlich trotzdem?

                  Das sind halt wohl die Beschränkungen des Web-Editors.

                  Hast Du VS-Code? Kopiere den Code mal testweise da rein. Meckert vermutlich nicht.

                  Ich bin in Sachen JS auch noch blutiger Anfänger.

                  "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

                  Proxmox 9.1.1 LXC|8 GB|Core i7-6700
                  HmIP|ZigBee|Tasmota|Unifi
                  Zabbix Certified Specialist
                  Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

                  L 1 Antwort Letzte Antwort
                  0
                  • CodierknechtC Codierknecht

                    @legro sagte in Namenskonflikte???:

                    Was er hier anmeckert, ist ein weiter unten definierter Trigger. Die dort deklarierten Variablen sollten jedoch lokal sein, überschreiben also bloß globale gleichen Namens.

                    Und? Funktioniert vermutlich trotzdem?

                    Das sind halt wohl die Beschränkungen des Web-Editors.

                    Hast Du VS-Code? Kopiere den Code mal testweise da rein. Meckert vermutlich nicht.

                    Ich bin in Sachen JS auch noch blutiger Anfänger.

                    L Online
                    L Online
                    legro
                    schrieb am zuletzt editiert von legro
                    #9

                    @codierknecht

                    Bevor ich's vergesse: Vielen Dank für deine Unterstützung!:slightly_smiling_face:

                    In der Tat, es funktioniert stets alles trotz solch' ominöser Fehlermeldungen. Aber dein Hinweis auf VS Code nehme ich einmal auf. Wenn ich mich recht entsinne, kann man dieses Programm an ioBroker 'anbinden'.

                    Hier einmal der gesamte Code des betrachteten Skriptes ..

                    let eventGas = null
                    let eventPH = null
                    let eventPW = null
                    let eventGH = null
                    let eventGW = null
                    
                    let Umrechnungsfaktor = getState('0_userdata.0.Heizung.Umrechnungsfaktor').val
                    let Zustandszahl = getState('0_userdata.0.Heizung.Zustandszahl').val
                    let partsDatum = {jahr: '', monat: '', tag: ''}
                    
                    setPartsDate()
                    setTrigger()
                    
                    //die Datumsangaben auf den neuen Tag ausrichten
                    schedule({hour: 0, minute: 0}, function () {
                        delTrigger() // alte Trigger löschen
                        setPartsDate()
                        setTimeout(setTrigger, 2000) // um 2s verzögert alle Trigger neu einrichten
                    })
                    
                    
                    // ========== Funktionsdefinitionen ==========
                    
                    function setPartsDate() {
                        let alleMonate = ['Januar', 'Februar', 'Maerz', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember']
                        let d = new Date()
                        partsDatum = {jahr: d.getFullYear().toString(), monat: alleMonate[d.getMonth()], tag: d.getDate().toString()}
                    }
                    
                    
                    function setTrigger() {
                    
                    // Da die Trigger auf Änderungen in einem bestimmten Tagesverzeichnis eingestellt
                    // sind, müssen sie gelöscht und täglich neu eingerichtet bzw. registriert werden.
                    
                        let d = '0' + partsDatum.tag
                        d = d.slice(-2)
                    
                        //Gas
                        eventGas = on({id: '0_userdata.0.Heizung.tmp_tag', change: 'gt'}, function() {
                            let tmpGas = JSON.parse(getState(`0_userdata.0.Heizung.MonatsTabellen.${partsDatum.jahr}.${partsDatum.monat}.Gas`).val)
                            let tmpGasKWh = JSON.parse(getState(`0_userdata.0.Heizung.MonatsTabellen.${partsDatum.jahr}.${partsDatum.monat}.Gas_KWh`).val)
                    
                            tmpGas[Number(partsDatum.tag)-1] = Number((getState(`0_userdata.0.Heizung.tmp_tag`).val).toFixed(3))
                            tmpGasKWh[Number(Number(partsDatum.tag)-1)] = Number((getState(`0_userdata.0.Heizung.tmp_tag`).val * Umrechnungsfaktor * Zustandszahl).toFixed(1))
                    
                            setState(`0_userdata.0.Heizung.MonatsTabellen.${partsDatum.jahr}.${partsDatum.monat}.Gas`,JSON.stringify(tmpGas),true)
                            setState(`0_userdata.0.Heizung.MonatsTabellen.${partsDatum.jahr}.${partsDatum.monat}.Gas_KWh`,JSON.stringify(tmpGasKWh),true)
                        })
                    
                        //genHeizen
                        eventGH = on({id: `e3oncan.0.Vitocal.tree.1315_GeneratedCentralHeatingOutputMonthMatrix.CurrentMonth.${d}`, change: 'gt'}, () => {
                            let tmpGH = JSON.parse(getState(`0_userdata.0.Heizung.MonatsTabellen.${partsDatum.jahr}.${partsDatum.monat}.genHeizen`).val)
                            tmpGH[Number(partsDatum.tag)-1] = getState(`e3oncan.0.Vitocal.tree.1315_GeneratedCentralHeatingOutputMonthMatrix.CurrentMonth.${d}`).val
                            setState(`0_userdata.0.Heizung.MonatsTabellen.${partsDatum.jahr}.${partsDatum.monat}.genHeizen`,JSON.stringify(tmpGH),true)
                        })
                    
                        //genWasser
                        eventGW = on({id: `e3oncan.0.Vitocal.tree.1392_GeneratedDomesticHotWaterOutputMonthMatrix.CurrentMonth.${d}`, change: 'gt'}, () => {
                            let tmpGW = JSON.parse(getState(`0_userdata.0.Heizung.MonatsTabellen.${partsDatum.jahr}.${partsDatum.monat}.genWasser`).val)
                            tmpGW[Number(partsDatum.tag)-1] = getState(`e3oncan.0.Vitocal.tree.1392_GeneratedDomesticHotWaterOutputMonthMatrix.CurrentMonth.${d}`).val
                            setState(`0_userdata.0.Heizung.MonatsTabellen.${partsDatum.jahr}.${partsDatum.monat}.genWasser`,JSON.stringify(tmpGW),true)
                        })
                    
                        //primHeizen
                        eventPH = on({id: `e3oncan.0.Vitocal.tree.1294_EnergyConsumptionCentralHeatingMonthMatrix.CurrentMonth.${d}`, change: 'gt'}, () => {
                            let tmpPH = JSON.parse(getState(`0_userdata.0.Heizung.MonatsTabellen.${partsDatum.jahr}.${partsDatum.monat}.primHeizen`).val)
                            tmpPH[Number(partsDatum.tag)-1] = getState(`e3oncan.0.Vitocal.tree.1294_EnergyConsumptionCentralHeatingMonthMatrix.CurrentMonth.${d}`).val
                            setState(`0_userdata.0.Heizung.MonatsTabellen.${partsDatum.jahr}.${partsDatum.monat}.primHeizen`,JSON.stringify(tmpPH),true)
                        })
                    
                        //primWasser
                        eventPW = on({id: `e3oncan.0.Vitocal.tree.1311_EnergyConsumptionDomesticHotWaterMonthMatrix.CurrentMonth.${d}`, change: 'gt'}, () => {
                            let tmpPW = JSON.parse(getState(`0_userdata.0.Heizung.MonatsTabellen.${partsDatum.jahr}.${partsDatum.monat}.primWasser`).val)
                            tmpPW[Number(partsDatum.tag)-1] = getState(`e3oncan.0.Vitocal.tree.1311_EnergyConsumptionDomesticHotWaterMonthMatrix.CurrentMonth.${d}`).val
                            setState(`0_userdata.0.Heizung.MonatsTabellen.${partsDatum.jahr}.${partsDatum.monat}.primWasser`,JSON.stringify(tmpPW),true)
                        })
                    
                    }
                    
                    function delTrigger() {
                        //Bei Tageswechsel müssen die Trigger gelöscht und auf den neuen Tag umgestellt werden.
                        unsubscribe(eventGas)
                        unsubscribe(eventGH)
                        unsubscribe(eventGW)
                        unsubscribe(eventPH)
                        unsubscribe(eventPW)
                    }
                    

                    Das Skript sorgt dafür, das Werte in den Objektbaum von ioBroker geschrieben werden. Die Datenpunkte Gas, genHeizen, primHeizen, .. enthalten Arrays zur Aufnahme der Tageswerte.

                    533737f5-6957-4671-83ef-cb4a46f2fe7f-image.png

                    Raspberry Pi 5 mit 8GB + 120GB SSD + Coordinator COD-m + ioBroker ..

                    CodierknechtC 1 Antwort Letzte Antwort
                    0
                    • L legro

                      @codierknecht

                      Bevor ich's vergesse: Vielen Dank für deine Unterstützung!:slightly_smiling_face:

                      In der Tat, es funktioniert stets alles trotz solch' ominöser Fehlermeldungen. Aber dein Hinweis auf VS Code nehme ich einmal auf. Wenn ich mich recht entsinne, kann man dieses Programm an ioBroker 'anbinden'.

                      Hier einmal der gesamte Code des betrachteten Skriptes ..

                      let eventGas = null
                      let eventPH = null
                      let eventPW = null
                      let eventGH = null
                      let eventGW = null
                      
                      let Umrechnungsfaktor = getState('0_userdata.0.Heizung.Umrechnungsfaktor').val
                      let Zustandszahl = getState('0_userdata.0.Heizung.Zustandszahl').val
                      let partsDatum = {jahr: '', monat: '', tag: ''}
                      
                      setPartsDate()
                      setTrigger()
                      
                      //die Datumsangaben auf den neuen Tag ausrichten
                      schedule({hour: 0, minute: 0}, function () {
                          delTrigger() // alte Trigger löschen
                          setPartsDate()
                          setTimeout(setTrigger, 2000) // um 2s verzögert alle Trigger neu einrichten
                      })
                      
                      
                      // ========== Funktionsdefinitionen ==========
                      
                      function setPartsDate() {
                          let alleMonate = ['Januar', 'Februar', 'Maerz', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember']
                          let d = new Date()
                          partsDatum = {jahr: d.getFullYear().toString(), monat: alleMonate[d.getMonth()], tag: d.getDate().toString()}
                      }
                      
                      
                      function setTrigger() {
                      
                      // Da die Trigger auf Änderungen in einem bestimmten Tagesverzeichnis eingestellt
                      // sind, müssen sie gelöscht und täglich neu eingerichtet bzw. registriert werden.
                      
                          let d = '0' + partsDatum.tag
                          d = d.slice(-2)
                      
                          //Gas
                          eventGas = on({id: '0_userdata.0.Heizung.tmp_tag', change: 'gt'}, function() {
                              let tmpGas = JSON.parse(getState(`0_userdata.0.Heizung.MonatsTabellen.${partsDatum.jahr}.${partsDatum.monat}.Gas`).val)
                              let tmpGasKWh = JSON.parse(getState(`0_userdata.0.Heizung.MonatsTabellen.${partsDatum.jahr}.${partsDatum.monat}.Gas_KWh`).val)
                      
                              tmpGas[Number(partsDatum.tag)-1] = Number((getState(`0_userdata.0.Heizung.tmp_tag`).val).toFixed(3))
                              tmpGasKWh[Number(Number(partsDatum.tag)-1)] = Number((getState(`0_userdata.0.Heizung.tmp_tag`).val * Umrechnungsfaktor * Zustandszahl).toFixed(1))
                      
                              setState(`0_userdata.0.Heizung.MonatsTabellen.${partsDatum.jahr}.${partsDatum.monat}.Gas`,JSON.stringify(tmpGas),true)
                              setState(`0_userdata.0.Heizung.MonatsTabellen.${partsDatum.jahr}.${partsDatum.monat}.Gas_KWh`,JSON.stringify(tmpGasKWh),true)
                          })
                      
                          //genHeizen
                          eventGH = on({id: `e3oncan.0.Vitocal.tree.1315_GeneratedCentralHeatingOutputMonthMatrix.CurrentMonth.${d}`, change: 'gt'}, () => {
                              let tmpGH = JSON.parse(getState(`0_userdata.0.Heizung.MonatsTabellen.${partsDatum.jahr}.${partsDatum.monat}.genHeizen`).val)
                              tmpGH[Number(partsDatum.tag)-1] = getState(`e3oncan.0.Vitocal.tree.1315_GeneratedCentralHeatingOutputMonthMatrix.CurrentMonth.${d}`).val
                              setState(`0_userdata.0.Heizung.MonatsTabellen.${partsDatum.jahr}.${partsDatum.monat}.genHeizen`,JSON.stringify(tmpGH),true)
                          })
                      
                          //genWasser
                          eventGW = on({id: `e3oncan.0.Vitocal.tree.1392_GeneratedDomesticHotWaterOutputMonthMatrix.CurrentMonth.${d}`, change: 'gt'}, () => {
                              let tmpGW = JSON.parse(getState(`0_userdata.0.Heizung.MonatsTabellen.${partsDatum.jahr}.${partsDatum.monat}.genWasser`).val)
                              tmpGW[Number(partsDatum.tag)-1] = getState(`e3oncan.0.Vitocal.tree.1392_GeneratedDomesticHotWaterOutputMonthMatrix.CurrentMonth.${d}`).val
                              setState(`0_userdata.0.Heizung.MonatsTabellen.${partsDatum.jahr}.${partsDatum.monat}.genWasser`,JSON.stringify(tmpGW),true)
                          })
                      
                          //primHeizen
                          eventPH = on({id: `e3oncan.0.Vitocal.tree.1294_EnergyConsumptionCentralHeatingMonthMatrix.CurrentMonth.${d}`, change: 'gt'}, () => {
                              let tmpPH = JSON.parse(getState(`0_userdata.0.Heizung.MonatsTabellen.${partsDatum.jahr}.${partsDatum.monat}.primHeizen`).val)
                              tmpPH[Number(partsDatum.tag)-1] = getState(`e3oncan.0.Vitocal.tree.1294_EnergyConsumptionCentralHeatingMonthMatrix.CurrentMonth.${d}`).val
                              setState(`0_userdata.0.Heizung.MonatsTabellen.${partsDatum.jahr}.${partsDatum.monat}.primHeizen`,JSON.stringify(tmpPH),true)
                          })
                      
                          //primWasser
                          eventPW = on({id: `e3oncan.0.Vitocal.tree.1311_EnergyConsumptionDomesticHotWaterMonthMatrix.CurrentMonth.${d}`, change: 'gt'}, () => {
                              let tmpPW = JSON.parse(getState(`0_userdata.0.Heizung.MonatsTabellen.${partsDatum.jahr}.${partsDatum.monat}.primWasser`).val)
                              tmpPW[Number(partsDatum.tag)-1] = getState(`e3oncan.0.Vitocal.tree.1311_EnergyConsumptionDomesticHotWaterMonthMatrix.CurrentMonth.${d}`).val
                              setState(`0_userdata.0.Heizung.MonatsTabellen.${partsDatum.jahr}.${partsDatum.monat}.primWasser`,JSON.stringify(tmpPW),true)
                          })
                      
                      }
                      
                      function delTrigger() {
                          //Bei Tageswechsel müssen die Trigger gelöscht und auf den neuen Tag umgestellt werden.
                          unsubscribe(eventGas)
                          unsubscribe(eventGH)
                          unsubscribe(eventGW)
                          unsubscribe(eventPH)
                          unsubscribe(eventPW)
                      }
                      

                      Das Skript sorgt dafür, das Werte in den Objektbaum von ioBroker geschrieben werden. Die Datenpunkte Gas, genHeizen, primHeizen, .. enthalten Arrays zur Aufnahme der Tageswerte.

                      533737f5-6957-4671-83ef-cb4a46f2fe7f-image.png

                      CodierknechtC Online
                      CodierknechtC Online
                      Codierknecht
                      Developer Most Active
                      schrieb am zuletzt editiert von
                      #10

                      @legro

                      Kann ich im Web-Editor einfügen ohne dass gemeckert wird :thinking_face:

                      Ich verbuche sowas dann unter: "Muss man nicht unbedingt verstehen!"

                      "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

                      Proxmox 9.1.1 LXC|8 GB|Core i7-6700
                      HmIP|ZigBee|Tasmota|Unifi
                      Zabbix Certified Specialist
                      Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

                      L 1 Antwort Letzte Antwort
                      0
                      • CodierknechtC Codierknecht

                        @legro

                        Kann ich im Web-Editor einfügen ohne dass gemeckert wird :thinking_face:

                        Ich verbuche sowas dann unter: "Muss man nicht unbedingt verstehen!"

                        L Online
                        L Online
                        legro
                        schrieb am zuletzt editiert von
                        #11

                        @codierknecht sagte in Namenskonflikte???:

                        Ich verbuche sowas dann unter: "Muss man nicht unbedingt verstehen!"

                        Obwohl es eigentlich beunruhigend sein sollte, regt es mich mittlerweile auch nicht mehr auf. Ich habe unglaubliche vier Jahr benötigt, bis ich endlich den Zugang zu JavaScript fand. Alles, was ich in meinem Leben gelernt habe, hinderte mich eher als es mich förderte den Einstieg zu finden. Immer wieder habe ich nach ein paar Tagen die Flinte ins Korn geworfen. Mir kam das Ganze als eine Art Agrarinformatik vor nach dem Motto: Kraut&Rüben und rein in die Kartoffeln, raus aus den Kartoffeln.

                        Aber nun will ich nicht alles schlecht reden!

                        Nachdem es mir gelang, mich von den Vorstellungen streng typisierter Sprachen zu lösen, gelang mir auch der Zugang zu JavaScript. Was ich nun innerhalb weniger Wochen in JavaScript zu kodieren vermag, lässt mich vieles an Frust vergessen und ich erfreue mich daran, was in dieser Sprache so alles möglich ist. Allein das oben eingestellte Skript möchte ich lieber nicht in jenen Sprachen, die mir vertraut sind, programmieren müssen. ;)

                        Raspberry Pi 5 mit 8GB + 120GB SSD + Coordinator COD-m + ioBroker ..

                        OliverIOO T 2 Antworten Letzte Antwort
                        0
                        • L legro

                          @codierknecht sagte in Namenskonflikte???:

                          Ich verbuche sowas dann unter: "Muss man nicht unbedingt verstehen!"

                          Obwohl es eigentlich beunruhigend sein sollte, regt es mich mittlerweile auch nicht mehr auf. Ich habe unglaubliche vier Jahr benötigt, bis ich endlich den Zugang zu JavaScript fand. Alles, was ich in meinem Leben gelernt habe, hinderte mich eher als es mich förderte den Einstieg zu finden. Immer wieder habe ich nach ein paar Tagen die Flinte ins Korn geworfen. Mir kam das Ganze als eine Art Agrarinformatik vor nach dem Motto: Kraut&Rüben und rein in die Kartoffeln, raus aus den Kartoffeln.

                          Aber nun will ich nicht alles schlecht reden!

                          Nachdem es mir gelang, mich von den Vorstellungen streng typisierter Sprachen zu lösen, gelang mir auch der Zugang zu JavaScript. Was ich nun innerhalb weniger Wochen in JavaScript zu kodieren vermag, lässt mich vieles an Frust vergessen und ich erfreue mich daran, was in dieser Sprache so alles möglich ist. Allein das oben eingestellte Skript möchte ich lieber nicht in jenen Sprachen, die mir vertraut sind, programmieren müssen. ;)

                          OliverIOO Offline
                          OliverIOO Offline
                          OliverIO
                          schrieb am zuletzt editiert von
                          #12

                          @legro
                          Hast du noch globale Skripte? Die werden in der runtime noch davor kopiert. Das könnte evtl auch noch eine Auswirkung haben.

                          Hier sind Beispiele enthalten wo es schief geht wenn man kein semicolon setzt
                          https://www.freecodecamp.org/news/lets-talk-about-semicolons-in-javascript-f1fe08ab4e53/

                          Meine Adapter und Widgets
                          TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                          Links im Profil

                          1 Antwort Letzte Antwort
                          0
                          • L legro

                            @codierknecht sagte in Namenskonflikte???:

                            Ich verbuche sowas dann unter: "Muss man nicht unbedingt verstehen!"

                            Obwohl es eigentlich beunruhigend sein sollte, regt es mich mittlerweile auch nicht mehr auf. Ich habe unglaubliche vier Jahr benötigt, bis ich endlich den Zugang zu JavaScript fand. Alles, was ich in meinem Leben gelernt habe, hinderte mich eher als es mich förderte den Einstieg zu finden. Immer wieder habe ich nach ein paar Tagen die Flinte ins Korn geworfen. Mir kam das Ganze als eine Art Agrarinformatik vor nach dem Motto: Kraut&Rüben und rein in die Kartoffeln, raus aus den Kartoffeln.

                            Aber nun will ich nicht alles schlecht reden!

                            Nachdem es mir gelang, mich von den Vorstellungen streng typisierter Sprachen zu lösen, gelang mir auch der Zugang zu JavaScript. Was ich nun innerhalb weniger Wochen in JavaScript zu kodieren vermag, lässt mich vieles an Frust vergessen und ich erfreue mich daran, was in dieser Sprache so alles möglich ist. Allein das oben eingestellte Skript möchte ich lieber nicht in jenen Sprachen, die mir vertraut sind, programmieren müssen. ;)

                            T Nicht stören
                            T Nicht stören
                            ticaki
                            schrieb am zuletzt editiert von ticaki
                            #13

                            @legro

                            benutze Typescript!

                            let number = 5
                            number = 'test'
                            

                            Bildschirmfoto 2025-01-16 um 13.13.22.png

                            hm hätte die variable nicht number nennen sollen... :D

                            Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                            Spenden

                            L 1 Antwort Letzte Antwort
                            0
                            • T ticaki

                              @legro

                              benutze Typescript!

                              let number = 5
                              number = 'test'
                              

                              Bildschirmfoto 2025-01-16 um 13.13.22.png

                              hm hätte die variable nicht number nennen sollen... :D

                              L Online
                              L Online
                              legro
                              schrieb am zuletzt editiert von legro
                              #14

                              @ticaki @OliverIO

                              Nun, auf meine alten Tage werde ich gewiss mich nicht auch noch mit TypeScript abmühen. Ich bin heil froh, nunmehr in JavaScript leidlich programmieren zu können.

                              Das Ganze ist ohnehin bloß für unsere Hausautomatisierung; und für den Hausgebrauch reicht doch JavaScript allemal aus.:wink:

                              Ich danke euch sehr für eure Unterstützung.

                              Raspberry Pi 5 mit 8GB + 120GB SSD + Coordinator COD-m + ioBroker ..

                              T CodierknechtC 2 Antworten Letzte Antwort
                              0
                              • L legro

                                @ticaki @OliverIO

                                Nun, auf meine alten Tage werde ich gewiss mich nicht auch noch mit TypeScript abmühen. Ich bin heil froh, nunmehr in JavaScript leidlich programmieren zu können.

                                Das Ganze ist ohnehin bloß für unsere Hausautomatisierung; und für den Hausgebrauch reicht doch JavaScript allemal aus.:wink:

                                Ich danke euch sehr für eure Unterstützung.

                                T Nicht stören
                                T Nicht stören
                                ticaki
                                schrieb am zuletzt editiert von
                                #15

                                @legro sagte in Namenskonflikte???:

                                @ticaki @OliverIO

                                Nun, auf meine alten Tage werde ich gewiss mich nicht auch noch mit TypeScript abmühen. Ich bin heil froh, nunmehr in JavaScript leidlich programmieren zu können.

                                Ups, hatte dich so verstanden das dich die nicht vorhandenen Typen nerven :) Typescript ist ja nur javascript mit typen.

                                Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                                Spenden

                                1 Antwort Letzte Antwort
                                0
                                • L legro

                                  @ticaki @OliverIO

                                  Nun, auf meine alten Tage werde ich gewiss mich nicht auch noch mit TypeScript abmühen. Ich bin heil froh, nunmehr in JavaScript leidlich programmieren zu können.

                                  Das Ganze ist ohnehin bloß für unsere Hausautomatisierung; und für den Hausgebrauch reicht doch JavaScript allemal aus.:wink:

                                  Ich danke euch sehr für eure Unterstützung.

                                  CodierknechtC Online
                                  CodierknechtC Online
                                  Codierknecht
                                  Developer Most Active
                                  schrieb am zuletzt editiert von
                                  #16

                                  @legro
                                  Das was @ticaki schreibt.
                                  TypeScript ist quasi eine "Obermenge" von JS und reichert den ganzen Salat (mehr oder weniger) nur mit Typsicherheit an. Du musst also nix grundlegend neues lernen, hast aber den Vorteil dass der Editor Dich schon darauf hinweist, wenn Typen nicht passen.

                                  Wenn man von streng typisierten Sprachen kommt, ist JS schon ein gehöriger Rückschritt.
                                  TS macht diesen Nachteil größtenteils wieder wett.

                                  "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

                                  Proxmox 9.1.1 LXC|8 GB|Core i7-6700
                                  HmIP|ZigBee|Tasmota|Unifi
                                  Zabbix Certified Specialist
                                  Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

                                  L 1 Antwort Letzte Antwort
                                  0
                                  • CodierknechtC Codierknecht

                                    @legro
                                    Das was @ticaki schreibt.
                                    TypeScript ist quasi eine "Obermenge" von JS und reichert den ganzen Salat (mehr oder weniger) nur mit Typsicherheit an. Du musst also nix grundlegend neues lernen, hast aber den Vorteil dass der Editor Dich schon darauf hinweist, wenn Typen nicht passen.

                                    Wenn man von streng typisierten Sprachen kommt, ist JS schon ein gehöriger Rückschritt.
                                    TS macht diesen Nachteil größtenteils wieder wett.

                                    L Online
                                    L Online
                                    legro
                                    schrieb am zuletzt editiert von
                                    #17

                                    @codierknecht @ticaki

                                    Vielen Dank für die Erläuterungen. Was ihr da schreibt, lässt mich hoffen. Es scheint sich zu lohnen, sich mit TypeScript einmal zu beschäftigen.

                                    Raspberry Pi 5 mit 8GB + 120GB SSD + Coordinator COD-m + ioBroker ..

                                    R 1 Antwort Letzte Antwort
                                    0
                                    • L legro

                                      @codierknecht @ticaki

                                      Vielen Dank für die Erläuterungen. Was ihr da schreibt, lässt mich hoffen. Es scheint sich zu lohnen, sich mit TypeScript einmal zu beschäftigen.

                                      R Offline
                                      R Offline
                                      Ralf 2
                                      schrieb am zuletzt editiert von
                                      #18

                                      @legro
                                      Ja, es lohnt sich, man verflucht nur am Anfang, das man nicht alle Typen von den speziellen IOBroker-typischen Objekten kennt. Dann muss man viel mit Typof debugausgaben setzen oder sich eine zeitlang mit dem typ any behelfen.

                                      Zum Glück kann man in TS jedoch auch normal wie in JS programmieren und auf die Typen ab und an mal verzichten.
                                      @Codierknecht gibt es irgendwo eine auflistung der Typen für IOBroker? Im Visual Studio Code ist zwar die .iobroker\types\javascript.d.ts zu finden, aber so einen richtigen Überblick bekommt man damit auch nicht.

                                      Gruß Ralf

                                      1 Antwort Letzte Antwort
                                      0
                                      • T Nicht stören
                                        T Nicht stören
                                        ticaki
                                        schrieb am zuletzt editiert von ticaki
                                        #19

                                        @ralf-2
                                        Nur die javascript.d.ts. Das sind auch die Typen die für Systemfunktionen zur Verfügung stehen. Wüsste jetzt nicht was da fehlt. Übersicht müsste jemand machen. :)

                                        https://github.com/ioBroker/ioBroker.javascript/blob/master/lib/javascript.d.ts

                                        Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                                        Spenden

                                        1 Antwort Letzte Antwort
                                        0
                                        Antworten
                                        • In einem neuen Thema antworten
                                        Anmelden zum Antworten
                                        • Älteste zuerst
                                        • Neuste zuerst
                                        • Meiste Stimmen


                                        Support us

                                        ioBroker
                                        Community Adapters
                                        Donate

                                        594

                                        Online

                                        32.6k

                                        Benutzer

                                        82.1k

                                        Themen

                                        1.3m

                                        Beiträge
                                        Community
                                        Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                        ioBroker Community 2014-2025
                                        logo
                                        • Anmelden

                                        • Du hast noch kein Konto? Registrieren

                                        • Anmelden oder registrieren, um zu suchen
                                        • Erster Beitrag
                                          Letzter Beitrag
                                        0
                                        • Home
                                        • Aktuell
                                        • Tags
                                        • Ungelesen 0
                                        • Kategorien
                                        • Unreplied
                                        • Beliebt
                                        • GitHub
                                        • Docu
                                        • Hilfe