ZitatErst einmal gehört das nicht eigentlich in das MQTT-Unterforum, sondern in "Wallboxen und E-Fahrzeuge". Denn hier geht es nicht um ein MQTT-spezifisches Problem.
ZitatAnleitung hier funktioniert bei mir leider nicht.Das ist mir zu vage.
Zitat von: Prof. Dr. Peter Henning am 29 November 2025, 16:48:05Nach kurzer Diskussion mit Till Steinbach hat dieser die Version 0.9.3 des Carconnectivity-connector-volkswagen freigegeben. Darin sind jetzt auch die Daten für Türen und Fenster drin, prima. Man muss nur in der Konfiguration setzenZitat"force_enable_access": true // To allow for door/window state
Jetzt fehlt von den kritischen Readings nur noch die Überwachung des 12V-Batterielevel.
boxName
energy
environment
initDPM
led
log_filter_all
log_filter_fon
log_filter_sys
netDev
wGuest
wKey
wSet
wTime
wSet
wlanChannels
wlanEnvironment
wps
Ein Fehler wird ausgeworfen bei:ringtones # Initialize internal structures
map { addToAttrList($_, "FHEMWEB") } (
"additionalInformIds",
"cmdIcon",
"devStateIcon:textField-long",
"devStateStyle",
"icon",
"sortby",
"webCmd",
"webCmdLabel:textField-long",
"widgetOverride"
); my %h = map { $_ => 1 } devspec2array($filter);
# --- Manuelle IDs in den Überwachungs-Hash injizieren (start)---
my $addIds = AttrVal($FW_wname, "additionalInformIds", undef);
if(my $addIds = AttrVal($FW_wname, "additionalInformIds", undef)) {
map { $h{$_} = $FW_visibleDeviceHash{$_} = 1 if($defs{$_}) } split(/\s*,\s*/, $addIds);
}
# --- Manuelle IDs in den Überwachungs-Hash injizieren (ende)---
$h{global} = 1 if( $me->{inform}{addglobal} );attr WEBphone additionalInformIds Pumpe_FBH_Pwr,Kuehlschrank #!/opt/fhem/tapo/.venv/bin/python3
import subprocess
import time
import requests
import os
SNAPSHOT_SCRIPT = "/opt/fhem/tapo_snapshot.sh"
SNAPSHOT_PATH = "/opt/fhem/www/images/Tapo.jpg"
PREV_PATH = "/tmp/Tapo_prev.jpg"
FHEM_IP = "192.168.0.0"
FHEM_PORT = "8083"
COOLDOWN = 60
INTERVAL = 10
last_alert = 0
def take_snapshot():
subprocess.run(["sudo", SNAPSHOT_SCRIPT], capture_output=True)
def images_differ():
if not os.path.exists(PREV_PATH):
return False
subprocess.run(["convert", SNAPSHOT_PATH, "-resize", "320x180!", "/tmp/curr.jpg"], capture_output=True)
subprocess.run(["convert", PREV_PATH, "-resize", "320x180!", "/tmp/prev.jpg"], capture_output=True)
result = subprocess.run([
"compare", "-metric", "PSNR",
"/tmp/curr.jpg", "/tmp/prev.jpg",
"/dev/null"
], capture_output=True, text=True)
raw = result.stderr.strip()
try:
psnr = float(raw.split()[0])
print(f"PSNR: {psnr}", flush=True)
return psnr < 18
except:
print(f"Parse Fehler: '{raw}'", flush=True)
return False
def send_alert():
requests.get(
f"http://{FHEM_IP}:{FHEM_PORT}/fhem",
params={"cmd": "set telegram_andre sendImage /opt/fhem/www/images/Tapo.jpg Bewegung Tapo C210", "XHR": "1"}
)
print("Starte Motionerkennung...", flush=True)
# Erstes Bild als Referenzwert
take_snapshot()
time.sleep(2)
subprocess.run(["cp", SNAPSHOT_PATH, PREV_PATH])
print("Referenzbild gespeichert", flush=True)
while True:
try:
# dann neues bild holen
take_snapshot()
time.sleep(2)
# Vergleichen mit vorherigem Bild
now = time.time()
if images_differ() and (now - last_alert > COOLDOWN):
last_alert = now
print(f"Bewegung erkannt! {time.strftime('%H:%M:%S')}", flush=True)
send_alert()
# Aktuelles Bild als neues Referenzbild speichern
subprocess.run(["cp", SNAPSHOT_PATH, PREV_PATH])
except Exception as e:
print(f"Fehler: {e}", flush=True)
time.sleep(INTERVAL)snapshot.sh ist das hier vorgestellte.Zitat von: JudgeDredd am 04 April 2026, 18:37:51Ich dachte nur, ich klöppele was aus den Teilen, die ich sowieso noch hier rumliegen habe was zusammen.