Hauptmenü

Neueste Beiträge

#1
Homematic / Aw: Hm-OU-CFM-PL bei "regSet" ...
Letzter Beitrag von Beta-User - 22 Februar 2026, 20:48:24
Hmm. Fhem, cul_hm und co sind aktuell?
#2
Solaranlagen / Aw: Deye 3 Phasen Hochvolt Hyb...
Letzter Beitrag von dg02 - 22 Februar 2026, 20:36:13
Hallo Chris,
vielen Dank für die neuerlich angepasste, ausführliche Zusammenstellung deiner Konfiguration. Ich werde es damit nochmals ausprobieren, obwohl ich der Meinung bin, das alles in dieser Form schon durchgeführt zu haben.
Mein Problem ist, dass die RS485-Schnittstelle nicht "antwortet". Die Anfragen werden rausgesendet und als Antwort kommt im Logfile "ModbusRS485: Timeout waiting for a modbus response, read buffer empty". Auf dem Adapter blinkt nur kurz die "TXD"-LED, aber niemals die "RXD"-LED.
Falls ich eine Lösung finden sollte, werde ich dies hier beschreiben.

Viele Grüße
Gerhard
#3
Multimedia / Aw: [82_LGTV_WebOS.pm] Modul f...
Letzter Beitrag von CoolTux - 22 Februar 2026, 19:46:45
Bei einem HTTP 400 scheint fhem eine falsche Anfrage an den LG zu stellen.

Das könnte an einem nicht vorhandenen Pairing liegen.
Aktuell fällt mir dazu gerade nichts ein.
#4
Wallboxen und E-Fahrzeuge / Wie findet man die passende Wa...
Letzter Beitrag von betateilchen - 22 Februar 2026, 19:40:16
Moin,

irgendwie vermisse ich hier im Unterforum einen "Empfehlungs-Thread".

Konkret bin ich auf der Suche nach einer 1-phasigen Wallbox mit 7,4kW.
Möglichst ohne fest angeschlossenes Kabel.
Anbindung an FHEM wäre nett.
Themen wie Überschussladen stehen hier nicht zur Diskussion, da ich hier nur Mieter bin.

Und ich bin ohnehin gespannt, wie mein Vermieter auf meine heute gestellte Genehmigungsanfrage reagiert. Ja, ich weiß, dass ich als Mieter grundsätzlich einen Anspruch geltend machen kann, der schwer abzulehnen ist. Aber in einem 10-Parteien-Haus kann ich auch den Vermieter verstehen, wenn er hadert.

Oder anders ausgedrückt: Wie soll man darüber entscheiden, welche Wallbox die "richtige" ist, wenn man sich mit dem Thema "Laden (m)eines E-Autos" zum ersten Mal befasst?
#5
Homematic / Aw: Hm-OU-CFM-PL bei "regSet" ...
Letzter Beitrag von cocojambo - 22 Februar 2026, 19:38:14
Ich habe die Zeile 5824 (bei mir ist es die 5830) geändert.
natürlich mit reload 10_CUL_HM.pm und sicherheitshalber Neustart, ändert aber nix an der Fehlermeldung: ...out of range...

Gruß Nobbi
#6
Multimedia / Aw: [82_LGTV_WebOS.pm] Modul f...
Letzter Beitrag von fireball - 22 Februar 2026, 18:44:13
so einfach isses dann scheinbar doch nicht...

2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Current processing buffer (PARTIAL + incoming data): HTTP/1.1 400 Bad Request
Connection: close


2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message: H
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message: T
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message: T
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message: P
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message: /
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message: 1
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message: .
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message: 1
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message:
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message: 4
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message: 0
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message: 0
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message:
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message: B
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message: a
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message: d
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message:
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message: R
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message: e
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message: q
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message: u
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message: e
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message: s
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message: t
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message:
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message:

2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message: C
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message: o
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message: n
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message: n
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message: e
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message: c
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message: t
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message: i
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message: o
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message: n
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message: :
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message:
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message: c
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message: l
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message: o
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message: s
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message: e
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message:
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message:

2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message:
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Garbage character before message:

2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - return msg:  and tail:
2026.02.22 18:40:49 4: LGTV_WebOS (TV_MZ) - PARTIAL lenght: 0
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - Tail:
2026.02.22 18:40:49 5: LGTV_WebOS (TV_MZ) - PARTIAL:
2026.02.22 18:40:49 4: LGTV_WebOS (TV_MZ) - ReadFn started
2026.02.22 18:40:49 4: LGTV_WebOS (TV_MZ) - can't read from socket, autodie exception: Can't sysread(IO::Socket::SSL=GLOB(0x55a8830000), <UNDEF>, 10240): Connection reset by peer at lib/FHEM/Devices/LGTV/LGTVWebOS.pm line 778

PuTTYPuTTYPuTTYPuTTYPuTTYPuTTYPuTTYPuTTYPuTTYPuTTYPuTTYPuTTYPuTTYPuTTYPuTTYPuTTYPuTTYPuTTYPuTTYPuTTYPuTTYPuTTYPuTTY2026.02.22 18:40:49 4: LGTV_WebOS (TV_MZ) - Socket Disconnected

Also FHEM kann keine Verbindung zum TV aufbauen.

Das stand noch im Log:
2026.02.22 17:55:20 4: LGTV_WebOS (TV_MZ) - Baue Socket Verbindung auf
2026.02.22 17:55:21 4: LGTV_WebOS (TV_MZ) Couldn't connect to 192.168.178.26:3000/3001
2026.02.22 17:55:31 4: LGTV_WebOS (TV_MZ) - Baue Socket Verbindung auf
2026.02.22 17:55:31 4: LGTV_WebOS (TV_MZ) Couldn't connect to 192.168.178.26:3000/3001
2026.02.22 17:55:41 4: LGTV_WebOS (TV_MZ) - Baue Socket Verbindung auf
2026.02.22 17:55:42 4: LGTV_WebOS (TV_MZ) Couldn't connect to 192.168.178.26:3000/3001

Kann man sonst noch was überprüfen?
#7
Sonstige Systeme / Aw: Support-Thread Modul 36_Sh...
Letzter Beitrag von Starkstrombastler - 22 Februar 2026, 18:33:20
Zitat von: jkriegl am 22 Februar 2026, 17:12:22http://192.168.178.xx:8083/fhem?cmd=set myShelly out_off
Das ist ein SET-Befehl, mit dem Änderungen auf dem Shelly an Fhem mitgeteilt werden, ohne auf dem Shelly selbst irgendetwas auzulösen.
Hinweis: Leerzeichen mit %20 oder + maskieren.

Genau das habe ich auch ergänzt, um die von Elektron beschriebenen Aktionen zu ergänzen:
Zitat von: Elektron am 22 Februar 2026, 14:08:32Im Shelly selber habe ich zwei Aktionen definiert:

http://192.168.178.107:8083/fhem?cmd=set+Y182+out_off
http://192.168.178.107:8083/fhem?cmd=set+Y182+out_on
Damit bekommt das Modul jeden Wechsel zeitnah mit.
Im Eventmonitor, getriggert auf die Readings timer und relay, beobachte ich allerdings, dass dreifach(!) geschaltet wird:
2026-02-22 15:37:09.390 Shelly Y182 timer: 1.0 sec = 2026-02-22 15:37:10
2026-02-22 15:37:10.512 Shelly Y182 relay: on
2026-02-22 15:37:10.549 Shelly Y182 timer: -
2026-02-22 15:37:10.655 Shelly Y182 relay: off
2026-02-22 15:37:11.017 Shelly Y182 relay: on
2026-02-22 15:37:11.017 Shelly Y182 timer: 299.7 sec = 2026-02-22 15:42:10
und
2026-02-22 15:42:03.800 Shelly Y182 timer: 6.9 sec = 2026-02-22 15:42:10
2026-02-22 15:42:10.809 Shelly Y182 relay: off
2026-02-22 15:42:10.852 Shelly Y182 relay: on
2026-02-22 15:42:10.852 Shelly Y182 timer: 300.0 sec = 2026-02-22 15:47:10
2026-02-22 15:42:11.289 Shelly Y182 relay: off
2026-02-22 15:42:11.289 Shelly Y182 timer: 3999.7 sec = 2026-02-22 16:48:51

Problematisch ist also die Definiton der Aktionen, denn es wird ein sofortiger Schaltvorgang und ein zeitverzögerter Vorgang ausgelöst.
Bei Event 'Switch toggled on' sollte auch 'set output state on' und umgekehrt gewählt werden.

Damit funktioniert das Ganze bei mir ohne Mehrfach-Schaltvorgänge.

#8
Wallboxen und E-Fahrzeuge / Aw: Umstellung auf myHyundai-A...
Letzter Beitrag von optimizer - 22 Februar 2026, 18:27:46
Zitat von: RPort am 22 Februar 2026, 11:16:52Für Hyundai hat das bei mir nicht funktioniert.
Haben sich vtl. für Hyundai die Hosts geändert?
Kann jemand bestätigen, dass es für Hyundai noch funktioniert und ggf. wie
Du müstest auf alle Fälle im Script brand: 'kia' auf 'hyundai' ändern und ausprobieren. Bin mir aber nicht sicher, ob Hyundai die gleichen Anmelde-Server hat.
#9
Wallboxen und E-Fahrzeuge / Aw: Umstellung auf myHyundai-A...
Letzter Beitrag von optimizer - 22 Februar 2026, 18:22:13
Zitat von: Rewe2000 am 21 Februar 2026, 20:06:49Wenn es Probleme macht den Code dem PDF zu entnehmen, kurze Nachricht und ich stelle diesen nochmals als Code hier ein.

