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. ioBroker Allgemein
  4. Mitsubishi Heavy Industries Split Klimaanlage

NEWS

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    11
    1
    536

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    24
    1
    1.7k

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    9.6k

Mitsubishi Heavy Industries Split Klimaanlage

Geplant Angeheftet Gesperrt Verschoben ioBroker Allgemein
253 Beiträge 24 Kommentatoren 49.4k Aufrufe 23 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.
  • H hacki11

    Ich hab mal ein Monitoring auf meine Geräte aktiviert.
    Hier sieht man durchaus ein paar Peaks (Monitoring geht auf Max, nicht auf Mittelwert - man sieht also immer den schlechtesten).
    8df01b16-3df3-4f8f-af47-9c0440d5e742-image.png
    Wenn man genauer reinzoomt, erkennt man, dass diese für einen Ping anhalten und der nächste Ping (10s später) geht wieder schnell:
    576df284-a803-4adf-8d5b-3d5cd5c9b03a-image.png

    Das heißt, wenn das ein Restart gewesen sein sollte, geht er in <10s und hat dann auch wieder die Verbindung aufgebaut. Bei mir sehe ich die Log Einträge nicht, auch lässt sich dieses Stundenmuster nicht aus dem Monitoring ableiten.

    Unifi Client Daten sind nicht hervorragend, man sieht ein paar gelbe Striche aber in Summe Ok.
    b0715f95-ef05-431c-927d-7eff8786ca2a-image.png

    Wie sieht eure Verbindungsqualität aus? Wie lange dauert es bei euch, bis das Gerät wieder erreichbar ist? Evtl. trägt die Verbindungsqualität dazu bei, dass das Gerät länger offline ist? Evtl. ist der reconnect langsamer?

    S Offline
    S Offline
    saeft_2003
    Most Active
    schrieb am zuletzt editiert von saeft_2003
    #176

    @hacki11

    So siehts bei mir aus. Bei dem kurzen Aussetzer bin ich auf einen anderen AP gewechselt der zwar weiter weg ist, aber im Moment scheint es stabiler zu laufen.

    IMG_6075.png

    Screenshot 2025-05-15 103024.png

    H 1 Antwort Letzte Antwort
    0
    • S saeft_2003

      @hacki11

      So siehts bei mir aus. Bei dem kurzen Aussetzer bin ich auf einen anderen AP gewechselt der zwar weiter weg ist, aber im Moment scheint es stabiler zu laufen.

      IMG_6075.png

      Screenshot 2025-05-15 103024.png

      H Online
      H Online
      hacki11
      schrieb am zuletzt editiert von
      #177

      @saeft_2003 Sieht ja nicht so schlecht aus - kannst du ein Monitoring aufsetzen um die Dauer der Reconnects zu messen?

      S 1 Antwort Letzte Antwort
      0
      • H hacki11

        @saeft_2003 Sieht ja nicht so schlecht aus - kannst du ein Monitoring aufsetzen um die Dauer der Reconnects zu messen?

        S Offline
        S Offline
        saeft_2003
        Most Active
        schrieb am zuletzt editiert von
        #178

        @hacki11

        Wüsste jetzt auf anhieb nicht wie ich das mache. Wenn dann müsstest du mir mal grob sagen wie genau das geht...

        Noch eine andere Frage. Wenn der Adapter gelb ist, versucht dieser dann in einem bestimmten Intervall sich wieder zu verbinden? Weil ich hatte es vor kurzem das der Adapter gelb war, hab diesen dann neugestartet und zack grün.

        H 1 Antwort Letzte Antwort
        0
        • H Online
          H Online
          hacki11
          schrieb am zuletzt editiert von
          #179

          Ich habe eine telegraf config für influxdb erstellt und visualisiere dann mit Grafana.

          Es scheint aber auch einen ping Adapter zu geben, das zusammen mit dem History Feature von iobroker sollte ein ähnliches Ergebnis liefern.

          S 1 Antwort Letzte Antwort
          0
          • S saeft_2003

            @hacki11

            Wüsste jetzt auf anhieb nicht wie ich das mache. Wenn dann müsstest du mir mal grob sagen wie genau das geht...

            Noch eine andere Frage. Wenn der Adapter gelb ist, versucht dieser dann in einem bestimmten Intervall sich wieder zu verbinden? Weil ich hatte es vor kurzem das der Adapter gelb war, hab diesen dann neugestartet und zack grün.

            H Online
            H Online
            hacki11
            schrieb am zuletzt editiert von
            #180

            @saeft_2003 Es wird im angegebenen Interval abgefragt. Bei einer erfolgreichen Abfrage wird der Datenpunkt "online" auf true gesetzt. Bei jedem Intervall werden am Ende alle online Datenpunkte evaluiert und sofern alle true sind, wird der Gesamstatus auch aktualisiert. So sollte sich der Zustand auch ohne Neustart wieder fangen. Du könntest das nächste mal schauen, ob alle online Datenpunkte der aktiven Geräte true sind und der Adapterzustand dennoch gelb.

            S 1 Antwort Letzte Antwort
            0
            • H hacki11

              Ich habe eine telegraf config für influxdb erstellt und visualisiere dann mit Grafana.

              Es scheint aber auch einen ping Adapter zu geben, das zusammen mit dem History Feature von iobroker sollte ein ähnliches Ergebnis liefern.

              S Offline
              S Offline
              saeft_2003
              Most Active
              schrieb am zuletzt editiert von saeft_2003
              #181

              @hacki11 sagte in Mitsubishi Heavy Industries Split Klimaanlage:

              Ich habe eine telegraf config für influxdb erstellt und visualisiere dann mit Grafana.

              Es scheint aber auch einen ping Adapter zu geben, das zusammen mit dem History Feature von iobroker sollte ein ähnliches Ergebnis liefern.

              Den ping andapter hab ich laufen, aber woher kommt die Zeit wie lang der ping gebraucht hat? Beim Adapter bekomme ich doch nur true oder false?

              1 Antwort Letzte Antwort
              0
              • H hacki11

                @saeft_2003 Es wird im angegebenen Interval abgefragt. Bei einer erfolgreichen Abfrage wird der Datenpunkt "online" auf true gesetzt. Bei jedem Intervall werden am Ende alle online Datenpunkte evaluiert und sofern alle true sind, wird der Gesamstatus auch aktualisiert. So sollte sich der Zustand auch ohne Neustart wieder fangen. Du könntest das nächste mal schauen, ob alle online Datenpunkte der aktiven Geräte true sind und der Adapterzustand dennoch gelb.

                S Offline
                S Offline
                saeft_2003
                Most Active
                schrieb am zuletzt editiert von
                #182

                @hacki11 sagte in Mitsubishi Heavy Industries Split Klimaanlage:

                @saeft_2003 Es wird im angegebenen Interval abgefragt. Bei einer erfolgreichen Abfrage wird der Datenpunkt "online" auf true gesetzt. Bei jedem Intervall werden am Ende alle online Datenpunkte evaluiert und sofern alle true sind, wird der Gesamstatus auch aktualisiert. So sollte sich der Zustand auch ohne Neustart wieder fangen. Du könntest das nächste mal schauen, ob alle online Datenpunkte der aktiven Geräte true sind und der Adapterzustand dennoch gelb.

                Alles klar falls das wieder vorkommt mache ich das.

                1 Antwort Letzte Antwort
                0
                • S Offline
                  S Offline
                  saeft_2003
                  Most Active
                  schrieb am zuletzt editiert von
                  #183

                  Denke ich habs. Intervall ping alle 60 sek?

                  Screenshot 2025-05-15 111216.png

                  1 Antwort Letzte Antwort
                  0
                  • H Online
                    H Online
                    hacki11
                    schrieb am zuletzt editiert von
                    #184

                    @saeft_2003 Jede Sekunde

                    S 1 Antwort Letzte Antwort
                    0
                    • H hacki11

                      @saeft_2003 Jede Sekunde

                      S Offline
                      S Offline
                      saeft_2003
                      Most Active
                      schrieb am zuletzt editiert von
                      #185

                      @hacki11

                      Das lässt der ping adapter nicht zu. kürzester intervall sind alle 5 sek.

                      H 1 Antwort Letzte Antwort
                      0
                      • S saeft_2003

                        @hacki11

                        Das lässt der ping adapter nicht zu. kürzester intervall sind alle 5 sek.

                        H Online
                        H Online
                        hacki11
                        schrieb am zuletzt editiert von
                        #186

                        @saeft_2003 passt auch noch

                        S 1 Antwort Letzte Antwort
                        0
                        • H hacki11

                          @saeft_2003 passt auch noch

                          S Offline
                          S Offline
                          saeft_2003
                          Most Active
                          schrieb am zuletzt editiert von
                          #187

                          @hacki11

                          Alles klar ich lass das mal bis morgen so laufen und schau ob ich in grafana was sehe und melde mich.

                          1 Antwort Letzte Antwort
                          0
                          • S Offline
                            S Offline
                            saeft_2003
                            Most Active
                            schrieb am zuletzt editiert von
                            #188

                            @hacki11

                            So was war jetzt um 11:42 43 und 44? Keine Verbindung? Wieso?

                            IMG_6079.png IMG_6078.png IMG_6077.png

                            Thomas BraunT H 2 Antworten Letzte Antwort
                            0
                            • S saeft_2003

                              @hacki11

                              So was war jetzt um 11:42 43 und 44? Keine Verbindung? Wieso?

                              IMG_6079.png IMG_6078.png IMG_6077.png

                              Thomas BraunT Online
                              Thomas BraunT Online
                              Thomas Braun
                              Most Active
                              schrieb am zuletzt editiert von
                              #189

                              @saeft_2003

                              Das sieht mir nach einer schlechten WLAN-Verbindung aus.

                              Linux-Werkzeugkasten:
                              https://forum.iobroker.net/topic/42952/der-kleine-iobroker-linux-werkzeugkasten
                              NodeJS Fixer Skript:
                              https://forum.iobroker.net/topic/68035/iob-node-fix-skript
                              iob_diag: curl -sLf -o diag.sh https://iobroker.net/diag.sh && bash diag.sh

                              1 Antwort Letzte Antwort
                              0
                              • S saeft_2003

                                @hacki11

                                So was war jetzt um 11:42 43 und 44? Keine Verbindung? Wieso?

                                IMG_6079.png IMG_6078.png IMG_6077.png

                                H Online
                                H Online
                                hacki11
                                schrieb am zuletzt editiert von
                                #190

                                @saeft_2003 Nimm mal den alive mit in die history auf. Aber man sieht schon schön ne Lücke in dem Graphen. Vermutlich gab’s keine Werte und es wird linear mit dem ersten Ping der wiederkommt verbunden? Zumindest würde das den Graphen erklären.

                                1 Antwort Letzte Antwort
                                0
                                • S Offline
                                  S Offline
                                  saeft_2003
                                  Most Active
                                  schrieb am zuletzt editiert von
                                  #191

                                  Ich hab die Klima jetzt wieder auf den AP gelockt der theoretisch am besten ist. Normalerweise muss die Verbindung hier top sein. Luftlinie ist der nur 2m weg und nur dünne Wände dazwischen. Andere Geräte zum Teil weiter weg haben null Probleme.

                                  H 1 Antwort Letzte Antwort
                                  0
                                  • S saeft_2003

                                    Ich hab die Klima jetzt wieder auf den AP gelockt der theoretisch am besten ist. Normalerweise muss die Verbindung hier top sein. Luftlinie ist der nur 2m weg und nur dünne Wände dazwischen. Andere Geräte zum Teil weiter weg haben null Probleme.

                                    H Online
                                    H Online
                                    hacki11
                                    schrieb am zuletzt editiert von
                                    #192

                                    @saeft_2003 Mein IG nimmt auch immer den weiter entfernten AP statt dem der 4m entfernt steht. Roaming ist in dem WLAN deaktiviert, da viele IOT Geräte damit nicht klar kommen. Das IG vermutlich gleich dreimal nicht.

                                    MrLarodosM 1 Antwort Letzte Antwort
                                    0
                                    • H hacki11

                                      @saeft_2003 Mein IG nimmt auch immer den weiter entfernten AP statt dem der 4m entfernt steht. Roaming ist in dem WLAN deaktiviert, da viele IOT Geräte damit nicht klar kommen. Das IG vermutlich gleich dreimal nicht.

                                      MrLarodosM Offline
                                      MrLarodosM Offline
                                      MrLarodos
                                      schrieb am zuletzt editiert von MrLarodos
                                      #193

                                      @hacki11 Ich habe das WLAN so konfiguriert, dass die Geräte in einem separaten WLAN in 2.4Ghz am jeweils nächstliegenden AP eingesperrt sind. Habe kurz ein Shellscript für Linux mit Chat GPT entwickelt, was ne csv mitloggt (im Subfolder "Log" im Scriptordner. Inhalt der CSV:

                                      Name;Zeitstempel;Erreichbar;Zeit(ms)
                                      Klima-Spitzboden;2025-05-15 13:39:18;True;30.4
                                      Klima-K1;2025-05-15 13:39:18;True;85.3
                                      Klima-K2;2025-05-15 13:39:18;True;95.8
                                      

                                      Ist auch ein Billigfrontend drauf:
                                      6f150060-cc27-493e-a71d-e04fd9d3fcbe-grafik.png

                                      Hier das Script (IPs und Aliase anpassen!):

                                      #!/bin/bash
                                      
                                      # Intervall in Sekunden
                                      INTERVAL=5
                                      
                                      # IP-Adressen und Aliasnamen
                                      IPS=("192.168.120.135" "192.168.120.138" "192.168.120.137" "192.168.120.136" "192.168.120.166")
                                      ALIASES=("Klima-Spitzboden" "Klima-K1" "Klima-K2" "Klima-Esszimmer" "Klima-Buero")
                                      
                                      # Logging-Verzeichnis und -Datei
                                      SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
                                      LOG_DIR="$SCRIPT_DIR/log"
                                      CSV_FILE="$LOG_DIR/ping_log.csv"
                                      mkdir -p "$LOG_DIR"
                                      
                                      # CSV-Datei initialisieren, falls noch nicht vorhanden
                                      if [ ! -f "$CSV_FILE" ]; then
                                          echo "Name;Zeitstempel;Erreichbar;Zeit(ms)" >> "$CSV_FILE"
                                      fi
                                      
                                      # Statusspeicher
                                      declare -A LAST_RESPONSE
                                      declare -A LAST_SEEN_DOWN
                                      
                                      # Spaltenbreiten
                                      WIDTH_ALIAS=20
                                      WIDTH_REACH=12
                                      WIDTH_TIME=10
                                      WIDTH_LASTDOWN=25
                                      
                                      # Initialisieren
                                      for alias in "${ALIASES[@]}"; do
                                          LAST_RESPONSE["$alias"]="-"
                                          LAST_SEEN_DOWN["$alias"]="-"
                                      done
                                      
                                      # Letzte bekannte False-Zeiten aus CSV rekonstruieren
                                      if [ -f "$CSV_FILE" ]; then
                                          for alias in "${ALIASES[@]}"; do
                                              last_false=$(grep "^$alias;" "$CSV_FILE" | grep ";False;" | tail -n 1 | cut -d';' -f2)
                                              if [ -n "$last_false" ]; then
                                                  epoch=$(date -d "$last_false" +%s 2>/dev/null)
                                                  if [ -n "$epoch" ]; then
                                                      LAST_SEEN_DOWN["$alias"]=$epoch
                                                  fi
                                              fi
                                          done
                                      fi
                                      
                                      # Funktion für menschenlesbare Zeitangabe
                                      time_diff_human() {
                                          local last_time=$1
                                          [[ "$last_time" == "-" ]] && echo "-" && return
                                          local now=$(date +%s)
                                          local diff=$((now - last_time))
                                          (( diff < 60 )) && echo "vor $diff Sek." && return
                                          (( diff < 3600 )) && echo "vor $((diff / 60)) Min." && return
                                          echo "vor $((diff / 3600)) Std."
                                      }
                                      
                                      # Hauptschleife
                                      while true; do
                                          clear
                                      
                                          printf "%-${WIDTH_ALIAS}s | %-${WIDTH_REACH}s | %-${WIDTH_TIME}s | %-${WIDTH_LASTDOWN}s\n" "Alias" "Erreichbar" "Zeit(ms)" "Nicht erreichbar vor"
                                          printf "%-${WIDTH_ALIAS}s-+-%-${WIDTH_REACH}s-+-%-${WIDTH_TIME}s-+-%-${WIDTH_LASTDOWN}s\n" \
                                              "$(printf '─%.0s' $(seq 1 $WIDTH_ALIAS))" \
                                              "$(printf '─%.0s' $(seq 1 $WIDTH_REACH))" \
                                              "$(printf '─%.0s' $(seq 1 $WIDTH_TIME))" \
                                              "$(printf '─%.0s' $(seq 1 $WIDTH_LASTDOWN))"
                                      
                                          for i in "${!IPS[@]}"; do
                                              IP=${IPS[$i]}
                                              NAME=${ALIASES[$i]}
                                              TIMESTAMP_HUMAN=$(date '+%Y-%m-%d %H:%M:%S')
                                              TIMESTAMP_EPOCH=$(date +%s)
                                              PING_OUTPUT=$(ping -c 1 -W 1 "$IP" 2>/dev/null)
                                      
                                              if echo "$PING_OUTPUT" | grep -q "1 received"; then
                                                  TIME_MS=$(echo "$PING_OUTPUT" | grep "time=" | sed -E 's/.*time=([0-9.]+) ms/\1/')
                                                  LAST_RESPONSE["$NAME"]=$TIME_MS
                                                  REACH="Ja"
                                                  DOWNTIME=$(time_diff_human "${LAST_SEEN_DOWN[$NAME]}")
                                                  echo "$NAME;$TIMESTAMP_HUMAN;True;$TIME_MS" >> "$CSV_FILE"
                                              else
                                                  REACH="Nein"
                                                  TIME_MS="-"
                                                  if [[ "${LAST_SEEN_DOWN[$NAME]}" == "-" ]]; then
                                                      LAST_SEEN_DOWN["$NAME"]=$TIMESTAMP_EPOCH
                                                  fi
                                                  DOWNTIME=$(time_diff_human "${LAST_SEEN_DOWN[$NAME]}")
                                                  echo "$NAME;$TIMESTAMP_HUMAN;False;" >> "$CSV_FILE"
                                              fi
                                      
                                              printf "%-${WIDTH_ALIAS}s | %-${WIDTH_REACH}s | %-${WIDTH_TIME}s | %-${WIDTH_LASTDOWN}s\n" \
                                                  "$NAME" "$REACH" "${LAST_RESPONSE[$NAME]}" "$DOWNTIME"
                                          done
                                      
                                          sleep "$INTERVAL"
                                      done
                                      

                                      Falls Ihr irgendwo Linux habt, könnt Ihr das da laufen lassen.

                                      Und hier das Script, um die CSV als Bild darzustellen:

                                      #!/usr/bin/env python3
                                      
                                      import pandas as pd
                                      import matplotlib.pyplot as plt
                                      from datetime import timedelta
                                      import matplotlib.dates as mdates
                                      import os
                                      
                                      # 🕒 Benutzerabfrage zum Stundenbereich
                                      try:
                                          user_input = input("Wie viele Stunden zurück anzeigen? [Default: 24]: ").strip()
                                          MAX_HOURS = int(user_input) if user_input else 24
                                      except Exception:
                                          MAX_HOURS = 24
                                      
                                      # 📥 CSV einlesen
                                      CSV_PATH = "./log/ping_log.csv"
                                      df = pd.read_csv(CSV_PATH, sep=';')
                                      df['Zeitstempel'] = pd.to_datetime(df['Zeitstempel'], format="%Y-%m-%d %H:%M:%S")
                                      df['Farbe'] = df['Erreichbar'].apply(lambda x: 'green' if str(x).strip().lower() == 'true' else 'red')
                                      df['Erreichbar_bool'] = df['Erreichbar'].apply(lambda x: str(x).strip().lower() == 'true')
                                      
                                      # 🧭 Zeitbereich setzen
                                      latest_time = df['Zeitstempel'].max()
                                      earliest_time = df['Zeitstempel'].min()
                                      start_time = max(earliest_time, latest_time - timedelta(hours=MAX_HOURS))
                                      df = df[df['Zeitstempel'] >= start_time].copy()
                                      
                                      # 📋 Aliasnamen extrahieren
                                      aliases = df['Name'].unique()
                                      aliases_sorted = list(aliases)
                                      
                                      # 📁 Diagrammverzeichnis erstellen
                                      output_dir = "./diagramm_pix"
                                      os.makedirs(output_dir, exist_ok=True)
                                      
                                      # 📊 Plot vorbereiten
                                      fig, ax = plt.subplots(figsize=(14, len(aliases_sorted) * 1.2))
                                      
                                      def plot_status_blocks(data, y_pos):
                                          current_color = None
                                          block_start = None
                                          for _, row in data.iterrows():
                                              color = row['Farbe']
                                              timestamp = row['Zeitstempel']
                                              if color != current_color:
                                                  if current_color is not None:
                                                      duration = (timestamp - block_start).total_seconds()
                                                      ax.barh(
                                                          y=y_pos,
                                                          width=duration / 3600,
                                                          left=block_start,
                                                          height=0.6,
                                                          color=current_color,
                                                          edgecolor='none'
                                                      )
                                                  block_start = timestamp
                                                  current_color = color
                                          if block_start is not None and current_color is not None:
                                              duration = (latest_time - block_start).total_seconds()
                                              ax.barh(
                                                  y=y_pos,
                                                  width=duration / 3600,
                                                  left=block_start,
                                                  height=0.6,
                                                  color=current_color,
                                                  edgecolor='none'
                                              )
                                      
                                      for i, alias in enumerate(aliases_sorted):
                                          data = df[df['Name'] == alias].sort_values(by='Zeitstempel')
                                          plot_status_blocks(data, i)
                                      
                                      # 📐 Achsen und Format
                                      ax.set_yticks(range(len(aliases_sorted)))
                                      ax.set_yticklabels(aliases_sorted)
                                      ax.set_xlim(start_time, latest_time)
                                      ax.invert_yaxis()
                                      ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))
                                      ax.set_xlabel("Uhrzeit")
                                      ax.set_title("Erreichbarkeit der IPs – zusammenhängende Zustandsbereiche")
                                      plt.grid(axis='x', linestyle='--', alpha=0.5)
                                      plt.tight_layout()
                                      
                                      # 💾 Bild speichern
                                      image_filename = f"{output_dir}/ping_status_{latest_time.strftime('%Y%m%d_%H%M%S')}.png"
                                      plt.savefig(image_filename)
                                      plt.show()
                                      
                                      # 📋 Zusammenfassung pro Alias
                                      print("\nZusammenfassung:")
                                      total_minutes = MAX_HOURS * 60
                                      
                                      for alias in aliases_sorted:
                                          alias_data = df[df['Name'] == alias].sort_values(by='Zeitstempel')
                                          alias_data['diff'] = alias_data['Zeitstempel'].diff().dt.total_seconds().fillna(0)
                                      
                                          # Statuswechsel ermitteln
                                          alias_data['is_new_block'] = (alias_data['Erreichbar_bool'] != alias_data['Erreichbar_bool'].shift())
                                          alias_data['block_id'] = alias_data['is_new_block'].cumsum()
                                      
                                          # Offline-Blöcke
                                          false_blocks = alias_data[alias_data['Erreichbar_bool'] == False]
                                          grouped = false_blocks.groupby('block_id')
                                      
                                          total_offline_secs = grouped['diff'].sum().sum()
                                          total_offline_minutes = round(total_offline_secs / 60, 2)
                                      
                                          total_outages = grouped.ngroups
                                          outages_per_hour = round(total_outages / MAX_HOURS, 2)
                                          avg_offline_per_hour = round(total_offline_minutes / MAX_HOURS, 2)
                                      
                                          # Antwortzeiten nur bei True
                                          true_responses = alias_data[alias_data['Erreichbar_bool'] == True].copy()
                                          true_responses['Zeit(ms)'] = pd.to_numeric(true_responses['Zeit(ms)'], errors='coerce')
                                          min_time = round(true_responses['Zeit(ms)'].min(), 2)
                                          avg_time = round(true_responses['Zeit(ms)'].mean(), 2)
                                          max_time = round(true_responses['Zeit(ms)'].max(), 2)
                                      
                                          print(f"{alias}:")
                                          print(f"  Gesamtofflinezeit:       {total_offline_minutes:.2f} Min")
                                          print(f"  Ø Offlinezeit/Stunde:    {avg_offline_per_hour:.2f} Min")
                                          print(f"  Gesamtzahl Ausfälle:     {total_outages}")
                                          print(f"  Ø Ausfälle/Stunde:       {outages_per_hour}")
                                          print(f"  Antwortzeit (Min/Ø/Max): {min_time:.2f} / {avg_time:.2f} / {max_time:.2f} ms\n")
                                      

                                      «Underground werden mit Stil»

                                      MrLarodosM 1 Antwort Letzte Antwort
                                      0
                                      • MrLarodosM MrLarodos

                                        @hacki11 Ich habe das WLAN so konfiguriert, dass die Geräte in einem separaten WLAN in 2.4Ghz am jeweils nächstliegenden AP eingesperrt sind. Habe kurz ein Shellscript für Linux mit Chat GPT entwickelt, was ne csv mitloggt (im Subfolder "Log" im Scriptordner. Inhalt der CSV:

                                        Name;Zeitstempel;Erreichbar;Zeit(ms)
                                        Klima-Spitzboden;2025-05-15 13:39:18;True;30.4
                                        Klima-K1;2025-05-15 13:39:18;True;85.3
                                        Klima-K2;2025-05-15 13:39:18;True;95.8
                                        

                                        Ist auch ein Billigfrontend drauf:
                                        6f150060-cc27-493e-a71d-e04fd9d3fcbe-grafik.png

                                        Hier das Script (IPs und Aliase anpassen!):

                                        #!/bin/bash
                                        
                                        # Intervall in Sekunden
                                        INTERVAL=5
                                        
                                        # IP-Adressen und Aliasnamen
                                        IPS=("192.168.120.135" "192.168.120.138" "192.168.120.137" "192.168.120.136" "192.168.120.166")
                                        ALIASES=("Klima-Spitzboden" "Klima-K1" "Klima-K2" "Klima-Esszimmer" "Klima-Buero")
                                        
                                        # Logging-Verzeichnis und -Datei
                                        SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
                                        LOG_DIR="$SCRIPT_DIR/log"
                                        CSV_FILE="$LOG_DIR/ping_log.csv"
                                        mkdir -p "$LOG_DIR"
                                        
                                        # CSV-Datei initialisieren, falls noch nicht vorhanden
                                        if [ ! -f "$CSV_FILE" ]; then
                                            echo "Name;Zeitstempel;Erreichbar;Zeit(ms)" >> "$CSV_FILE"
                                        fi
                                        
                                        # Statusspeicher
                                        declare -A LAST_RESPONSE
                                        declare -A LAST_SEEN_DOWN
                                        
                                        # Spaltenbreiten
                                        WIDTH_ALIAS=20
                                        WIDTH_REACH=12
                                        WIDTH_TIME=10
                                        WIDTH_LASTDOWN=25
                                        
                                        # Initialisieren
                                        for alias in "${ALIASES[@]}"; do
                                            LAST_RESPONSE["$alias"]="-"
                                            LAST_SEEN_DOWN["$alias"]="-"
                                        done
                                        
                                        # Letzte bekannte False-Zeiten aus CSV rekonstruieren
                                        if [ -f "$CSV_FILE" ]; then
                                            for alias in "${ALIASES[@]}"; do
                                                last_false=$(grep "^$alias;" "$CSV_FILE" | grep ";False;" | tail -n 1 | cut -d';' -f2)
                                                if [ -n "$last_false" ]; then
                                                    epoch=$(date -d "$last_false" +%s 2>/dev/null)
                                                    if [ -n "$epoch" ]; then
                                                        LAST_SEEN_DOWN["$alias"]=$epoch
                                                    fi
                                                fi
                                            done
                                        fi
                                        
                                        # Funktion für menschenlesbare Zeitangabe
                                        time_diff_human() {
                                            local last_time=$1
                                            [[ "$last_time" == "-" ]] && echo "-" && return
                                            local now=$(date +%s)
                                            local diff=$((now - last_time))
                                            (( diff < 60 )) && echo "vor $diff Sek." && return
                                            (( diff < 3600 )) && echo "vor $((diff / 60)) Min." && return
                                            echo "vor $((diff / 3600)) Std."
                                        }
                                        
                                        # Hauptschleife
                                        while true; do
                                            clear
                                        
                                            printf "%-${WIDTH_ALIAS}s | %-${WIDTH_REACH}s | %-${WIDTH_TIME}s | %-${WIDTH_LASTDOWN}s\n" "Alias" "Erreichbar" "Zeit(ms)" "Nicht erreichbar vor"
                                            printf "%-${WIDTH_ALIAS}s-+-%-${WIDTH_REACH}s-+-%-${WIDTH_TIME}s-+-%-${WIDTH_LASTDOWN}s\n" \
                                                "$(printf '─%.0s' $(seq 1 $WIDTH_ALIAS))" \
                                                "$(printf '─%.0s' $(seq 1 $WIDTH_REACH))" \
                                                "$(printf '─%.0s' $(seq 1 $WIDTH_TIME))" \
                                                "$(printf '─%.0s' $(seq 1 $WIDTH_LASTDOWN))"
                                        
                                            for i in "${!IPS[@]}"; do
                                                IP=${IPS[$i]}
                                                NAME=${ALIASES[$i]}
                                                TIMESTAMP_HUMAN=$(date '+%Y-%m-%d %H:%M:%S')
                                                TIMESTAMP_EPOCH=$(date +%s)
                                                PING_OUTPUT=$(ping -c 1 -W 1 "$IP" 2>/dev/null)
                                        
                                                if echo "$PING_OUTPUT" | grep -q "1 received"; then
                                                    TIME_MS=$(echo "$PING_OUTPUT" | grep "time=" | sed -E 's/.*time=([0-9.]+) ms/\1/')
                                                    LAST_RESPONSE["$NAME"]=$TIME_MS
                                                    REACH="Ja"
                                                    DOWNTIME=$(time_diff_human "${LAST_SEEN_DOWN[$NAME]}")
                                                    echo "$NAME;$TIMESTAMP_HUMAN;True;$TIME_MS" >> "$CSV_FILE"
                                                else
                                                    REACH="Nein"
                                                    TIME_MS="-"
                                                    if [[ "${LAST_SEEN_DOWN[$NAME]}" == "-" ]]; then
                                                        LAST_SEEN_DOWN["$NAME"]=$TIMESTAMP_EPOCH
                                                    fi
                                                    DOWNTIME=$(time_diff_human "${LAST_SEEN_DOWN[$NAME]}")
                                                    echo "$NAME;$TIMESTAMP_HUMAN;False;" >> "$CSV_FILE"
                                                fi
                                        
                                                printf "%-${WIDTH_ALIAS}s | %-${WIDTH_REACH}s | %-${WIDTH_TIME}s | %-${WIDTH_LASTDOWN}s\n" \
                                                    "$NAME" "$REACH" "${LAST_RESPONSE[$NAME]}" "$DOWNTIME"
                                            done
                                        
                                            sleep "$INTERVAL"
                                        done
                                        

                                        Falls Ihr irgendwo Linux habt, könnt Ihr das da laufen lassen.

                                        Und hier das Script, um die CSV als Bild darzustellen:

                                        #!/usr/bin/env python3
                                        
                                        import pandas as pd
                                        import matplotlib.pyplot as plt
                                        from datetime import timedelta
                                        import matplotlib.dates as mdates
                                        import os
                                        
                                        # 🕒 Benutzerabfrage zum Stundenbereich
                                        try:
                                            user_input = input("Wie viele Stunden zurück anzeigen? [Default: 24]: ").strip()
                                            MAX_HOURS = int(user_input) if user_input else 24
                                        except Exception:
                                            MAX_HOURS = 24
                                        
                                        # 📥 CSV einlesen
                                        CSV_PATH = "./log/ping_log.csv"
                                        df = pd.read_csv(CSV_PATH, sep=';')
                                        df['Zeitstempel'] = pd.to_datetime(df['Zeitstempel'], format="%Y-%m-%d %H:%M:%S")
                                        df['Farbe'] = df['Erreichbar'].apply(lambda x: 'green' if str(x).strip().lower() == 'true' else 'red')
                                        df['Erreichbar_bool'] = df['Erreichbar'].apply(lambda x: str(x).strip().lower() == 'true')
                                        
                                        # 🧭 Zeitbereich setzen
                                        latest_time = df['Zeitstempel'].max()
                                        earliest_time = df['Zeitstempel'].min()
                                        start_time = max(earliest_time, latest_time - timedelta(hours=MAX_HOURS))
                                        df = df[df['Zeitstempel'] >= start_time].copy()
                                        
                                        # 📋 Aliasnamen extrahieren
                                        aliases = df['Name'].unique()
                                        aliases_sorted = list(aliases)
                                        
                                        # 📁 Diagrammverzeichnis erstellen
                                        output_dir = "./diagramm_pix"
                                        os.makedirs(output_dir, exist_ok=True)
                                        
                                        # 📊 Plot vorbereiten
                                        fig, ax = plt.subplots(figsize=(14, len(aliases_sorted) * 1.2))
                                        
                                        def plot_status_blocks(data, y_pos):
                                            current_color = None
                                            block_start = None
                                            for _, row in data.iterrows():
                                                color = row['Farbe']
                                                timestamp = row['Zeitstempel']
                                                if color != current_color:
                                                    if current_color is not None:
                                                        duration = (timestamp - block_start).total_seconds()
                                                        ax.barh(
                                                            y=y_pos,
                                                            width=duration / 3600,
                                                            left=block_start,
                                                            height=0.6,
                                                            color=current_color,
                                                            edgecolor='none'
                                                        )
                                                    block_start = timestamp
                                                    current_color = color
                                            if block_start is not None and current_color is not None:
                                                duration = (latest_time - block_start).total_seconds()
                                                ax.barh(
                                                    y=y_pos,
                                                    width=duration / 3600,
                                                    left=block_start,
                                                    height=0.6,
                                                    color=current_color,
                                                    edgecolor='none'
                                                )
                                        
                                        for i, alias in enumerate(aliases_sorted):
                                            data = df[df['Name'] == alias].sort_values(by='Zeitstempel')
                                            plot_status_blocks(data, i)
                                        
                                        # 📐 Achsen und Format
                                        ax.set_yticks(range(len(aliases_sorted)))
                                        ax.set_yticklabels(aliases_sorted)
                                        ax.set_xlim(start_time, latest_time)
                                        ax.invert_yaxis()
                                        ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))
                                        ax.set_xlabel("Uhrzeit")
                                        ax.set_title("Erreichbarkeit der IPs – zusammenhängende Zustandsbereiche")
                                        plt.grid(axis='x', linestyle='--', alpha=0.5)
                                        plt.tight_layout()
                                        
                                        # 💾 Bild speichern
                                        image_filename = f"{output_dir}/ping_status_{latest_time.strftime('%Y%m%d_%H%M%S')}.png"
                                        plt.savefig(image_filename)
                                        plt.show()
                                        
                                        # 📋 Zusammenfassung pro Alias
                                        print("\nZusammenfassung:")
                                        total_minutes = MAX_HOURS * 60
                                        
                                        for alias in aliases_sorted:
                                            alias_data = df[df['Name'] == alias].sort_values(by='Zeitstempel')
                                            alias_data['diff'] = alias_data['Zeitstempel'].diff().dt.total_seconds().fillna(0)
                                        
                                            # Statuswechsel ermitteln
                                            alias_data['is_new_block'] = (alias_data['Erreichbar_bool'] != alias_data['Erreichbar_bool'].shift())
                                            alias_data['block_id'] = alias_data['is_new_block'].cumsum()
                                        
                                            # Offline-Blöcke
                                            false_blocks = alias_data[alias_data['Erreichbar_bool'] == False]
                                            grouped = false_blocks.groupby('block_id')
                                        
                                            total_offline_secs = grouped['diff'].sum().sum()
                                            total_offline_minutes = round(total_offline_secs / 60, 2)
                                        
                                            total_outages = grouped.ngroups
                                            outages_per_hour = round(total_outages / MAX_HOURS, 2)
                                            avg_offline_per_hour = round(total_offline_minutes / MAX_HOURS, 2)
                                        
                                            # Antwortzeiten nur bei True
                                            true_responses = alias_data[alias_data['Erreichbar_bool'] == True].copy()
                                            true_responses['Zeit(ms)'] = pd.to_numeric(true_responses['Zeit(ms)'], errors='coerce')
                                            min_time = round(true_responses['Zeit(ms)'].min(), 2)
                                            avg_time = round(true_responses['Zeit(ms)'].mean(), 2)
                                            max_time = round(true_responses['Zeit(ms)'].max(), 2)
                                        
                                            print(f"{alias}:")
                                            print(f"  Gesamtofflinezeit:       {total_offline_minutes:.2f} Min")
                                            print(f"  Ø Offlinezeit/Stunde:    {avg_offline_per_hour:.2f} Min")
                                            print(f"  Gesamtzahl Ausfälle:     {total_outages}")
                                            print(f"  Ø Ausfälle/Stunde:       {outages_per_hour}")
                                            print(f"  Antwortzeit (Min/Ø/Max): {min_time:.2f} / {avg_time:.2f} / {max_time:.2f} ms\n")
                                        
                                        MrLarodosM Offline
                                        MrLarodosM Offline
                                        MrLarodos
                                        schrieb am zuletzt editiert von MrLarodos
                                        #194

                                        @mrlarodos Habe mir noch ein Script gebaut, das die CSV als Diagramm visualisiert:
                                        0cae9fa0-2530-432a-a78e-056fb5f6e743-ping_status_20250515_193136.png

                                        Und hier die Zusammenfassung der bisherigen Messung:
                                        Klima-Spitzboden:
                                        Gesamtofflinezeit: 3.50 Min
                                        Ø Offlinezeit/Stunde: 0.15 Min
                                        Gesamtzahl Ausfälle: 19
                                        Ø Ausfälle/Stunde: 0.79
                                        Antwortzeit (Min/Ø/Max): 4.30 / 82.30 / 878.00 ms

                                        Klima-K1:
                                        Gesamtofflinezeit: 6.25 Min
                                        Ø Offlinezeit/Stunde: 0.26 Min
                                        Gesamtzahl Ausfälle: 21
                                        Ø Ausfälle/Stunde: 0.88
                                        Antwortzeit (Min/Ø/Max): 4.09 / 77.67 / 452.00 ms

                                        Klima-K2:
                                        Gesamtofflinezeit: 6.42 Min
                                        Ø Offlinezeit/Stunde: 0.27 Min
                                        Gesamtzahl Ausfälle: 28
                                        Ø Ausfälle/Stunde: 1.17
                                        Antwortzeit (Min/Ø/Max): 3.88 / 85.14 / 680.00 ms

                                        Klima-Esszimmer:
                                        Gesamtofflinezeit: 3.35 Min
                                        Ø Offlinezeit/Stunde: 0.14 Min
                                        Gesamtzahl Ausfälle: 8
                                        Ø Ausfälle/Stunde: 0.33
                                        Antwortzeit (Min/Ø/Max): 3.74 / 78.01 / 979.00 ms

                                        Klima-Buero:
                                        Gesamtofflinezeit: 0.18 Min
                                        Ø Offlinezeit/Stunde: 0.01 Min
                                        Gesamtzahl Ausfälle: 2
                                        Ø Ausfälle/Stunde: 0.08
                                        Antwortzeit (Min/Ø/Max): 4.20 / 73.71 / 993.00 ms

                                        Hm. Hilft uns das sehr? :)

                                        «Underground werden mit Stil»

                                        H 1 Antwort Letzte Antwort
                                        0
                                        • MrLarodosM MrLarodos

                                          @mrlarodos Habe mir noch ein Script gebaut, das die CSV als Diagramm visualisiert:
                                          0cae9fa0-2530-432a-a78e-056fb5f6e743-ping_status_20250515_193136.png

                                          Und hier die Zusammenfassung der bisherigen Messung:
                                          Klima-Spitzboden:
                                          Gesamtofflinezeit: 3.50 Min
                                          Ø Offlinezeit/Stunde: 0.15 Min
                                          Gesamtzahl Ausfälle: 19
                                          Ø Ausfälle/Stunde: 0.79
                                          Antwortzeit (Min/Ø/Max): 4.30 / 82.30 / 878.00 ms

                                          Klima-K1:
                                          Gesamtofflinezeit: 6.25 Min
                                          Ø Offlinezeit/Stunde: 0.26 Min
                                          Gesamtzahl Ausfälle: 21
                                          Ø Ausfälle/Stunde: 0.88
                                          Antwortzeit (Min/Ø/Max): 4.09 / 77.67 / 452.00 ms

                                          Klima-K2:
                                          Gesamtofflinezeit: 6.42 Min
                                          Ø Offlinezeit/Stunde: 0.27 Min
                                          Gesamtzahl Ausfälle: 28
                                          Ø Ausfälle/Stunde: 1.17
                                          Antwortzeit (Min/Ø/Max): 3.88 / 85.14 / 680.00 ms

                                          Klima-Esszimmer:
                                          Gesamtofflinezeit: 3.35 Min
                                          Ø Offlinezeit/Stunde: 0.14 Min
                                          Gesamtzahl Ausfälle: 8
                                          Ø Ausfälle/Stunde: 0.33
                                          Antwortzeit (Min/Ø/Max): 3.74 / 78.01 / 979.00 ms

                                          Klima-Buero:
                                          Gesamtofflinezeit: 0.18 Min
                                          Ø Offlinezeit/Stunde: 0.01 Min
                                          Gesamtzahl Ausfälle: 2
                                          Ø Ausfälle/Stunde: 0.08
                                          Antwortzeit (Min/Ø/Max): 4.20 / 73.71 / 993.00 ms

                                          Hm. Hilft uns das sehr? :)

                                          H Online
                                          H Online
                                          hacki11
                                          schrieb am zuletzt editiert von
                                          #195

                                          @mrlarodos Zur Sicherheit mal den Adapter stoppen und prüfen ob die Offlinezeit dadurch beeinflusst wird. Falls nicht ist zumindest der Adapter raus 🫠

                                          MrLarodosM 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
                                          FAQ Cloud / IOT
                                          HowTo: Node.js-Update
                                          HowTo: Backup/Restore
                                          Downloads
                                          BLOG

                                          338

                                          Online

                                          32.5k

                                          Benutzer

                                          81.8k

                                          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