Navigation

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

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Profile
    • Following 0
    • Followers 0
    • Topics 1
    • Posts 9
    • Best 1
    • Groups 1

    Toller Tenya

    @Toller Tenya

    Starter

    1
    Reputation
    4
    Profile views
    9
    Posts
    0
    Followers
    0
    Following
    Joined Last Online

    Toller Tenya Follow
    Starter

    Best posts made by Toller Tenya

    • RE: Cannot find module '@iobroker/plugin-sentry

      @mcm1957 sorry 😞 hier nochmal als Text

      host.smarti
      2024-12-18 08:30:07.176	info	instance system.adapter.ical.0 having pid 112850 terminated with code 0 (NO_ERROR)
      
      ical.0
      2024-12-18 08:30:06.654	info	Terminated (NO_ERROR): Without reason
      
      smartmeter.1
      2024-12-18 08:30:05.084	info	Received 11 values, 3 updated
      
      ical.0
      2024-12-18 08:30:01.605	info	processing URL: Restmuell https://abfall.alzey-worms.de/WasteManagementAlzeyworms/WasteManagementServiceServlet?ApplicationName=Calendar&SubmitAction=sync&StandortID=1076237001&AboID=233065&Fra=P;R;B;S;C;L
      
      ical.0
      2024-12-18 08:30:01.170	info	starting. Version 1.16.1 in /opt/iobroker/node_modules/iobroker.ical, node: v20.18.1, js-controller: 7.0.6
      2024-12-18 08:30:00.882	error	Couldnot add plugins: Cannot find module '@iobroker/plugin-sentry'Require stack:- /opt/iobroker/node_modules/@iobroker/js-controller-adapter/node_modules/@iobroker/plugin-base/lib/PluginHandler.js- /opt/iobroker/node_modules/@iobroker/js-controller-adapter/node_modules/@iobroker/plugin-base/index.js- /opt/iobroker/node_modules/@iobroker/js-controller-adapter/build/cjs/lib/adapter/adapter.js- /opt/iobroker/node_modules/@iobroker/js-controller-adapter/build/cjs/index.js- /opt/iobroker/node_modules/@iobroker/adapter-core/build/cjs/utils.js
      
      host.smarti
      2024-12-18 08:30:00.019	info	instance system.adapter.ical.0 in version "1.16.1" started with pid 112850
      
      
      
      posted in ioBroker Allgemein
      Toller Tenya
      Toller Tenya

    Latest posts made by Toller Tenya

    • RE: CAN-BUS Interface ESP32 > MQTT und Stiebel Eltron WP steuern

      @hugo1217 Ich habe eine Tecalor TTF 5 Eco Sole WP- Baugleich mit Stiebel Elton
      Die Steuerung ist ein WPMiW

      Ich habe nun CAN Speed von 5-100kbps ausprobiert aber es kommt nichts an außer dem Alive
      Bildschirmfoto 2025-01-01 um 15.54.06.png

      Starte ich das Script im IOBroker mit Scan für 0x180 werden auch vermeintlich die CAN Telegramme versendet aber ohne Antwort.

      Bildschirmfoto 2025-01-01 um 15.54.24.png

      Noch Ideen was ich überprüfen könnte?

      Mein Sketch:

      #include <Arduino.h>
      #include <mcp2515.h>
      #include <WiFi.h>
      #include <ArduinoOTA.h>
      #include <PubSubClient.h>
      #include <ArduinoJson.h>
      const char* ssid = "XXXXX";     // Ersetze mit deinem WiFi-Namen
      const char* password = "XXXXXX";  // Ersetze mit deinem WiFi-Passwort
      
      const char* mqtt_server = "192.168.1.154";  // Dein MQTT Broker Server
      const int mqtt_port = 1884;
      const char* mqtt_user = "iobrokermqtt";
      const char* mqtt_password = "XXXX";
      const char* mqtt_topic = "TTF";
      
      void(* resetFunc) (void) = 0;
      
      // Timer declare
      hw_timer_t * timer = NULL;
      volatile SemaphoreHandle_t timerSemaphore;
      portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;
      volatile uint32_t isrCounter = 0;
      volatile uint32_t lastIsrAt = 0;
      
      void ARDUINO_ISR_ATTR onTimer(){
       // Increment the counter and set the time of ISR
       portENTER_CRITICAL_ISR(&timerMux);
       isrCounter = isrCounter + 1;
       lastIsrAt = millis();
       portEXIT_CRITICAL_ISR(&timerMux);
       // Give a semaphore that we can check in the loop
       xSemaphoreGiveFromISR(timerSemaphore, NULL);
       // It is safe to use digitalRead/Write here if you want to toggle an output
      }
      
      WiFiClient espClient;
      PubSubClient client(espClient);
      MCP2515 mcp2515(5); // Der CS-Pin muss entsprechend deiner Schaltung angepasst werden.
      
      // Diese Funktion wird aufgerufen, wenn eine Nachricht auf einem abonnierten Thema ankommt
      void callback(char* topic, byte* payload, unsigned int length) {
       Serial.println("Callback aufgerufen: " + String(topic));
       char canSendTopic[128];  //War vorher 64
       snprintf(canSendTopic, sizeof(canSendTopic), "%s/canRawGesendet", mqtt_topic);
      
       String topicString = String(topic);
       // Überprüfe, ob das Topic stimmt
       if (topicString.equals(String(mqtt_topic) + "/canSend")) {
         // Konvertiere payload in einen String zur Verarbeitung
         String payloadString;
         for (int i = 0; i < length; i++) {
           payloadString += (char)payload[i];
         }
         if (length == 0 || payloadString == "0" || payloadString == "OK" || payloadString == "INIT" ) {
           Serial.println("Leere Nachricht ");
           return;
         }
         // Parse die JSON-Nachricht
         StaticJsonDocument<200> doc;
         DeserializationError error = deserializeJson(doc, payloadString);
         if (error || !doc.is<JsonObject>()) {
           Serial.println("Fehler beim Parsen von JSON");
           client.publish(canSendTopic, ("JSON PARS ERROR: " + payloadString).c_str());
           return;
         }
         String tempDataString = doc["Data"].as<String>(); // Konvertiert den Wert zu einem String
         tempDataString.replace(" ", ""); // Entfernt alle Leerzeichen
         doc["Data"] = tempDataString.c_str(); // Speichert den geänderten Wert zurück im JSON-Objekt
      
         // Extrahiere ID und Daten aus dem JSON
         const char* idString = doc["ID"];
         const char* dataString = doc["Data"];
      
         // Umwandeln der ID in einen Integer
         uint16_t id = strtol(idString, NULL, 16);
      
         // Umwandeln des Datenstrings in ein Byte-Array
         uint8_t data[10];
         size_t dataLength = strlen(dataString) / 2;
         for (size_t i = 0; i < dataLength; i++) {
           char byteString[] = {dataString[i * 2], dataString[i * 2 + 1], 0};
           data[i] = strtol(byteString, NULL, 16);
         }
      
         // Erstelle CAN-Nachricht und sende sie
         can_frame canMsg;
         canMsg.can_id = id;
         canMsg.can_dlc = dataLength;
         memcpy(canMsg.data, data, dataLength);
      
         // Erstelle einen String, um die Hex-Darstellung zu speichern
         char msgString[35]; // Länge = Anzahl der Bytes * 2 (für Hex) + 1 (für '\0')
      
         // Konvertiere jeden Byte der Daten in einen Hex-String
         for (int i = 0; i < canMsg.can_dlc; i++) {
           sprintf(&msgString[i * 2], "%02X", canMsg.data[i]);
         }
      
         // Sende CAN-Nachricht
         if (mcp2515.sendMessage(&canMsg) != MCP2515::ERROR_OK) {
           Serial.println("Fehler beim Senden der CAN-Nachricht");
           client.loop();
           delay(100);
           client.publish(canSendTopic, "SEND ERROR");
      
           // Initialisiere den MCP2515 CAN Controller neu
           mcp2515.reset();
           mcp2515.setBitrate(CAN_20KBPS, MCP_8MHZ);
           // Setze die Masken und Filter
           mcp2515.setFilterMask(MCP2515::MASK0, true, 0x000); // Maske 0 auf 0 setzen (alle Nachrichten akzeptieren)
           mcp2515.setFilterMask(MCP2515::MASK1, true, 0x000); // Maske 1 auf 0 setzen (alle Nachrichten akzeptieren)
      
           // Setze alle Filter auf 0, um alle Nachrichten zu akzeptieren
           //for (int filter = 0; filter < 6; filter++) {
           //mcp2515.setFilter((MCP2515::RXF)filter, true, 0x000);
           //}
           mcp2515.setNormalMode();
         } else {
           // Gib den Hex-String aus
           Serial.print("Raw CAN Data: ");
           Serial.println(msgString);
           client.publish(canSendTopic, msgString); // Sende die Daten zum MQTT-Broker
           client.loop();
           Serial.println("Erfolgreich gesendet");
           client.publish(topicString.c_str(), "OK", false);
         }
       } else {
         Serial.println("Falsches Topic");
         return;
       }
      
      }
      
      void setup() {
       // Timer Setup
       timerSemaphore = xSemaphoreCreateBinary();  // Create semaphore to inform us when the timer has fired
       timer = timerBegin(1000000); // Set timer frequency to 1Mhz = 1µs
       timerAttachInterrupt(timer, &onTimer); // Attach onTimer function to our timer.
       timerAlarm(timer, 1000000, true, 0);  // Set alarm to call onTimer function every second (value in microseconds). Repeat the alarm (third parameter) with unlimited count = 0 (fourth parameter).
      
       // Initialisiere die serielle Kommunikation
       Serial.begin(115200);
       pinMode(2, OUTPUT); // Setze GPIO 26 als Ausgang für die LED
      
       // Warte auf die serielle Verbindung, falls nötig
       while (!Serial) {
         ; // warte auf die Verbindung der seriellen Schnittstelle
       }
       // Verbinde mit WiFi-Netzwerk
       WiFi.begin(ssid, password);
       Serial.print("Verbinde mit WiFi");
       while (WiFi.status() != WL_CONNECTED) {
         delay(500);
         Serial.print(".");
       }
       Serial.println("\nWiFi verbunden!");
       Serial.print("IP-Adresse: ");
       Serial.println(WiFi.localIP());
      
       connectMQTT();
      
       // Initialisiere den MCP2515 CAN Controller
       mcp2515.reset();
       mcp2515.setBitrate(CAN_20KBPS, MCP_8MHZ);
       // Setze die Masken und Filter
       mcp2515.setFilterMask(MCP2515::MASK0, true, 0x000); // Maske 0 auf 0 setzen (alle Nachrichten akzeptieren)
       mcp2515.setFilterMask(MCP2515::MASK1, true, 0x000); // Maske 1 auf 0 setzen (alle Nachrichten akzeptieren)
      
       // Setze alle Filter auf 0, um alle Nachrichten zu akzeptieren
       //for (int filter = 0; filter < 6; filter++) {
       //mcp2515.setFilter((MCP2515::RXF)filter, true, 0x000);
       //}
       mcp2515.setNormalMode();
      
       Serial.println("CAN-Bus Monitor gestartet!");
       //Starte OTA
       ArduinoOTA.setHostname("esp32-ota");
       ArduinoOTA.setPassword("XXXXXXXX");   //Hier das Passowrd für OTA setzen
      
       ArduinoOTA.onStart([]() {
         String type;
         if (ArduinoOTA.getCommand() == U_FLASH) {
           type = "sketch";
         } else { // U_SPIFFS
           type = "filesystem";
         }
         // Hinweis: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end()
         Serial.println("Start updating " + type);
       });
       ArduinoOTA.onEnd([]() {
         Serial.println("\nEnd");
       });
       ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
         Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
       });
       ArduinoOTA.onError([](ota_error_t error) {
         Serial.printf("Error[%u]: ", error);
         if (error == OTA_AUTH_ERROR) {
           Serial.println("Auth Failed");
         } else if (error == OTA_BEGIN_ERROR) {
           Serial.println("Begin Failed");
         } else if (error == OTA_CONNECT_ERROR) {
           Serial.println("Connect Failed");
         } else if (error == OTA_RECEIVE_ERROR) {
           Serial.println("Receive Failed");
         } else if (error == OTA_END_ERROR) {
           Serial.println("End Failed");
         }
       });
       ArduinoOTA.begin();
      }
      
      void loop() {
       static unsigned long lastMillis = 0;
       char aliveTopic[64];
       char timestampString[32]; // Genug Platz für die Darstellung des Zeitstempels
       connectMQTT();
      
      
       if (xSemaphoreTake(timerSemaphore, 0) == pdTRUE){
         uint32_t isrCount = 0, isrTime = 0;
         // Read the interrupt count and time
         portENTER_CRITICAL(&timerMux);
         isrCount = isrCounter;
         isrTime = lastIsrAt;
         portEXIT_CRITICAL(&timerMux);
         // Print it
         Serial.print("onTimer no. ");
         Serial.print(isrCount);
         Serial.print(" at ");
         Serial.print(isrTime);
         Serial.println(" ms");
         if (isrTime > 1000 * 60 * 60 * 12) {
           resetFunc(); 
         }
       }
      
       // Sende alle 5 Sekunden eine Nachricht an das Thema "alive"
       if (millis() - lastMillis > 5000) {
         lastMillis = millis();
         snprintf(aliveTopic, sizeof(aliveTopic), "%s/alive", mqtt_topic); // Kombiniere das Hauptthema mit "/alive"
         snprintf(timestampString, sizeof(timestampString), "%lu", millis()); // Konvertiere den Zeitstempel in einen String
         client.publish(aliveTopic, timestampString); // Sende das Zeichen "!" an das Unterthema "alive"
         Serial.println("Alive-Nachricht gesendet!");
         digitalWrite(2, HIGH);   // LED einschalten
         //delay(10);               // Kurz warten
         digitalWrite(2, LOW);    // LED ausschalten
         Serial.println(timestampString);
       }
      
       can_frame canMsg;
       if (mcp2515.readMessage(&canMsg) == MCP2515::ERROR_OK) {
         digitalWrite(2, HIGH);   // LED einschalten
         delay(100);               // Kurz warten
         digitalWrite(2, LOW);    // LED ausschalten
         char msgString[128]; // Ein Array, um die Daten zu speichern
         sprintf(msgString, "{\"ID\": \"0x%03X\", \"Len\": \"%1d\", \"Data\": \"", canMsg.can_id, canMsg.can_dlc);
         for (int i = 0; i < canMsg.can_dlc; i++) {
           sprintf(msgString + strlen(msgString), "%02X ", canMsg.data[i]);
         }
         sprintf(msgString + strlen(msgString) - 1, "\"}");
         snprintf(aliveTopic, sizeof(aliveTopic), "%s/pload", mqtt_topic); // Kombiniere das Hauptthema mit "/alive"
         client.publish(aliveTopic, msgString); // Sende die Daten zum MQTT-Broker
         Serial.println(msgString);
       }
      
       // Kurze Verzögerung, um den CAN-Bus nicht zu überlasten
       //Serial.print(".");
       //delay(10);
       ArduinoOTA.handle();
       client.loop();
      }
      
      void connectMQTT() {
       // Verbinde mit MQTT Broker
       while (!client.connected()) {
         client.setServer(mqtt_server, mqtt_port);
         Serial.print("Verbinde mit MQTT...");
         if (client.connect("CAN_MQTT_Client", mqtt_user, mqtt_password)) {
           Serial.println("verbunden");
           // Setze MQTT-Callback-Funktion
           client.setCallback(callback);
           // Erstelle das Topic für das Senden von CAN-Nachrichten
           char canSendTopic[64];
           snprintf(canSendTopic, sizeof(canSendTopic), "%s/canSend", mqtt_topic);
           client.publish(canSendTopic, "INIT"); // Sende die Daten zum MQTT-Broker
           delay(200);
           Serial.print("Abonniere Topic: ");
           Serial.println(canSendTopic);
           if (client.subscribe(canSendTopic)) {
             Serial.println("Abonnement erfolgreich!");
           } else {
             Serial.println("Abonnement fehlgeschlagen!");
           }
           delay(200);
         } else {
           Serial.print("Fehler, rc=");
           Serial.print(client.state());
           Serial.println(" Versuche es erneut in 5 Sekunden");
           delay(5000);
         }
       }
      };
      
      

      Mein Javascript

      const DEBUG = true
      let filePath = '/opt/iobroker/iobroker-data/ElsterTable.inc';
      let elsterJsObject = convertToJsObject(filePath);
      const CanScnifferId = "mqtt.0.TTF"
      //const CanScnifferId = "mqtt.0.TTF.303"
      let scanAllElsterIdsTimerVar, scanAllStatestimerVar, scanShortStatestimerVar
      let GlobscanAllElsterIds = {
         lastPosition: 0,
         lastkey: "0",
       //  geraet: 0x0180
      }
      // Das muss einmal pro Zieladresse ausgeführt werden um zu scannen welche Datenpunke abfragbar sind
      // Jeweils einmal pro Adresse 
      scanAllElsterIds(0x0180,0)
      let GlobscanAllStates = {
         lastPosition: 0,
         lastkey: "0",
         intervall: 10 * 60 * 1000,
      }
      scanAllStates()
      // Die Hier angegebenen Datenpunkte werden in einem unter Intervall angegebenen Intervall in Millisekunden regelmäßig aktiv abgefragt
      let GlobshortScan = {
         lastPosition: 0,
         lastkey: "0",
         intervall: 30000,
         iDs: [
          //   { geraet: 0x0180, elsterName: "WPVORLAUFIST" },
          //   { geraet: 0x0180, elsterName: "RUECKLAUFISTTEMP" },
         //    { geraet: 0x0180, elsterName: "MASCHINENDRUCK" },
         //    { geraet: 0x0301, elsterName: "VORLAUFSOLLTEMP" },
         //    { geraet: 0x0180, elsterName: "PUFFERSOLL" },
         ]
      }
      
      scanShortStates()
      
      on({ id: CanScnifferId + '.pload', change: "ne" }, function (obj) {
         if (DEBUG || false) log(obj.state.val)
         const telegramObj = parseCanTelegram(JSON.parse(obj.state.val))
         if (Number(telegramObj.elsterIndex) == Number(GlobscanAllElsterIds.lastkey)) {
             //log("gleich")
             //log(Number(telegramObj.elsterIndex) + " - " + Number(GlobscanAllElsterIds.lastkey))
             clearTimeout(scanAllElsterIdsTimerVar)
             scanAllElsterIds(GlobscanAllElsterIds.geraet, GlobscanAllElsterIds.lastPosition + 1)
         }
         if (Number(telegramObj.elsterIndex) == Number(GlobscanAllStates.lastkey)) {
             //log("gleich")
             //log(Number(telegramObj.elsterIndex) + " - " + Number(GlobscanAllElsterIds.lastkey))
             clearTimeout(scanAllStatestimerVar)
             scanAllStates(GlobscanAllStates.lastPosition + 1)
         }
         if (Number(telegramObj.elsterIndex) == Number(GlobshortScan.lastkey)) {
             //log("gleich")
             //log(Number(telegramObj.elsterIndex) + " - " + Number(GlobscanAllElsterIds.lastkey))
             clearTimeout(scanShortStatestimerVar)
             scanShortStates(GlobshortScan.lastPosition + 1)
         }
         //evaluateMessages(JSON.parse(obj.state.val))
         //log(JSON.stringify(telegramObj));
         //writeLog(JSON.stringify(telegramObj)), 'CanLog.csv').catch(error => console.error(JSON.stringify(error)));
      });
      function convertToJsObject(filePath) {
         // In einer echten JavaScript-Umgebung müsste hier die fs-Bibliothek verwendet werden,
         // um die Datei zu lesen. Der folgende Code ist eine vereinfachte Darstellung.
         const fs = require('fs');
         let elsterTable = {};
         // Lies die Datei synchron, dies ist in einem realen Szenario zu vermeiden
         let fileContent = fs.readFileSync(filePath, 'utf-8');
         let lines = fileContent.split('\n');
         lines.forEach((line) => {
             // Ignorieren von Kommentaren und leeren Zeilen
             if (line.startsWith('//') || line.trim() === '' || line.startsWith('{') || line.startsWith('}')) {
                 return;
             }
             // Entfernen von Anführungszeichen und geschweiften Klammern, dann Aufspaltung der Zeile in Teile
             let parts = line.replace('{', '').replace('}', '').replace(/"/g, '').trim().split(',');
             parts = parts.map(part => part.trim()).filter(part => part);
      
             // Überprüfen, ob die Zeile drei Teile enthält: Name, Index und Typ
             if (parts.length === 3) {
                 let [name, index, type_] = parts;
                 try {
                     // Versuche, den Index von Hex zu Dezimal zu konvertieren
                     let indexKey = parseInt(index, 16);
                     // Hinzufügen zum JavaScript-Objekt
                     elsterTable[indexKey] = { "name": name, "type": type_ };
                 } catch (error) {
                     // Wenn der Index nicht in einen Integer umgewandelt werden kann, ignorieren wir diese Zeile
                     console.error('Konvertierungsfehler:', error);
                 }
             }
         });
         return elsterTable;
      }
      // Das ElsterTable-Objekt, das zuvor erstellt wurde
      let elsterTable = elsterJsObject
      
      // Funktion zum Konvertieren der Hex-Daten in lesbare Werte
      function convertData(hexString) {
         let bytes = [];
         for (let i = 0; i < hexString.length; i += 2) {
             bytes.push(parseInt(hexString.substr(i, 2), 16));
         }
         let rawValue = (bytes[1] << 8) | bytes[2]; // Korrigierte Byte-Position
         return rawValue / 10; // Annahme: Der Wert ist durch 10 zu teilen
      }
      // Funktion zum Auswerten der Nachrichten
      function evaluateMessages(message) {
         //messages.forEach((message) => {
         let id = message.ID;
         let data = message.Data.replace(/\s/g, "");
      
         // Der Index ist das dritte Byte in der Nachricht, hier als Hex-String
         let indexHex = data.substr(4, 2);
         log(indexHex)
         let index = parseInt(indexHex, 16);
         let valueHEX = data.substr(6, 4);
         let value = parseInt(valueHEX, 16)
         log("Index:" + index)
         log("Data:" + data)
         log("Value Hex:" + valueHEX)
         log("Value Dezi:" + value)
         // Hole den Eintrag aus dem ElsterTable
         let entry = elsterTable[index];
         if (entry) {
             log(`Gerät: ${id}, Parameter: ${entry.name}, Wert: ${value / 10}`);
         } else {
             log(`Unbekannter Index: ${indexHex}. Message: ${message}`);
         }
      }
      function parseMessage(str) {
         // Zerlege den String in Teile und extrahiere relevante Teile
         const parts = str.trim().split(/\s+/);
         const idPart = parts[1].substring(2); // Entferne '0x'
         const dataPart = parts.slice(4).join('').replace("Data:", ""); // Entferne 'Data:'
      
         // Erstelle das messages-Objekt
         return {
             id: idPart, // Entfernt '0x'
             data: dataPart // Entfernt 'Data:'
         };
      }
      // Beispiel für die Verwendung der Funktion
      //const messageStr = {"ID": "0x301", "Len": "7", "Data": "C0 01 11 00 DF 00 00"};
      //evaluateMessages(messageStr)
      // ****************************************************************
      // :
      function parseCanTelegram(telegram) {
         // Entferne alle Leerzeichen und prüfe das Format
         let dataString = telegram.Data.replace(/\s/g, '');
         if (dataString.length % 2 !== 0) {
             throw new Error('Ungültige Datenlänge');
         }
         // Zerlege die Daten in ihre Teile
         let parts = dataString.match(/.{1,2}/g).map(byte => parseInt(byte, 16));
         // Berechne die CAN-ID
         let calculatedId = (8 * (parts[0] & 0xF0)) + (parts[1] & 0x0F);
         let calculatedIdHex = calculatedId.toString(16).toUpperCase();
         calculatedIdHex = "0x" + ("000" + calculatedIdHex).slice(-4);
         // Überprüfe den Typ des Telegramms
         let typID = (parts[0] & 0x0F)
         let type
         switch (typID) {
             case 0:
                 type = "write"
                 break;
             case 1:
                 type = "read"
                 break;
             case 2:
                 type = "response"
                 break;
             case 3:
                 type = "ack"
                 break;
             case 4:
                 type = "write ack"
                 break;
             case 5:
                 type = "write respond"
                 break;
             case 6:
                 type = "system"
                 break;
             case 7:
                 type = "system respond"
                 break;
             default:
                 type = "Unbekannt"
         }
         // Bestimme den Elster-Index und erhöhe ihn um 1
         let elsterIndex = parts[2] === 0xFA ? (((parts[3] << 8) + parts[4])) : (parts[2]);
         // Konvertiere den Elster-Index in vierstellige Hexadezimalzahl und entferne das zuvor hinzugefügte +1
         let elsterIndexHex = elsterIndex.toString(16).toUpperCase();
         let elsterFunktion = elsterTable[elsterIndex];
         elsterIndexHex = "0x" + ("000" + elsterIndexHex).slice(-4);
         let data = parts.slice(3).map(byte => byte.toString(16).padStart(2, '0')).join(' ').toUpperCase();
         // Nutzdaten, beginnend nach dem Elster-Index
         let dataIndexStart = parts[2] === 0xFA ? 5 : 3;
         let dataBytes = parts.slice(dataIndexStart, dataIndexStart + 2);
         let dataHex = dataBytes.map(byte => byte.toString(16).padStart(2, '0')).join('').toUpperCase();
         let dataDecimal = (dataBytes[0] << 8) + dataBytes[1];
         let dataDecimalCon = AllValuesConverter(dataDecimal, elsterFunktion.type, true)
         let StateToSet = "0_userdata.0.WP13." + telegram.ID.replace("0x", "") + "." + elsterFunktion.name
         log(StateToSet)
         log("state:" + StateToSet + " dataDecimalCon: " + dataDecimalCon)
         if (dataDecimal != 32768) {
             createState(StateToSet, dataDecimalCon, false)
             setState(StateToSet, dataDecimalCon, true)
         }
         return {
             raw: dataString,
             calculatedId: calculatedIdHex,
             type,
             elsterIndex: elsterIndexHex,
             elsterFunktion,
             dataHex,
             dataDecimal,
             FromID: telegram.ID,
             Len: telegram.Len
         };
      }
      function AllValuesConverter(value, TypeString, read = true) {
         //log("value to String: " +  value.toString().toLowerCase() )
         switch (TypeString) {
             case "et_datum":
                 if (read) {
                     return convertBytesToDatum(Number(value))
                 } else {
                     return convertDatumToBytes(value)
                 }
                 break;
             case "et_dec_val":
                 if (read) {
                     return Number((interpretAsSigned16(value) / 10).toFixed(1))
                 } else {
                     return Number((interpretAsSigned16(value) * 10).toFixed(0))
                 }
                 break;
             case "et_time_domain":
                 if (read) {
                     if (value == 0xFFFF) return "NA"
                     if (value == 0x8080) return "-----"
                     return convertBytesToTime(Number(value))
                 } else {
                     if (value.toString() == "NA") return 0xFFFF
                     if (value.toString() == "-----") return 0x8080
                     log("Zeitrückgabe: " + value + " zu: " + Number(convertTimeRangeToBytes(value.toString())))
                     return Number(convertTimeRangeToBytes(value.toString()))
                 }
                 break;
             case "et_betriebsart":
                 if (read) {
                     if (value == 0x0000) return "Notbetrieb"
                     if (value == 0x0100) return "Bereitschaft"
                     if (value == 0x0200) return "Automatik"
                     if (value == 0x0300) return "Tagbetrieb"
                     if (value == 0x0400) return "Absenkbetrieb"
                     if (value == 0x0500) return "Warmwasser"
                     if (value == 0x0B00) return "FEKAuto"
                     return value
                 } else {
                     //log("value to String: " +  value.toString().toLowerCase() )
                     if (value.toString().toLowerCase() == "notbetrieb") return 0x0000
                     if (value.toString().toLowerCase() == "bereitschaft") return 0x0100
                     if (value.toString().toLowerCase() == "automatik") return 0x0200
                     if (value.toString().toLowerCase() == "tagbetrieb") return 0x0300
                     if (value.toString().toLowerCase() == "absenkbetrieb") return 0x0400
                     if (value.toString().toLowerCase() == "warmwasser") return 0x0500
                     if (value.toString().toLowerCase() == "fekauto") return 0x0B00
                     return Number(value)
                 }
                 break;
             case "et_little_endian":
             case "et_little_bool":
                 return littleEndianHexConvert(value)
                 break;
             default:
                 return value
         }
      }
      function interpretAsSigned16(uint16) {
         // Prüfen, ob die Zahl größer als der maximal positive Wert für einen vorzeichenbehafteten 16-Bit-Integer ist
         if (uint16 > 32767) {
             return uint16 - 65536;
         } else {
             return uint16;
         }
      }
      // Von Little Endian Hex zu Dezimal
      function littleEndianHexConvert(value) {
         // Verschieben Sie die Bytes und kombinieren Sie sie
         let lowByte = value & 0xFF; // Extrahieren Sie das niedrigwertige Byte
         let highByte = (value & 0xFF00) >> 8; // Extrahieren und verschieben Sie das hochwertige Byte
         return (highByte | (lowByte << 8));
      }
      function convertBytesToTime(value) {
         let startByte = value >> 8;
         let endByte = value & 0xFF;
         return convertToTime(startByte) + ' - ' + convertToTime(endByte);
      }
      function convertBytesToDatum(value) {
         let startByte = value >> 8;
         let endByte = value & 0xFF;
         return (startByte) + '.' + (endByte);
      }
      function convertToTime(value) {
         let hours = Math.floor(value / 4);
         let minutes = (value % 4) * 15;
         return hours.toString().padStart(2, '0') + ':' + minutes.toString().padStart(2, '0');
      }
      function convertTimeToBytes(startTime, endTime) {
         let startUnits = convertToUnits(startTime);
         let endUnits = convertToUnits(endTime);
         return (startUnits << 8) + endUnits;
      }
      function convertToUnits(time) {
         let [hours, minutes] = time.split(':').map(Number);
         return hours * 4 + Math.floor(minutes / 15);
      }
      function convertTimeRangeToBytes(timeRange) {
         // Entfernen Sie alle Leerzeichen aus dem String
         let cleanedTimeRange = timeRange.replace(/\s/g, '');
      
         // Teilen Sie den bereinigten String in Start- und Endzeit
         let [startTime, endTime] = cleanedTimeRange.split('-');
         if (!endTime) return timeRange
         return convertTimeToBytes(startTime, endTime);
      }
      function convertDatumToBytes(datum) {
         let cleaneddatum = datum.replace(/\s/g, '');
         let [tag, monat] = cleaneddatum.split('.').map(Number);
         //log(tag + " " + monat + " " + typeof(monat))
         if (!monat) return datum
         return ((tag << 8) + (monat));
      }
      //console.log(convertBytesToTime(0x8080)); // Gibt "00:00 - 01:15" aus
      //console.log(convertTimeToBytes("15:30", "01:15").toString(16)); // Gibt "105" aus
      //console.log(convertTimeRangeToBytes("32:00 - 32:00").toString(16)); // Gibt "105" aus
      //log(convertBytesToDatum(3851)) // Gibt "15.11" aus
      //log(convertDatumToBytes("15.11"))
      // Beispiel-Telegramm
      let telegram = {
         "ID": "0x680",
         "Len": "6",
         "Data": "61010112340000"
      }
      //console.log(parseCanTelegram(telegram));
      function buildCanIdWithTypeId(canId, typeId, elsterIndexHex, HexDaten) {
         let hexbuffer = Buffer.from("0000000000", "hex")
         hexbuffer[0] = Math.floor(parseInt(canId, 16) / 8) + parseInt(typeId, 16)
         hexbuffer[1] = (parseInt(canId, 16) % 8)
         let elsterBytes = Buffer.from(elsterIndexHex, "hex");
         hexbuffer[2] = elsterBytes[1];
         //hexbuffer[3] = elsterBytes[1];
         let DatenBytes = Buffer.from(HexDaten, "hex");
         hexbuffer[3] = DatenBytes[0];
         hexbuffer[4] = DatenBytes[1];
         return hexbuffer.toString('hex')
      }
      /***************************************
      **********  LOG FILE ERSTELLEN  ************ 
      ****************************************/
      const logpath = '/opt/iobroker/log/';
      const fs = require('fs').promises;
      async function writeLog(logEntry, filename = "ECOTest2.csv") {
         // Get the current date and time
         const now = new Date();
         const dateTime = now.toLocaleString();
      {1}
         // Format the log entry
         const formattedEntry = `${dateTime}\t${logEntry}\n`;
      {1}
         try {
             // Check if the file already exists
             await fs.stat(logpath + filename);
         } catch (error) {
             if (error.code === 'ENOENT') {
                 // If the file does not exist, we need to add the header
                 const header = 'DateTime\tLog Entry\n';
                 await fs.writeFile(logpath + filename, header);
                 log("neue datei erstellt");
             } else {
                 // Some other error occurred
                 throw error;
             }
         }
         // Append the log entry to the file
         try {
             await fs.appendFile(logpath + filename, formattedEntry);
             //console.log('Log entry saved!');
         } catch (error) {
             throw error;
         }
      }
      // Anwendung:
      //writeLog('This is a test entry.', 'Filename.csv').catch(error => console.error(error));
      //***************************************
      //***************************************
      function initElsterFrame(senderId, receiverId, elsterIdx, pdaten, typ = 1) {
         senderId = Number(senderId)
         const address = (Number(receiverId) & 0x780) >> 3;
         let data = new Array(7); // Erstellt ein Array mit 5 Elementen für die Datenbytes
         // Die Id und die Länge des Frames werden nicht direkt gesetzt, da in JavaScript
         // üblicherweise Objekte anstelle von direkt manipulierten Byte-Arrays verwendet werden.
         data[0] = (Number(address) & 0xF0) + Number(typ);
         data[1] = Number(receiverId) & 0x07;
         data[2] = 0xFA;
         data[3] = (Number(elsterIdx) >> 8) & 0xFF; // Höherwertiges Byte von ElsterIdx
         data[4] = Number(elsterIdx) & 0xFF; // Niederwertiges Byte von ElsterIdx
         data[5] = (Number(pdaten) >> 8) & 0xFF; // Niederwertiges Byte von ElsterIdx
         data[6] = Number(pdaten) & 0xFF; // Niederwertiges Byte von ElsterIdx
         return {
             ID: "0x" + senderId.toString(16),
             Len: "7",
             Data: data.map(byte => byte.toString(16).padStart(2, '0')).join('').toUpperCase()
         };
      }
      // Änderungen senden:
      on({ id: new RegExp("0_userdata.0.WP13\..*"), change: "any", ack: false }, function (obj) {
         log("was geändert:" + obj.id + " ack:" + obj.state.ack)
         readDataFromObject(obj, 'write')
      });
      function readDataFromObject(obj, art = 'readonly') {
         let ID, elstername, mtelegram
         if (obj.id) {
             ID = "0x" + ((obj.id).split('.').slice(-2, -1)[0])
             elstername = ((obj.id).split('.').slice(-1)[0])
         } else {
             ID = "0x" + ((obj._id).split('.').slice(-2, -1)[0])
             elstername = ((obj._id).split('.').slice(-1)[0])
         }
         let elsterObjekt = Object.entries(elsterJsObject).find(([key, value]) => value.name === elstername);
      {1}
         let elsterID = elsterObjekt[0]; // Der Schlüssel
         let gesuchtesObjekt = elsterObjekt[1]; // Das gesuchte Objekt
         // Verwenden Sie hier elsterID und gesuchtesObjekt wie benötigt
         // log (JSON.stringify(gesuchtesObjekt) + " : " + obj.state.val + " Konvertiert: " + AllValuesConverter(obj.state.val, gesuchtesObjekt.type ,true))
      {1}
         //let elsterID = Object.keys(elsterJsObject).find(key => elsterJsObject[key].name === elstername);
         /*
             log("Gerät: " + ID)
             log("elstername: " + elstername)
             log("elsterIDHex: " + Number(elsterID).toString(16))
             log("value: " + obj.state.val)
             log("art: " + art)
         */
         if (art == 'write') {
             let dataDecimalCon = AllValuesConverter((obj.state.val), gesuchtesObjekt.type, false)
             mtelegram = JSON.stringify(initElsterFrame("0x680", ID, elsterID, dataDecimalCon, 2))
             log(" Wert Setzten: " + mtelegram)
             setState(CanScnifferId + '.canSend', mtelegram)
             setTimeout(function () {
                 mtelegram = JSON.stringify(initElsterFrame("0x680", ID, elsterID, 0, 1))
                 //log(" Wert abrufen: " + mtelegram)
                 setState(CanScnifferId + '.canSend', mtelegram)
             }, 2 * 1000);
         } else if (art == 'readonly') {
             mtelegram = JSON.stringify(initElsterFrame("0x680", ID, elsterID, 0, 1))
             //log(" Wert abrufen: " + mtelegram)
             setState(CanScnifferId + '.canSend', mtelegram)
         }
      }
      //Zum Scannen aller verfügbaren Parameter eines gerätes
      function scanAllElsterIds(geraet = 0x180, lastPosition = 0) {
         GlobscanAllElsterIds.geraet = geraet
         let canId, mtelegram
         let maxScan
         let keys = Object.keys(elsterJsObject);
         maxScan = keys.length
         if (lastPosition >= maxScan) {
             let Zeitkompl = Math.floor((Date.now() - GlobscanAllStates.Starttime) / 1000)
             if (DEBUG) log("Scan all ElsterIds beendet. Scandauer: " + Zeitkompl + " Sekunden für " + lastPosition + " Scans")
             GlobscanAllElsterIds.lastPosition = 0
             GlobscanAllElsterIds.lastkey = "0"
             GlobscanAllElsterIds.Starttime = 0
             return
         } else if (lastPosition == 0) {
             if (DEBUG) log("Scan all States gestartet")
             GlobscanAllElsterIds.Starttime = Date.now()
         }
         let key = keys[lastPosition]
         if (DEBUG) if (lastPosition % 20 == 0) log("(" + ((100 / maxScan) * lastPosition).toFixed(0) + "%) Scanposition: " + lastPosition + " von " + maxScan + " elsterID:" + key + " elstername:" + elsterJsObject[key].name)
         //log(key)
         mtelegram = JSON.stringify(initElsterFrame("0x680", geraet, key, 0, 1))
         //log(lastPosition + " von " + maxScan + " Wert abrufen: " + mtelegram)
         setState(CanScnifferId + '.canSend', mtelegram)
         GlobscanAllElsterIds.lastPosition = lastPosition
         GlobscanAllElsterIds.lastkey = key
         scanAllElsterIdsTimerVar = setTimeout(function () {
             scanAllElsterIds(geraet, lastPosition + 1); // Setzt den nächsten Aufruf auf 1000 ms später
         }, 5000)
      }
      //Zum Scannen aller Angelegten States
      function scanAllStates(lastPosition = 0) {
         let mSelector = $("0_userdata.0.WP13.*");
         let maxScan = mSelector.length
         if (lastPosition >= maxScan - 1) {
             let Zeitkompl = Math.floor((Date.now() - GlobscanAllStates.Starttime) / 1000)
             if (DEBUG) log("Scan all States beendet. Scandauer: " + Zeitkompl + " Sekunden für " + lastPosition + " Scans")
             GlobscanAllStates.lastPosition = 0
             GlobscanAllStates.lastkey = "0"
             GlobscanAllStates.Starttime = 0
             setTimeout(function () {
                 scanAllStates(0); // Setzt den nächsten Aufruf auf 1000 ms später
             }, GlobscanAllStates.intervall)
             return
         } else if (lastPosition == 0) {
             if (DEBUG) log("Scan all States gestartet")
             GlobscanAllStates.Starttime = Date.now()
         }
         //log("mSelector " + mSelector[lastPosition])
         let elstername = ((mSelector[lastPosition]).split('.').slice(-1)[0])
         let geraeteId = (mSelector[lastPosition]).split('.').slice(-2)[0]
         //log("GeraeteID:" + geraeteId )
         let elsterID = Object.keys(elsterJsObject).find(key => elsterJsObject[key].name === elstername);
         GlobscanAllStates.lastPosition = lastPosition
         GlobscanAllStates.lastkey = elsterID
         if (DEBUG) if (lastPosition % 20 == 0) log("ScanAllStates (" + ((100 / maxScan) * lastPosition).toFixed(0) + "%) Positiom:" + lastPosition + " von " + maxScan + " geraeteId:" + geraeteId + " elsterID:" + elsterID + " elstername:" + elstername)
         let myObj = getObject(mSelector[lastPosition])
         myObj.state = getState(mSelector[lastPosition])
         myObj.id = mSelector[lastPosition]
         //log(JSON.stringify(myObj))
         readDataFromObject(myObj)
         scanAllStatestimerVar = setTimeout(function () {
             if (elstername != "DATUM") log("Timeout position:" + lastPosition + " geraeteId:" + geraeteId + " elsterID:" + elsterID + " elstername:" + elstername)
             scanAllStates(lastPosition + 1); // Setzt den nächsten Aufruf auf 1000 ms später
         }, 5000)
      }
      function scanShortStates(lastPosition = 0) {
         let maxScan = GlobshortScan.iDs.length
         //log("Anzahl IDs Short:" + maxScan)
         if (lastPosition >= maxScan) {
             let Zeitkompl = Math.floor((Date.now() - GlobshortScan.Starttime) / 1000)
             if (DEBUG) log("Scan Short States beendet. Scandauer: " + Zeitkompl + " Sekunden für " + lastPosition + " Scans")
             GlobshortScan.lastPosition = 0
             GlobshortScan.lastkey = "0"
             GlobshortScan.Starttime = 0
             setTimeout(function () {
                 scanShortStates(0); // Setzt den nächsten Aufruf auf 1000 ms später
             }, GlobshortScan.intervall)
             return
         } else if (lastPosition == 0) {
             if (DEBUG) log("Scan Short States gestartet")
             GlobshortScan.Starttime = Date.now()
         }
         //log("mSelector " + mSelector[lastPosition])
         let elstername = GlobshortScan.iDs[lastPosition].elsterName
         let elsterID = Object.keys(elsterJsObject).find(key => elsterJsObject[key].name === elstername);
         GlobshortScan.lastPosition = lastPosition
         GlobshortScan.lastkey = elsterID
         let esterState = "0_userdata.0.WP13." + GlobshortScan.iDs[lastPosition].geraet.toString(16).replace("tzt0x", "") + "." + elstername
         //log(esterState)
         if (DEBUG) if (lastPosition % 20 == 0) log("ScanShortStates (" + ((100 / maxScan) * lastPosition).toFixed(0) + "%) Positiom:" + lastPosition + " von " + maxScan + " elsterID:" + elsterID + " elstername:" + elstername)
         let myObj = getObject(esterState)
         myObj.state = getState(esterState)
         myObj.id = esterState
         //log(JSON.stringify(myObj))
         readDataFromObject(myObj)
         scanShortStatestimerVar = setTimeout(function () {
             log("Timeout Shortscan position:" + lastPosition + " elsterID:" + elsterID + " elstername:" + elstername)
             scanShortStates(lastPosition + 1); // Setzt den nächsten Aufruf auf 1000 ms später
         }, 5000)
      }
      /*
      //Objekte löschen:
      $('0_userdata.0.WP13.180.EL_*').each(function (id, i) {
                 log(i + " - " + id + " existsObject: " + existsObject(id))
                 //deleteObject(id,true);
      });
      */
      // Beispielaufruf
      let canId, mtelegram
      let Senderid = "0x680"
      canId = "0x180"; // 384 in dezimal
      //canId = "0x601"; // 384 in dezimal
      let typeId = 1; // 1 in dezimal
      let elsterIndexHex = "0x17a0"
      let pHexDaten = 0x0000
      mtelegram = JSON.stringify(initElsterFrame(Senderid, canId, elsterIndexHex, pHexDaten, typeId))
      //console.log("Generiertes Telegramm:" + mtelegram);
      //setState( CanScnifferId +'.canSend', mtelegram)
      /*
      setState( CanScnifferId +'.canSend', mtelegram, function () {
         setTimeout(function () {
             elsterIndexHex = "0x1700"
             pHexDaten = 0x8080
             mtelegram = JSON.stringify(initElsterFrame(Senderid, canId, elsterIndexHex, pHexDaten, typeId))
             console.log("Generiertes Telegramm:" + mtelegram);
             setState( CanScnifferId +'.canSend', mtelegram, function () {
                 setTimeout(function () {
                     elsterIndexHex = "0x1722"
                     pHexDaten = 0x8080
                     mtelegram = JSON.stringify(initElsterFrame(Senderid, canId, elsterIndexHex, pHexDaten, typeId))
                     console.log("Generiertes Telegramm:" + mtelegram);
                     setState( CanScnifferId +'.canSend', mtelegram)
                 }, 200);
             })
         }, 200);
      })
      */
      //console.log(mtelegram); 
      setTimeout(function () {
         typeId = 1;
         //elsterIndexHex = "0x1720"
         //HexDaten = "0000"
         mtelegram = JSON.stringify(initElsterFrame(Senderid, canId, elsterIndexHex, pHexDaten, typeId))
         //console.log("Generiertes Telegramm:" + mtelegram);
         //setState( CanScnifferId +'.canSend', mtelegram)
      }, 2 * 1000);
      //
      
      

      posted in ioBroker Allgemein
      Toller Tenya
      Toller Tenya
    • RE: CAN-BUS Interface ESP32 > MQTT und Stiebel Eltron WP steuern

      @leitwolf said in CAN-BUS Interface ESP32 > MQTT und Stiebel Eltron WP steuern:

      Problem gefunden. war eine falsche mcp2515.h. Ausgetauscht und es funzt.

      Wo finde ich denn die richtige mcp2515.h

      Als Hardware habe ich einen ESP32 D1 Mini und AZDelivery MCP2515 CAN Bus Shield

      Habe die passende library: (https://github.com/autowp/arduino-mcp2515) gefunden

      Allerdings kommt im Serial Monitor noch nichts an außer den alive Nachrichten

      Danke euch & guten Rutsch
      Marcus

      posted in ioBroker Allgemein
      Toller Tenya
      Toller Tenya
    • RE: Cannot find module '@iobroker/plugin-sentry

      Es muss hier jetzt auch niemand großen Aufwand reinstecken.
      Ich werde zwischen den Jahren nochmal neu aufsetzen und ein Backup einspielen.
      Welche Linux Distribution ist zu bevorzugen?

      posted in ioBroker Allgemein
      Toller Tenya
      Toller Tenya
    • RE: Cannot find module '@iobroker/plugin-sentry

      @mcm1957 sorry 😞 hier nochmal als Text

      host.smarti
      2024-12-18 08:30:07.176	info	instance system.adapter.ical.0 having pid 112850 terminated with code 0 (NO_ERROR)
      
      ical.0
      2024-12-18 08:30:06.654	info	Terminated (NO_ERROR): Without reason
      
      smartmeter.1
      2024-12-18 08:30:05.084	info	Received 11 values, 3 updated
      
      ical.0
      2024-12-18 08:30:01.605	info	processing URL: Restmuell https://abfall.alzey-worms.de/WasteManagementAlzeyworms/WasteManagementServiceServlet?ApplicationName=Calendar&SubmitAction=sync&StandortID=1076237001&AboID=233065&Fra=P;R;B;S;C;L
      
      ical.0
      2024-12-18 08:30:01.170	info	starting. Version 1.16.1 in /opt/iobroker/node_modules/iobroker.ical, node: v20.18.1, js-controller: 7.0.6
      2024-12-18 08:30:00.882	error	Couldnot add plugins: Cannot find module '@iobroker/plugin-sentry'Require stack:- /opt/iobroker/node_modules/@iobroker/js-controller-adapter/node_modules/@iobroker/plugin-base/lib/PluginHandler.js- /opt/iobroker/node_modules/@iobroker/js-controller-adapter/node_modules/@iobroker/plugin-base/index.js- /opt/iobroker/node_modules/@iobroker/js-controller-adapter/build/cjs/lib/adapter/adapter.js- /opt/iobroker/node_modules/@iobroker/js-controller-adapter/build/cjs/index.js- /opt/iobroker/node_modules/@iobroker/adapter-core/build/cjs/utils.js
      
      host.smarti
      2024-12-18 08:30:00.019	info	instance system.adapter.ical.0 in version "1.16.1" started with pid 112850
      
      
      
      posted in ioBroker Allgemein
      Toller Tenya
      Toller Tenya
    • RE: Cannot find module '@iobroker/plugin-sentry

      @mcm1957
      Screenshot 2024-12-18 at 09.48.24.png

      Screenshot 2024-12-18 at 09.49.12.png

      posted in ioBroker Allgemein
      Toller Tenya
      Toller Tenya
    • RE: Cannot find module '@iobroker/plugin-sentry

      @mcm1957 Ich habe mir die Logs jetzt nochmal genauer angesehen.
      Der Fehler tritt bei allen Adaptern mit scheduling auf.
      Z.b. Netatmo und dasWetter

      posted in ioBroker Allgemein
      Toller Tenya
      Toller Tenya
    • RE: Cannot find module '@iobroker/plugin-sentry

      @mcm1957 der Output ist:

      iobrokeruser@smarti:/opt/iobroker$ npm ls @iobroker/plugin-sentry
      [sudo] password for iobrokeruser: 
      iobroker.inst@3.0.0 /opt/iobroker
      └─┬ iobroker.js-controller@7.0.6
        └── @iobroker/plugin-sentry@2.0.4
      
      

      Soweit ich gelesen habe ist sentry dazu da um Fehler/Abbrüche in Instanzen zu Reporten. Der Smartmeter Adapter läuft jedoch einwandfrei bei mir.

      posted in ioBroker Allgemein
      Toller Tenya
      Toller Tenya
    • RE: Cannot find module '@iobroker/plugin-sentry

      Das OS ist ein DietPi als VM auf Proxmox.
      Mh dann werde ich wohl mal frisch installieren und das Backup einspielen

      posted in ioBroker Allgemein
      Toller Tenya
      Toller Tenya
    • Cannot find module '@iobroker/plugin-sentry

      Hallo,
      nach einem Update von IOBroker taucht im Log folgende Meldung auf:

      Couldnot add plugins: Cannot find module '@iobroker/plugin-sentry'Require stack:- /opt/iobroker/node_modules/@iobroker/js-controller-adapter/node_modules/@iobroker/plugin-base/lib/PluginHandler.js- /opt/iobroker/node_modules/@iobroker/js-controller-adapter/node_modules/@iobroker/plugin-base/index.js- /opt/iobroker/node_modules/@iobroker/js-controller-adapter/build/cjs/lib/adapter/adapter.js- /opt/iobroker/node_modules/@iobroker/js-controller-adapter/build/cjs/index.js- /opt/iobroker/node_modules/@iobroker/adapter-core/build/cjs/utils.js
      

      die Diagnose sagt folgendes:

      ========== Start marking the full check here ===========

      Script v.2024-10-19
      
      *** BASE SYSTEM ***
      Failed to connect to bus: No such file or directory
      OS is similar to: 
      
      model name	: Common KVM processor
      Docker          : false
      Virtualization  : kvm
      Kernel          : x86_64
      Userland        : 64 bit
      
      Systemuptime and Load:
       11:00:05 up  3:02,  1 user,  load average: 0.31, 0.16, 0.09
      CPU threads: 4
      
      
      *** LIFE CYCLE STATUS ***
      Unknown release codenamed ''. Please check yourself if the Operating System is actively maintained.
      
      *** TIME AND TIMEZONES ***
      Failed to connect to bus: No such file or directory
      Failed to connect to bus: No such file or directory
      Failed to connect to bus: No such file or directory
      
      *** Users and Groups ***
      User that called 'iob diag':
      iobrokeruser
      HOME=/home/iobrokeruser
      GROUPS=iobrokeruser adm dialout sudo audio video plugdev users iobroker
      
      User that is running 'js-controller':
      iobroker
      HOME=/home/iobroker
      GROUPS=iobroker tty dialout audio video plugdev
      
      *** DISPLAY-SERVER SETUP ***
      Display-Server: false
      Desktop: 	
      Terminal: 	
      Failed to connect to bus: No such file or directory
      
      *** MEMORY ***
                     total        used        free      shared  buff/cache   available
      Mem:            2.9G        862M        1.7G         15M        366M        1.8G
      Swap:             0B          0B          0B
      Total:          2.9G        862M        1.7G
      
      Active iob-Instances: 	9
      
               2911 M total memory
                862 M used memory
                214 M active memory
                905 M inactive memory
               1682 M free memory
                 44 M buffer memory
                321 M swap cache
                  0 M total swap
                  0 M used swap
                  0 M free swap
      
      *** top - Table Of Processes  ***
      top - 11:00:06 up  3:02,  1 user,  load average: 0.31, 0.16, 0.09
      Tasks:  99 total,   1 running,  98 sleeping,   0 stopped,   0 zombie
      %Cpu(s):  3.1 us,  0.0 sy,  0.0 ni, 96.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
      MiB Mem :   2911.4 total,   1682.3 free,    862.6 used,    366.5 buff/cache
      MiB Swap:      0.0 total,      0.0 free,      0.0 used.   1819.4 avail Mem 
      
      *** FAILED SERVICES ***
      
      Failed to connect to bus: No such file or directory
      
      
      *** DMESG CRITICAL ERRORS ***
      No critical errors detected
      
      *** FILESYSTEM ***
      Filesystem     Type      Size  Used Avail Use% Mounted on
      udev           devtmpfs   10M     0   10M   0% /dev
      /dev/sda1      ext4      7.9G  5.3G  2.3G  70% /
      tmpfs          tmpfs     1.5G     0  1.5G   0% /dev/shm
      tmpfs          tmpfs     583M   16M  568M   3% /run
      tmpfs          tmpfs     5.0M     0  5.0M   0% /run/lock
      tmpfs          tmpfs     985M   80K  985M   1% /tmp
      tmpfs          tmpfs      50M  184K   50M   1% /var/log
      
      Messages concerning ext4 filesystem in dmesg:
      
      Show mounted filesystems:
      TARGET SOURCE    FSTYPE OPTIONS
      /      /dev/sda1 ext4   rw,noatime,lazytime
      
      Files in neuralgic directories:
      
      /var:
      927M	/var/
      570M	/var/lib
      540M	/var/lib/unifi
      539M	/var/lib/unifi/db
      356M	/var/cache
      
      Archived and active journals take up 14.5M in the file system.
      
      /opt/iobroker/backups:
      25M	/opt/iobroker/backups/
      
      /opt/iobroker/iobroker-data:
      263M	/opt/iobroker/iobroker-data/
      185M	/opt/iobroker/iobroker-data/files
      158M	/opt/iobroker/iobroker-data/files/admin.admin
      157M	/opt/iobroker/iobroker-data/files/admin.admin/custom/static/js
      157M	/opt/iobroker/iobroker-data/files/admin.admin/custom/static
      
      The five largest files in iobroker-data are:
      21M	/opt/iobroker/iobroker-data/objects.jsonl
      7.4M	/opt/iobroker/iobroker-data/files/admin.admin/custom/static/js/vendors-node_modules_iobroker_adapter-react-v5_node_modules_mui_icons-material_esm_index_js.d7ed606b.chunk.js.map
      7.0M	/opt/iobroker/iobroker-data/files/admin.admin/custom/static/js/vendors-node_modules_mui_icons-material_esm_index_js.e5b40573.chunk.js.map
      7.0M	/opt/iobroker/iobroker-data/files/admin.admin/custom/static/js/vendors-node_modules_mui_icons-material_esm_index_js.8219fdd8.chunk.js.map
      7.0M	/opt/iobroker/iobroker-data/files/admin.admin/custom/static/js/vendors-node_modules_mui_icons-material_esm_index_js.358dc38e.chunk.js.map
      
      USB-Devices by-id:
      USB-Sticks -  Avoid direct links to /dev/tty* in your adapter setups, please always prefer the links 'by-id':
      
      /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_AD0K9IZZ-if00-port0
      /dev/serial/by-id/usb-Silicon_Labs_CP2104_USB_to_UART_Bridge_Controller_01063C1C-if00-port0
      
      *** NodeJS-Installation ***
      
      /usr/bin/nodejs 	v20.18.1
      /usr/bin/node 		v20.18.1
      /usr/bin/npm 		11.0.0
      /usr/bin/npx 		11.0.0
      /usr/bin/corepack 	0.29.4
      
      nodejs:
        Installed: 20.18.1-1nodesource1
        Candidate: 20.18.1-1nodesource1
        Version table:
       *** 20.18.1-1nodesource1 1001
              500 https://deb.nodesource.com/node_20.x nodistro/main amd64 Packages
              100 /var/lib/dpkg/status
           20.18.0-1nodesource1 1001
              500 https://deb.nodesource.com/node_20.x nodistro/main amd64 Packages
           20.17.0-1nodesource1 1001
              500 https://deb.nodesource.com/node_20.x nodistro/main amd64 Packages
           20.16.0-1nodesource1 1001
              500 https://deb.nodesource.com/node_20.x nodistro/main amd64 Packages
           20.15.1-1nodesource1 1001
              500 https://deb.nodesource.com/node_20.x nodistro/main amd64 Packages
           20.15.0-1nodesource1 1001
              500 https://deb.nodesource.com/node_20.x nodistro/main amd64 Packages
           20.14.0-1nodesource1 1001
              500 https://deb.nodesource.com/node_20.x nodistro/main amd64 Packages
           20.13.1-1nodesource1 1001
              500 https://deb.nodesource.com/node_20.x nodistro/main amd64 Packages
           20.13.0-1nodesource1 1001
              500 https://deb.nodesource.com/node_20.x nodistro/main amd64 Packages
           20.12.2-1nodesource1 1001
              500 https://deb.nodesource.com/node_20.x nodistro/main amd64 Packages
           20.12.1-1nodesource1 1001
              500 https://deb.nodesource.com/node_20.x nodistro/main amd64 Packages
           20.12.0-1nodesource1 1001
              500 https://deb.nodesource.com/node_20.x nodistro/main amd64 Packages
           20.11.1-1nodesource1 1001
              500 https://deb.nodesource.com/node_20.x nodistro/main amd64 Packages
           20.11.0-1nodesource1 1001
              500 https://deb.nodesource.com/node_20.x nodistro/main amd64 Packages
           20.10.0-1nodesource1 1001
              500 https://deb.nodesource.com/node_20.x nodistro/main amd64 Packages
           20.9.0-1nodesource1 1001
              500 https://deb.nodesource.com/node_20.x nodistro/main amd64 Packages
           20.8.1-1nodesource1 1001
              500 https://deb.nodesource.com/node_20.x nodistro/main amd64 Packages
           20.8.0-1nodesource1 1001
              500 https://deb.nodesource.com/node_20.x nodistro/main amd64 Packages
           20.7.0-1nodesource1 1001
              500 https://deb.nodesource.com/node_20.x nodistro/main amd64 Packages
           20.6.1-1nodesource1 1001
              500 https://deb.nodesource.com/node_20.x nodistro/main amd64 Packages
           20.6.0-1nodesource1 1001
              500 https://deb.nodesource.com/node_20.x nodistro/main amd64 Packages
           20.5.1-1nodesource1 1001
              500 https://deb.nodesource.com/node_20.x nodistro/main amd64 Packages
           20.5.0-1nodesource1 1001
              500 https://deb.nodesource.com/node_20.x nodistro/main amd64 Packages
           20.4.0-1nodesource1 1001
              500 https://deb.nodesource.com/node_20.x nodistro/main amd64 Packages
           20.3.1-1nodesource1 1001
              500 https://deb.nodesource.com/node_20.x nodistro/main amd64 Packages
           20.3.0-1nodesource1 1001
              500 https://deb.nodesource.com/node_20.x nodistro/main amd64 Packages
           20.2.0-1nodesource1 1001
              500 https://deb.nodesource.com/node_20.x nodistro/main amd64 Packages
           20.1.0-1nodesource1 1001
              500 https://deb.nodesource.com/node_20.x nodistro/main amd64 Packages
           20.0.0-1nodesource1 1001
              500 https://deb.nodesource.com/node_20.x nodistro/main amd64 Packages
           12.22.12~dfsg-1~deb11u5 500
              500 https://deb.debian.org/debian-security bullseye-security/main amd64 Packages
           12.22.12~dfsg-1~deb11u4 500
              500 https://deb.debian.org/debian bullseye/main amd64 Packages
      
      Temp directories causing deletion problem: 0
      No problems detected
      
      Errors in npm tree: 0
      No problems detected
      
      *** ioBroker-Installation ***
      
      ioBroker Status
      iobroker is running on this host.
      
      
      Objects type: jsonl
      States  type: jsonl
      
      Hosts:
      smarti              smarti (version: 7.0.6, hostname: smarti        , alive, uptime: 10923)
      
      Core adapters versions
      js-controller: 	7.0.6
      admin: 		7.4.7
      javascript: 	"javascript" not found
      
      nodejs modules from github: 	0
      
      Adapter State
      + system.adapter.admin.0                  : admin                 : smarti                                   -  enabled, port: 8081, bind: 0.0.0.0, run as: admin
      + system.adapter.backitup.0               : backitup              : smarti                                   -  enabled
      + system.adapter.bmw.0                    : bmw                   : smarti                                   -  enabled
        system.adapter.daswetter.0              : daswetter             : smarti                                   -  enabled
      + system.adapter.discovery.0              : discovery             : smarti                                   -  enabled
        system.adapter.feiertage.0              : feiertage             : smarti                                   -  enabled
        system.adapter.ical.0                   : ical                  : smarti                                   -  enabled
        system.adapter.mielecloudservice.0      : mielecloudservice     : smarti                                   -  enabled
        system.adapter.netatmo-crawler.0        : netatmo-crawler       : smarti                                   -  enabled
      + system.adapter.pvforecast.0             : pvforecast            : smarti                                   -  enabled
        system.adapter.schoolfree.0             : schoolfree            : smarti                                   -  enabled
      + system.adapter.simple-api.0             : simple-api            : smarti                                   -  enabled, port: 8087, bind: 0.0.0.0, run as: admin
      + system.adapter.smartmeter.0             : smartmeter            : smarti                                   -  enabled
      + system.adapter.smartmeter.1             : smartmeter            : smarti                                   -  enabled
      
      + instance is alive
      
      Enabled adapters with bindings
      + system.adapter.admin.0                  : admin                 : smarti                                   -  enabled, port: 8081, bind: 0.0.0.0, run as: admin
      + system.adapter.simple-api.0             : simple-api            : smarti                                   -  enabled, port: 8087, bind: 0.0.0.0, run as: admin
      
      ioBroker-Repositories
      ┌─────────┬──────────┬─────────────────────────────────────────────────────────┬──────────────┐
      │ (index) │ name     │ url                                                     │ auto upgrade │
      ├─────────┼──────────┼─────────────────────────────────────────────────────────┼──────────────┤
      │ 0       │ 'stable' │ 'http://iobroker.live/repo/sources-dist-latest.json'    │ false        │
      │ 1       │ 'beta'   │ 'http://download.iobroker.net/sources-dist-latest.json' │ false        │
      └─────────┴──────────┴─────────────────────────────────────────────────────────┴──────────────┘
      
      Active repo(s): stable
      Upgrade policy: none
      
      Installed ioBroker-Instances
      Used repository: stable
      Adapter    "admin"        : 7.4.7    , installed 7.4.7
      Adapter    "backitup"     : 3.0.31   , installed 3.0.31
      Adapter    "bmw"          : 2.9.0    , installed 2.9.0
      Adapter    "daswetter"    : 3.2.2    , installed 3.2.2
      Adapter    "discovery"    : 5.0.0    , installed 5.0.0
      Adapter    "feiertage"    : 1.2.0    , installed 1.2.0
      Adapter    "ical"         : 1.16.1   , installed 1.16.1
      Controller "js-controller": 7.0.6    , installed 7.0.6
      Adapter    "mielecloudservice": 6.5.7, installed 6.5.7
      Adapter    "netatmo-crawler": 0.8.1  , installed 0.8.1
      Adapter    "pvforecast"   : 4.1.0    , installed 4.1.0
      Adapter    "schoolfree"   : 1.1.6    , installed 1.1.6
      Adapter    "simple-api"   : 2.8.0    , installed 2.8.0
      Adapter    "smartmeter"   : 3.4.0    , installed 3.4.0
      
      Objects and States
      Please stand by - This may take a while
      Objects: 	8894
      States: 	8147
      
      *** OS-Repositories and Updates ***
      W: GPG error: https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/3.6 Release: The following signatures were invalid: EXPKEYSIG 58712A2291FA4AD5 MongoDB 3.6 Release Signing Key <packaging@mongodb.com>
      Hit:1 https://deb.debian.org/debian bullseye InRelease
      Hit:2 https://deb.debian.org/debian bullseye-updates InRelease
      Hit:3 https://deb.debian.org/debian-security bullseye-security InRelease
      Hit:4 https://deb.nodesource.com/node_20.x nodistro InRelease
      Hit:5 https://deb.debian.org/debian bullseye-backports InRelease
      Ign:6 https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/3.6 InRelease
      Hit:8 http://repo.mongodb.org/apt/debian bullseye/mongodb-org/7.0 InRelease
      Hit:7 https://dl.ui.com/unifi/debian stable InRelease
      Hit:9 https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/3.6 Release
      Get:10 https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/3.6 Release.gpg [801 B]
      Ign:10 https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/3.6 Release.gpg
      Fetched 801 B in 1s (720 B/s)
      Reading package lists...
      W: GPG error: https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/3.6 Release: The following signatures were invalid: EXPKEYSIG 58712A2291FA4AD5 MongoDB 3.6 Release Signing Key <packaging@mongodb.com>
      Pending Updates: 0
      
      *** Listening Ports ***
      Active Internet connections (only servers)
      Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode      PID/Program name    
      tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      1001       11708      450/iobroker.js-con 
      tcp        0      0 127.0.0.1:9001          0.0.0.0:*               LISTEN      1001       11703      450/iobroker.js-con 
      tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      0          9156       1/init              
      tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      0          12487      387/sshd: /usr/sbin 
      tcp6       0      0 :::111                  :::*                    LISTEN      0          9160       1/init              
      tcp6       0      0 :::8081                 :::*                    LISTEN      1001       12836      520/io.admin.0      
      tcp6       0      0 :::22                   :::*                    LISTEN      0          12498      387/sshd: /usr/sbin 
      tcp6       0      0 :::8087                 :::*                    LISTEN      1001       15706      786/io.simple-api.0 
      udp        0      0 0.0.0.0:68              0.0.0.0:*                           0          11493      255/dhclient        
      udp        0      0 0.0.0.0:111             0.0.0.0:*                           0          9157       1/init              
      udp6       0      0 :::111                  :::*                                0          9163       1/init              
      
      *** Log File - Last 25 Lines ***
      
      2024-12-17 11:00:30.096  - info: smartmeter.1 (690) Received 11 values, 3 updated
      2024-12-17 11:00:33.008  - info: host.smarti instance system.adapter.daswetter.0 in version "3.2.2" started with pid 18013
      2024-12-17 11:00:33.810  - error: Could not add plugins: Cannot find module '@iobroker/plugin-sentry'
      Require stack:
      - /opt/iobroker/node_modules/@iobroker/js-controller-adapter/node_modules/@iobroker/plugin-base/lib/PluginHandler.js
      - /opt/iobroker/node_modules/@iobroker/js-controller-adapter/node_modules/@iobroker/plugin-base/index.js
      - /opt/iobroker/node_modules/@iobroker/js-controller-adapter/build/cjs/lib/adapter/adapter.js
      - /opt/iobroker/node_modules/@iobroker/js-controller-adapter/build/cjs/index.js
      - /opt/iobroker/node_modules/@iobroker/adapter-core/build/cjs/utils.js
      2024-12-17 11:00:34.078  - info: daswetter.0 (18013) starting. Version 3.2.2 in /opt/iobroker/node_modules/iobroker.daswetter, node: v20.18.1, js-controller: 7.0.6
      2024-12-17 11:00:36.542  - info: smartmeter.0 (672) Received 7 values, 3 updated
      2024-12-17 11:00:41.057  - info: daswetter.0 (18013) still wrong data structure from server received! repaired...
      2024-12-17 11:00:42.841  - info: daswetter.0 (18013) Terminated (ADAPTER_REQUESTED_TERMINATION): All data handled, adapter stopped until next scheduled moment
      2024-12-17 11:00:43.008  - info: host.smarti instance system.adapter.netatmo-crawler.0 in version "0.8.1" started with pid 18653
      2024-12-17 11:00:43.350  - info: daswetter.0 (18013) cleaned everything up...
      2024-12-17 11:00:43.362  - info: host.smarti instance system.adapter.daswetter.0 having pid 18013 terminated with code 11 (ADAPTER_REQUESTED_TERMINATION)
      2024-12-17 11:00:44.013  - error: Could not add plugins: Cannot find module '@iobroker/plugin-sentry'
      Require stack:
      - /opt/iobroker/node_modules/@iobroker/js-controller-adapter/node_modules/@iobroker/plugin-base/lib/PluginHandler.js
      - /opt/iobroker/node_modules/@iobroker/js-controller-adapter/node_modules/@iobroker/plugin-base/index.js
      - /opt/iobroker/node_modules/@iobroker/js-controller-adapter/build/cjs/lib/adapter/adapter.js
      - /opt/iobroker/node_modules/@iobroker/js-controller-adapter/build/cjs/index.js
      - /opt/iobroker/node_modules/@iobroker/adapter-core/build/cjs/utils.js
      2024-12-17 11:00:44.290  - info: netatmo-crawler.0 (18653) starting. Version 0.8.1 in /opt/iobroker/node_modules/iobroker.netatmo-crawler, node: v20.18.1, js-controller: 7.0.6
      2024-12-17 11:00:44.323  - info: netatmo-crawler.0 (18653) Getting data for stationid:70:ee:50:14:3f:98
      
      

      ============ Mark until here for C&P =============

      iob diag has finished.

      Press any key for a summary

      Kann man das sentry admin irgendwie nachinstallieren?

      posted in ioBroker Allgemein
      Toller Tenya
      Toller Tenya
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo