I finally got it working thanks to AI. For everybody struggeling. Please find my working script below.
Code:
local http = require('socket.http')
local bit = require('bit')
-- CONFIGURATION
local url = 'http://192.168.1.1/current/current_packets.vbus'
local alarm_obj = '0/4/28' -- DPT 1.005: 1 = ALARM, 0 = OK
function parseVBus()
local response, status = http.request(url)
-- 1. HTTP Connection Check (Network/KM2 Failure)
if status ~= 200 or not response then
grp.checkupdate(alarm_obj, true) -- ALARM ON
log("[SLL ALARM] KM2 unreachable. Network or Power issue.")
return
end
local function getVal(b1, b2)
if not b1 or not b2 then return 0 end
local v = (b2 * 256) + b1
if v > 32767 then v = v - 65536 end
return v * 0.1
end
-- 2. Find the primary SLL Data Header
local p = response:find('\16\00\113\34\16')
if p then
-- System is healthy
grp.checkupdate(alarm_obj, false) -- ALARM OFF (OK)
-- SENSORS
local s1 = getVal(response:byte(p+16), response:byte(p+17))
local s2 = getVal(response:byte(p+18), response:byte(p+19))
local s3 = getVal(response:byte(p+20), response:byte(p+21))
local s4 = 0
local p_extra = response:find('\16\00\00\01\76', p)
if p_extra then
s4 = getVal(response:byte(p_extra+18), response:byte(p_extra+19))
end
-- PWM & RELAYS (Verified Mapping)
local pwa = response:byte(p+32) or 0 -- PWM A
local r2 = response:byte(p+33) or 0 -- Relay 2 (Diverting Valve)
local mask = response:byte(p+40) or 0
local r1 = (bit.band(mask, 0x01) == 0x01) and 100 or 0 -- Relay 1 (Pump Power)
-- Safety Cleanup
if pwa > 100 then pwa = 0 end
if r1 > 100 then r1 = 100 end
if r2 > 100 then r2 = 100 end
-- KNX UPDATES
grp.checkupdate('0/4/26', s1)
grp.checkupdate('0/4/20', s2)
grp.checkupdate('0/4/23', s3)
grp.checkupdate('0/4/21', s4)
grp.checkupdate('0/4/24', pwa)
grp.checkupdate('0/4/27', r1)
grp.checkupdate('0/4/25', r2)
else
-- 3. Data Header Missing (VBus Cable or Controller Mode Failure)
grp.checkupdate(alarm_obj, true) -- ALARM ON
log("[SLL ALARM] KM2 online but VBus data stream invalid.")
end
end
parseVBus()