Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. stolly82

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    • Profile
    • Following 0
    • Followers 4
    • Topics 8
    • Posts 117
    • Best 41
    • Groups 2

    stolly82

    @stolly82

    Starter

    64
    Reputation
    77
    Profile views
    117
    Posts
    4
    Followers
    0
    Following
    Joined Last Online

    stolly82 Follow
    Pro Starter

    Best posts made by stolly82

    • Neuer Adapter - Android TV & Fire TV Benachrichtigungen

      Hey zusammen,

      ich wollte euch mal meinen neuen Adapter für IoBroker in Verbindung mit Notifications for Android TV oder/und Notifications for Fire TV vorstellen!

      was macht er?

      Er sendet Nachrichten aus dem IoBroker an euren TV.

      Installieren über die Katze:
      https://github.com/DNAngelX/ioBroker.notificationforandroidtv

      Liebe Grüsse

      posted in Entwicklung
      stolly82
      stolly82
    • iOS App - Tester gesucht!

      Hey zusammen, ich habe mir ein paar Nächte um die Ohren geschlagen und eine iOS App inkl. Adapter für den IoBroker erstellt.

      1719533795349-e7d4fd58-5c88-4363-ab7e-5eeb1326b1ac-image.png

      8961c758-4dd7-4e61-bf47-057836972f12-image.png

      e051025b-89bd-4dd2-ad5f-7bb1ec36ab7a-image.png 1719533458930-a84b3421-9b85-48e9-97aa-fbdb49e9d7c6-image.png

      DIe App verbindet sich mit einem IoBroker-Adapter und ermöglicht es deinem iOS-Gerät, Sensordaten an deinen IoBroker zu senden. Mit der App kannst du mehrere Server und Zonen definieren. Die Zonen werden im IoBroker angelegt, und Personen werden automatisch ein- und ausgeloggt. Außerdem wird die Entfernung zur Zone gesendet.

      Features:

      • Sensordatenübertragung: Dein iOS-Gerät sendet kontinuierlich Sensordaten an den IoBroker.
      • Mehrere Server: Unterstützung für die Verbindung mit mehreren Servern.
      • Zonenverwaltung: Definiere und verwalte mehrere Zonen, die im IoBroker angelegt werden.
      • Präsenz- und Distanz-Tracking: Automatisches Ein- und Ausloggen von Personen in Zonen sowie Übermittlung der Entfernung zur Zone.

      Offene Punkte:

      • Push-Benachrichtigungen: Empfang von Push-Benachrichtigungen vom IoBroker zu iOS.
      • NFC-Tags: Lesen und Schreiben von NFC-Tags sowie Auslösung von Aktionen im IoBroker.
      • Widgets: Integration von Widgets (nur bei viel Motivation).

      Beta-Tester werden:

      Um Beta-Tester zu werden, aktiviere den Entwicklermodus auf deinem iPhone und sende mir deine UDID. Ich trage sie dann in meinen Entwickleraccount ein.

      Wer mal lust hat zu testen, git adapter + iPhone im DEV mode wird benötigt.

      posted in ioBroker Allgemein
      stolly82
      stolly82
    • RE: iOS App - Tester gesucht!

      @knallochse

      Erledigt!

      TestFlight

      Für TestFlight bitte die Email,... also alle die, die wollen!

      Adapter:
      https://github.com/DNAngelX/ioBroker.iosapp

      posted in ioBroker Allgemein
      stolly82
      stolly82
    • RE: iOS App - Tester gesucht!

      @steffensammet

      Die kannte ich gar nicht 🤣

      Ich bin im August Vater von Zwillingen geworden, hatte aufgrund dessen tatsächlich das letzte Jahr ein bisschen den Faden verloren, und hatte beim Starten des Projektes nicht noch nachgekuckt, was es aktuell Neues gibt.

      Die einzelnen Überschneidung sind wenn ich das richtig gesehen habe, bisher nur die Zonen.

      Bei den Zonen hab ich allerdings noch ein paar Funktionen mehr drin, zum Beispiel, dass die Entfernung von ioBroker System geladen aus den Konfiguration zum iPhone mit angezeigt wird und kalkuliert wird.

      In die Zonen wollte ich bei mir noch mit einarbeiten, dass die indoor Lokalisierung im Haus funktioniert. Ich hab aktuell mehrere Scripts, die zum Beispiel beacons oder über WLAN den Raum zu ordnen können, indem man ist.

      Das wird vermutlich mit einer nativen iOS App wesentlich besser funktionieren wie mit meinem Skript, da das iPhone beziehungsweise die Apple Watch ja dann die Signale verarbeitet, aktuell arbeite ich genau andersrum, dass die Repeater beziehungsweise die ESP 32 in meinen Steckdosen dieses über triangulieren kalkulieren.

      Was ich gestern fast fertig bekommen habe ist die NFC Funktion zum beschreiben der NFCs, ebenfalls das Triggern im ioBroker, wenn diese gelesen werden.

      Wenn ich die Zwillinge heute im Bett hab, wollte ich mich heute an die Push Notifications setzen, da bin ich nur gerade im Kopf noch nicht soweit, ob ich das ganz normal über den Apple Server (APN) laufen lasse, oder ob ich websockets schreibe und über die internen Pushs laufen lassen,… oder sogar eine Kombination mit fallback.

      Die Push Nachrichten habe ich generell schon vorbereitet, da ich Anforderungen aus einem anderen Projekt nutze, würde ich sehr wahrscheinlich ein Objektbaum im ioBroker aufbauen, wo man dann auch den Typ wie zum Beispiel Video oder Bilder oder normale Push Nachrichten einstellen kann, ebenfalls die iOS Töne Mappen kann etc.

      Wenn alles fertig ist, kann ich mir vorstellen, dass wir das mit der offiziellen App Mergen, wenn es so gewünscht wird.

      Ich habe mir auch schon CarPlay und Widgets angeguckt, da vermute ich, dass wir im ioBroker Adapter eventuell Templates einbauen, die man dann hinzufügen kann.

      Meine persönliche To-do ist (nach Aufwand)

      1. Push Notification
      2. NFC
      3. CarPlay
      4. Widgets
      5. Triangulierung (noch nicht klar)

      Falls ihr noch andere Ideen habt, die wirklich wichtig oder interessant sind, gib mir die gerne rüber, dann schaue ich mir dieses an.

      posted in ioBroker Allgemein
      stolly82
      stolly82
    • RE: iOS App - Tester gesucht!

      Neue App Version (10)

      • Verbessertes Logging
      • WebSockets Update (Nummer 100 oder so 😬 )

      Nach wie vor bekomme ich es nicht hin, dass der Background mode sauber getriggert wird.
      Das steuert IOS selbstständig, das kann man so leider auch nicht simulieren richtig.

      Ich habe noch mal ein paar Dinge geändert, so stabil habe ich das bisher noch nicht hinbekommen,...

      Was immer sein sollte:

      • alle 30 sec. Ping, wenn die App im Vordergrund ist
      • Alle 15 Minuten "Check all Websockets" wenn die App im Hintergrund ist

      Ich bekomme theoretisch immer um XX:00:00 eine notification (die ist solange ich zuhause war (22:40 - 09:58 auch immer pünktlich gekommen).
      Danach saß ich auf dem Fahrrad bis 10:02 > Einkaufen (kein Internet) > 10:04 Fahrrad bis 10:25 > 10:27 WLAN

      Wenn ich mir meine Logs jetzt anschaue sieht das schon mal deutlich besser aus als vorher.

      Was aber nicht immer nicht so läuft wie es soll:

      • Ping läuft bis 09:19 durch, 09:19 bin ich aufgestanden und hatte das iPhone aus der Ladestation genommen.
      • Nach 09:19 kein Ping mehr
      • Es fehlen alle Logs die was mit Background Mode zu tun haben (beim booten der App Registering background tasks > Background tasks registered funktioniert), nicht aber die 15 minütigen Scheduling app refresh und Scheduling processing task.
      
      [06.08.24, 22:40:49 CEST] Application did finish launching
      [06.08.24, 22:40:49 CEST] Permission granted: true
      [06.08.24, 22:40:49 CEST] Check all Websocket Connectrions called
      [06.08.24, 22:40:49 CEST] Check all Websocket Connectrions called
      [06.08.24, 22:40:49 CEST] Notification settings: <UNNotificationSettings: 0x3010306c0; authorizationStatus: Authorized, notificationCenterSetting: Enabled, soundSetting: Enabled, badgeSetting: Enabled, lockScreenSetting: Enabled, carPlaySetting: NotSupported, announcementSetting: Disabled, criticalAlertSetting: NotSupported, timeSensitiveSetting: NotSupported, alertSetting: Enabled, scheduledDeliverySetting: Disabled, directMessagesSetting: NotSupported, showsPreviewsSetting: WhenAuthenticated, alertStyle: Banner, groupingSetting: Default providesAppNotificationSettings: No>
      [06.08.24, 22:40:49 CEST] Registering background tasks
      [06.08.24, 22:40:49 CEST] Attempting reconnect for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:40:49 CEST] Connecting to WebSocket for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:40:49 CEST] Background tasks registered
      [06.08.24, 22:40:49 CEST] Monitoring Network satisfied: satisfied
      [06.08.24, 22:40:50 CEST] Attempted to reconnect while already connected or connecting for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:40:51 CEST] Updated online state: connecting for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:40:51 CEST] WebSocket connected: ["Connection": "Upgrade", "Upgrade": "websocket", "Sec-WebSocket-Accept": "0vIv/QLxUiyS45uPCaZbUb9KKlI="] for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:40:51 CEST] Websocket State: authenticating for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:40:52 CEST] Updated online state: connected for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:40:52 CEST] Updated online state: authenticating for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:40:52 CEST] Device Token: ba1992fba2e9436ccaded9458d678ce88270603e67191f1bc3738f752cf231f8
      [06.08.24, 22:40:53 CEST] Websocket State: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:40:53 CEST] Updated online state: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:40:53 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:40:53 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:40:53 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 22:41:04 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:41:05 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 22:41:07 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 22:41:11 CEST] check Event ["action": setPresence, "success": 1]
      [06.08.24, 22:41:11 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 22:41:11 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 22:41:12 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 22:41:12 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:41:13 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 22:41:13 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:41:16 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:41:16 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:41:16 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:41:16 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:41:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:41:20 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 22:41:20 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:41:20 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:41:21 CEST] check Event ["success": 1, "action": setPresence]
      [06.08.24, 22:41:21 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 22:41:21 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:41:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:42:01 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:42:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:42:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:43:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:43:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:44:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:44:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:44:53 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:44:54 CEST] check Event ["action": setPresence, "success": 1]
      [06.08.24, 22:44:54 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:44:54 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 22:44:54 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:44:55 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:45:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:45:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:45:56 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 22:45:57 CEST] check Event ["success": 1, "action": setPresence]
      [06.08.24, 22:45:57 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 22:45:57 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:45:57 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:45:58 CEST] check Event ["success": 1, "action": setPresence]
      [06.08.24, 22:45:58 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:46:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:46:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:47:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:47:29 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:47:31 CEST] check Event ["success": 1, "action": setPresence]
      [06.08.24, 22:47:31 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:47:31 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:47:32 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 22:47:33 CEST] check Event ["action": setPresence, "success": 1]
      [06.08.24, 22:47:33 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:47:33 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 22:47:35 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:47:35 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 22:47:36 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 22:47:36 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 22:47:41 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 22:47:43 CEST] check Event ["action": setPresence, "success": 1]
      [06.08.24, 22:47:43 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 22:47:43 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 22:47:44 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:47:45 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 22:47:45 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:47:46 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 22:47:46 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:47:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:47:51 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:47:53 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 22:47:53 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 22:47:54 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 22:47:54 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:47:54 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 22:47:55 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:47:57 CEST] check Event ["action": setPresence, "success": 1]
      [06.08.24, 22:47:57 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 22:47:57 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:47:58 CEST] check Event ["action": setPresence, "success": 1]
      [06.08.24, 22:47:58 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 22:47:59 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 22:47:59 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:47:59 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:48:00 CEST] check Event ["action": setPresence, "success": 1]
      [06.08.24, 22:48:00 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 22:48:00 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:48:00 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:48:01 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:48:01 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 22:48:02 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 22:48:02 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:48:03 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:48:03 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:48:04 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 22:48:04 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:48:05 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:48:05 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 22:48:05 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 22:48:06 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:48:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:48:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:49:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:49:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:50:05 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:50:07 CEST] check Event ["action": setPresence, "success": 1]
      [06.08.24, 22:50:07 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 22:50:07 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 22:50:07 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:50:08 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:50:08 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:50:09 CEST] check Event ["action": setPresence, "success": 1]
      [06.08.24, 22:50:09 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:50:09 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:50:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:50:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:51:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:51:29 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:51:30 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:51:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:52:13 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:52:15 CEST] check Event ["action": setPresence, "success": 1]
      [06.08.24, 22:52:15 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:52:15 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:52:15 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:52:15 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:52:16 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 22:52:16 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 22:52:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:52:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:53:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:53:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:54:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:54:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:55:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:55:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:56:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:56:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:57:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:57:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:58:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:58:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:59:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 22:59:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 23:00:00 CEST] check Event ["action": notification, "payload": {
          aps =     {
              alert =         {
                  body = "Cron Datum: 06.08.2024 - 23:00";
                  subtitle = Ooooo;
                  title = "Cron Stunde: 23";
              };
          };
      }]
      [06.08.24, 23:00:00 CEST] notification ["action": notification, "payload": {
          aps =     {
              alert =         {
                  body = "Cron Datum: 06.08.2024 - 23:00";
                  subtitle = Ooooo;
                  title = "Cron Stunde: 23";
              };
          };
      }]
      [06.08.24, 23:00:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 23:00:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 23:01:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 23:01:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 23:02:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 23:02:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 23:03:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 23:03:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 23:04:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 23:04:43 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 23:04:45 CEST] check Event ["action": setPresence, "success": 1]
      [06.08.24, 23:04:45 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 23:04:45 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 23:04:46 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 23:04:46 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 23:04:47 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 23:04:47 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 23:04:48 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 23:04:48 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 23:04:48 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 23:04:49 CEST] check Event ["action": setPresence, "success": 1]
      [06.08.24, 23:04:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 23:04:49 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 23:04:49 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 23:04:50 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 23:04:50 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 23:04:51 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 23:04:52 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 23:04:53 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 23:04:55 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 23:04:57 CEST] check Event ["action": setPresence, "success": 1]
      [06.08.24, 23:04:57 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 23:04:57 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 23:04:58 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 23:04:58 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 23:04:59 CEST] check Event ["success": 1, "action": setPresence]
      [06.08.24, 23:04:59 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 23:05:00 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 23:05:00 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 23:05:00 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 23:05:01 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 23:05:01 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 23:05:01 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 23:05:02 CEST] check Event ["action": setPresence, "success": 1]
      [06.08.24, 23:05:02 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 23:05:02 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 23:05:07 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 23:05:08 CEST] check Event ["success": 1, "action": set]
      [06.08.24, 23:05:09 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 23:05:09 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 23:05:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 23:05:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 23:06:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 23:06:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 23:07:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 23:07:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 23:08:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 23:08:20 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 23:08:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 23:09:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 23:09:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 23:10:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 23:10:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 23:11:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 23:11:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 23:12:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 23:12:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 23:13:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [06.08.24, 23:13:42 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 23:13:42 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 23:13:42 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 23:13:42 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 23:13:42 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 23:13:42 CEST] check Event ["action": set, "success": 1]
      [06.08.24, 23:13:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [PINGS GELÖSCHT] Wegen Beitrag Zeichenlänge
      [06.08.24, 23:59:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 00:00:00 CEST] check Event ["action": notification, "payload": {
          aps =     {
              alert =         {
                  body = "Cron Datum: 07.08.2024 - 00:00";
                  subtitle = Ooooo;
                  title = "Cron Stunde: 0";
              };
          };
      }]
      [07.08.24, 00:00:00 CEST] notification ["action": notification, "payload": {
          aps =     {
              alert =         {
                  body = "Cron Datum: 07.08.2024 - 00:00";
                  subtitle = Ooooo;
                  title = "Cron Stunde: 0";
              };
          };
      }]
      [07.08.24, 00:00:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 00:00:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [PINGS GELÖSCHT] Wegen Beitrag Zeichenlänge
      [07.08.24, 00:59:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 01:00:00 CEST] check Event ["payload": {
          aps =     {
              alert =         {
                  body = "Cron Datum: 07.08.2024 - 01:00";
                  subtitle = Ooooo;
                  title = "Cron Stunde: 1";
              };
          };
      }, "action": notification]
      [07.08.24, 01:00:00 CEST] notification ["payload": {
          aps =     {
              alert =         {
                  body = "Cron Datum: 07.08.2024 - 01:00";
                  subtitle = Ooooo;
                  title = "Cron Stunde: 1";
              };
          };
      }, "action": notification]
      [07.08.24, 01:00:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [PINGS GELÖSCHT] Wegen Beitrag Zeichenlänge
      [07.08.24, 01:59:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 02:00:00 CEST] check Event ["payload": {
          aps =     {
              alert =         {
                  body = "Cron Datum: 07.08.2024 - 02:00";
                  subtitle = Ooooo;
                  title = "Cron Stunde: 2";
              };
          };
      }, "action": notification]
      [07.08.24, 02:00:00 CEST] notification ["payload": {
          aps =     {
              alert =         {
                  body = "Cron Datum: 07.08.2024 - 02:00";
                  subtitle = Ooooo;
                  title = "Cron Stunde: 2";
              };
          };
      }, "action": notification]
      [07.08.24, 02:00:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 02:00:26 CEST] check Event ["action": setPresence, "success": 1]
      [07.08.24, 02:00:26 CEST] check Event ["action": set, "success": 1]
      [07.08.24, 02:00:27 CEST] check Event ["success": 1, "action": set]
      [07.08.24, 02:00:27 CEST] check Event ["action": set, "success": 1]
      [07.08.24, 02:00:28 CEST] check Event ["success": 1, "action": set]
      [07.08.24, 02:00:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [PINGS GELÖSCHT] Wegen Beitrag Zeichenlänge
      [07.08.24, 02:35:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 02:36:00 CEST] Updated online state: lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 02:36:09 CEST] Attempting reconnect for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 02:36:09 CEST] Connecting to WebSocket for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 02:36:09 CEST] Updated online state: connecting for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 02:36:10 CEST] WebSocket connected: ["Upgrade": "websocket", "Connection": "Upgrade", "Sec-WebSocket-Accept": "GgJ9zG7wNBnc4akNnfedHjx0RkA="] for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 02:36:10 CEST] Websocket State: authenticating for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 02:36:10 CEST] Updated online state: connected for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 02:36:10 CEST] Updated online state: authenticating for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 02:36:11 CEST] Websocket State: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 02:36:11 CEST] Updated online state: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 02:36:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 02:36:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 02:37:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 02:37:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 02:38:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 02:38:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 02:39:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 02:39:22 CEST] Check all Websocket Connectrions called
      [07.08.24, 02:39:22 CEST] Connection state set to ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 02:39:22 CEST] Monitoring Network satisfied: satisfied
      [07.08.24, 02:39:22 CEST] Updated online state: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 02:39:23 CEST] Check all Websocket Connectrions called
      [07.08.24, 02:39:23 CEST] Monitoring Network satisfied: satisfied
      [07.08.24, 02:39:23 CEST] Connection state set to ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 02:39:23 CEST] Updated online state: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 02:39:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [PINGS GELÖSCHT] Wegen Beitrag Zeichenlänge
      [07.08.24, 02:59:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 03:00:00 CEST] check Event ["action": notification, "payload": {
          aps =     {
              alert =         {
                  body = "Cron Datum: 07.08.2024 - 03:00";
                  subtitle = Ooooo;
                  title = "Cron Stunde: 3";
              };
          };
      }]
      [07.08.24, 03:00:00 CEST] notification ["action": notification, "payload": {
          aps =     {
              alert =         {
                  body = "Cron Datum: 07.08.2024 - 03:00";
                  subtitle = Ooooo;
                  title = "Cron Stunde: 3";
              };
          };
      }]
      [07.08.24, 03:00:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [PINGS GELÖSCHT] Wegen Beitrag Zeichenlänge
      [07.08.24, 03:59:49 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 04:00:00 CEST] check Event ["payload": {
          aps =     {
              alert =         {
                  body = "Cron Datum: 07.08.2024 - 04:00";
                  subtitle = Ooooo;
                  title = "Cron Stunde: 4";
              };
          };
      }, "action": notification]
      [07.08.24, 04:00:00 CEST] notification ["payload": {
          aps =     {
              alert =         {
                  body = "Cron Datum: 07.08.2024 - 04:00";
                  subtitle = Ooooo;
                  title = "Cron Stunde: 4";
              };
          };
      }, "action": notification]
      [07.08.24, 04:00:19 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [PINGS GELÖSCHT] Wegen Beitrag Zeichenlänge
      [07.08.24, 04:59:50 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 05:00:00 CEST] check Event ["action": notification, "payload": {
          aps =     {
              alert =         {
                  body = "Cron Datum: 07.08.2024 - 05:00";
                  subtitle = Ooooo;
                  title = "Cron Stunde: 5";
              };
          };
      }]
      [07.08.24, 05:00:00 CEST] notification ["action": notification, "payload": {
          aps =     {
              alert =         {
                  body = "Cron Datum: 07.08.2024 - 05:00";
                  subtitle = Ooooo;
                  title = "Cron Stunde: 5";
              };
          };
      }]
      [07.08.24, 05:00:20 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 05:00:21 CEST] check Event ["success": 1, "action": set]
      [PINGS GELÖSCHT] Wegen Beitrag Zeichenlänge
      [07.08.24, 05:12:20 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 05:12:25 CEST] Check all Websocket Connectrions called
      [07.08.24, 05:12:25 CEST] Monitoring Network satisfied: satisfied
      [07.08.24, 05:12:25 CEST] Connection state set to ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 05:12:25 CEST] Updated online state: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 05:12:25 CEST] Check all Websocket Connectrions called
      [07.08.24, 05:12:25 CEST] Monitoring Network satisfied: satisfied
      [07.08.24, 05:12:25 CEST] Connection state set to ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 05:12:25 CEST] Updated online state: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 05:12:50 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [PINGS GELÖSCHT] Wegen Beitrag Zeichenlänge
      [07.08.24, 05:59:50 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 06:00:00 CEST] check Event ["action": notification, "payload": {
          aps =     {
              alert =         {
                  body = "Cron Datum: 07.08.2024 - 06:00";
                  subtitle = Ooooo;
                  title = "Cron Stunde: 6";
              };
          };
      }]
      [07.08.24, 06:00:00 CEST] notification ["action": notification, "payload": {
          aps =     {
              alert =         {
                  body = "Cron Datum: 07.08.2024 - 06:00";
                  subtitle = Ooooo;
                  title = "Cron Stunde: 6";
              };
          };
      }]
      [07.08.24, 06:00:20 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [PINGS GELÖSCHT] Wegen Beitrag Zeichenlänge
      [07.08.24, 06:59:50 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 07:00:00 CEST] check Event ["action": notification, "payload": {
          aps =     {
              alert =         {
                  body = "Cron Datum: 07.08.2024 - 07:00";
                  subtitle = Ooooo;
                  title = "Cron Stunde: 7";
              };
          };
      }]
      [07.08.24, 07:00:00 CEST] notification ["action": notification, "payload": {
          aps =     {
              alert =         {
                  body = "Cron Datum: 07.08.2024 - 07:00";
                  subtitle = Ooooo;
                  title = "Cron Stunde: 7";
              };
          };
      }]
      [07.08.24, 07:00:20 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [PINGS GELÖSCHT] Wegen Beitrag Zeichenlänge
      [07.08.24, 07:59:50 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 08:00:00 CEST] check Event ["payload": {
          aps =     {
              alert =         {
                  body = "Cron Datum: 07.08.2024 - 08:00";
                  subtitle = Ooooo;
                  title = "Cron Stunde: 8";
              };
          };
      }, "action": notification]
      [07.08.24, 08:00:00 CEST] notification ["payload": {
          aps =     {
              alert =         {
                  body = "Cron Datum: 07.08.2024 - 08:00";
                  subtitle = Ooooo;
                  title = "Cron Stunde: 8";
              };
          };
      }, "action": notification]
      [07.08.24, 08:00:20 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [PINGS GELÖSCHT] Wegen Beitrag Zeichenlänge
      [07.08.24, 08:59:50 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:00:00 CEST] check Event ["payload": {
          aps =     {
              alert =         {
                  body = "Cron Datum: 07.08.2024 - 09:00";
                  subtitle = Ooooo;
                  title = "Cron Stunde: 9";
              };
          };
      }, "action": notification]
      [07.08.24, 09:00:00 CEST] notification ["payload": {
          aps =     {
              alert =         {
                  body = "Cron Datum: 07.08.2024 - 09:00";
                  subtitle = Ooooo;
                  title = "Cron Stunde: 9";
              };
          };
      }, "action": notification]
      [07.08.24, 09:00:20 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [PINGS GELÖSCHT] Wegen Beitrag Zeichenlänge
      [07.08.24, 09:16:20 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:16:28 CEST] check Event ["action": setPresence, "success": 1]
      [07.08.24, 09:16:28 CEST] check Event ["action": set, "success": 1]
      [07.08.24, 09:16:28 CEST] check Event ["success": 1, "action": set]
      [07.08.24, 09:16:29 CEST] check Event ["action": set, "success": 1]
      [07.08.24, 09:16:50 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:17:20 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:17:50 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:18:20 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:18:50 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:19:20 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:19:35 CEST] check Event ["action": set, "success": 1]
      [07.08.24, 09:19:36 CEST] check Event ["success": 1, "action": setPresence]
      [07.08.24, 09:31:27 CEST] Check all Websocket Connectrions called
      [07.08.24, 09:31:27 CEST] Monitoring Network satisfied: satisfied
      [07.08.24, 09:31:27 CEST] Connection state set to ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:31:27 CEST] Updated online state: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:31:28 CEST] Check all Websocket Connectrions called
      [07.08.24, 09:31:28 CEST] Monitoring Network satisfied: satisfied
      [07.08.24, 09:31:28 CEST] Connection state set to ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:31:28 CEST] Updated online state: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:31:28 CEST] check Event ["action": set, "success": 1]
      [07.08.24, 09:31:28 CEST] check Event ["action": set, "success": 1]
      [07.08.24, 09:31:28 CEST] Check all Websocket Connectrions called
      [07.08.24, 09:31:28 CEST] Monitoring Network satisfied: satisfied
      [07.08.24, 09:31:28 CEST] Connection state set to ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:31:28 CEST] Updated online state: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:31:29 CEST] check Event ["success": 1, "action": setPresence]
      [07.08.24, 09:35:35 CEST] Check all Websocket Connectrions called
      [07.08.24, 09:35:35 CEST] Monitoring Network satisfied: satisfied
      [07.08.24, 09:35:35 CEST] Connection state set to ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:35:35 CEST] Updated online state: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:35:35 CEST] Check all Websocket Connectrions called
      [07.08.24, 09:35:35 CEST] Monitoring Network satisfied: satisfied
      [07.08.24, 09:35:35 CEST] Connection state set to ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:35:35 CEST] Updated online state: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:35:35 CEST] Check all Websocket Connectrions called
      [07.08.24, 09:35:35 CEST] Monitoring Network satisfied: satisfied
      [07.08.24, 09:35:35 CEST] Connection state set to ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:35:35 CEST] Updated online state: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:35:35 CEST] check Event ["action": setPresence, "success": 1]
      [07.08.24, 09:35:35 CEST] check Event ["action": set, "success": 1]
      [07.08.24, 09:35:35 CEST] check Event ["action": set, "success": 1]
      [07.08.24, 09:35:36 CEST] check Event ["success": 1, "action": setPresence]
      [07.08.24, 09:35:36 CEST] Check all Websocket Connectrions called
      [07.08.24, 09:35:36 CEST] Monitoring Network satisfied: satisfied
      [07.08.24, 09:35:36 CEST] Connection state set to ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:35:36 CEST] Updated online state: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:35:36 CEST] check Event ["action": set, "success": 1]
      [07.08.24, 09:35:36 CEST] check Event ["success": 1, "action": set]
      [07.08.24, 09:35:36 CEST] check Event ["action": set, "success": 1]
      [07.08.24, 09:35:36 CEST] Check all Websocket Connectrions called
      [07.08.24, 09:35:36 CEST] Monitoring Network satisfied: satisfied
      [07.08.24, 09:35:36 CEST] Connection state set to ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:35:36 CEST] Updated online state: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:35:37 CEST] check Event ["success": 1, "action": set]
      [07.08.24, 09:35:37 CEST] check Event ["success": 1, "action": set]
      [07.08.24, 09:35:37 CEST] Check all Websocket Connectrions called
      [07.08.24, 09:35:37 CEST] Monitoring Network satisfied: satisfied
      [07.08.24, 09:35:37 CEST] Connection state set to ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:35:37 CEST] Updated online state: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:35:37 CEST] Check all Websocket Connectrions called
      [07.08.24, 09:35:37 CEST] Monitoring Network satisfied: satisfied
      [07.08.24, 09:35:37 CEST] Connection state set to ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:35:37 CEST] Updated online state: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:35:38 CEST] check Event ["action": setPresence, "success": 1]
      [07.08.24, 09:35:38 CEST] check Event ["success": 1, "action": set]
      [07.08.24, 09:36:31 CEST] check Event ["success": 1, "action": set]
      [07.08.24, 09:58:30 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:58:30 CEST] Check all Websocket Connectrions called
      [07.08.24, 09:58:30 CEST] Monitoring Network satisfied: satisfied
      [07.08.24, 09:58:30 CEST] Connection state set to ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:58:30 CEST] Updated online state: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:58:30 CEST] Reconnect suggested, connection lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:58:30 CEST] Websocket viability changed, connection lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:58:30 CEST] Websocket State: lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:58:30 CEST] WebSocket error: POSIXErrorCode(rawValue: 53): Software caused connection abort for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:58:30 CEST] Websocket State: lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:58:30 CEST] Updated online state: lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:58:30 CEST] Updated online state: lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:58:30 CEST] Updated online state: lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:58:30 CEST] Updated online state: lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:58:30 CEST] Updated online state: lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:58:31 CEST] Check all Websocket Connectrions called
      [07.08.24, 09:58:31 CEST] Monitoring Network satisfied: satisfied
      [07.08.24, 09:58:31 CEST] Attempting reconnect for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:58:31 CEST] Connecting to WebSocket for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:58:31 CEST] Updated online state: connecting for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:58:36 CEST] WebSocket connected: ["Connection": "Upgrade", "Upgrade": "websocket", "Sec-WebSocket-Accept": "hKRAuWjI3mK4uxCFRuHMia3eDeA="] for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:58:36 CEST] Websocket State: authenticating for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:58:36 CEST] Updated online state: connected for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:58:36 CEST] Updated online state: authenticating for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:58:38 CEST] Websocket State: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:58:38 CEST] Updated online state: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:58:39 CEST] check Event ["action": set, "success": 1]
      [07.08.24, 09:58:39 CEST] check Event ["action": set, "success": 1]
      [07.08.24, 09:58:39 CEST] check Event ["action": set, "success": 1]
      [07.08.24, 09:58:39 CEST] check Event ["action": set, "success": 1]
      [07.08.24, 09:58:39 CEST] check Event ["action": set, "success": 1]
      [07.08.24, 09:58:39 CEST] check Event ["action": set, "success": 1]
      [07.08.24, 09:58:39 CEST] check Event ["action": set, "success": 1]
      [07.08.24, 09:58:39 CEST] check Event ["action": setPresence, "success": 1]
      [07.08.24, 09:58:40 CEST] Connection state set to ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:58:40 CEST] Updated online state: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:59:38 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:59:38 CEST] Check all Websocket Connectrions called
      [07.08.24, 09:59:38 CEST] Monitoring Network satisfied: satisfied
      [07.08.24, 09:59:38 CEST] Connection state set to ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:59:38 CEST] Updated online state: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:59:38 CEST] Websocket State: lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:59:38 CEST] WebSocket error: POSIXErrorCode(rawValue: 53): Software caused connection abort for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:59:38 CEST] Websocket State: lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:59:38 CEST] Updated online state: lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:59:38 CEST] Updated online state: lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:59:38 CEST] Updated online state: lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:59:39 CEST] Check all Websocket Connectrions called
      [07.08.24, 09:59:39 CEST] Monitoring Network satisfied: satisfied
      [07.08.24, 09:59:39 CEST] Attempting reconnect for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:59:39 CEST] Connecting to WebSocket for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:59:39 CEST] Updated online state: connecting for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:59:41 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:59:42 CEST] Check all Websocket Connectrions called
      [07.08.24, 09:59:42 CEST] Monitoring Network satisfied: satisfied
      [07.08.24, 09:59:42 CEST] Attempted to reconnect while already connected or connecting for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:59:43 CEST] Check all Websocket Connectrions called
      [07.08.24, 09:59:43 CEST] Monitoring Network satisfied: satisfied
      [07.08.24, 09:59:43 CEST] Attempted to reconnect while already connected or connecting for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:59:43 CEST] WebSocket connected: ["Upgrade": "websocket", "Connection": "Upgrade", "Sec-WebSocket-Accept": "87a52907IIfpASZB0eMQFl/5FVk="] for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:59:43 CEST] Websocket State: authenticating for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:59:43 CEST] Updated online state: connected for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:59:43 CEST] Updated online state: authenticating for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:59:45 CEST] Check all Websocket Connectrions called
      [07.08.24, 09:59:45 CEST] Monitoring Network satisfied: satisfied
      [07.08.24, 09:59:45 CEST] Connection state set to ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:59:45 CEST] Updated online state: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:59:48 CEST] Connection state set to ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 09:59:48 CEST] Updated online state: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:04:38 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:04:38 CEST] Check all Websocket Connectrions called
      [07.08.24, 10:04:38 CEST] Updated online state: lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:04:38 CEST] Monitoring Network satisfied: satisfied
      [07.08.24, 10:04:38 CEST] Attempting reconnect for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:04:38 CEST] Connecting to WebSocket for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:04:38 CEST] Updated online state: connecting for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:04:38 CEST] WebSocket connected: ["Upgrade": "websocket", "Sec-WebSocket-Accept": "4c1jtiF45JIo+ZLUAVFGpL9FIO0=", "Connection": "Upgrade"] for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:04:38 CEST] Websocket State: authenticating for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:04:38 CEST] Updated online state: connected for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:04:38 CEST] Updated online state: authenticating for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:04:38 CEST] Check all Websocket Connectrions called
      [07.08.24, 10:04:38 CEST] Monitoring Network satisfied: satisfied
      [07.08.24, 10:04:38 CEST] Connection state set to ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:04:38 CEST] Updated online state: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:04:39 CEST] check Event ["action": set, "success": 1]
      [07.08.24, 10:04:39 CEST] check Event ["action": set, "success": 1]
      [07.08.24, 10:04:39 CEST] check Event ["success": 1, "action": set]
      [07.08.24, 10:04:39 CEST] check Event ["success": 1, "action": set]
      [07.08.24, 10:04:40 CEST] check Event ["action": notification, "payload": {
          aps =     {
              alert =         {
                  body = "Cron Datum: 07.08.2024 - 10:00";
                  subtitle = Ooooo;
                  title = "Cron Stunde: 10";
              };
          };
      }]
      [07.08.24, 10:04:40 CEST] notification ["action": notification, "payload": {
          aps =     {
              alert =         {
                  body = "Cron Datum: 07.08.2024 - 10:00";
                  subtitle = Ooooo;
                  title = "Cron Stunde: 10";
              };
          };
      }]
      [07.08.24, 10:04:41 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:04:41 CEST] Check all Websocket Connectrions called
      [07.08.24, 10:04:41 CEST] Monitoring Network satisfied: satisfied
      [07.08.24, 10:04:41 CEST] Connection state set to ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:04:41 CEST] Updated online state: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:04:44 CEST] Check all Websocket Connectrions called
      [07.08.24, 10:04:44 CEST] Monitoring Network satisfied: satisfied
      [07.08.24, 10:04:44 CEST] Connection state set to ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:04:44 CEST] Updated online state: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:04:47 CEST] Check all Websocket Connectrions called
      [07.08.24, 10:04:47 CEST] Monitoring Network satisfied: satisfied
      [07.08.24, 10:04:47 CEST] Connection state set to ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:04:47 CEST] Updated online state: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:04:48 CEST] Connection state set to ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:04:48 CEST] Updated online state: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:11:44 CEST] Check all Websocket Connectrions called
      [07.08.24, 10:11:44 CEST] Connection state set to ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:11:44 CEST] Monitoring Network satisfied: satisfied
      [07.08.24, 10:11:44 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:11:44 CEST] Updated online state: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:11:44 CEST] Websocket State: lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:11:44 CEST] WebSocket error: POSIXErrorCode(rawValue: 53): Software caused connection abort for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:11:44 CEST] Websocket State: lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:11:44 CEST] Updated online state: lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:11:44 CEST] Updated online state: lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:11:44 CEST] Updated online state: lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:11:45 CEST] Check all Websocket Connectrions called
      [07.08.24, 10:11:45 CEST] Monitoring Network satisfied: satisfied
      [07.08.24, 10:11:45 CEST] Attempting reconnect for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:11:45 CEST] Connecting to WebSocket for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:11:45 CEST] Updated online state: connecting for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:11:45 CEST] WebSocket connected: ["Upgrade": "websocket", "Sec-WebSocket-Accept": "d6N4ehZOhIewwAF3sZcaPT8rFZw=", "Connection": "Upgrade"] for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:11:45 CEST] Websocket State: authenticating for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:11:45 CEST] Updated online state: connected for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:11:45 CEST] Updated online state: authenticating for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:11:46 CEST] Websocket State: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:11:46 CEST] Updated online state: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:11:46 CEST] check Event ["success": 1, "action": set]
      [07.08.24, 10:11:46 CEST] check Event ["success": 1, "action": set]
      [07.08.24, 10:11:46 CEST] check Event ["success": 1, "action": set]
      [07.08.24, 10:11:46 CEST] check Event ["action": set, "success": 1]
      [07.08.24, 10:11:46 CEST] check Event ["action": set, "success": 1]
      [07.08.24, 10:11:46 CEST] check Event ["action": setPresence, "success": 1]
      [07.08.24, 10:11:48 CEST] check Event ["success": 1, "action": set]
      [07.08.24, 10:11:48 CEST] check Event ["action": set, "success": 1]
      [07.08.24, 10:11:54 CEST] Check all Websocket Connectrions called
      [07.08.24, 10:11:54 CEST] Monitoring Network satisfied: satisfied
      [07.08.24, 10:11:54 CEST] Connection state set to ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:11:54 CEST] Updated online state: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:11:54 CEST] Connection state set to ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:11:54 CEST] Updated online state: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:16:45 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:16:45 CEST] Check all Websocket Connectrions called
      [07.08.24, 10:16:45 CEST] Monitoring Network satisfied: satisfied
      [07.08.24, 10:16:45 CEST] Connection state set to ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:16:45 CEST] Updated online state: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:16:45 CEST] Websocket State: lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:16:45 CEST] WebSocket error: POSIXErrorCode(rawValue: 53): Software caused connection abort for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:16:45 CEST] Updated online state: lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:16:45 CEST] Updated online state: lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:16:45 CEST] Websocket State: lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:16:45 CEST] Updated online state: lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:16:46 CEST] Check all Websocket Connectrions called
      [07.08.24, 10:16:46 CEST] Monitoring Network satisfied: satisfied
      [07.08.24, 10:16:46 CEST] Attempting reconnect for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:16:46 CEST] Connecting to WebSocket for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:16:46 CEST] Updated online state: connecting for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:16:47 CEST] WebSocket connected: ["Connection": "Upgrade", "Upgrade": "websocket", "Sec-WebSocket-Accept": "QgYsvm3zExGcrPbw76MGSWn7ygo="] for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:16:47 CEST] Websocket State: authenticating for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:16:47 CEST] Updated online state: connected for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:16:47 CEST] Updated online state: authenticating for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:16:48 CEST] Websocket State: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:16:48 CEST] Updated online state: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:16:48 CEST] check Event ["success": 1, "action": set]
      [07.08.24, 10:16:48 CEST] check Event ["action": set, "success": 1]
      [07.08.24, 10:16:48 CEST] check Event ["action": set, "success": 1]
      [07.08.24, 10:16:48 CEST] check Event ["action": set, "success": 1]
      [07.08.24, 10:16:48 CEST] check Event ["action": setPresence, "success": 1]
      [07.08.24, 10:16:48 CEST] Check all Websocket Connectrions called
      [07.08.24, 10:16:48 CEST] Monitoring Network satisfied: satisfied
      [07.08.24, 10:16:48 CEST] Connection state set to ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:16:48 CEST] Updated online state: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:16:51 CEST] check Event ["action": set, "success": 1]
      [07.08.24, 10:16:54 CEST] check Event ["action": set, "success": 1]
      [07.08.24, 10:16:55 CEST] Connection state set to ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:16:55 CEST] Updated online state: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:21:46 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:21:46 CEST] Check all Websocket Connectrions called
      [07.08.24, 10:21:46 CEST] Monitoring Network satisfied: satisfied
      [07.08.24, 10:21:46 CEST] Connection state set to ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:21:46 CEST] Updated online state: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:21:46 CEST] Websocket State: lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:21:46 CEST] WebSocket error: POSIXErrorCode(rawValue: 53): Software caused connection abort for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:21:46 CEST] Websocket State: lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:21:46 CEST] Updated online state: lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:21:46 CEST] Updated online state: lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:21:46 CEST] Updated online state: lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:21:56 CEST] Attempting reconnect for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:21:56 CEST] Connecting to WebSocket for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:21:56 CEST] Updated online state: connecting for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:24:50 CEST] Check all Websocket Connectrions called
      [07.08.24, 10:24:50 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:24:50 CEST] Monitoring Network satisfied: satisfied
      [07.08.24, 10:24:50 CEST] Attempted to reconnect while already connected or connecting for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:24:50 CEST] Websocket State: lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:24:50 CEST] Updated online state: lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:24:50 CEST] WebSocket error: POSIXErrorCode(rawValue: 53): Software caused connection abort for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:24:50 CEST] Updated online state: lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:25:00 CEST] Attempting reconnect for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:25:00 CEST] Connecting to WebSocket for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:25:00 CEST] Updated online state: connecting for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:27:32 CEST] Check all Websocket Connectrions called
      [07.08.24, 10:27:32 CEST] Monitoring Network satisfied: satisfied
      [07.08.24, 10:27:32 CEST] Attempted to reconnect while already connected or connecting for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:27:32 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:27:32 CEST] Reconnect suggested, connection lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:27:32 CEST] Websocket viability changed, connection lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:27:32 CEST] WebSocket error: POSIXErrorCode(rawValue: 57): Socket is not connected for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:27:32 CEST] Updated online state: lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:27:32 CEST] Updated online state: lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:27:32 CEST] Updated online state: lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:27:41 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:27:42 CEST] Attempting reconnect for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:27:42 CEST] Connecting to WebSocket for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:27:42 CEST] Updated online state: connecting for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:27:42 CEST] WebSocket connected: ["Upgrade": "websocket", "Connection": "Upgrade", "Sec-WebSocket-Accept": "z/MdcTywf+rSbmS7pq359buSNB8="] for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:27:42 CEST] Websocket State: authenticating for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:27:42 CEST] Updated online state: connected for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:27:42 CEST] Updated online state: authenticating for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:28:41 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:28:41 CEST] Updated online state: lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:28:41 CEST] Websocket State: lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:28:41 CEST] WebSocket error: POSIXErrorCode(rawValue: 53): Software caused connection abort for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:28:41 CEST] Websocket State: lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:28:41 CEST] Updated online state: lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:28:41 CEST] Updated online state: lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:28:41 CEST] Updated online state: lost for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:28:52 CEST] Attempting reconnect for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:28:52 CEST] Connecting to WebSocket for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:28:52 CEST] Updated online state: connecting for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:28:52 CEST] WebSocket connected: ["Upgrade": "websocket", "Connection": "Upgrade", "Sec-WebSocket-Accept": "pGXFlA4YRIrXvtsrrs3xDI5/wt0="] for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:28:52 CEST] Websocket State: authenticating for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:28:52 CEST] Updated online state: connected for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:28:52 CEST] Updated online state: authenticating for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:28:53 CEST] Websocket State: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:28:53 CEST] Updated online state: ready for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:28:53 CEST] check Event ["success": 1, "action": set]
      [07.08.24, 10:31:02 CEST] check Event ["action": set, "success": 1]
      [07.08.24, 10:31:02 CEST] check Event ["action": set, "success": 1]
      [07.08.24, 10:31:31 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:31:31 CEST] check Event ["action": setPresence, "success": 1]
      [07.08.24, 10:31:31 CEST] check Event ["action": set, "success": 1]
      [07.08.24, 10:31:31 CEST] check Event ["action": set, "success": 1]
      [07.08.24, 10:31:32 CEST] check Event ["action": set, "success": 1]
      [07.08.24, 10:31:32 CEST] check Event ["action": set, "success": 1]
      [07.08.24, 10:31:32 CEST] check Event ["action": set, "success": 1]
      [07.08.24, 10:31:41 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:32:11 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:32:41 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:33:11 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:33:41 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:34:11 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:34:41 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:35:11 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:35:41 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:36:11 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:36:35 CEST] check Event ["success": 1, "action": set]
      [07.08.24, 10:36:36 CEST] check Event ["success": 1, "action": setPresence]
      [07.08.24, 10:36:36 CEST] check Event ["success": 1, "action": set]
      [07.08.24, 10:36:36 CEST] check Event ["success": 1, "action": set]
      [07.08.24, 10:36:37 CEST] check Event ["action": set, "success": 1]
      [07.08.24, 10:36:37 CEST] check Event ["action": set, "success": 1]
      [07.08.24, 10:36:38 CEST] check Event ["success": 1, "action": set]
      [07.08.24, 10:36:38 CEST] check Event ["success": 1, "action": set]
      [07.08.24, 10:36:39 CEST] check Event ["action": set, "success": 1]
      [07.08.24, 10:36:40 CEST] check Event ["success": 1, "action": set]
      [07.08.24, 10:36:41 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      [07.08.24, 10:36:41 CEST] check Event ["success": 1, "action": set]
      [07.08.24, 10:36:41 CEST] check Event ["action": set, "success": 1]
      [07.08.24, 10:36:41 CEST] check Event ["action": set, "success": 1]
      [07.08.24, 10:37:11 CEST] Sent ping for system ID: EC6D18F5-3F4E-4BED-B8CD-8C1E520186BC
      
      posted in ioBroker Allgemein
      stolly82
      stolly82
    • RE: iOS App - Tester gesucht!

      Hey zusammen,

      ich muss mich mal wieder melden.

      Ich bin aktuell mit mehren Projekten beschäftigt (irgendwann muss ich leider auch mal Arbeiten und Geld verdienen), weshalb ich hier nicht mehr viel gemacht hatte.

      Die meisten neigen sich gerade dem Ende so dass ich mich hier wieder ein wenig drum kümmern kann.

      Liebe Grüsse

      posted in ioBroker Allgemein
      stolly82
      stolly82
    • Huawei Wallbox - S Charger (7kw/h / 22kw/h) Adapter test

      Zusammenfassung des ioBroker Huawei Charger Adapters

      Beschreibung:
      Der ioBroker Huawei Charger Adapter ermöglicht die Integration von Huawei AC Chargers über das Modbus-TCP-Protokoll in ioBroker. Mit diesem Adapter können Echtzeitdaten wie Spannung, Strom und Leistung überwacht und Konfigurationen am Ladevorgang vorgenommen werden.

      Funktionen:

      • Überwachung der Spannungs- und Stromwerte der einzelnen Phasen (L1, L2, L3).
      • Berechnung und Anzeige der Gesamtspannung und des Gesamtstroms über alle Phasen.
      • Steuerung der maximalen Ladeleistung und des Ladevorgangs über konfigurierbare Register (Funktioniert noch nicht)
      • Automatische Wiederverbindung bei Verbindungsverlust.

      Konfiguration:

      • IP-Adresse: Die IP-Adresse des Huawei Chargers.
      • Port: Der Modbus-TCP-Port des Chargers (Standard: 502).
      • Unit ID: Die Modbus-Unit-ID des Chargers (Standard: 1).
      • Reconnect-Intervall: Wählen Sie, wie oft der Adapter die Verbindung zum Charger wiederherstellen soll, nachdem sie vom Charger getrennt wurde (Optionen: sofort, 5 min, 10 min, 15 min, 30 min, 60 min).

      Installation über Git:

      1. Öffnen Sie das Terminal auf Ihrem ioBroker-Host.
      2. Navigieren Sie zum ioBroker-Installationsverzeichnis (z. B. /opt/iobroker).
      3. Führen Sie den folgenden Befehl aus:
        cd iobroker
        iobroker url https://github.com/DNAngelX/ioBroker.huawei-charger
        
      4. Starten Sie den Adapter in ioBroker und konfigurieren Sie die notwendigen Einstellungen.

      db8d3b5a-53ad-4388-bfce-8b370ff26af4-image.png

      posted in Tester
      stolly82
      stolly82
    • RE: Neuer Adapter - Android TV & Fire TV Benachrichtigungen

      @ilovegym

      @dragon said in Neuer Adapter - Android TV & Fire TV Benachrichtigungen:

      @stolly82
      Das ist ja mal eine sehr schnelle Reaktion! Vielen Dank für deine tolle Arbeit!

      Er müsste im Stable verfügbar sein, wurde freigegeben!

      posted in Entwicklung
      stolly82
      stolly82
    • RE: iOS App - Tester gesucht!

      Ich möchte hier mal ein kleines Update geben.
      Ich habe das App und auch den Adapter komplett auf Websockets umgeschrieben

      Das war etwas mehr Arbeit als erwartet, der Login sind alleine 3 Tage mit der Validierung gewesen.

      Eingebaut habe ich zusätzlich:

      Notifications

      • An einzelne devices
      • An alle Devices eines Users
      • An alle
      • Notification Queue, wenn device nicht verbunden wird nach dem Verbinden gepusht

      Sensoren, Presence und Distance

      • Queue eingefügt, welche einen Call eines Devices speichert.
      • Sensoren korrigiert, entfernt und neue hinzugefügt

      Die Gedanken dazu sind, dass wenn z.B. in eine Zone eingetreten wird (Home) aber man nicht verbunden ist, man noch in der Zone ist und diese wieder verlässt, dann würde man nur das verlassen triggern.

      Ebenfalls wenn man drin ist, beim Verlassen keine Verbindung hat, dann muss das nachgezogen werden.

      Wenn man aber in eine Zone fährt und direkt wieder verlässt, die Verbindung erst wieder nach dem Verlassen aufgebaut wird, dann pusht man false welches dann ggf. keine Aktionen auslöst etc.,... daher habe ich die Queue auf eine Statusänderung je sensor type gegrenzt.

      Neue Testflight Version

      • Nur mit neuer Adapter Version nutzen.
      posted in ioBroker Allgemein
      stolly82
      stolly82
    • RE: iOS App - Tester gesucht!

      Distance hatte ich mittlerweile deaktiviert, da die Berechnung nicht sauber funktionierte und zu viel Energie zog.

      Message muss immer title, Body, subtitle gesetzt werden, das sind iOS Anforderungen, sonst geht es nicht.

      Websocket Abbrüche / standby:
      Theoretisch sollen im Hintergrund backend cronjobs laufen, die alle 15 min die WS Verbindung prüfen und ggf. Wiederherstellen.
      Das klappt nicht, auch die URLs für die NFCs nicht.
      Beides wird über die AppDeligate.swift Datei gesteuert (wie auch einiges anderes).
      Die beiden Funktionen bekomme ich weder in dieser App noch in meiner debug/testing App zum laufen obwohl ich die aktuellste Apple developer Description dafür nutze und alles 100% korrekt aktiviert wurde.
      Das debugging hier ist sehr aufwendig weil es wirklich nur trail and error ist.
      Was erstaunlich funktioniert, Netzwerk Wechsel, Funkturm Wechsel etc.
      da bekomme ich meine Push Nachrichten auch nach 3 Tagen App nicht öffnen auf mal alle zugestellt.

      NFC bitte dran denken, ich habe das nur „mal eben“ geschrieben und nicht getestet o.ä.
      Aktuell geht so oder so nur schreiben.

      Fehlende Objekte:
      Objekte werden angelegt, wenn ein device erstellt oder neu verlinkt wird (oder wenn der Server deaktiviert und wieder aktiviert wird, beim aktivieren gibt es aber einen Bug).
      Da ich mehre datenpunkte hinzugefügt habe (habt ihr am Bluetooth gemerkt) am besten einmal Server löschen und neu anlegen.

      Bevor ist tiefere Dinge weiter entwickel, will ich die websockets im Hintergrund 100% zum laufen bekommen.

      posted in ioBroker Allgemein
      stolly82
      stolly82

    Latest posts made by stolly82

    • RE: Adapter Hyundai (Bluelink) oder KIA (UVO)

      @nimsoc sagte in Adapter Hyundai (Bluelink) oder KIA (UVO):

      Am wichtigsten ist mir zunächst die Fernklimatisierung, vor allem in der kalten Jahreszeit. In der App heisst es "Klimaanlage starten", im Adapter heißt der "Button" "control.clima.start".

      Vielen Dank erstmal!

      Bei unserem 2024er EV9 klappt das auch bestens

      posted in Tester
      stolly82
      stolly82
    • RE: Huawei Wallbox - S Charger (7kw/h / 22kw/h) Adapter test

      @mhuber leider meinte ich nicht Mitte 2025, sondern Mitte 2023! Das war schon korrekt 😉

      Es sollte schon seit diversen FW Versionen drin sein, im HomeAssistant forum hatten Leute vor vor mehren Monaten eine Antwort von Huawei gepostet, dass die OCPP in der nächsten Firmware enthalten ist.

      Danach gab es bereits 4 neue Versionen.

      Die nerven die da bei Huawei auch richtig, aber das scheint denen wirklich egal zu sein.

      Ich mache da dann einen Adapter aus dem Script (ist nur 10 min Arbeit das eben umzuschreiben).

      Die Adapter sind super nervig beim Entwickeln, da schleichen sich bei mir immer Fehler ein die dann bei der Prüfung extrem aufwendig sind raus zu bekommen.
      Das liegt irgendwie am Adapter Creator tool, daher schreibe ich sowas aktuell immer als javascript vor und wenn es fertig ist schiebe ich das in den Adapter rein.

      Sind in der Regel nur Konfigurationen und der Objekt-Pfad "Adaptername.(instanz)." statt "Adaptername" die ich dann ändern muss.

      @baerengraben
      GIT macht sinn, kannst aber auch hier machen.

      Wichtig sind dinge wie unter welchen bedingungen ggf. noch eine Abfrage schneller rein muss (Beispiel man ändert was, dann würde ja die Änderung gepusht zur WB aber der Adapter fragt erst im nächsten Zyklus wieder ab, ggf. will man das schneller im Adapter sehen, dass man nach einer Änderung den Zyklus minimiert oder so).

      Oder wenn was nicht funktioniert.

      Viel ist aus der API eh nicht raus zu holen, die dinge die was mit der WB zu tun haben, habe ich alle drin.

      posted in Tester
      stolly82
      stolly82
    • RE: Huawei Wallbox - S Charger (7kw/h / 22kw/h) Adapter test

      @baerengraben

      😀 😀 😀 😀 😀 😀 ,...nicht basierend auf einer API Beschreibung von Huawei 😀 😀 😀 😀 😀 😀

      Das ist komplettes Reverse Engineering, Offiziell gibt es überhaupt nichts von Huawei und die werden es auch nicht einbinden.

      Die wollen OCPP machen, release irgendwie Mitte 2023,...

      Ich bin da ziemlich im Thema mit den HomeAssistant Junx, da ich denne geholfen habe Modbus und jetzt die App API mit einzubinden.

      posted in Tester
      stolly82
      stolly82
    • RE: Huawei Wallbox - S Charger (7kw/h / 22kw/h) Adapter test

      Die Fehlermeldung zum Start mache ich noch weg.

      Also das Loggen der API Calls aus der App war nicht gerade das einfachste, bis ich die Calls raus hatte die da was machen und wann diese von der APP abgerufen und gesetzt werden,... und was da aus welchen Calls rein muss.

      Es gibt in der App mehre API Calls, die nur beim öffnen der Wallbox aufgerufen werden (einmalig) und Live calls, die nur nach dem verstellen von Werten einmalig abgerufen werden.

      Die Wallbox ist in 2 unterschiedlichen API Calls vorhanden und wird in den Wallbox.Settings und Wallbox.Values zusammengelegt (Die anderen WallboxInfo & WallboxSettings sind die Responses aus den APIs, so wie sie raus kommen).

      WallboxInfo & WallboxSettings sind auch unbenannt in der API, werden also nur als ID ausgegeben, die man dann alle einzeln über eine API abfragen muss, wie diese heissen.

      Die IDs die beschreibbar sind, habe ich durch das API logging recherchiert, ich glaube aber da habe ich irgendwas falsch aufgeschrieben, denn ich habe mit Garantie die IP Adresse in der App nicht geändert.
      Vielleicht mal die IDs ausprobieren die euch noch fehlen, die dann einfach in die WRITABLE_IDS eintragen, theoretisch sollten die Datenpunkte dann in Wallbox.Settings erscheinen.
      Nur in denen Werte ändert, darauf lauscht der listener.

      Die IDs findet Ihr dann in den Wallbox > Values > Objektdaten
      8cf25280-846a-4c04-b5a9-eadc23b6b420-image.png

      posted in Tester
      stolly82
      stolly82
    • RE: Huawei Wallbox - S Charger (7kw/h / 22kw/h) Adapter test

      Hier schon mal vorab das Javascript, das könnt Ihr zum testen so übernehmen!

      Einfach oben die Zugangsdaten aus der mobilen App eingeben und fertig.
      @baerengraben @Fabio

      const axios = require('axios');
      
      // Konfiguration
      const CONFIG = {
          userName: 'MySUERNAME',
          password: 'MyPASSWORD',
          grantType: 'password',
          appClientId: '86366133-B8B5-41FA-8EB9-E5A64229E3E1',
          httpsAgent: new (require('https').Agent)({ rejectUnauthorized: false }),
          interval: 1200000 // Intervall in Millisekunden für wiederkehrende Abfragen
      };
      
      // Beschreibbare IDs (manuell festgelegt)
      const WRITABLE_IDS = [
          20001, 20002, 20004, 20005, 20006, 20010, 20011, 20013, 20015, 20016, 20017, 538976529, 538976290, 538976533, 538976534, 538976570, 538976800
      ];
      
      
      let authData = null;
      
      // Authentifizierung und Planung der Token-Erneuerung
      async function authenticateAndScheduleRenewal() {
          authData = await authenticate();
          if (!authData) {
              log('Authentifizierung fehlgeschlagen', 'error');
              return;
          }
      
          const refreshTime = (authData.expires - 300) * 1000; // Erneuerung 5 Minuten vor Ablauf
          log(`Nächste Token-Erneuerung in ${(refreshTime / 1000 / 60).toFixed(2)} Minuten`, 'info');
      
          setTimeout(authenticateAndScheduleRenewal, refreshTime);
      }
      
      // Authentifizierung
      async function authenticate() {
          try {
              const response = await axios.post(
                  "https://intl.fusionsolar.huawei.com:32800/rest/neteco/appauthen/v1/smapp/app/token",
                  JSON.stringify({
                      userName: CONFIG.userName,
                      value: CONFIG.password,
                      grantType: CONFIG.grantType,
                      verifyCode: "",
                      appClientId: CONFIG.appClientId
                  }),
                  {
                      headers: {
                          "Content-Type": "application/json"
                      },
                      httpsAgent: CONFIG.httpsAgent
                  }
              );
      
              if (response.data && response.data.data && response.data.data.accessToken) {
                  log("Benutzer validiert. Antwort: " + JSON.stringify(response.data), 'info');
                  setState('huawei-smart-charger.info.connection', true, true);
                  response.data.data.expiryTime = new Date().getTime() + (response.data.data.expires * 1000);
                  return response.data.data;
              } else {
                  log("Fehler bei der Authentifizierung: Ungültige Antwort. Antwort: " + JSON.stringify(response.data), 'error');
                  setState('huawei-smart-charger.info.connection', false, true);
                  return null;
              }
          } catch (error) {
              log("Fehler bei der Authentifizierung: " + error.message, 'error');
              setState('huawei-smart-charger.info.connection', false, true);
              return null;
          }
      }
      
      // Benutzerinformationen abrufen
      async function getUserDetailInfo() {
          try {
              const response = await axios.get(
                  "https://" + authData.regionFloatIp + ':32800/rest/neteco/phoneapp/v1/datacenter/getuserdetailinfo',
                  {
                      headers: {
                          'roaRand': authData.roaRand,
                          'Cookie': 'locale=de-de;bspsession=' + authData.accessToken + ';dp-session=' + authData.accessToken + '; Secure; HttpOnly'
                      },
                      httpsAgent: CONFIG.httpsAgent
                  }
              );
              log("Benutzerinformationen: " + JSON.stringify(response.data), 'info');
              const userInfo = response.data;
              await createAndSetObjects('huawei-smart-charger.User', userInfo);
          } catch (error) {
              log("Fehler beim Abrufen der Benutzerinformationen: " + error.message, 'error');
          }
      }
      
      // Serverinformationen abrufen
      async function getServerInfo() {
          try {
              const response = await axios.get(
                  "https://" + authData.regionFloatIp + ":32800/rest/neteco/phoneapp/v2/fusionsolarbusiness/company/getorganizationcompanybyuser",
                  {
                      headers: {
                          'roaRand': authData.roaRand,
                          'Cookie': 'locale=de-de;bspsession=' + authData.accessToken + ';dp-session=' + authData.accessToken + '; Secure; HttpOnly'
                      },
                      httpsAgent: CONFIG.httpsAgent
                  }
              );
              log("Serverinformationen: " + JSON.stringify(response.data), 'info');
              const serverInfo = response.data.data;
              await createAndSetObjects('huawei-smart-charger.Server', serverInfo);
          } catch (error) {
              log("Fehler beim Abrufen der Serverinformationen: " + error.message, 'error');
          }
      }
      
      // Station-Liste abrufen
      async function getStationList() {
          try {
              const response = await axios.post(
                  "https://" + authData.regionFloatIp + ":32800/rest/pvms/web/station/v1/station/station-list",
                  {
                      "locale": "de_DE",
                      "sortId": "createTime",
                      "timeZone": "2.00",
                      "pageSize": "11",
                      "supportMDevice": "1",
                      "sortDir": "DESC",
                      "curPage": 1
                  },
                  {
                      headers: {
                          'roaRand': authData.roaRand,
                          'Cookie': 'locale=de-de;bspsession=' + authData.accessToken + ';dp-session=' + authData.accessToken + '; Secure; HttpOnly',
                          "Content-Type": "application/json"
                      },
                      httpsAgent: CONFIG.httpsAgent
                  }
              );
              log("Station-Liste: " + JSON.stringify(response.data), 'info');
              const stationList = response.data.data.list[0];
              await createAndSetObjects('huawei-smart-charger.Station', stationList);
          } catch (error) {
              log("Fehler beim Abrufen der Station-Liste: " + error.message, 'error');
          }
      }
      
      // Wallbox-Informationen abrufen
      async function getWallboxInfo() {
          try {
              const parentDn = getState('huawei-smart-charger.Station.dn').val;
              if (!parentDn) {
                  await getUserDetailInfo();
                  await getServerInfo();
                  await getStationList();
                  return await getWallboxInfo();
              }
      
              const response = await axios.post(
                  "https://" + authData.regionFloatIp + `:32800/rest/neteco/web/config/device/v1/device-list`,
                  "conditionParams.curPage=0&conditionParams.mocTypes=60080&conditionParams.parentDn=" + parentDn + "&conditionParams.recordperpage=500",
                  {
                      headers: {
                          'roaRand': authData.roaRand,
                          'Cookie': 'locale=de-de;bspsession=' + authData.accessToken + ';dp-session=' + authData.accessToken + '; Secure; HttpOnly',
                          "Content-Type": "application/x-www-form-urlencoded"
                      },
                      httpsAgent: CONFIG.httpsAgent
                  }
              );
      
              log("Wallbox-Informationen: " + JSON.stringify(response.data), 'debug');
              const wallboxInfo = response.data.data[0];
      
              // Erstelle den Basisordner für die Wallbox-Informationen
              const basePath = `huawei-smart-charger.WallboxInfo`;
      
              // Speichere alle Daten in IoBroker, einschließlich paramValues
              for (const key in wallboxInfo) {
                  if (key === 'paramValues') {
                      // Speziell für paramValues
                      const paramValuesPath = `${basePath}.paramValues`;
                      for (const paramKey in wallboxInfo.paramValues) {
                          const paramValue = wallboxInfo.paramValues[paramKey];
                          await setObject(`${paramValuesPath}.${paramKey}`, {
                              type: 'state',
                              common: {
                                  name: `Parameter ${paramKey}`,
                                  type: typeof paramValue,
                                  role: 'info',
                                  read: true,
                                  write: WRITABLE_IDS.includes(parseInt(paramKey)) // Schreibbare IDs berücksichtigen
                              },
                              native: { id: paramKey, value: paramValue }
                          });
                          await setState(`${paramValuesPath}.${paramKey}`, paramValue, true);
                      }
                  } else {
                      // Speichere alle anderen Daten in IoBroker
                      await setObject(`${basePath}.${key}`, {
                          type: 'state',
                          common: {
                              name: key,
                              type: typeof wallboxInfo[key],
                              role: 'info',
                              read: true,
                              write: false
                          },
                          native: { value: wallboxInfo[key] }
                      });
                      await setState(`${basePath}.${key}`, wallboxInfo[key], true);
                  }
              }
      
              // Speichere die dnId explizit im Basisordner
              const dnId = wallboxInfo.dnId;
              await setState(`${basePath}.dnId`, dnId, true);
      
              // Rufe die Wallbox-Konfigurationsinformationen auf, wenn paramValues vorhanden sind
              if (wallboxInfo.paramValues) {
                  await getWallboxConfigInfo(dnId, wallboxInfo.paramValues);
              }
          } catch (error) {
              log("Fehler beim Abrufen der Wallbox-Informationen: " + error.message, 'error');
          }
      }
      
      
      
      on({ id: new RegExp('^huawei-smart-charger\\.Wallbox\\.Settings\\.[^.]+$'), change: 'ne' }, async (obj) => {
          if (obj.state.ack) {
              return; // Wenn die Änderung von der API bestätigt wurde, ignoriere sie
          }
      
          const writableId = obj.native?.id;
          if (!writableId || !WRITABLE_IDS.includes(writableId)) {
              log(`Keine beschreibbare ID für ${obj.id} gefunden.`, 'warn');
              return;
          }
      
          try {
              // Verwende die gespeicherte dnId aus dem Objekt
              const dnId = getState(`${obj.id.replace('.Settings.', '.Settings.dnId')}`).val;
              if (!authData || (authData && new Date().getTime() > authData.expiryTime)) {
                  await authenticateAndScheduleRenewal();
              }
      
              if (authData && dnId) {
                  const requestData = {
                      changeValues: [{ id: writableId, value: obj.state.val }],
                      dnId: dnId
                  };
      
                  log(`Sende Anfrage mit Daten: ${JSON.stringify(requestData)}`, 'debug');
      
                  const response = await axios.post(
                      "https://" + authData.regionFloatIp + ":32800/rest/neteco/web/homemgr/v1/device/set-config-info",
                      JSON.stringify(requestData),
                      {
                          headers: {
                              'roaRand': authData.roaRand,
                              'Cookie': `locale=de-de;bspsession=${authData.accessToken};dp-session=${authData.accessToken}; Secure; HttpOnly`,
                              'Content-Type': 'application/json',
                              'x-timezone-offset': '120',
                              'client-info': '_manufacturer=iPhone;_model=iPhone;_os_ver=18.0.1;_os=iOS;_app_ver=24.6.102006;_package_name=com.huawei.smartpvms;appClientId=86366133-B8B5-41FA-8EB9-E5A64229E3D5',
                              'x-requested-with': 'XMLHttpRequest',
                              'User-Agent': 'iCleanPower/24.6.102006 (iPhone; iOS 18.0.1; Scale/3.00)',
                              'Accept-Language': 'de-DE;q=1, en-DE;q=0.9, zh-Hans-DE;q=0.8',
                              'Accept': '*/*'
                          },
                          httpsAgent: CONFIG.httpsAgent
                      }
                  );
      
                  log(`Antwort vom Server: ${JSON.stringify(response.data)}`, 'info');
                  if (response.data && response.data.code === 0) {
                      await setState(obj.id, obj.state.val, true);
                  }
              }
          } catch (error) {
              log(`Fehler beim Ändern des Werts für ${obj.id}: ${error.message}`, 'error');
              if (error.response) {
                  log(`Fehlerantwort vom Server: ${JSON.stringify(error.response.data)}`, 'error');
              }
          }
      });
      // Wallbox-Einstellungen abrufen und Konfigurationsinformationen anfordern
      async function getWallboxSettings() {
          const parentDn = getState('huawei-smart-charger.WallboxInfo.dn').val;
          try {
              if (!parentDn) {
                  await getWallboxInfo();
                  return await getWallboxSettings();
              }
      
              const response = await axios.get(
                  "https://" + authData.regionFloatIp + `:32800/rest/neteco/web/config/device/v1/children-list?conditionParams.curPage=0&conditionParams.mocTypes=60081&conditionParams.parentDn=${encodeURIComponent(parentDn)}&conditionParams.recordperpage=1`,
                  {
                      headers: {
                          'roaRand': authData.roaRand,
                          'Cookie': 'locale=de-de;bspsession=' + authData.accessToken + ';dp-session=' + authData.accessToken + '; Secure; HttpOnly'
                      },
                      httpsAgent: CONFIG.httpsAgent
                  }
              );
      
              log(`Wallbox-Einstellungen für ${parentDn}: ` + JSON.stringify(response.data), 'info');
              const wallboxSettings = response.data.data[0];
      
              // Speichern der dnId
              const dnId = wallboxSettings.dnId;
              //setState('huawei-smart-charger.WallboxSettings.dnId', dnId, true);
      
              // Erstelle die Struktur für paramValues und andere Daten
              const basePath = `huawei-smart-charger.WallboxSettings.${dnId}`;
      
              // Speichere alle Schlüssel von wallboxSettings in IoBroker, einschließlich paramValues
              for (const key in wallboxSettings) {
                  if (key === 'paramValues') {
                      // Speziell für paramValues
                      const paramValuesPath = `${basePath}.paramValues`;
                      for (const paramKey in wallboxSettings.paramValues) {
                          const paramValue = wallboxSettings.paramValues[paramKey];
                          await setObject(`${paramValuesPath}.${paramKey}`, {
                              type: 'state',
                              common: {
                                  name: `Parameter ${paramKey}`,
                                  type: typeof paramValue,
                                  role: 'info',
                                  read: true,
                                  write: WRITABLE_IDS.includes(parseInt(paramKey)) // Schreibbare IDs berücksichtigen
                              },
                              native: { id: paramKey, value: paramValue }
                          });
                          await setState(`${paramValuesPath}.${paramKey}`, paramValue, true);
                      }
                  } else {
                      // Speichere alle anderen Daten in IoBroker
                      await setObject(`${basePath}.${key}`, {
                          type: 'state',
                          common: {
                              name: key,
                              type: typeof wallboxSettings[key],
                              role: 'info',
                              read: true,
                              write: false
                          },
                          native: { value: wallboxSettings[key] }
                      });
                      await setState(`${basePath}.${key}`, wallboxSettings[key], true);
                  }
              }
      
              // Nur beim ersten Mal die Wallbox-Konfigurationsinformationen abrufen
              if (!getWallboxConfigInfo.calledWallboxSettings) {
                  await getWallboxConfigInfo(dnId, wallboxSettings.paramValues);
                  getWallboxConfigInfo.calledWallboxSettings = true;
              }
          } catch (error) {
              log(`Fehler beim Abrufen der Wallbox-Einstellungen für ${parentDn}: ${error.message}`, 'info');
          }
      }
      
      // Wallbox-Konfigurationsinformationen abrufen und in den entsprechenden Pfaden anlegen
      async function getWallboxConfigInfo(dnId, paramValues) {
          if (!paramValues) {
              log(`Keine Parameterwerte für dnId ${dnId} gefunden.`, 'info');
              return;
          }
      
          for (const id of Object.keys(paramValues)) {
              try {
                  const conditions = [{ queryAll: 0, signals: [id], dnId }];
                  const response = await axios.post(
                      "https://" + authData.regionFloatIp + ":32800/rest/neteco/web/homemgr/v1/device/get-config-info",
                      JSON.stringify({ conditions }),
                      {
                          headers: {
                              'roaRand': authData.roaRand,
                              'Cookie': `locale=de-de;bspsession=${authData.accessToken};dp-session=${authData.accessToken}; Secure; HttpOnly`,
                              "Content-Type": "application/json"
                          },
                          httpsAgent: CONFIG.httpsAgent
                      }
                  );
      
                  log(`Wallbox-Konfigurationsinformationen für ${dnId}, Signal ${id}: ` + JSON.stringify(response.data), 'debug');
                  const wallboxConfigInfo = response.data;
                  if (wallboxConfigInfo && wallboxConfigInfo[dnId] && wallboxConfigInfo[dnId][0]) {
                      const { name, realValue, value, enumMap, unit } = wallboxConfigInfo[dnId][0];
                      if (!name) continue;
      
                      // Sanitize the object ID, but not the display name
                      const sanitizedKey = name
                          .replace(/ä/g, 'ae')
                          .replace(/ö/g, 'oe')
                          .replace(/ü/g, 'ue')
                          .replace(/Ä/g, 'Ae')
                          .replace(/Ö/g, 'Oe')
                          .replace(/Ü/g, 'Ue')
                          .replace(/ß/g, 'ss')
                          .replace(/\s+/g, '_')
                          .replace(/[^\w\d_]/g, '');
      
      
                      // Speichere in huawei-smart-charger.Wallbox.Values
                      const key = sanitizedKey;
                      const stateValue = enumMap && Object.keys(enumMap).length > 0 ? value : realValue;
                      const valuePath = `huawei-smart-charger.Wallbox.Values.${key}`;
                      const settingsPath = `huawei-smart-charger.Wallbox.Settings.${key}`;
      
                      // Objekt in Values erstellen
                      await setObject(valuePath, {
                          type: 'state',
                          common: {
                              name: name, // Keep the original name here
                              type: typeof stateValue,
                              role: 'info',
                              read: true,
                              write: WRITABLE_IDS.includes(parseInt(id)),
                              unit: unit || undefined,
                              states: Object.keys(enumMap).length > 0 ? enumMap : undefined,
                              dnId: dnId // Speichern der dnId in common
                          },
                          native: wallboxConfigInfo[dnId][0]
                      });
                      await setState(valuePath, stateValue, true);
      
                      // Wenn das Objekt schreibbar ist, auch in Settings erstellen
                      if (WRITABLE_IDS.includes(parseInt(id))) {
                          await setObject(settingsPath, {
                              type: 'state',
                              common: {
                                  name: name, // Keep the original name here
                                  type: typeof stateValue,
                                  role: 'info',
                                  read: true,
                                  write: true,
                                  unit: unit || undefined,
                                  states: Object.keys(enumMap).length > 0 ? enumMap : undefined,
                                  dnId: dnId // Speichern der dnId in common
                              },
                              native: wallboxConfigInfo[dnId][0]
                          });
                          await setState(settingsPath, stateValue, true);
                      }
                  }
              } catch (error) {
                  log(`Fehler beim Abrufen der Wallbox-Konfigurationsinformationen für ${dnId}, Signal ${id}: ${error.message}`, 'error');
              }
          }
      }
      
      
      async function createAndSetObjects(basePath, data) {
          if (!data) {
              log(`Daten für ${basePath} sind null oder undefined.`, 'error');
              return;
          }
      
          for (const key in data) {
              if (data.hasOwnProperty(key)) {
                  const value = data[key];
                  // Ersetze Leerzeichen im Objektnamen durch '_'
                  const sanitizedKey = key.replace(/\s+/g, '_');
                  const id = `${basePath}.${sanitizedKey}`;
                  const objType = typeof value === 'object' && value !== null ? 'channel' : 'state';
      
                  log(`Versuche, Objekt ${id} zu erstellen. Typ: ${objType}, Wert: ${JSON.stringify(value)}`, 'info');
      
                  await setObject(id, {
                      type: objType,
                      common: {
                          name: sanitizedKey,
                          type: typeof value,
                          role: objType === 'channel' ? 'folder' : 'state',
                          read: true,
                          write: WRITABLE_IDS.includes(parseInt(key))
                      },
                      native: typeof value === 'object' && value !== null ? value : { value: value }
                  });
      
                  if (objType === 'state' && value !== null && value !== undefined) {
                      await setState(id, value, true);
                  } else if (objType === 'channel' && value !== null) {
                      // Rekursiv verschachtelte Objekte verarbeiten
                      await createAndSetObjects(id, value);
                  }
              }
          }
      }
      
      
      // Aktualisierung des Verbindungsstatus
      function updateConnectionState(isConnected) {
          try {
              setState('huawei-smart-charger.info.connection', isConnected, true);
          } catch (error) {
              log(`Fehler beim Aktualisieren des Verbindungsstatus: ${error.message}`, 'error');
          }
      }
      
      // Hauptlogik zur Authentifizierung und Datenabfrage
      async function main() {
          await authenticateAndScheduleRenewal();
          if (!authData) return;
      
          await getUserDetailInfo();
          await getServerInfo();
          await getStationList();
          await getWallboxInfo();
          await getWallboxSettings();
          await getChargeStatus();
          
      }
      
      // Lausche auf Änderungen der Settings und sende PUT-Anfrage an die API
      on({ id: new RegExp('^huawei-smart-charger\\.Wallbox\\.Settings\\.[^.]+$'), change: 'ne' }, async (obj) => {
          if (obj.state.ack) {
              return; // Wenn die Änderung von der API bestätigt wurde, ignoriere sie
          }
      
          const writableId = obj.native?.id;
          if (!writableId || !WRITABLE_IDS.includes(writableId)) {
              log(`Keine beschreibbare ID für ${obj.id} gefunden.`, 'warn');
              return;
          }
      
          try {
              // Lese die dnId aus dem Objekt in common
              const dnId = getObject(obj.id).common.dnId;
              if (!authData || (authData && new Date().getTime() > authData.expiryTime)) {
                  await authenticateAndScheduleRenewal();
              }
      
              if (authData && dnId) {
                  const requestData = {
                      changeValues: [{ id: writableId, value: obj.state.val }],
                      dnId: dnId
                  };
      
                  log(`Sende Anfrage mit Daten: ${JSON.stringify(requestData)}`, 'debug');
      
                  const response = await axios.post(
                      "https://" + authData.regionFloatIp + ":32800/rest/neteco/web/homemgr/v1/device/set-config-info",
                      JSON.stringify(requestData),
                      {
                          headers: {
                              'roaRand': authData.roaRand,
                              'Cookie': `locale=de-de;bspsession=${authData.accessToken};dp-session=${authData.accessToken}; Secure; HttpOnly`,
                              'Content-Type': 'application/json',
                              'x-timezone-offset': '120',
                              'client-info': '_manufacturer=iPhone;_model=iPhone;_os_ver=18.0.1;_os=iOS;_app_ver=24.6.102006;_package_name=com.huawei.smartpvms;appClientId=86366133-B8B5-41FA-8EB9-E5A64229E3D5',
                              'x-requested-with': 'XMLHttpRequest',
                              'User-Agent': 'iCleanPower/24.6.102006 (iPhone; iOS 18.0.1; Scale/3.00)',
                              'Accept-Language': 'de-DE;q=1, en-DE;q=0.9, zh-Hans-DE;q=0.8',
                              'Accept': '*/*'
                          },
                          httpsAgent: CONFIG.httpsAgent
                      }
                  );
      
                  log(`Antwort vom Server: ${JSON.stringify(response.data)}`, 'debug');
                  if (response.data) {
                      await setState(obj.id, obj.state.val, true);
                  }
                  await getWallboxInfo();
                  await getWallboxSettings();
              }
          } catch (error) {
              log(`Fehler beim Ändern des Werts für ${obj.id}: ${error.message}`, 'error');
              if (error.response) {
                  log(`Fehlerantwort vom Server: ${JSON.stringify(error.response.data)}`, 'error');
              }
          }
      });
      
      // Monitor changes in WallboxSettings and WallboxInfo under paramValues
      on({ id: new RegExp('^huawei-smart-charger\\.Wallbox(Settings|Info)\\.[^.]+\\.paramValues\\.[^.]+$'), change: 'ne' }, async (obj) => {
          if (obj.state.ack) {
              return; // If the change was confirmed by the API, ignore it
          }
      
          try {
              // Extract the parameter ID from the changed paramValues instance
              const paramId = parseInt(obj.id.split('.').pop()); // Extract the parameter ID from the object path
      
              // Define a helper function to update corresponding objects
              const updateObjects = async (basePath) => {
                  getObjectView('system', 'state', { startkey: basePath, endkey: basePath + "\u9999" }, async (err, allObjects) => {
                      if (err) {
                          log(`Error fetching objects from ${basePath}: ${err.message}`, 'error');
                          return;
                      }
      
                      for (const obj of allObjects.rows) {
                          const nativeId = obj.value.native?.id;
                          if (nativeId === paramId) {
                              // Update the state in the corresponding object
                              const newValue = obj.state.val;
                              await setState(obj.id, newValue, true);
                              log(`Updated value in ${obj.id} to: ${newValue}`, 'info');
                          }
                      }
                  });
              };
      
              // Update the corresponding objects in Wallbox.Values and Wallbox.Settings
              await updateObjects('huawei-smart-charger.Wallbox.Values.');
              await updateObjects('huawei-smart-charger.Wallbox.Settings.');
      
          } catch (error) {
              log(`Error while updating Wallbox.Values or Wallbox.Settings from paramValues change: ${error.message}`, 'error');
          }
      });
      
      // Ladestatus abfragen
      async function getChargeStatus() {
          try {
              // Fetch the dnId from the IoBroker state
              const dnId = getState('huawei-smart-charger.WallboxInfo.dnId').val;
              if (!dnId) {
                  log('dnId not found for getChargeStatus', 'warn');
                  return;
              }
      
              // Construct the request payload based on the provided curl example
              const requestData = {
                  gunNumber: 1, // Fixed value as per the example
                  needRealTimeStatus: false, // This will be toggled based on the interval logic
                  dnId: dnId
              };
      
              // Perform the POST request
              const response = await axios.post(
                  "https://" + authData.regionFloatIp + ":32800/rest/neteco/web/homemgr/v1/charger/status/charge-status",
                  JSON.stringify(requestData),
                  {
                      headers: {
                          'roaRand': authData.roaRand,
                          'Cookie': `locale=de-de;bspsession=${authData.accessToken};dp-session=${authData.accessToken}; Secure; HttpOnly`,
                          'Content-Type': 'application/json',
                          'x-timezone-offset': '120',
                          'client-info': '_manufacturer=iPhone;_model=iPhone;_os_ver=18.0.1;_os=iOS;_app_ver=24.6.102006;_package_name=com.huawei.smartpvms;appClientId=86366133-B8B5-41FA-8EB9-E5A64229E3D5',
                          'x-requested-with': 'XMLHttpRequest',
                          'User-Agent': 'iCleanPower/24.6.102006 (iPhone; iOS 18.0.1; Scale/3.00)',
                          'Accept-Language': 'de-DE;q=1, en-DE;q=0.9, zh-Hans-DE;q=0.8',
                          'Accept': '*/*'
                      },
                      httpsAgent: CONFIG.httpsAgent
                  }
              );
      
              // Log the charge status response for testing
              log(`Charge Status response: ${JSON.stringify(response.data)}`, 'info');
      
              // Update interval based on the charge status
              if (response.data && response.data.chargeStatus !== undefined) {
                  const status = response.data.chargeStatus;
                  log(`Current charge status: ${status}`, 'info');
                  scheduleIntervals(status); // Update intervals based on the charge status
              } else {
                  log(`Invalid response from getChargeStatus: ${JSON.stringify(response.data)}`, 'warn');
              }
      
          } catch (error) {
              log(`Fehler beim Abrufen des Ladestatus: ${error.message}`, 'error');
              if (error.response) {
                  log(`Fehlerantwort vom Server: ${JSON.stringify(error.response.data)}`, 'error');
              }
          }
      }
      
      // Schedule intervals based on the charge status
      function scheduleIntervals(chargeStatus) {
          let intervalTime = 300000; // Default interval: 5 minutes
          let needRealTimeStatus = false;
      
          // Define specific interval times based on the charge status
          if ([3, 4, 7, 8].includes(chargeStatus)) {
              intervalTime = 60000; // 30 seconds for these statuses
              needRealTimeStatus = true; // Enable real-time status when charging or in related states
          } else if ([1, 2, 6, 10, 11].includes(chargeStatus)) {
              intervalTime = 180000; // 3 minutes for these statuses
          }
      
          // Clear any existing intervals
          clearInterval(infoInterval);
          clearInterval(settingsInterval);
      
          // Schedule intervals with the appropriate time
          infoInterval = setInterval(async () => {
              await getWallboxInfo(needRealTimeStatus); // Fetch wallbox info at the set interval
          }, intervalTime);
      
          settingsInterval = setInterval(async () => {
              await getWallboxSettings(needRealTimeStatus); // Fetch wallbox settings at the set interval
          }, intervalTime);
      
          log(`Scheduled intervals: ${intervalTime / 1000} seconds`, 'info');
      }
      
      
      // Initial call to getChargeStatus and start checking intervals
      let infoInterval, settingsInterval;
      async function checkChargeInterval() {
          await getChargeStatus(); // Check the charge status initially and set intervals
          setInterval(async () => {
              await getChargeStatus(); // Re-check the charge status at regular intervals
          }, CONFIG.interval);
      }
      
      
      
      main();
      
      
      posted in Tester
      stolly82
      stolly82
    • RE: Huawei Wallbox - S Charger (7kw/h / 22kw/h) Adapter test

      Hey zusammen,

      ich habe es hinbekommen einen 100% funktionstüchtigen Adapter hinzubekommen!

      Inkl. ändern der Werte 😉

      Kommt die Tage über GIT!

      f6177ff9-e967-40f0-9e26-088dc6d1e77a-image.png

      posted in Tester
      stolly82
      stolly82
    • RE: Luxtronik 2 Adapter

      Hey zusammen,

      ich habe ein Skript geschrieben, das die Steuerung der Wassertemperatur über MyUplink ermöglicht, da die Luxtronik Weboberfläche (ab Version 3.89.4) keine direkte Option dazu bietet. Der Plan ist, daraus später einen richtigen Adapter zu machen, aber hier ist schon einmal die Skriptversion zum Ausprobieren.

      Was macht das Skript?

      Die Luxtronik ab Version 3.89.4 kann MyUplink integrieren, und genau das nutzt dieses Skript aus. Das Skript erlaubt es euch, die Heizung und das Warmwasser über die MyUplink-Cloud zu steuern, und stellt alle Informationen zur Verfügung, die dort abgerufen werden können. Das bedeutet, ihr könnt die Temperatur direkt anpassen, ohne die Einschränkungen der normalen Weboberfläche. Mehr Informationen zu MyUplink findet ihr hier:

      MyUplink Cloud – Alpha Innotec

      So probiert ihr das Skript aus:

      • Öffnet den IoBroker > JavaScript Adapter > Neu > JavaScript > Hinzufügen.
      • Fügt das Skript ein.
      • Tragt eure MyUplink-Zugangsdaten ein.
      • Startet das Skript – und schon seid ihr einsatzbereit!

      Funktionsumfang

      • Heizung & Warmwasser: Ihr könnt die gewünschten Temperaturen einstellen.
      • Informationsabruf: Alle relevanten Daten, die MyUplink zur Verfügung stellt, werden abgerufen und angezeigt.

      https://forum.iobroker.net/topic/73706/wie-mittels-luxtronik-adapter-wassertemperatur-einstellen/5

      posted in ioBroker Allgemein
      stolly82
      stolly82
    • RE: Wie mittels LUXTRONIK-Adapter Wassertemperatur einstellen?

      Hey zusammen,

      ich habe ein Skript geschrieben, das die Steuerung der Wassertemperatur über MyUplink ermöglicht, da die Luxtronik Weboberfläche (ab Version 3.89.4) keine direkte Option dazu bietet. Der Plan ist, daraus später einen richtigen Adapter zu machen, aber hier ist schon einmal die Skriptversion zum Ausprobieren.

      Was macht das Skript?

      Die Luxtronik ab Version 3.89.4 kann MyUplink integrieren, und genau das nutzt dieses Skript aus. Das Skript erlaubt es euch, die Heizung und das Warmwasser über die MyUplink-Cloud zu steuern, und stellt alle Informationen zur Verfügung, die dort abgerufen werden können. Das bedeutet, ihr könnt die Temperatur direkt anpassen, ohne die Einschränkungen der normalen Weboberfläche. Mehr Informationen zu MyUplink findet ihr hier:

      MyUplink Cloud – Alpha Innotec

      So probiert ihr das Skript aus:

      • Öffnet den IoBroker > JavaScript Adapter > Neu > JavaScript > Hinzufügen.
      • Fügt das Skript ein.
      • Tragt eure MyUplink-Zugangsdaten ein.
      • Startet das Skript – und schon seid ihr einsatzbereit!

      Funktionsumfang

      • Heizung & Warmwasser: Ihr könnt die gewünschten Temperaturen einstellen.
      • Informationsabruf: Alle relevanten Daten, die MyUplink zur Verfügung stellt, werden abgerufen und angezeigt.

      Falls ihr das Skript ausprobiert, würde ich mich sehr über euer Feedback freuen. Viel Spaß damit!

      // Konfigurationseinstellungen
      const CONFIG = {
          email: 'EMAIL@MYMAIL.DE',
          password: 'GEHEIM',
          clientId: 'My-Uplink-iOS',
          clientSecret: '992EFE7C-9CDC-435B-8BA3-2EF8E81BEF14',
          interval: 30000, // Standardintervall in Millisekunden für wiederkehrende Abfragen
          intervalFunctions: [
              'getWeatherTileData',
              'getAndCreateMenu'
          ]
      };
      
      
      const axios = require('axios');
      
      class MyUplinkAdapter {
          constructor() {
              this.token = null;
              this.userData = {}; // Hier werden die Benutzerdaten gespeichert
              this.devices = {};  // Hier werden die Gerätedaten gespeichert
              this.groups = [];   // Hier werden die Gruppendaten gespeichert
              this.failedRequests = []; // Warteschlange für fehlgeschlagene Anfragen
              log('Konstruktor von MyUplinkAdapter wurde aufgerufen!', 'info');
              // Initialisieren des Verbindungsstatus
              setObject('myUplink.info.connection', {
                  type: 'state',
                  common: {
                      name: 'API-Verbindungsstatus',
                      type: 'boolean',
                      role: 'indicator.connected',
                      read: true,
                      write: false
                  },
                  native: {}
              });
              setState('myUplink.info.connection', { val: false, ack: true });
          }
      
          // Authentifizierungsmethode
          authenticate() {
              log("Starte Authentifizierung...", 'info');
              log(`Authentifizierungsparameter: email=${CONFIG.email}, clientId=${CONFIG.clientId}`, 'debug');
              return axios.post('https://internalapi.myuplink.com/v2/users/validate', {
                  email: CONFIG.email,
                  password: CONFIG.password
              }, {
                  headers: {
                      'Content-Type': 'application/json',
                      'Accept': 'application/json',
                      'Accept-Language': 'de-DE'
                  }
              })
              .then(response => {
                  log("Benutzer validiert. Antwort: " + JSON.stringify(response.data), 'debug');
                  const validationData = response.data;
                  if (validationData.id) {
                      this.userData = validationData; // Speichert die Benutzerdaten
                      log(`Authentifizierung erfolgreich. Benutzer-ID: ${validationData.id}`, 'info');
                      setState('myUplink.info.connection', { val: true, ack: true }); // Verbindung erfolgreich
                      return this.getAccessToken(validationData.id);
                  } else {
                      log("Fehlende ID im Validierungsschritt. Antwort: " + JSON.stringify(validationData), 'error');
                      throw new Error('User validation failed: Missing ID');
                  }
              })
              .catch(error => {
                  this.handleError(error);
                  setState('myUplink.info.connection', { val: false, ack: true }); // Verbindung fehlgeschlagen
                  throw error;
              });
          }
      
          // Methode zum Abrufen des Access Tokens
          getAccessToken(userId) {
              log("Abrufen des Access Tokens...", 'info');
              log(`Tokenparameter: clientId=${CONFIG.clientId}, userId=${userId}`, 'debug');
              return axios.post('https://internalapi.myuplink.com/oauth/token', 
                  `password=${encodeURIComponent(CONFIG.password)}&client_secret=${CONFIG.clientSecret}&grant_type=password&client_id=${CONFIG.clientId}&username=${encodeURIComponent(CONFIG.email)}`,
                  {
                      headers: {
                          'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8',
                          'Authorization': `Bearer ${userId}`
                      }
                  }
              )
              .then(response => {
                  log("Token erfolgreich erhalten. Antwort: " + JSON.stringify(response.data), 'debug');
                  const tokenData = response.data;
                  if (tokenData.access_token) {
                      this.token = tokenData.access_token;
                      log(`Access-Token erfolgreich gespeichert.`, 'info');
                      return tokenData;
                  } else {
                      log("Fehlender Access-Token in der Antwort: " + JSON.stringify(tokenData), 'error');
                      throw new Error('Access token not received');
                  }
              })
              .catch(error => {
                  this.handleError(error);
                  throw error;
              });
          }
      
          // Methode zum Speichern der Benutzerdaten
          saveUserData() {
              return this.ensureTokenIsValid().then(() => {
                  log("Speichern der Benutzerdaten...", 'info');
                  const userUrl = 'https://internalapi.myuplink.com/v2/users/me';
                  log(`Anfrage-URL für Benutzerdaten: ${userUrl}`, 'debug');
                  return axios.get(userUrl, {
                      headers: {
                          'Authorization': `Bearer ${this.token}`,
                          'Accept': 'application/json'
                      }
                  })
                  .then(response => {
                      log("Benutzerdaten erfolgreich abgerufen. Antwort: " + JSON.stringify(response.data), 'debug');
                      this.userData = response.data;
      
                      // Dynamische Erstellung der Datenpunkte in myUplink.users und Setzen der Werte
                      Object.keys(this.userData).forEach(key => {
                          if (typeof this.userData[key] === 'object' && this.userData[key] !== null) {
                              Object.keys(this.userData[key]).forEach(subKey => {
                                  const stateId = `myUplink.User.${key}.${subKey}`;
                                  setObject(stateId, {
                                      type: 'state',
                                      common: {
                                          name: `${key} ${subKey}`,
                                          type: typeof this.userData[key][subKey],
                                          read: true,
                                          write: false
                                      }
                                  });
                                  setState(stateId, {
                                      val: this.userData[key][subKey],
                                      ack: true
                                  });
                              });
                          } else {
                              const stateId = `myUplink.User.${key}`;
                              setObject(stateId, {
                                  type: 'state',
                                  common: {
                                      name: key,
                                      type: typeof this.userData[key],
                                      read: true,
                                      write: false
                                  }
                              });
                              setState(stateId, {
                                  val: this.userData[key],
                                  ack: true
                              });
                          }
                      });
      
                      return this.userData;
                  })
                  .catch(error => {
                      this.handleError(error);
                      throw error;
                  });
              });
          }
      
          // Methode für das Abrufen der Wetterdaten
          getWeatherTileData() {
              return this.ensureTokenIsValid().then(() => {
                  const group = this.groups.find(g => g.id); // Nimmt die erste gültige Gruppe aus den gespeicherten Gruppendaten
                  if (!group || !group.id) {
                      log('Keine gültige Group ID gefunden.', 'error');
                      throw new Error('No valid Group ID found.');
                  }
                  const groupId = group.id;
      
                  const fetchWeatherData = () => {
                      log("Abrufen der Wetterdaten...", 'info');
                      const weatherUrl = `https://internalapi.myuplink.com/v2/groups/${groupId}/weather-tile-data`;
                      log(`Anfrage-URL für Wetterdaten: ${weatherUrl}`, 'debug');
                      return axios.get(weatherUrl, {
                          headers: {
                              'Authorization': `Bearer ${this.token}`,
                              'Accept': 'application/json'
                          }
                      })
                      .then(response => {
                          log("Wetterdaten erfolgreich abgerufen. Antwort: " + JSON.stringify(response.data), 'debug');
                          const weatherData = response.data;
      
                          // Dynamische Erstellung der Datenpunkte in myUplink.Weather und Setzen der Werte
                          const basePath = `myUplink`;
                          Object.keys(weatherData).forEach(key => {
                              if (typeof weatherData[key] === 'object' && weatherData[key] !== null) {
                                  if (Array.isArray(weatherData[key])) {
                                      weatherData[key].forEach((item, index) => {
                                          Object.keys(item).forEach(subKey => {
                                              const stateId = `${basePath}.Weather.${key}[${index}].${subKey}`;
                                              setObject(stateId, {
                                                  type: 'state',
                                                  common: {
                                                      name: `${key} ${subKey}`,
                                                      type: typeof item[subKey],
                                                      read: true,
                                                      write: false
                                                  }
                                              });
                                              setState(stateId, {
                                                  val: item[subKey],
                                                  ack: true
                                              });
                                          });
                                      });
                                  } else {
                                      Object.keys(weatherData[key]).forEach(subKey => {
                                          const stateId = `${basePath}.Weather.${key}.${subKey}`;
                                          setObject(stateId, {
                                              type: 'state',
                                              common: {
                                                  name: `${key} ${subKey}`,
                                                  type: typeof weatherData[key][subKey],
                                                  read: true,
                                                  write: false
                                              }
                                          });
                                          setState(stateId, {
                                              val: weatherData[key][subKey],
                                              ack: true
                                          });
                                      });
                                  }
                              } else {
                                  const stateId = `${basePath}.Weather.${key}`;
                                  setObject(stateId, {
                                      type: 'state',
                                      common: {
                                          name: key,
                                          type: typeof weatherData[key],
                                          read: true,
                                          write: false
                                      }
                                  });
                                  setState(stateId, {
                                      val: weatherData[key],
                                      ack: true
                                  });
                              }
                          });
      
                          return weatherData;
                      })
                      .catch(error => {
                          this.handleError(error, fetchWeatherData);
                      });
                  };
      
                  // Erstmaliger Aufruf und Intervall einrichten
                  fetchWeatherData();
                  setInterval(fetchWeatherData, CONFIG.interval);
              });
          }
      
          // Methode zum Sicherstellen, dass der Token noch gültig ist
          ensureTokenIsValid() {
              if (!this.token) {
                  log("Token ist nicht vorhanden oder ungültig. Hole neuen Token...", 'warn');
                  return this.authenticate();
              }
              return Promise.resolve();
          }
      
          // Methode zum Abrufen der Gruppendaten
          getGroups() {
              return this.ensureTokenIsValid().then(() => {
                  log("Abrufen der Gruppendaten...", 'info');
                  const groupsUrl = 'https://internalapi.myuplink.com/v2/groups/me';
                  log(`Anfrage-URL für Gruppendaten: ${groupsUrl}`, 'debug');
                  return axios.get(groupsUrl, {
                      headers: {
                          'Authorization': `Bearer ${this.token}`,
                          'Accept': 'application/json'
                      }
                  })
                  .then(response => {
                      log("Gruppendaten erfolgreich abgerufen. Antwort: " + JSON.stringify(response.data), 'debug');
                      this.groups = response.data.groups || []; // Speichert die Gruppendaten
                      this.devices = this.groups.flatMap(group => group.devices) || []; // Speichert die Gerätedaten
                      this.createObjectsFromGroupsAndDevices();
                      return this.groups;
                  })
                  .catch(error => {
                      this.handleError(error);
                      throw error;
                  });
              });
          }
      
          // Methode zum Erstellen der Baumstruktur in myUplink
          createObjectsFromGroupsAndDevices() {
              log("Erstelle Objekte für Gruppen und Geräte...", 'info');
              this.groups.forEach(group => {
                  const groupId = group.id;
                  group.devices.forEach(device => {
                      const deviceId = device.id;
                      const groupPath = `myUplink.System.${groupId}.${deviceId}`;
      
                      // Erstellt das Geräteobjekt innerhalb der Gruppe
                      setObject(groupPath, {
                          type: 'device',
                          common: {
                              name: device.name || 'Unbenanntes Gerät',
                              desc: device.description || ''
                          },
                          native: device
                      });
                  });
              });
              log("Objekterstellung abgeschlossen.", 'info');
          }
          
          // Methode zum Abrufen der Menüstruktur
          async getAndCreateMenu(menuId = 0, basePath = `myUplink`) {
              try {
                  const device = this.groups.flatMap(group => group.devices).find(device => device.id);
                  if (!device || !device.id) {
                      log('Keine gültige Device ID gefunden.', 'error');
                      throw new Error('No valid Device ID found.');
                  }
                  const menuUrl = `https://internalapi.myuplink.com/v3/devices/${device.id}/menu/${menuId}`;
      
                  const response = await axios.get(menuUrl, {
                      headers: {
                          'Authorization': `Bearer ${this.token}`,
                          'Accept': 'application/json'
                      }
                  });
      
                  const menuData = response.data;
      
                  if (menuData.rows && menuData.rows.length > 0) {
                      for (const row of menuData.rows) {
                          let name = row.text?.text || `Menü_${row.id}`;
                          name = this.normalizeName(name); // Normalisieren von Umlauten
                          const path = `${basePath}.${name}`;
      
                          // Falls es ein weiterer Menü-Link ist, rufe das nächste Menü ab
                          if (row.type === 'uilink') {
                              setObject(path, {
                                  type: 'channel',
                                  common: {
                                      name: name,
                                      desc: `Menü ID: ${row.id}`
                                  },
                                  native: row
                              });
                              await this.getAndCreateMenu(row.id, path);
                          }
      
                          // Falls es ein Parameter ist, erstelle das Parameter-Objekt
                          if (row.type === 'uiinfoparameter' || row.type === 'uinumerical' || row.type === 'uidropdown' || row.type === 'uiboolean') {
                              this.createParameterObject(path, row);
                          }
                      }
                  }
              } catch (error) {
                  this.handleError(error);
              }
          }
      
          // Methode zum Erstellen eines Parameter-Objekts
          createParameterObject(path, parameter) {
              const parameterName = parameter.text?.text || `Parameter_${parameter.parameterId}`;
              let value = parameter.value?.integerValue ?? parameter.value?.stringValue ?? null;
              let adjustedValue = value;
      
              // Divisor anwenden, falls vorhanden und nur auf den Wert im Objekt selbst
              if (parameter.metadata?.divisor) {
                  if (typeof value === 'number') {
                      adjustedValue = value / parameter.metadata.divisor;
                  }
              }
      
              // Wert als Text anzeigen, falls enumValues vorhanden sind
              const states = {};
              if (parameter.metadata?.enumValues && parameter.metadata.enumValues.length > 0) {
                  parameter.metadata.enumValues.forEach(ev => {
                      states[ev.value] = ev.text;
                  });
                  adjustedValue = value;
              }
      
              // Setze den Objekt-Typ je nach Parameter-Typ
              const commonType = parameter.metadata?.variableType?.toLowerCase() || 'mixed';
              const role = parameter.type === 'uiboolean' ? 'switch' : 'text';
      
              setObject(path, {
                  type: 'state',
                  common: {
                      name: parameterName,
                      type: commonType,
                      unit: parameter.metadata?.unit || '',
                      read: true,
                      write: parameter.metadata?.isWritable || false,
                      role: role,
                      states: Object.keys(states).length > 0 ? states : undefined,
                      min: parameter.metadata?.minValue && parameter.metadata.minValue !== 0 ? parameter.metadata.minValue / (parameter.metadata.divisor || 1) : undefined,
                      max: parameter.metadata?.maxValue && parameter.metadata.maxValue !== 0 ? parameter.metadata.maxValue / (parameter.metadata.divisor || 1) : undefined,
                      step: parameter.metadata?.change ? parameter.metadata.change / (parameter.metadata.divisor || 1) : undefined
                  },
                  native: parameter
              });
      
              // Setze den Wert des Parameters als Zahl oder Enum-Wert
              setState(path, {
                  val: typeof adjustedValue === 'number' ? adjustedValue : value,
                  ack: true
              });
      
              // Lausche auf Änderungen des Werts, um die PUT-Anfrage zu senden
              if (parameter.metadata?.isWritable) {
                  on({id: path, change: 'ne'}, (obj) => { // 'ne' bedeutet, nur nicht bestätigte Änderungen lauschen
                      if (obj.state.ack) {
                          return; // Wenn die Änderung von der API bestätigt wurde, ignoriere sie
                      }
                      
                      let newValue = obj.state.val;
                      const divisor = parameter.metadata?.divisor || 1;
                      const minValue = typeof parameter.metadata?.minValue !== 'undefined' && parameter.metadata.minValue !== 0 ? parameter.metadata.minValue / divisor : undefined;
                      const maxValue = typeof parameter.metadata?.maxValue !== 'undefined' && parameter.metadata.maxValue !== 0 ? parameter.metadata.maxValue / divisor : undefined;
                      const change = parameter.metadata?.change ? parameter.metadata.change / divisor : undefined;
      
                      // Werte begrenzen und anpassen
                      if (typeof minValue !== 'undefined' && newValue < minValue) {
                          newValue = minValue;
                      }
                      if (typeof maxValue !== 'undefined' && newValue > maxValue) {
                          newValue = maxValue;
                      }
                      if (typeof change !== 'undefined') {
                          newValue = Math.round(newValue / change) * change;
                      }
      
                      const adjustedValueForPut = newValue * divisor;
      
                      let currentPath = path;
                      let menuId = null;
                      while (!menuId && currentPath.includes('.')) {
                          currentPath = currentPath.substring(0, currentPath.lastIndexOf('.'));
                          const currentObject = getObject(currentPath);
                          if (currentObject?.native?.id) {
                              menuId = currentObject.native.id;
                          }
                      }
      
                      if (menuId) {
                          this.updateParameterValue(menuId, parameter.parameterId, adjustedValueForPut, parameter.metadata?.unit || '', path, newValue);
                      } else {
                          log(`Fehler: Menü-ID für Pfad ${path} nicht gefunden.`, 'error');
                      }
                  });
              }
          }
      
          // Methode zum Normalisieren von Umlauten
          normalizeName(name) {
              return name
                  .replace(/ä/g, 'ae')
                  .replace(/ö/g, 'oe')
                  .replace(/ü/g, 'ue')
                  .replace(/ß/g, 'ss')
                  .replace(/[^a-zA-Z0-9]/g, '_');
          }
      
          // Methode zur Aktualisierung der Parameterwerte (PUT-Call)
          updateParameterValue(menuId, parameterId, value, unit = "", path, newValue) {
              const device = this.groups.flatMap(group => group.devices).find(device => device.id);
              if (!device || !device.id) {
                  log('Keine gültige Device ID gefunden.', 'error');
                  throw new Error('No valid Device ID found.');
              }
              const updateUrl = `https://internalapi.myuplink.com/v2/devices/${device.id}/menu/${menuId}/rawpoints/${parameterId}`;
              log(`Sende PUT-Anfrage an URL: ${updateUrl} mit Wert: ${value} und Einheit: ${unit}`, 'info');
      
              return axios.put(updateUrl, {
                  value: value,
                  unit: unit
              }, {
                  headers: {
                      'Authorization': `Bearer ${this.token}`,
                      'Content-Type': 'application/json'
                  }
              })
              .then(response => {
                  log(`Parameter erfolgreich aktualisiert: ${JSON.stringify(response.data)}`, 'debug');
                  setState(path, {
                      val: newValue,
                      ack: true
                  }); // Bestätigt den Wert im Objekt
              })
              .catch(error => {
                  this.handleError(error, () => this.updateParameterValue(menuId, parameterId, value, unit, path, newValue));
              });
          }
      
          // Fehlerbehandlungs-Methode
          handleError(error, retryCallback = null) {
              if (error.response) {
                  log('Fehler-Antwortdaten: ' + JSON.stringify(error.response.data, null, 2), 'error');
                  log('HTTP-Statuscode: ' + error.response.status, 'error');
                  if (error.response.status === 401) {
                      log('Token abgelaufen, erneuere den Token...', 'warn');
                      this.authenticate().then(() => {
                          if (retryCallback) {
                              retryCallback();
                          }
                      });
                  }
              }
              setState('myUplink.info.connection', { val: false, ack: true }); // Verbindung fehlgeschlagen
          }
      }
      
      // Beispiel für die Verwendung der MyUplinkAdapter-Klasse (alle Logs als Fehler oder Warnungen)
      log("Starte die Authentifizierung...", 'info');
      
      const adapter = new MyUplinkAdapter();
      adapter.authenticate()
          .then(() => adapter.getGroups())
          .then(groups => {
              log("Gruppendaten empfangen: " + JSON.stringify(groups), 'debug');
              log("Gerätedaten empfangen: " + JSON.stringify(adapter.devices), 'debug');
              return adapter.saveUserData();
          })
          .then(userData => {
              log("Benutzerdaten gespeichert: " + JSON.stringify(userData), 'info');
               return adapter.getWeatherTileData();
          })
          .then(weatherData => {
              log("Wetterdaten empfangen: " + JSON.stringify(weatherData), 'info');
          })
          .then(() => adapter.getAndCreateMenu())
          .then(() => {
              log('Menüstruktur erfolgreich erstellt.', 'info');
          })
          .then(() => {
              // Dynamisches Registrieren der Intervall-Funktionen
              CONFIG.intervalFunctions.forEach(funcName => {
                  if (typeof adapter[funcName] === 'function') {
                      setInterval(() => {
                          adapter[funcName]();
                      }, CONFIG.interval);
                      log(`${funcName} wurde als Intervallfunktion registriert.`, 'info');
                  } else {
                      log(`Funktion ${funcName} existiert nicht im Adapter.`, 'error');
                  }
              });
          })
          .catch(err => {
              log('Allgemeiner Fehler: ' + (err.message || "Keine Fehlermeldung verfügbar"), 'error');
          });
      
      log("Ende des Skripts erreicht.", 'info');
      
      
      
      posted in Off Topic
      stolly82
      stolly82
    • RE: Fire TV Fernseher - Erfahrungen

      Hey,

      ist bei dem Thema schon eine Möglichkeit, dass man den Status des TV's abgreift?

      Also TV ist an, Screen ist an,... Waipu wird geschaut,...

      Ich hatte bei mir einen Samsung TV der wenn er an war mit dem WLAN verbunden hat, so dass ich das abgreifen konnte über den Radar Adapter.

      Hier sehe ich im Alexa2 Adapter leider nichts und habe aktuell auch nichts was wirklich funktioniert um die abzugreifen.

      posted in Off Topic
      stolly82
      stolly82
    • RE: Huawei Wallbox - S Charger (7kw/h / 22kw/h) Adapter test

      @bernhard

      hey, ich bekomme es nicht hin. Ich habe von Huawai die Anleitung genutzt und theoretisch übergebe ich alles korrekt an die Wallbox, aber das Schalten klappt einfach nicht.

      posted in Tester
      stolly82
      stolly82
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo