Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. ioBroker Allgemein
    4. Ping via Javascript Adapter um den Ping-Adapter zu sparen

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Ping via Javascript Adapter um den Ping-Adapter zu sparen

    This topic has been deleted. Only users with topic management privileges can see it.
    • L
      loverz last edited by loverz

      Hallo zusammen,

      ich habe mal den Microsoft Copilot bemüht, da ich selbst kein Javascript kann.

      Er hat mir ein nettes Script gebastelt, mit dem ich den Ping Adapter überflüssig mache.

      Einstellen kann man:
      -Pingintervall bei erfolgreichen Pings
      -Pingintervall bei fehlgeschlagenen Pings
      -Anzupingende IP-Adresse
      -Ziel-Datenpunkt

      const { exec } = require('child_process');
      
      // Konfigurationsvariablen
      const intervalSeconds = 30; // Zeit in Sekunden für erfolgreiche Pings
      const failIntervalSeconds = 5; // Zeit in Sekunden für fehlgeschlagene Pings
      const ipAddress = '192.168.1.1'; // IP-Adresse
      const datapoint = 'javascript.0.Variablen.Temp.Testvariable'; // Datenpunkt
      
      // Funktion zum Schreiben in den Datenpunkt
      function writeState(id, value) {
          setState(id, value, true);
      }
      
      let deviceStatus = {};
      let currentInterval = intervalSeconds * 1000;
      
      function ping(ip, datapoint) {
          exec(`ping -c 1 ${ip}`, (error, stdout, stderr) => {
              if (error || stderr) {
                  // Fehlerausgabe unterdrücken
                  deviceStatus[ip] = false;
                  writeState(datapoint, false);
                  currentInterval = failIntervalSeconds * 1000; // Intervall auf 30 Sekunden erhöhen
                  return;
              }
              const isAlive = stdout.includes('1 received');
              deviceStatus[ip] = isAlive;
              writeState(datapoint, isAlive);
              currentInterval = intervalSeconds * 1000; // Intervall auf 5 Sekunden zurücksetzen
          });
      }
      
      // Funktion zum periodischen Pingen
      function startPinging() {
          ping(ipAddress, datapoint);
          setTimeout(startPinging, currentInterval);
      }
      
      // Start des Pings
      startPinging();
      
      // Ausgabe des Status-Objekts alle intervalSeconds Sekunden (optional)
      // setInterval(() => console.log(deviceStatus), intervalSeconds * 1000);
      
      
      

      Viel Spaß damit 😉

      haus-automatisierung BananaJoe 2 Replies Last reply Reply Quote 0
      • haus-automatisierung
        haus-automatisierung Developer Most Active @loverz last edited by haus-automatisierung

        @loverz sagte in Ping via Javascript Adapter um den Pin Adapter zu sparen:

        Er hat mir ein nette Script gebastelt, mit dem ich den Ping Adapter überflüssig mache.

        Theoretisch könntest Du auch alles selbst programmieren und damit jeden Adapter überflüssig machen.

        Die Frage ist nur: Warum das Rad neu erfinden?

        Und: Das Script taugt nicht so viel.

        • Warum sollte man ein Ping via exec ausführen, wenn es node libraries dafür gibt? Wo ist der Vorteil?
        • setInterval ist nicht so gut dafür geeignet, besser ein schedule nutzen.
        • Wozu die Funktion writeState, welche eh wieder nur eine andere Funktion aufruft?
        L 1 Reply Last reply Reply Quote 0
        • L
          loverz @haus-automatisierung last edited by loverz

          @haus-automatisierung kann dir leider keine Antwort auf diese fragen geben, da ich selbst kein Entwickler bin 😉

          Finde die Lösung praktisch, weil ich sowieso schon sehr viele Adapter habe und dadurch einen sparen kann 😄

          Ein Vorteil fällt mir aber ein: Man kann bei dieser Lösung hier das Intervall für jeden Ping einzeln festlegen, beim Ping Adapter geht das nicht.

          haus-automatisierung Jey Cee 2 Replies Last reply Reply Quote 0
          • haus-automatisierung
            haus-automatisierung Developer Most Active @loverz last edited by haus-automatisierung

            @loverz sagte in Ping via Javascript Adapter um den Ping-Adapter zu sparen:

            Man kann bei dieser Lösung hier das Intervall für jeden Ping einzeln festlegen

            Dafür müsste man (in der aktuellen Variante) aber das Script x-fach kopieren. Also müsste man es noch so umbauen, dass man mehrere IP-Adressen + Intervall pflegen kann.

            L 1 Reply Last reply Reply Quote 0
            • L
              loverz @haus-automatisierung last edited by

              @haus-automatisierung kann man aber auch als Vorteil sehen.
              Ich mag diese Modularität und habe unzählige Scripts in verschiedene Ordner gepackt.

              So weiß ich gleich was Sache ist und kann sie einzeln stoppen bei Bedarf.

              haus-automatisierung 1 Reply Last reply Reply Quote 0
              • haus-automatisierung
                haus-automatisierung Developer Most Active @loverz last edited by

                @loverz Jedes Script startet eine NodeVM, jedes dieser Scripts startet dann ständig einen zusätzlichen Prozess…

                Und jede Menge duplicate Code.
                Muss man wollen.

                1 Reply Last reply Reply Quote 1
                • BananaJoe
                  BananaJoe Most Active @loverz last edited by BananaJoe

                  @loverz die meisten Monitoringtools verwenden fping statt ping da es als performanter gilt. Zudem kann es mehrere IP-Adressen gleichzeitig anpingen. Die Antwort kommt auch quasi sofort, die anderen Parameter kennt es auch.

                  Wenn man also z.B. 30 Adressen überwachen will kann man die in einem Schritt anpingen und braucht nicht 30x ping aufrufen

                  Ansonsten, ja, warum nicht direkt in nodeJS: https://hackernoon.com/building-ping-command-in-nodejs-practical-guide-to-buffers-sockets-and-bit-manipulation

                  1 Reply Last reply Reply Quote 0
                  • BananaJoe
                    BananaJoe Most Active last edited by BananaJoe

                    Nachtrag: mit fping + jq kannst du dir das auch gleich als JSON zurück geben lassen:

                    fping -r 1 192.168.0.199 192.168.1.198 192.168.0.198| jq -R 'split(" ")|{ip:.[0],status:.[2]}' | jq -n '[inputs]'
                    

                    Ergebnis:

                    [
                      {
                        "ip": "192.168.0.199",
                        "status": "alive"
                      },
                      {
                        "ip": "192.168.1.198",
                        "status": "alive"
                      },
                      {
                        "ip": "192.168.0.198",
                        "status": "unreachable"
                      }
                    ]
                    

                    Edit: Parameter -r 1 aufgenommen, sonst gibt es ein fehlerhaftes JSON wenn ein Host nicht erreichbar ist

                    Edit 2: nur das es kein richtiger JSON ist, ich arbeite dran. Zumindest , ,müssten da noch zwischen und [ ... ] umzu

                    Edit 3: Nun funktioniert es richtig, musste ein zweiter jq Aufruf dahinter um die Objekte zu verbinden und ein valides JSON zu erzeugen

                    1 Reply Last reply Reply Quote 1
                    • BananaJoe
                      BananaJoe Most Active last edited by

                      Und weil es mich gerade gepackt hatte, hier eine "True/False" Version die man in ioBroker dann quasi so wegschreiben könnte:

                      fping -r 1 192.168.0.199 192.168.1.198 192.168.0.198 | jq -R 'split(" ")|{ip:.[0],online:.[2]}' | sed -e 's/"alive"/true/g' -e 's/"unreachable"/false/g' | jq -r -n '[inputs]'
                      

                      Ausgabe:

                      [
                        {
                          "ip": "192.168.0.199",
                          "online": true
                        },
                        {
                          "ip": "192.168.1.198",
                          "online": true
                        },
                        {
                          "ip": "192.168.0.198",
                          "online": false
                        }
                      ]
                      

                      ja, schöner als das mit sed zu ersetzen habe ich nicht hinbekommen.

                      OliverIO 1 Reply Last reply Reply Quote 1
                      • OliverIO
                        OliverIO @BananaJoe last edited by OliverIO

                        @loverz

                        Hm, Ich weiß nicht so richtig.
                        Lösungen zu Problemen nach denen keiner gefragt hat.
                        Klar kann man alles selbst programmieren, aber auf dieser Schöpfungsebene setzen die, die programmieren können es selbst um.
                        Diejenigen die nicht programmieren können nehmen die Adapter oder blockly oder dann wie du chatgpt

                        Support kannst du aber dafür nicht bieten, bzw Erweiterungen einbauen. Nur dann wenn chatgpt weiterhelfen kann.

                        Ich verwende selbst chatgpt bzw codemium. Hauptsächlich um mir grundgerüste zu erstellen, die dann verfeinert werden. Das ist aber meist nur aus zeitspargründen.

                        Stackoverflow hat mittlerweile Lösungen aus chatgpt und ähnlichem verboten. Was sich aber oft nicht so kontrollieren lässt.

                        Was du gerne machen kannst, meiner Meinung nach, ist diese beschreiben, wie du mit ChatGPT vorgegangen bist und welche Probleme du hattest und wie du die gelöst hast
                        Das würde auch anderen helfen, diese Plattform richtig einzusetzen

                        BananaJoe 1 Reply Last reply Reply Quote 0
                        • Jey Cee
                          Jey Cee Developer @loverz last edited by

                          @loverz sagte in Ping via Javascript Adapter um den Ping-Adapter zu sparen:

                          Ein Vorteil fällt mir aber ein: Man kann bei dieser Lösung hier das Intervall für jeden Ping einzeln festlegen, beim Ping Adapter geht das nicht.

                          Im Net-Tools Adapter geht das, außerdem kann man auch einstellen nach wievielen Pings ein Gerät als Offline angezeigt wird.

                          1 Reply Last reply Reply Quote 0
                          • BananaJoe
                            BananaJoe Most Active @OliverIO last edited by BananaJoe

                            @oliverio sagte in Ping via Javascript Adapter um den Ping-Adapter zu sparen:

                            Was du gerne machen kannst, meiner Meinung nach, ist diese beschreiben, wie du mit ChatGPT vorgegangen bist und welche Probleme du hattest und wie du die gelöst hast

                            Öhm, ist das schlimm das ich ChatGPT dazu NICHT benutzt habe sondern klassisch die Hilfe / man-pages von jq und sed? Und natürlich habe ich viel gegoogelt um dann aus verschiedenen Beispielen zu lernen. So "Programmiere" ich eigentlich immer.
                            Den Erfahrungsgewinn in Sachen jq habe ich auch gleich zu Verbesserung meines Zabbix-Monitorings genutzt.

                            Mein einziger bisheriger erfolgreicher Einsatz von ChatGPT war für eine JSON-Pfad-Abfrage basierend auf einem Wert innerhalb eines Objektes um unabhängig von der Reihenfolge der Objekte zu werden.

                            Ich gebe ja zu das mir da ein wenig die Pferde durchgegangen sind. Aber Beschwerden über ein zu viel an Lösungen erhalte ich sonst eher nie.

                            Drauf gekommen bin ich ja auch nur über fping, weil ich das sonst auch einsetze (Zabbix nutzt es). Und dann dachte "wäre doch cool wenn da gleich ein JSON käme" da man diese ja sowohl in ioBroker als auch in Zabbix super weiter verarbeiten kann.

                            OliverIO 1 Reply Last reply Reply Quote 2
                            • OliverIO
                              OliverIO @BananaJoe last edited by

                              @bananajoe

                              Sorry, du warst nicht der TE. Der hat chatgpt verwendet

                              1 Reply Last reply Reply Quote 0
                              • L
                                loverz last edited by

                                @oliverio sagte in Ping via Javascript Adapter um den Ping-Adapter zu sparen:

                                Lösungen zu Problemen nach denen keiner gefragt hat.

                                Es geht ja nicht um eine Problemlösung, sondern ein möglicher Weg, wenn man sich den Adapter sparen möchte.

                                Hab das nun so umgesetzt und funktioniert tadellos.

                                Erwarte hier auch keinen Support dafür.

                                1 Reply Last reply Reply Quote 0
                                • First post
                                  Last post

                                Support us

                                ioBroker
                                Community Adapters
                                Donate
                                FAQ Cloud / IOT
                                HowTo: Node.js-Update
                                HowTo: Backup/Restore
                                Downloads
                                BLOG

                                975
                                Online

                                31.9k
                                Users

                                80.3k
                                Topics

                                1.3m
                                Posts

                                5
                                14
                                637
                                Loading More Posts
                                • Oldest to Newest
                                • Newest to Oldest
                                • Most Votes
                                Reply
                                • Reply as topic
                                Log in to reply
                                Community
                                Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                The ioBroker Community 2014-2023
                                logo