Das würde anderen sicher helfen.

Ich habe das Script (mit Hilfe von Claude.ai) etwas umgebaut:
- für ältere Kia-Fahrzeuge (z.B. eNiro) ist die JSON Struktur etwas anders.
- es kommt oft vor dass die Antwort mit Bad Request endet. Daher gibt es einen 3-maligen Retry.
Auf Repository https://github.com/PierreLevres/Kuvork.git zu wechseln (anstatt https://github.com/Hacksore/bluelinky ) war bei mir der entscheidende Hinweis.
Hier mein Script:
#!/usr/bin/env node

// --- Imports ---
const fs = require('fs');
const path = require('path');
const { BlueLinky } = require('./dist/index.cjs');
const MQTT = require("async-mqtt");

// --- Konfiguration laden ---
const configPath = "/home/pi/.config/kia/credentials.json";
let config;

try {
  const raw = fs.readFileSync(configPath, 'utf8');
  config = JSON.parse(raw);
} catch (err) {
  console.error(`Fehler beim Laden der Config-Datei (${configPath}): ${err.message}`);
  process.exit(1);
}

// --- Hilfsfunktionen ---

// Zahlenwerte sicher abfragen
function safeValue(value) {
  return (typeof value === "number" && !isNaN(value)) ? value : null;
}

// Ladestecker 0/1/2 in Textrückmeldung wandeln
function connectorToText(value) {
  if (value === 0) return "nicht angeschlossen";
  if (value >= 1) return "gesteckt";  // 2=AC, 1=DC, beide sind "gesteckt"
  return "unbekannt";
}

// Hilfsfunktion für Datum/Zeit-Format
function getFormattedDateTime() {
  const now = new Date();
  const year = now.getFullYear();
  const month = String(now.getMonth() + 1).padStart(2, '0');
  const day = String(now.getDate()).padStart(2, '0');
  const hours = String(now.getHours()).padStart(2, '0');
  const minutes = String(now.getMinutes()).padStart(2, '0');
  const seconds = String(now.getSeconds()).padStart(2, '0');
  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}

// --- Retry-Konfiguration ---
let retryCount = 0;
const MAX_RETRIES = 2;
const RETRY_DELAY = 10000; // 10 Sekunden

// --- Verbindungsversuch ---
async function attemptConnection() {
  return new Promise((resolve, reject) => {
    console.log(`Verbindungsversuch ${retryCount + 1}/${MAX_RETRIES + 1}...`);

    const client = new BlueLinky({
      username: config.api.username,
      password: config.api.password,
      brand: 'kia',
      region: 'EU',
      pin: config.api.pin,
      language: 'de'
    });

    let readyReceived = false;
    const timeout = setTimeout(() => {
      if (!readyReceived) {
        console.log('⚠️  Timeout - kein Ready-Event empfangen');
        reject(new Error('Timeout waiting for ready event'));
      }
    }, 30000); // 30 Sekunden Timeout

    client.on('ready', async () => {
      readyReceived = true;
      clearTimeout(timeout);
      console.log('✅ Ready-Event empfangen');

      try {
        await handleVehicleData(client);
        resolve();
      } catch (err) {
        reject(err);
      }
    });

    client.on('error', (err) => {
      if (err.path && err.path.includes('notifications/register')) {
        console.log('⚠️  Push-Notification fehlgeschlagen (ignoriert)');
        return;
      }

      console.error('❌ Login-Fehler:', err.message);
      clearTimeout(timeout);
      reject(err);
    });
  });
}

