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.
ZitatPS: Etwas seltsam finde ich auch, dass der Verbraucher immer für 4h eingeplant wird, obgleich mintime=180. Ich hätte erwartet, dass er ihn wenigstens für 3h einplant plus den Stunden, in denen genügend PV-Überschuss da ist. Am aktuellen Tag wären es dann 4h und am morgigen Tag 8hIn deinen bereitgestellten Daten ist aber erkennbar, dass der Consumer genau mit 3 Stunden (mintime=180) eingeplant wurde, also so wie du es vorgegeben hast:
2026-04-05 09:47:51 consumer03 name='Wallbox' state='off' mode='can' planningstate='planned'
2026-04-05 09:47:51 consumer03_currentPower 0 W
2026-04-05 09:47:51 consumer03_planned_start 05.04.2026 12:00:00
2026-04-05 09:47:51 consumer03_planned_stop 05.04.2026 15:00:00
ZitatDa mein Watchdog-Prozess ausgelöst hat, frage ich mich, ob die Kontaktaufnahme zu o.g. Server möglicherweise blockierend ist.Eher nicht. Bei der Meldung "SF - Open-Meteo API server response:..." hat HttpUtils bereits die Antwort zurück geliefert. Wenn etwas blockiert, müsste es in der Verarbeitung danach sein. Da sehe ich aber nichts was das sein könnte. Mal darüber schlafen.
ZitatErsetzt der Consumer-Typ bev den Consumer-Typ charger oder sind bei Bedarf x Consumer von Typ charger und y Consumer vom Typ bev zu definieren?Der Typ Charger gibt es weiterhin. Die Idee dahinter war aber simpler als es scheint. Gedacht ist dieser Typ zum Beispiel für einen Plug an dem ein Tablet oder Mobiltel zum Aufladen gehängt ist. Also einfache Ladegeräte.