// --- Fahrzeugdaten verarbeiten ---
async function handleVehicleData(client) {
  const vehicle = client.getVehicle(config.api.vin);

  console.log('Hole Fahrzeugdaten...');

  const status = await vehicle.status({ parsed: false, refresh: true });
  const location = await vehicle.location();
  const odometer = await vehicle.odometer();

  // Einzelwerte mit Sicherheitsprüfung
  const odo = safeValue(odometer?.value);
  const ran = safeValue(status?.evStatus?.drvDistance?.[0]?.rangeByFuel?.evModeRange?.value);
  const soc = safeValue(status?.evStatus?.batteryStatus);
  const typ = connectorToText(safeValue(status?.evStatus?.batteryPlugin));
  const bat = safeValue(status?.battery?.batSoc);
  const lat = safeValue(location?.latitude);
  const lon = safeValue(location?.longitude);
  const carLocked = status?.doorLock;
  const batteryCharge = status?.evStatus?.batteryCharge;

  // Ausgabe
  console.log("odometer (Kilometerstand):", odo);
  console.log("range (Reichweite):", ran);
  console.log("SOC (Batterieladestand):", soc);
  console.log("chargingPlug (Ladestecker):", typ);
  console.log("battery12V_SOC (Ladestand 12V Batterie):", bat);
  console.log("Locked (Fahrzeug verschlossen):", carLocked);
  console.log("latitude (Breitengrad):", lat);
  console.log("longitude (Längengrad):", lon);
  console.log("batteryCharge (Battery wird geladen):", batteryCharge);
  console.log("lastUpdate (Abfragedatum):", getFormattedDateTime());

  // Validierung: Nur wenn wichtige Daten vorhanden sind
  if (typeof odo !== "number" || isNaN(odo) || typeof soc !== "number" || isNaN(soc)) {
    throw new Error("Unvollständige Daten empfangen (Odometer oder SOC fehlt)");
  }

  // An MQTT senden
  const mqttClient = await MQTT.connectAsync(config.mqtt.host, {
    username: config.mqtt.username,
    password: config.mqtt.password
  });

  console.log("Sending to MQTT server");

  const topic = `BluelinkCarStatus/${config.api.vin}`;
  await mqttClient.publish(
    topic,
    JSON.stringify({
      odometer: Math.round(odo),
      range: ran,
      SOC: soc,
      chargingPlug: typ,
      battery12V_SOC: bat,
      locked: carLocked,
      latitude: lat,
      longitude: lon,
      batteryCharge: batteryCharge,
      state: `Ladekabel: ${typ} SOC: ${soc}% range: ${ran}`,
      lastUpdate: getFormattedDateTime()
    }),
    { retain: true, qos: 1 }
  );

  await mqttClient.end();
  console.log("✅ MQTT call Done");
}

// --- Fehler an MQTT senden ---
async function sendErrorToMQTT(errorMessage) {
  try {
    const mqttClient = await MQTT.connectAsync(config.mqtt.host, {
      username: config.mqtt.username,
      password: config.mqtt.password
    });

    await mqttClient.publish(
      `BluelinkCarStatus/${config.api.vin}`,
      JSON.stringify({
        state: `Fehler: ${errorMessage}`,
        lastUpdate: getFormattedDateTime()
      }),
      { retain: true, qos: 1 }
    );

    await mqttClient.end();
    console.log('Fehlerstatus an MQTT gesendet');
  } catch (mqttErr) {
    console.error('❌ Konnte Fehler nicht an MQTT senden:', mqttErr.message);
  }
}

// --- Haupt-Ausführung mit Retry ---
(async function main() {
  console.log('=== Kia UVO zu FHEM/MQTT Bridge ===');

  while (retryCount <= MAX_RETRIES) {
    try {
      await attemptConnection();
      console.log('\n✅ Erfolgreich abgeschlossen');
      process.exit(0);

    } catch (err) {
      console.error(`\n❌ Versuch ${retryCount + 1} fehlgeschlagen:`, err.message);

      retryCount++;

      if (retryCount <= MAX_RETRIES) {
        console.log(`⏳ Warte ${RETRY_DELAY/1000} Sekunden vor erneutem Versuch...\n`);
        await new Promise(resolve => setTimeout(resolve, RETRY_DELAY));
      } else {
        console.error(`\n❌ Maximale Anzahl an Versuchen erreicht (${MAX_RETRIES + 1})`);

        // Fehler an MQTT senden
        await sendErrorToMQTT(`Fehler nach ${MAX_RETRIES + 1} Versuchen: ${err.message}`);

        process.exit(1);
      }
    }
  }
})();


#10
Homematic / Aw: Hm-OU-CFM-PL bei "regSet" ...
Letzter Beitrag von Beta-User - 22 Februar 2026, 17:57:54
Puh, sieht nach einem dicken Brett aus...

Die Fehlermeldung kommt nach meinem Verständnis aus Zeile 5822 von 10_CUL_HM.pm.

In Zeile 5824 steht jetzt:
             if (!($conv =~ m/^(lit|hex|min2time)$/)&&
Das könntest du testweise ändern in
             if ( #!($conv =~ m/^(lit|hex|min2time)$/)&&Dann die Datei neu laden oder FHEM neu starten und nochmal testen.

Damit wird der Check teilweise ausgeschaltet, was Nebenwirkungen haben kann, von daher sollte das wieder zurückgestellt werden, wenn die Aktion(en) erfolgreich durchgeführt wurde(n).

Warum der Code überhaupt scheitert (oder das bisher keiner gemerkt hat, dass da (wohl in Zeile 424 von HMConfig.pm) eventuell was in "c=>''" fehlt?), erschließt sich mir nicht recht, das scheint eigentlich nichts Modell-spezifisches zu sein...