Runtime DALI svetelné riadenie pre Modbus-DALI bránu RESI-DALI-SIO a RESI-DALI-ETH. Stmievanie pre až 64 ovládacích zariadení (gears), 16 broadcast skupín a per-gear DALI 1.0 stav, diagnostika porúch lampy/napájania a min/max úrovne cez Modbus RTU.
ResiModbus RTU80 zariadeníRevízia 1.3Posledná aktualizácia: 15. novembra 2026
Import do aplikácie TapHomeHardvér › Modbus › Pridať zo šablóny
Šablóna Resi DALI je runtime prevádzkový pendant nástroja Resi Dali - Konfigurácia na uvedenie do prevádzky. Pripája TapHome k plne adresovanej DALI svetelnej zbernici cez bránu RESI-DALI-SIO alebo RESI-DALI-ETH (Modbus-DALI) a sprístupňuje denné ovládanie pre až 64 individuálne adresovaných DALI ovládacích zariadení (gears) (krátke adresy 0–63) a 16 DALI broadcast skupín (0–15), plus per-gear DALI stav, diagnostika porúch ovládacieho zariadenia a porúch lampy.
Komunikácia s bránou používa Modbus RTU pri 9600 baud 8N1. Zápisy jasu idú do H:510 LAMP LEVEL (per-gear) a H:520 GROUP LEVEL (per-skupina); per-gear konfiguračné príkazy a dotazy sú tunelované cez H:511 LAMP COMMAND / H:512 LAMP COMMAND + REPEAT, pričom register brány H:550 DALI STATUS sa pollie kvôli pripravenosti odpovede.
Táto šablóna predpokladá, že DALI krátke adresy sú už naprogramované na zbernici. Ak gear-y ešte nemajú adresu, použite najprv šablónu Resi Dali - Konfigurácia (alebo bezplatný nástroj výrobcu MODBUSConfigurator / DCA) na spustenie sprievodcu náhodným adresovaním DALI 2.0 — pozri Vzťah ku konfiguračnej šablóne nižšie.
RESI-DALI-SIO (RS-485) a RESI-DALI-ETH (Ethernet) sú master brány na DIN lištu, ktoré sú medzi sériovým/Ethernet hostom a DALI svetelnou zbernicou. SIO je v púzdre CEM17 (17,5 × 90 × 56,4 mm) a ETH v širšom púzdre CEM35 (35,8 × 90 × 56,4 mm), aby sa zmestil RJ45 konektor. Žiadna z brán nenapája DALI zbernicu sama — sprievodný DALI bus napájací zdroj (RESI-DALI-PS alebo akýkoľvek kompatibilný 200 mA DALI PSU) je povinný.
Zapojenie RESI-DALI-SIO (RS-485)
Svorky na ľavej strane RESI-DALI-SIO (zhora → nadol): GND, +12..48V=, RS485 DATA+ (A+), RS485 DATA- (B-), RS485 GND, RS232 TX, RS232 RX, RS232 GND. Svorky DALI zbernice na opačnej strane sú D+ / N/C / D- (3-pinový USLIM blok, prostredný N/C pin zostáva nezapojený).
Pre TapHome inštaláciu použite RS-485 rozhranie:
RS485 DATA+ (A+) → A+/D+ na TapHome RS-485 zbernici
RS485 DATA- (B-) → B-/D- na TapHome RS-485 zbernici
RS485 GND → GND na TapHome napájacom zdroji (odporúčané pre stabilnú komunikáciu)
+12..48V= / GND → 12–48 V DC primárne napájanie
Zapojenie RESI-DALI-ETH (Ethernet)
Ethernetová varianta má rovnaké svorky DALI zbernice (D+ / N/C / D-) a vstupy primárneho napájania (GND, +12..48V=), plus jediný RJ45 konektor pre 10/100 Mbit Ethernet. Továrenské IP nastavenia sú 192.168.0.191 / 255.255.255.0 / 192.168.0.1 s Modbus Unit ID 255; vstavané webové UI používa prihlasovacie údaje RESI / RESI.
Keďže ide o Modbus RTU šablónu, TapHome nekomunikuje s RESI-DALI-ETH cez natívny Modbus/TCP. Použite ho radšej v transparentnom režime RTU-over-Ethernet, alebo umiestnite SIO za sériovo-IP most (Moxa NPort, USR-TCP232) — pozri Konfigurácia → Nastavenie RTU-over-TCP nižšie.
DALI bus napájací zdroj (RESI-DALI-PS)
RESI-DALI-PS poskytuje až 200 mA na DALI zbernici (skratový prúd ~225 mA, napätie zbernice typicky 14–18 V) a podporuje až 64 DALI 1.0 predradníkov alebo DALI 2.0 ovládacích zariadení na jednej linke. Primárna strana akceptuje rovnaké 12–48 V DC napájanie ako jednotka SIO/ETH. Brána a PSU sa pripájajú na rovnaký pár D+ / D- — PSU napája zbernicu, pričom brána číta a zapisuje DALI rámce.
Tri LED diódy na PSU pomáhajú pri diagnostike porúch: POWER (primárne 12–48 V OK, počas normálnej prevádzky stále svieti), DALI (krátko bliká počas DALI komunikácie), ERR (trvalo svieti pri poruche PSU, DALI skrate alebo preťažení zbernice — počas normálnej prevádzky musí byť zhasnutá).
Topológia DALI zbernice
DALI linka má niekoľko tvrdých obmedzení, ktoré priamo ovplyvňujú stabilitu prevádzky:
Prierez vodiča
Max dĺžka DALI kábla
1,5 mm²
300 m
1,0 mm²
238 m
0,75 mm²
174 m
0,5 mm²
116 m
Limit vychádza z maximálne povoleného úbytku napätia 2 V na DALI kábli. Ďalšie pravidlá:
Maximálne 64 DALI 1.0 predradníkov a až 64 DALI 2.0 ovládacích zariadení na zbernici (oddelené priestory krátkych adries).
Iba stromová topológia — žiadne kruhy, žiadne slučky.
Skutočný počet gear-ov závisí aj od menovitého prúdu PSU (typicky 200 mA na RESI-DALI-PS; rátajte ~2 mA na gear plus rezervu).
RESI-DALI-PS (alebo ekvivalentný DALI PSU) je povinný. Bez neho brána nemôže napájať zbernicu a každé per-gear čítanie skončí timeoutom “Gear not responding!”. Ak sa na dlhú linku pridá druhý PSU, vložte DALI tlmivku alebo rozdeľte zbernicu na galvanicky oddelené segmenty.
Sériové parametre hosta na RESI-DALI-SIO sa volia 4-polohovým DIP prepínačom na module. TapHome šablóna je fixne nastavená na 9600 baud 8N1, takže DIP prepínače musia zodpovedať.
DIP1
DIP2
Baud rate
OFF
OFF
9600 bd (vyžadované TapHome)
ON
OFF
19200 bd
OFF
ON
38400 bd
ON
ON
Použije baud rate z FLASH (továrenský default 57600 bd)
DIP4
Zdroj Modbus Unit ID
OFF
FLASH register H:65221 je akceptovaný — vyžadované, ak bola počas uvedenia do prevádzky naprogramovaná neštandardná Slave ID
ON
Hardvérový fallback — Unit ID je vynútene 255, FLASH hodnota je ignorovaná
DIP3 je pre produkt vyhradený rezervný bit; nechajte ho v továrenskej polohe. Parita je fixná na None a stop bit na 1 (formát rámca 8N1) pre kombinácie DIP1/DIP2 baud rate vybrané vyššie.
RS-485 zakončenie: ukončte zbernicu odporom 120 Ω na oboch koncoch. TapHome Core poskytuje jedno zakončenie na svojich BUS svorkách; ak je RESI brána posledným zariadením na linke, pridajte diskrétny 120 Ω rezistor medzi A+ / B- na jej RS-485 svorkách.
Slave ID
Továrensky predvolená Modbus Unit ID je 255 (FLASH register H:65221 číta 0xFFFF, čo brána klampuje na 255). Šablóna sprístupňuje servisný atribút na úrovni modulu Slave ID, ktorý spätne číta tento register, takže nakonfigurovanú adresu možno overiť po importe.
Zmena Slave ID je záležitosťou uvedenia do prevádzky riešená sesterskou šablónou Resi Dali - Konfigurácia — táto runtime šablóna zámerne nezapisuje do H:65221 ani nespúšťa softvérový reset, takže môže ostať aktívna v projekte bez rizika náhodnej rekonfigurácie brány.
Nastavenie RTU-over-TCP
Keďže šablóna používa Modbus RTU pripojenie, ponúka sa aj importný parameter IpAddress pre inštalácie, kde TapHome dosiahne bránu cez sériovo-IP most (Moxa NPort, USR-TCP232) alebo cez RESI-DALI-ETH v transparentnom režime RTU-over-Ethernet. V tom prípade nasmerujte IpAddress na IP mosta / ETH jednotky a všetky ostatné nastavenia ponechajte rovnaké ako pri RS-485 variante. Pre čistý Modbus/TCP by bola prirodzenejšia TCP-based šablóna — táto Modbus RTU šablóna konkrétne očakáva rámcovanú RTU komunikáciu.
Iba jeden Modbus master naraz. Ani DALI ani Modbus RTU nearbitrujú medzi súbežnými master-mi. Ak PLC, BMS alebo PC nástroj (napríklad MODBUSConfigurator) tiež pollie bránu, dotazy gear-ov budú kolidovať a TapHome bude hlásiť sporadické chyby “Gear not responding!”.
Tá istá definícia Dali.xml sa s RESI bránou dodáva ako dve komplementárne TapHome šablóny, ktoré pracujú na rôznych fázach životného cyklu rovnakého hardvéru:
Šablóna
Fáza
Čo robí
Kedy použiť
Resi Dali - Konfigurácia (resi-dali-daliconfig)
Jednorazové uvedenie do prevádzky
Sprievodca DALI 2.0 náhodným adresovaním, per-adresa probe device-type, broadcast ON/OFF testy zdravia, Resetovať krátke adresy / Delete short address / Change short address, Set Slave ID, Reset Gateway
Nová inštalácia: priraďte krátke adresy 0–63 ovládacím zariadeniam, overte ktoré adresy sú obsadené
Resi DALI (resi-dali-dali, táto šablóna)
Denné runtime ovládanie
Per-gear stmievanie (64 gear-ov), skupinové stmievanie (16 skupín), per-gear DALI 1.0 diagnostika, správa členstva v skupinách
Po uvedení do prevádzky: koncové ovládanie osvetlenia
Typický priebeh projektu:
Zapojte a napájajte DALI zbernicu (RESI-DALI-PS) a bránu.
Importujte šablónu Resi Dali - Konfigurácia, spustite akciu modulu Resetovať krátke adresy (Confirm = Yes), potom na sprievodcovi Find New Devices vyberte Štart — sprievodca sám prejde stavmi Skenovať krátku adresu → Set SEARCHADDR → Kontrola → PROGRAM SHORT ADDRESS, kým sa nezastaví na Dokončiť; potom reláciu ukončite cez TERMINATE. Overte cez Gear 0..63 a Turn On / Off All Lamps.
Odstráňte modul Resi Dali - Konfigurácia z projektu.
Importujte šablónu Resi DALI (túto) na runtime ovládanie. Namapujte zariadenia Gear N a Group N na TapHome scény, časovače a pravidlá.
Obe šablóny môžu aj dočasne koexistovať — napr. pri pridávaní nového gear-u do živej inštalácie — ale len jedna by mala posielať Modbus komunikáciu naraz. Runtime šablóna zámerne vynecháva akcie rekonfigurácie brány (Reset Gateway, Set Slave ID, broadcast ALL LEVEL), aby mohla zostať v projekte bez rizika prepísania nastavení uvedenia do prevádzky.
Bezplatný DCA nástroj výrobcu MODBUSConfigurator (Windows, dostupný zo stránky RESI) možno tiež použiť na uvedenie do prevádzky namiesto TapHome šablóny Resi Dali - Konfigurácia. Runtime šablóna Resi DALI funguje rovnako bez ohľadu na to, ktorý nástroj bol použitý na priradenie krátkych adries.
Šablóna sprístupňuje 80 DALI zariadení v TapHome, organizovaných v dvoch paralelných skupinách: 64 stmievačov Gear (jeden na každú DALI krátku adresu) a 16 stmievačov Group (jeden na každú DALI skupinu). Jeden servisný atribút na úrovni modulu dopĺňa obraz.
Per-gear stmievanie — Gear 0 … Gear 63
Každé zo 64 servisných zariadení Gear 0, Gear 1, … Gear 63 je TapHome stmievač, ktorý cieli na jediné DALI ovládacie zariadenie pri zodpovedajúcej krátkej adrese. Zápisy jasu idú do H:510 LAMP LEVEL (TapHome 0–100 % je škálované lineárne do rozsahu DALI arc power, ohraničeného vlastnou MIN LEVEL a MAX LEVEL gear-u); skutočná úroveň sa spätne číta z H:511 cez DALI príkaz QUERY ACTUAL LEVEL (0xA0) a preškáluje sa späť do 0–100 %.
Keď šablóna importuje gear, init skript najprv probuje gear cez QUERY STATUS (0x90); akýkoľvek bajt odpovede dokazuje, že gear je prítomný, a uloží sa ako jeho stav. Odpoveď 0x8000 „bez odpovede" označí gear ako neodpovedajúci (na náhodných 1–60 s) a v TapHome logu vypíše „Gear not responding!". Ak gear odpovie, init skript ďalej prečíta QUERY MIN LEVEL (0xA2) a QUERY MAX LEVEL (0xA1) a uloží výsledky do interného stavu pre periodický readscript.
Každý dotaz je chránený pred zastaranými a poškodenými odpoveďami: pred každým dotazom šablóna vyčíta neprečítanú odpoveď, ktorá zostala v H:511, aby ju nepovažovala za odpoveď na nový dotaz. Odpoveď s úrovňou, ktorá nie je platnou úrovňou (0xFF, 0x20FF kolízia na zbernici, 0x8000 bez odpovede) alebo leží medzi 1 a MIN LEVEL gear-u, sa zamietne a zostane posledná úroveň; zmenená úroveň sa prijme až po druhom rovnakom čítaní. Servisné atribúty úrovní namiesto neplatnej hodnoty zobrazia --.
Každý gear sprístupňuje 12 servisných atribútov, ktoré na požiadanie čítajú DALI 1.0 / 2.0 dotazy:
Servisný atribút
DALI príkaz
Hlási
Short Address
(interné)
Krátka adresa (0–63), na ktorú toto zariadenie cieli — fixovaná v čase importu šablóny
Device Type
QUERY DEVICE TYPE (0x99)
DT{n} (napr. DT0 fluorescenčný, DT6 LED, DT8 farebný / tunable white) alebo -- keď bez odpovede. Gear s viacerými device typmi odpovie 0xFF (MASK); šablóna ich potom vypíše cez QUERY NEXT DEVICE TYPE (0xA7), napr. DT6, DT8, alebo zobrazí MASK, keď sa nevráti žiadny typ
Physical Min Level
QUERY PHYSICAL MIN LEVEL (0x9A)
Hardvérom vynútená minimálna úroveň stmievania v %
Max Level
QUERY MAX LEVEL (0xA1)
Nakonfigurovaná horná hranica použitá pri škálovaní 0–100 % na DALI arc power
Min Level
QUERY MIN LEVEL (0xA2)
Nakonfigurovaná dolná hranica použitá pri škálovaní 0–100 % na DALI arc power
Power Up Level
QUERY POWER ON LEVEL (0xA3)
Jas obnovený po opätovnom napájaní DALI zbernice
System Failure Level
QUERY SYSTEM FAILURE LEVEL (0xA4)
Jas prijatý, keď zbernica stratí komunikáciu na >500 ms
Groups
QUERY GROUPS 0-7 (0xC0) + QUERY GROUPS 8-15 (0xC1)
Čiarkami oddelený zoznam DALI skupín, do ktorých gear patrí (None alebo napr. 0,3,7)
DALI Status
QUERY STATUS (0x90)
Dekódovaný stavový bajt s jeho surovou hodnotou: OK, keď nie je nastavený žiadny bit, inak nastavené príznaky — gear failure, lamp failure, lamp on, limit error, fade running, reset state, missing short address, power cycle — napr. lamp on (0x04). Porucha prítomná od prvej odpovede gear-u je označená not raised: … reported since start
fade time {n} ({t} s), fade rate {n}; fade time off, keď je 0, alebo extended 0x.., keď gear namiesto nej používa rozšírený fade time
DALI Version
QUERY VERSION NUMBER (0x97)
DALI-1 alebo DALI-2 {major}.{minor}, za ktorým nasleduje surová hodnota v zátvorkách
Bus statistics
(interné počítadlá)
Počítadlá od štartu: dotazy, vyčítané zastarané odpovede, bez odpovede, kolízie, zamietnuté úrovne
Periodický readscript na každom gear-i číta aktuálnu arc úroveň (0xA0) a aspoň raz za 60 čítacích cyklov pollie QUERY STATUS (0x90). Bit 0 stavového bajtu vyvolá „Control gear failure!" a bit 1 vyvolá „Lamp failure!" — vystavené ako TapHome warningy/chyby, takže porucha žiarivkovej trubice alebo vypadnutý LED ovládač sa zobrazí v aktivity logu bez manuálneho pollovania. Zmenený bit poruchy sa prevezme až po druhom rovnakom čítaní a stratená odpoveď sa ešte raz zopakuje, kým sa gear nahlási ako „Gear not responding!". Bity porúch, ktoré gear hlási v prvej odpovedi, sa považujú za jeho trvalý stav: zobrazia sa v DALI Status, ale nevyvolajú sa, kým sa bit nevynuluje — neskoršia porucha sa potom vyvolá znova. Porucha napájania sa nevyvoláva ako chyba; stavový bit sa v DALI Status zobrazí ako power cycle.
Akcie konfigurácie per-gear
Päť servisných akcií na každom Gear N zariadení zapisuje DALI konfiguračné príkazy (auto-opakované do 100 ms cez H:512 LAMP COMMAND + REPEAT, ako vyžadujú non-volatile DALI príkazy):
Add to Group (parameter Group ID 0–15) — posiela ADD TO GROUP (0x60+grp), takže gear vstúpi do zvolenej DALI skupiny a bude poslúchať následné broadcast zápisy skupiny.
Remove from Group (parameter Group ID 0–15) — posiela REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings — posiela DALI RESET (0x20); obnoví všetky NVM parametre gear-u (max/min/power-on/system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels — zachytí aktuálnu arc power a uloží ju ako Power On Level aj System Failure Level v poradí: STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D), každý s 10 ms medzerou.
Disable fading (bez parametrov) — nahrá 0 do DALI registra prenosu dát (0xA300 zapísané do H:541) a uloží ho v gear-i ako fade time (0x2E) a extended fade time (0x30), každý so 100 ms medzerou, takže zmeny úrovne sa prejavia bez prechodu. Aktuálne hodnoty zobrazuje atribút Fade.
Skupinové stmievanie — Group 0 … Group 15
Každé zo 16 servisných zariadení Group 0, Group 1, … Group 15 je write-only TapHome stmievač, ktorý broadcastuje jednu hodnotu arc-power každému gear-u patriacemu do tej DALI skupiny, používajúc H:520 GROUP LEVEL (TapHome 0–100 % sa násobí 0xFE → DALI arc power 0–254). DALI nepovoľuje bráne spätne čítať úroveň skupiny — zbernica nesie iba broadcast zápis — takže TapHome drží poslednú zapísanú hodnotu ako „aktuálnu" úroveň. Na zariadeniach skupiny nie sú žiadne init ani read skripty.
Každé zariadenie Group N sprístupňuje dve servisné akcie pre hromadnú správu členstva:
Add All Lamps to Group — broadcastuje ADD TO GROUP (0x60+grp) cez H:532 ALL COMMAND + REPEAT. Každý gear na zbernici vstúpi do skupiny bez ohľadu na svoju aktuálnu krátku adresu.
Remove All Lamps from Group — broadcastuje REMOVE FROM GROUP (0x70+grp). Každý gear opustí skupinu.
Použite skupinové stmievanie pre „kuchynské svetlá", „obývacie downlighty" alebo akúkoľvek zónu, kde má viacero gear-ov sledovať jediný stmievač. Skupinové zápisy sú oveľa efektívnejšie ako paralelné ovládanie jednotlivých gear-ov — jediná Modbus transakcia dosiahne až 64 gear-ov súčasne.
Diagnostika na úrovni modulu
Modul sprístupňuje jediný servisný atribút:
Slave ID — číta Modbus Unit ID uložené vo FLASH registri H:65221. Aktívne iba keď DIP4 = OFF; pri DIP4 = ON brána vynúti adresu 255 bez ohľadu na FLASH hodnotu. Použite na overenie adresy brány pred pridávaním ďalších zariadení, najmä po kole uvedenia do prevádzky, ktoré zapísalo neštandardnú ID.
„Gear not responding!" na známom adresovanom gear-i
Overte napätie DALI zbernice na gear-i: 11,5–22,5 V (typicky 14–16 V). Nižšie hodnoty zvyčajne indikujú skrat alebo zbernicu, ktorá je príliš dlhá pre prierez kábla (pozri Topológia DALI zbernice).
Skontrolujte LED ERR na RESI-DALI-PS — ak svieti, zbernica je v skrate, preťažená alebo PSU je chybný.
Spustite znova probovanie Gear N v sesterskej šablóne Resi Dali - Konfigurácia — runtime šablóna skúša znova iba po náhodnej pauze až 60 s, konfiguračná šablóna dáva okamžité pass/fail per adresu.
Overte, či gear vôbec má krátku adresu. Ak bol vymenený alebo továrensky resetovaný na zbernici, bude bez adresy a musí byť znova uvedený do prevádzky cez Resi Dali - Konfigurácia.
Skupinové stmievanie nemá efekt
Overte, že aspoň jeden gear je členom skupiny — otvorte Gear N → Groups na každom podozrivom členovi a skontrolujte, či sa ID skupiny objavuje v čiarkami oddelenom zozname.
Ak chýba členstvo, spustite akciu Add to Group na každom gear-i jednotlivo, alebo použite Add All Lamps to Group na zariadení skupiny pre broadcast po celej zbernici.
Pamätajte, že Group N je write-only — slider stmievača v TapHome ukladá poslednú zapísanú hodnotu, ale nereflektuje skutočný stav zbernice. Ak sú gear-y vypnuté, príkaz úrovne skupiny na nich nemá efekt.
Porucha lampy / porucha napájania nie sú hlásené
Otvorte atribút DALI Status gear-u. Ak končí na not raised: … reported since start, porucha bola prítomná už v prvej odpovedi gear-u a považuje sa za jeho trvalý stav — zobrazí sa, ale nevyvolá sa, kým sa bit raz nevynuluje.
Porucha napájania sa ako chyba nevyvoláva vôbec; stavový bit sa v DALI Status zobrazí ako power cycle.
Nová porucha sa objaví až po tom, čo sa stav pollne (aspoň raz za 60 čítacích cyklov) a dvakrát sa prečíta rovnako, takže krátke preblikutie bitu poruchy sa nehlási.
Sporadické Modbus chyby po uvedení do prevádzky
Uistite sa, že žiadny iný Modbus master (MODBUSConfigurator, PLC, BMS) súbežne nepollie bránu. DALI a Modbus nearbitrujú medzi master-mi. Atribút Bus statistics na každom gear-i počíta od štartu vyčítané zastarané odpovede, chýbajúce odpovede, kolízie a zamietnuté úrovne — počty, ktoré stále rastú, ukazujú na súbežnú komunikáciu na bráne alebo na DALI zbernici.
Overte, že RS485 GND je pripojený medzi bránou a spoločnou zemou TapHome napájacieho zdroja — chýbajúca GND je najčastejšia chyba RS-485 na dlhých linkách.
Pre RTU-over-TCP cez sériový most potvrďte, že most beží v rámcovom RTU režime (nie raw TCP socket) a že medzi-znaková medzera na sériovej strane rešpektuje časovanie 9600 baud 8N1.
Ak sa symptómy objavili po zmene Slave ID cez šablónu Resi Dali - Konfigurácia, znova importujte túto runtime šablónu s novým importným parametrom SlaveId — predchádzajúci importovaný modul stále pollie na starej adrese.
Dostupné zariadenia 80
Tieto zariadenia sa po importe zobrazia v TapHome.
Resi DALIModul
Servisné atribúty
Slave ID
Číta Modbus Unit ID uložené vo FLASH registri H:65221 — aktívne iba keď DIP4=OFF (továrenský default 255). Použite na overenie adresy brány pred pridaním ďalších zariadení.
Resi Dali
Servisné atribúty
${xml_slave_id}
modbusr(H,65221,uint16)
Gear 0StmievačČítanie aj zápis
DALI ovládacie zariadenie pri krátkej adrese 0 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 0
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 1 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 1
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 2 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 2
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 3 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 3
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 4 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 4
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 5 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 5
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 6 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 6
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 7 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 7
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 8 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 8
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 9 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 9
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 10 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 10
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 11 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 11
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 12 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 12
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 13 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 13
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 14 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 14
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 15 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 15
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 16 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 16
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 17 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 17
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 18 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 18
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 19 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 19
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 20 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 20
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 21 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 21
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 22 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 22
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 23 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 23
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 24 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 24
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 25 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 25
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 26 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 26
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 27 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 27
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 28 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 28
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 29 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 29
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 30 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 30
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 31 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 31
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 32 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 32
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 33 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 33
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 34 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 34
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 35 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 35
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 36 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 36
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 37 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 37
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 38 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 38
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 39 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 39
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 40 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 40
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 41 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 41
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 42 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 42
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 43 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 43
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 44 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 44
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 45 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 45
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 46 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 46
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 47 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 47
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 48 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 48
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 49 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 49
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 50 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 50
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 51 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 51
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 52 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 52
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 53 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 53
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 54 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 54
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 55 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 55
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 56 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 56
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 57 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 57
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 58 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 58
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 59 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 59
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 60 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 60
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 61 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 61
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 62 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 62
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI ovládacie zariadenie pri krátkej adrese 63 — TapHome stmievač namapovaný na DALI arc power 0–100 % cez H:510 LAMP LEVEL (zápis) a QUERY ACTUAL LEVEL cez H:511 (čítanie), ohraničený vlastnou MIN / MAX LEVEL gear-u.
Register: H:511 → H:510UInt16Jednotka: %numeric
Servisné atribúty
Krátka adresa
DALI krátka adresa (0–63) cielená týmto zariadením — fixovaná v čase importu šablóny a použitá v hornom byte každého Modbus zápisu.
Device Type
DALI byte device-type vrátený cez QUERY DEVICE TYPE (0x99) — hlási DT0 (fluorescenčný), DT6 (LED ovládač), DT8 (farebný / tunable white) atď., alebo -- keď bez odpovede.
Physical Min Level
Hardvérom vynútená minimálna úroveň stmievania, ktorú gear hlási — čítané z QUERY PHYSICAL MIN LEVEL (0x9A), v percentách.
Max Level
Nakonfigurovaný DALI MAX LEVEL — čítané z QUERY MAX LEVEL (0xA1); použité ako horná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Min Level
Nakonfigurovaný DALI MIN LEVEL — čítané z QUERY MIN LEVEL (0xA2); použité ako dolná hranica pri škálovaní TapHome 0–100 % na DALI arc power.
Power Up Level
Jas obnovený po obnove napájania DALI zbernice — čítané z QUERY POWER ON LEVEL (0xA3).
System Failure Level
Jas prijatý, keď DALI zbernica stratí komunikáciu na viac ako 500 ms — čítané z QUERY SYSTEM FAILURE LEVEL (0xA4).
Skupiny
Čiarkami oddelený zoznam DALI skupín (0–15), do ktorých gear patrí — dekódovaný z QUERY GROUPS 0-7 (0xC0) a QUERY GROUPS 8-15 (0xC1); zobrazuje None alebo napr. 0,3,7.
Support Lamp Failure
Či lampa / ovládač podporuje detekciu poruchy lampy — Yes / No / --. Kontroluje chybu Lamp failure! v periodickom readscripte.
Support Power Failure
Či lampa / ovládač podporuje detekciu poruchy napájania — Yes / No / --. Kontroluje chybu Power failure! v periodickom readscripte.
DALI Version
Bus statistics
Servisné akcie
Add to Group
Pridá tento gear do DALI skupiny (0–15) cez ADD TO GROUP (0x60+grp) — auto-opakované do 100 ms, ako vyžadujú DALI konfiguračné príkazy.
Remove from Group
Odstráni tento gear z DALI skupiny (0–15) cez REMOVE FROM GROUP (0x70+grp).
Reset to Default Settings
Posiela DALI RESET (0x20) — obnoví každý NVM parameter gear-u (max / min / power-on / system-failure level, členstvo v skupinách, scény) na továrenský default.
Set Startup Levels
Zachytí aktuálnu arc power a uloží ju ako Power On Level a System Failure Level — postupnosť STORE ACTUAL LEVEL IN DTR (0x21) → STORE DTR AS POWER ON LEVEL (0x2C) → STORE DTR AS SYSTEM FAILURE LEVEL (0x2D).
Disable fading
Gear 63
Čítanie (modul)
var x := 0; var rx := 0; var y := 0;
if Status > 0
Status := Status - 1;
adderror(3, "Gear not responding!");
return(0);
end
# checkStatus: ReadLevel resets it while the gear answers; statusPoll: QUERY STATUS at least once per 60 runs
checkStatus := checkStatus - 1;
statusPoll := statusPoll - 1;
if checkStatus < 1 or statusPoll < 1
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
# a single lost answer happens on DALI: ask once more before declaring the gear missing
if x = 0x8000
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
end
if x <= 0xFF
# a changed failure bit must be read twice the same before it is taken
if statusSeen = 1 and getbits(x, 0, 2) != getbits(gearStatus, 0, 2)
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
x := gearStatus;
end
end
if statusSeen = 0
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
end
# a bit that clears ends its ignore, so a later failure is raised
if (getbit(x, 0) = 0, ignGear := 0);
if (getbit(x, 1) = 0, ignLamp := 0);
gearStatus := x;
checkStatus := 60;
statusPoll := 60;
else
if x = 0x8000
Status := RANDINT(10, 60);
adderror(3, "Gear not responding!");
return(0);
end
end
end
# messages last one run only, so they are raised from the stored status on every run
if ((getbit(gearStatus, 0) = 1) and (ignGear = 0), adderror(1, "Control gear failure!"));
if ((getbit(gearStatus, 1) = 1) and (ignLamp = 0), adderror(2, "Lamp failure!"));
Inicializácia
var x := 0; var rx := 0;
# QUERY STATUS 0x90: every reply byte proves the gear is present; 0x8000 = no answer, 0x20FF = bus collision
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
statusSeen := 0;
if x <= 0xFF
# failure bits a gear reports from its first answer are its permanent state, not an event: shown, not raised
gearStatus := x;
ignGear := getbit(x, 0);
ignLamp := getbit(x, 1);
statusSeen := 1;
Status := 0;
else
Status := RANDINT(1, 60);
end
if Status = 0
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, maxLevel := x);
end
Čítanie úrovne
var x := 0; var rx := 0; var y := 0;
if Status = 0
if minLevel = 0
# an unread answer left in the gateway would be taken for this query: read it away and count it
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x <= 0xFE, minLevel := x);
end
x := modbusr(SH, 511, uint16); if (x != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (x = 0x8000, cntNone := cntNone + 1); if (x = 0x20FF, cntColl := cntColl + 1);
if (x != 0x8000 or rx, checkStatus := 60);
# 0xFF = MASK, 0x20FF = collision, 0x8000 = no answer: keep the last level instead of a phantom value
if x > 0xFE
return(Le);
end
# an actual level is 0 or between the gear's min and max: anything else is not this gear's answer
if x > 0 and x < minLevel
cntBad := cntBad + 1;
return(Le);
end
# a changed level must be read twice the same before it is taken
if x != lastRaw
y := modbusr(SH, 511, uint16); if (y != 0x8000, cntStale := cntStale + 1);
modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
cntQ := cntQ + 1; if (y = 0x8000, cntNone := cntNone + 1); if (y = 0x20FF, cntColl := cntColl + 1);
if y != x
cntBad := cntBad + 1;
return(Le);
end
lastRaw := x;
end
return(if(x = 0, 0, linear(x, minLevel, 0.01, maxLevel, 1)));
else
return(NaN);
end
var x := 0; var y := 0; var rx := 0; var s := ""; var i := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x99);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
x := modbusr(SH, 511, uint16);
if (x < 0xFF, return("DT" + x));
if x = 0xFF
while i < 8
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA7);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
y := modbusr(SH, 511, uint16);
if y < 0xFE
s := if(s = "", "DT" + y, s + ", DT" + y);
i := i + 1;
else
i := 8;
end
loop
return(if(s = "", "MASK", s));
end
end
return("--")
Physical Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x9A);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Max Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA1);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Min Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA2);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
Power Up Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA3);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
System Failure Level
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA4);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if (x <= 0xFE, return(round((x / 0xFE) * 100) + " %"));
end
return("--")
${xml_groups}
var x := 0; var rx := 0;
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC0);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g1 := modbusr(SH, 511, uint16);
if (g1 > 0xFF, return("--"));
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xC1);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var g2 := modbusr(SH, 511, uint16);
if (g2 > 0xFF, return("--"));
var ret := "";
if (getbit(g1, 0), ret := ret + "0");
if (getbit(g1, 1), if (ret = "", ret := "1", ret := ret + ",1"));
if (getbit(g1, 2), if (ret = "", ret := "2", ret := ret + ",2"));
if (getbit(g1, 3), if (ret = "", ret := "3", ret := ret + ",3"));
if (getbit(g1, 4), if (ret = "", ret := "4", ret := ret + ",4"));
if (getbit(g1, 5), if (ret = "", ret := "5", ret := ret + ",5"));
if (getbit(g1, 6), if (ret = "", ret := "6", ret := ret + ",6"));
if (getbit(g1, 7), if (ret = "", ret := "7", ret := ret + ",7"));
if (getbit(g2, 0), if (ret = "", ret := "8", ret := ret + ",8"));
if (getbit(g2, 1), if (ret = "", ret := "9", ret := ret + ",9"));
if (getbit(g2, 2), if (ret = "", ret := "10", ret := ret + ",10"));
if (getbit(g2, 3), if (ret = "", ret := "11", ret := ret + ",11"));
if (getbit(g2, 4), if (ret = "", ret := "12", ret := ret + ",12"));
if (getbit(g2, 5), if (ret = "", ret := "13", ret := ret + ",13"));
if (getbit(g2, 6), if (ret = "", ret := "14", ret := ret + ",14"));
if (getbit(g2, 7), if (ret = "", ret := "15", ret := ret + ",15"));
if (ret = "", return("None"), return(ret));
else
return("--");
end
DALI Status
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x90);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var s := "";
if (getbit(x, 0), s := if(s = "", "gear failure", s + ", gear failure"));
if (getbit(x, 1), s := if(s = "", "lamp failure", s + ", lamp failure"));
if (getbit(x, 2), s := if(s = "", "lamp on", s + ", lamp on"));
if (getbit(x, 3), s := if(s = "", "limit error", s + ", limit error"));
if (getbit(x, 4), s := if(s = "", "fade running", s + ", fade running"));
if (getbit(x, 5), s := if(s = "", "reset state", s + ", reset state"));
if (getbit(x, 6), s := if(s = "", "missing short address", s + ", missing short address"));
if (getbit(x, 7), s := if(s = "", "power cycle", s + ", power cycle"));
var ign := if((ignGear = 1) and (ignLamp = 1), "gear and lamp failure", if(ignGear = 1, "gear failure", if(ignLamp = 1, "lamp failure", "")));
return(if(s = "", "OK", s) + " (0x" + tostring(x, "X2") + ")" + if(ign = "", "", "; not raised: " + ign + " reported since start"));
end
end
return("--")
Fade
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA5);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
var t := getbits(x, 4, 4);
var ret := if(t = 0, "off", t + " (" + round(sqrt(power(2, t)) * 5) / 10 + " s)");
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0xA8);
sleep(5); rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var e := modbusr(SH, 511, uint16);
if (t = 0 and e <= 0xFF and e != 0, ret := "extended 0x" + tostring(e, "X2"));
return("fade time " + ret + ", fade rate " + getbits(x, 0, 4));
end
end
return("--")
DALI Version
if Status = 0
modbusr(SH, 511, uint16); modbusw(SH, 511, uint16, (ShortAddress << 8) + 0x97);
sleep(5); var rx := getbits(modbusr(SH, 550, uint16), 0, 2); if(rx, 0, sleep(50));
var x := modbusr(SH, 511, uint16);
if x <= 0xFF
return(if(x >= 8, "DALI-2 " + getbits(x, 2, 6) + "." + getbits(x, 0, 2), "DALI-1") + " (" + x + ")");
end
end
return("--")
DALI broadcast skupina 0 (0–15) — write-only TapHome stmievač, ktorý broadcastuje jednu hodnotu arc-power každému gear-u v tejto skupine cez H:520 GROUP LEVEL. Zbernica nezvracia úrovne skupín, takže TapHome drží poslednú zapísanú hodnotu.
UInt16Jednotka: %numeric
Servisné akcie
Add All Lamps to Group
Broadcastuje ADD TO GROUP cez H:532 ALL COMMAND + REPEAT — každý gear na zbernici vstúpi do tejto skupiny bez ohľadu na svoju aktuálnu krátku adresu.
Remove All Lamps from Group
Broadcastuje REMOVE FROM GROUP cez H:532 ALL COMMAND + REPEAT — každý gear na zbernici opustí túto skupinu.
var GroupAddress := 0;
modbusw(SH, 532, uint16, 0x60 + GroupAddress)
${xml_remove_from_group_all_lamps}
var GroupAddress := 0;
modbusw(SH, 532, uint16, 0x70 + GroupAddress)
Group 1StmievačČítanie aj zápis
DALI broadcast skupina 1 (0–15) — write-only TapHome stmievač, ktorý broadcastuje jednu hodnotu arc-power každému gear-u v tejto skupine cez H:520 GROUP LEVEL. Zbernica nezvracia úrovne skupín, takže TapHome drží poslednú zapísanú hodnotu.
UInt16Jednotka: %numeric
Servisné akcie
Add All Lamps to Group
Broadcastuje ADD TO GROUP cez H:532 ALL COMMAND + REPEAT — každý gear na zbernici vstúpi do tejto skupiny bez ohľadu na svoju aktuálnu krátku adresu.
Remove All Lamps from Group
Broadcastuje REMOVE FROM GROUP cez H:532 ALL COMMAND + REPEAT — každý gear na zbernici opustí túto skupinu.
var GroupAddress := 1;
modbusw(SH, 532, uint16, 0x60 + GroupAddress)
${xml_remove_from_group_all_lamps}
var GroupAddress := 1;
modbusw(SH, 532, uint16, 0x70 + GroupAddress)
Group 2StmievačČítanie aj zápis
DALI broadcast skupina 2 (0–15) — write-only TapHome stmievač, ktorý broadcastuje jednu hodnotu arc-power každému gear-u v tejto skupine cez H:520 GROUP LEVEL. Zbernica nezvracia úrovne skupín, takže TapHome drží poslednú zapísanú hodnotu.
UInt16Jednotka: %numeric
Servisné akcie
Add All Lamps to Group
Broadcastuje ADD TO GROUP cez H:532 ALL COMMAND + REPEAT — každý gear na zbernici vstúpi do tejto skupiny bez ohľadu na svoju aktuálnu krátku adresu.
Remove All Lamps from Group
Broadcastuje REMOVE FROM GROUP cez H:532 ALL COMMAND + REPEAT — každý gear na zbernici opustí túto skupinu.
var GroupAddress := 2;
modbusw(SH, 532, uint16, 0x60 + GroupAddress)
${xml_remove_from_group_all_lamps}
var GroupAddress := 2;
modbusw(SH, 532, uint16, 0x70 + GroupAddress)
Group 3StmievačČítanie aj zápis
DALI broadcast skupina 3 (0–15) — write-only TapHome stmievač, ktorý broadcastuje jednu hodnotu arc-power každému gear-u v tejto skupine cez H:520 GROUP LEVEL. Zbernica nezvracia úrovne skupín, takže TapHome drží poslednú zapísanú hodnotu.
UInt16Jednotka: %numeric
Servisné akcie
Add All Lamps to Group
Broadcastuje ADD TO GROUP cez H:532 ALL COMMAND + REPEAT — každý gear na zbernici vstúpi do tejto skupiny bez ohľadu na svoju aktuálnu krátku adresu.
Remove All Lamps from Group
Broadcastuje REMOVE FROM GROUP cez H:532 ALL COMMAND + REPEAT — každý gear na zbernici opustí túto skupinu.
var GroupAddress := 3;
modbusw(SH, 532, uint16, 0x60 + GroupAddress)
${xml_remove_from_group_all_lamps}
var GroupAddress := 3;
modbusw(SH, 532, uint16, 0x70 + GroupAddress)
Group 4StmievačČítanie aj zápis
DALI broadcast skupina 4 (0–15) — write-only TapHome stmievač, ktorý broadcastuje jednu hodnotu arc-power každému gear-u v tejto skupine cez H:520 GROUP LEVEL. Zbernica nezvracia úrovne skupín, takže TapHome drží poslednú zapísanú hodnotu.
UInt16Jednotka: %numeric
Servisné akcie
Add All Lamps to Group
Broadcastuje ADD TO GROUP cez H:532 ALL COMMAND + REPEAT — každý gear na zbernici vstúpi do tejto skupiny bez ohľadu na svoju aktuálnu krátku adresu.
Remove All Lamps from Group
Broadcastuje REMOVE FROM GROUP cez H:532 ALL COMMAND + REPEAT — každý gear na zbernici opustí túto skupinu.
var GroupAddress := 4;
modbusw(SH, 532, uint16, 0x60 + GroupAddress)
${xml_remove_from_group_all_lamps}
var GroupAddress := 4;
modbusw(SH, 532, uint16, 0x70 + GroupAddress)
Group 5StmievačČítanie aj zápis
DALI broadcast skupina 5 (0–15) — write-only TapHome stmievač, ktorý broadcastuje jednu hodnotu arc-power každému gear-u v tejto skupine cez H:520 GROUP LEVEL. Zbernica nezvracia úrovne skupín, takže TapHome drží poslednú zapísanú hodnotu.
UInt16Jednotka: %numeric
Servisné akcie
Add All Lamps to Group
Broadcastuje ADD TO GROUP cez H:532 ALL COMMAND + REPEAT — každý gear na zbernici vstúpi do tejto skupiny bez ohľadu na svoju aktuálnu krátku adresu.
Remove All Lamps from Group
Broadcastuje REMOVE FROM GROUP cez H:532 ALL COMMAND + REPEAT — každý gear na zbernici opustí túto skupinu.
var GroupAddress := 5;
modbusw(SH, 532, uint16, 0x60 + GroupAddress)
${xml_remove_from_group_all_lamps}
var GroupAddress := 5;
modbusw(SH, 532, uint16, 0x70 + GroupAddress)
Group 6StmievačČítanie aj zápis
DALI broadcast skupina 6 (0–15) — write-only TapHome stmievač, ktorý broadcastuje jednu hodnotu arc-power každému gear-u v tejto skupine cez H:520 GROUP LEVEL. Zbernica nezvracia úrovne skupín, takže TapHome drží poslednú zapísanú hodnotu.
UInt16Jednotka: %numeric
Servisné akcie
Add All Lamps to Group
Broadcastuje ADD TO GROUP cez H:532 ALL COMMAND + REPEAT — každý gear na zbernici vstúpi do tejto skupiny bez ohľadu na svoju aktuálnu krátku adresu.
Remove All Lamps from Group
Broadcastuje REMOVE FROM GROUP cez H:532 ALL COMMAND + REPEAT — každý gear na zbernici opustí túto skupinu.
var GroupAddress := 6;
modbusw(SH, 532, uint16, 0x60 + GroupAddress)
${xml_remove_from_group_all_lamps}
var GroupAddress := 6;
modbusw(SH, 532, uint16, 0x70 + GroupAddress)
Group 7StmievačČítanie aj zápis
DALI broadcast skupina 7 (0–15) — write-only TapHome stmievač, ktorý broadcastuje jednu hodnotu arc-power každému gear-u v tejto skupine cez H:520 GROUP LEVEL. Zbernica nezvracia úrovne skupín, takže TapHome drží poslednú zapísanú hodnotu.
UInt16Jednotka: %numeric
Servisné akcie
Add All Lamps to Group
Broadcastuje ADD TO GROUP cez H:532 ALL COMMAND + REPEAT — každý gear na zbernici vstúpi do tejto skupiny bez ohľadu na svoju aktuálnu krátku adresu.
Remove All Lamps from Group
Broadcastuje REMOVE FROM GROUP cez H:532 ALL COMMAND + REPEAT — každý gear na zbernici opustí túto skupinu.
var GroupAddress := 7;
modbusw(SH, 532, uint16, 0x60 + GroupAddress)
${xml_remove_from_group_all_lamps}
var GroupAddress := 7;
modbusw(SH, 532, uint16, 0x70 + GroupAddress)
Group 8StmievačČítanie aj zápis
DALI broadcast skupina 8 (0–15) — write-only TapHome stmievač, ktorý broadcastuje jednu hodnotu arc-power každému gear-u v tejto skupine cez H:520 GROUP LEVEL. Zbernica nezvracia úrovne skupín, takže TapHome drží poslednú zapísanú hodnotu.
UInt16Jednotka: %numeric
Servisné akcie
Add All Lamps to Group
Broadcastuje ADD TO GROUP cez H:532 ALL COMMAND + REPEAT — každý gear na zbernici vstúpi do tejto skupiny bez ohľadu na svoju aktuálnu krátku adresu.
Remove All Lamps from Group
Broadcastuje REMOVE FROM GROUP cez H:532 ALL COMMAND + REPEAT — každý gear na zbernici opustí túto skupinu.
var GroupAddress := 8;
modbusw(SH, 532, uint16, 0x60 + GroupAddress)
${xml_remove_from_group_all_lamps}
var GroupAddress := 8;
modbusw(SH, 532, uint16, 0x70 + GroupAddress)
Group 9StmievačČítanie aj zápis
DALI broadcast skupina 9 (0–15) — write-only TapHome stmievač, ktorý broadcastuje jednu hodnotu arc-power každému gear-u v tejto skupine cez H:520 GROUP LEVEL. Zbernica nezvracia úrovne skupín, takže TapHome drží poslednú zapísanú hodnotu.
UInt16Jednotka: %numeric
Servisné akcie
Add All Lamps to Group
Broadcastuje ADD TO GROUP cez H:532 ALL COMMAND + REPEAT — každý gear na zbernici vstúpi do tejto skupiny bez ohľadu na svoju aktuálnu krátku adresu.
Remove All Lamps from Group
Broadcastuje REMOVE FROM GROUP cez H:532 ALL COMMAND + REPEAT — každý gear na zbernici opustí túto skupinu.
var GroupAddress := 9;
modbusw(SH, 532, uint16, 0x60 + GroupAddress)
${xml_remove_from_group_all_lamps}
var GroupAddress := 9;
modbusw(SH, 532, uint16, 0x70 + GroupAddress)
Group 10StmievačČítanie aj zápis
DALI broadcast skupina 10 (0–15) — write-only TapHome stmievač, ktorý broadcastuje jednu hodnotu arc-power každému gear-u v tejto skupine cez H:520 GROUP LEVEL. Zbernica nezvracia úrovne skupín, takže TapHome drží poslednú zapísanú hodnotu.
UInt16Jednotka: %numeric
Servisné akcie
Add All Lamps to Group
Broadcastuje ADD TO GROUP cez H:532 ALL COMMAND + REPEAT — každý gear na zbernici vstúpi do tejto skupiny bez ohľadu na svoju aktuálnu krátku adresu.
Remove All Lamps from Group
Broadcastuje REMOVE FROM GROUP cez H:532 ALL COMMAND + REPEAT — každý gear na zbernici opustí túto skupinu.
var GroupAddress := 10;
modbusw(SH, 532, uint16, 0x60 + GroupAddress)
${xml_remove_from_group_all_lamps}
var GroupAddress := 10;
modbusw(SH, 532, uint16, 0x70 + GroupAddress)
Group 11StmievačČítanie aj zápis
DALI broadcast skupina 11 (0–15) — write-only TapHome stmievač, ktorý broadcastuje jednu hodnotu arc-power každému gear-u v tejto skupine cez H:520 GROUP LEVEL. Zbernica nezvracia úrovne skupín, takže TapHome drží poslednú zapísanú hodnotu.
UInt16Jednotka: %numeric
Servisné akcie
Add All Lamps to Group
Broadcastuje ADD TO GROUP cez H:532 ALL COMMAND + REPEAT — každý gear na zbernici vstúpi do tejto skupiny bez ohľadu na svoju aktuálnu krátku adresu.
Remove All Lamps from Group
Broadcastuje REMOVE FROM GROUP cez H:532 ALL COMMAND + REPEAT — každý gear na zbernici opustí túto skupinu.
var GroupAddress := 11;
modbusw(SH, 532, uint16, 0x60 + GroupAddress)
${xml_remove_from_group_all_lamps}
var GroupAddress := 11;
modbusw(SH, 532, uint16, 0x70 + GroupAddress)
Group 12StmievačČítanie aj zápis
DALI broadcast skupina 12 (0–15) — write-only TapHome stmievač, ktorý broadcastuje jednu hodnotu arc-power každému gear-u v tejto skupine cez H:520 GROUP LEVEL. Zbernica nezvracia úrovne skupín, takže TapHome drží poslednú zapísanú hodnotu.
UInt16Jednotka: %numeric
Servisné akcie
Add All Lamps to Group
Broadcastuje ADD TO GROUP cez H:532 ALL COMMAND + REPEAT — každý gear na zbernici vstúpi do tejto skupiny bez ohľadu na svoju aktuálnu krátku adresu.
Remove All Lamps from Group
Broadcastuje REMOVE FROM GROUP cez H:532 ALL COMMAND + REPEAT — každý gear na zbernici opustí túto skupinu.
var GroupAddress := 12;
modbusw(SH, 532, uint16, 0x60 + GroupAddress)
${xml_remove_from_group_all_lamps}
var GroupAddress := 12;
modbusw(SH, 532, uint16, 0x70 + GroupAddress)
Group 13StmievačČítanie aj zápis
DALI broadcast skupina 13 (0–15) — write-only TapHome stmievač, ktorý broadcastuje jednu hodnotu arc-power každému gear-u v tejto skupine cez H:520 GROUP LEVEL. Zbernica nezvracia úrovne skupín, takže TapHome drží poslednú zapísanú hodnotu.
UInt16Jednotka: %numeric
Servisné akcie
Add All Lamps to Group
Broadcastuje ADD TO GROUP cez H:532 ALL COMMAND + REPEAT — každý gear na zbernici vstúpi do tejto skupiny bez ohľadu na svoju aktuálnu krátku adresu.
Remove All Lamps from Group
Broadcastuje REMOVE FROM GROUP cez H:532 ALL COMMAND + REPEAT — každý gear na zbernici opustí túto skupinu.
var GroupAddress := 13;
modbusw(SH, 532, uint16, 0x60 + GroupAddress)
${xml_remove_from_group_all_lamps}
var GroupAddress := 13;
modbusw(SH, 532, uint16, 0x70 + GroupAddress)
Group 14StmievačČítanie aj zápis
DALI broadcast skupina 14 (0–15) — write-only TapHome stmievač, ktorý broadcastuje jednu hodnotu arc-power každému gear-u v tejto skupine cez H:520 GROUP LEVEL. Zbernica nezvracia úrovne skupín, takže TapHome drží poslednú zapísanú hodnotu.
UInt16Jednotka: %numeric
Servisné akcie
Add All Lamps to Group
Broadcastuje ADD TO GROUP cez H:532 ALL COMMAND + REPEAT — každý gear na zbernici vstúpi do tejto skupiny bez ohľadu na svoju aktuálnu krátku adresu.
Remove All Lamps from Group
Broadcastuje REMOVE FROM GROUP cez H:532 ALL COMMAND + REPEAT — každý gear na zbernici opustí túto skupinu.
var GroupAddress := 14;
modbusw(SH, 532, uint16, 0x60 + GroupAddress)
${xml_remove_from_group_all_lamps}
var GroupAddress := 14;
modbusw(SH, 532, uint16, 0x70 + GroupAddress)
Group 15StmievačČítanie aj zápis
DALI broadcast skupina 15 (0–15) — write-only TapHome stmievač, ktorý broadcastuje jednu hodnotu arc-power každému gear-u v tejto skupine cez H:520 GROUP LEVEL. Zbernica nezvracia úrovne skupín, takže TapHome drží poslednú zapísanú hodnotu.
UInt16Jednotka: %numeric
Servisné akcie
Add All Lamps to Group
Broadcastuje ADD TO GROUP cez H:532 ALL COMMAND + REPEAT — každý gear na zbernici vstúpi do tejto skupiny bez ohľadu na svoju aktuálnu krátku adresu.
Remove All Lamps from Group
Broadcastuje REMOVE FROM GROUP cez H:532 ALL COMMAND + REPEAT — každý gear na zbernici opustí túto skupinu.
H:531ALL COMMAND (broadcast DALI command) — Single-shot broadcast DALI command (no repeat). Template uses H:532 (ALL COMMAND + REPEAT) for group membership but never exposes plain ALL OFF / ALL ON / ALL ARC POWER as a service action — turn-on/off-all are not present (sibling daliconfig template has them via H:530)
H:530ALL LEVEL (broadcast arc power) — Sets brightness for every gear in one Modbus write. Convenient 'turn off all lamps' / 'turn on all lamps' shortcut — implemented in the sibling daliconfig template, missing in this operational template
H:521GROUP COMMAND (per-group DALI command) — Per-group DALI command (single-shot). Could expose group-level OFF / RECALL MIN / RECALL MAX / GO TO SCENE as service actions on each Group device, but template only writes H:520 GROUP LEVEL
H:522GROUP COMMAND + REPEAT — Per-group DALI configuration command (auto-repeated within 100 ms). Required for STORE DTR AS GROUP SCENE etc. — not exposed as a service action
H:541DIRECT 16-BIT FRAME — Raw DALI 1.0 frame send. Used by sibling daliconfig template for the DALI 2.0 random-addressing algorithm; not needed for runtime brightness control
I:10020-I:10027DALI 24-BIT FRAME — DALI 2.0 24-bit frames — required for DT8 colour control (XY, colour temperature, RGBW), DALI 2.0 control gear queries, and DALI-2 input devices (push-buttons, presence detectors). Template exposes only DALI 1.0 brightness layer per gear
I:10030-I:10047DALI 25-BIT eDALI FRAME — Lunatone-proprietary 25-bit eDALI frames (auto and user redundant-bit variants). Not used by any DALI 1.0 gear
I:10050-I:10067DALI 28-BIT / 32-BIT FRAME — Extended DALI 2.0 frames (memory bank access, DALI-2 application controllers). Template scope is single-channel arc power per gear
H:500 (DSI VALUE)DSI 8-bit value send — Send a raw 8-bit DSI/DALI value with no addressing (bus-level diagnostics). Bypassed by every TapHome script
C:0 / H:551DALI Bus Error — 1 = DALI bus fault / short circuit / missing PSU. Useful diagnostic — could be added as a module-level service attribute. Currently bus errors only surface indirectly through 'Gear not responding!' errors emitted by per-gear readscripts
H:100DALI PRIORITY SLOT — 0..4 → 12-16 ms forward-frame timing. Default 2 (configuration). Bus-tuning parameter; template runs at default
H:6000DIP SWITCH / SOFTWARE RESET — Read returns the 4 DIP switch values; write 1 reboots the gateway. Sibling daliconfig template exposes Reset Gateway / Set Slave ID; this runtime template intentionally does not (commissioning concern)
H:65222 / H:65224 / H:65225BAUD_RATE / PARITY / STOP_BITS (FLASH) — FLASH-stored serial parameters. Template hard-codes 9600 8N1 in connection_details, so these are out of scope
I:0 / I:50-I:53 / scenesDALI 1.0 scenes (recall / store / query) — DALI 1.0 standard supports 16 stored scenes per gear/group recallable via GO TO SCENE (0x10..0x1F) and storable via STORE DTR AS SCENE (0x40..0x4F). Template exposes per-gear ADD/REMOVE FROM GROUP and RESET, but no scene recall/store/remove/query actions
H:512 (RECALL MAX/MIN/GOTO LAST/UP/DOWN/STEP)DALI 1.0 high-level commands per gear — RECALL MAX LEVEL (0x05), RECALL MIN LEVEL (0x06), UP (0x01), DOWN (0x02), STEP UP (0x03), STEP DOWN (0x04), GO TO LAST ACTIVE LEVEL (0x0A) — useful as service actions for visual feedback / smooth dimming. Not exposed; brightness goes only through linear scaling
H:512 (STORE DTR AS MAX/MIN/POWER ON/SYSTEM FAILURE LEVEL)Per-gear configuration write commands — STORE DTR AS MAX LEVEL (0x2A), STORE DTR AS MIN LEVEL (0x2B), STORE DTR AS POWER ON LEVEL (0x2C), STORE DTR AS SYSTEM FAILURE LEVEL (0x2D), STORE DTR AS FADE TIME / FADE RATE — template has 'Set Startup Levels' (combines 0x21, 0x2C, 0x2D) but does NOT expose individual writes for max/min/fade-time/fade-rate
H:511 (QUERY FADE TIME / FADE RATE / RANDOM ADDRESS / EXT VERSION)Additional DALI queries — QUERY FADE TIME / FADE RATE (0xA5), QUERY VERSION NUMBER (0x97), QUERY RANDOM ADDRESS H/M/L (0x98/0xC2/0xC3), QUERY CONTENT DTR/DTR1/DTR2 — not exposed in service attributes, only the 10 attributes listed per gear are populated
H:511 (QUERY CONTROL GEAR / RESET STATE / LIMIT ERROR / LAMP POWER ON / MISSING SHORT ADDRESS)DALI gear health / topology queries — QUERY CONTROL GEAR (0x90), QUERY RESET STATE (0x95), QUERY LIMIT ERROR (0x94), QUERY LAMP POWER ON (0x93), QUERY MISSING SHORT ADDRESS (0x96, broadcast) — diagnostic queries. Could be useful as module-level diagnostics; template exposes only QUERY STATUS / LAMP FAILURE / POWER FAILURE / DEVICE TYPE / MIN-MAX-PHYSICAL MIN-POWER UP-SYSTEM FAILURE LEVEL / GROUPS
H:511 (READ MEMORY LOCATION 0xC5)DALI memory bank read — READ MEMORY LOCATION (0xC5) is required to read DALI 2.0 memory banks (Bank 0 device GTIN, FW version, serial number; Bank 1 for emergency lighting). Not used
ASCII protocol commandsParallel ASCII text protocol — RESI gateway also exposes a CR-terminated text protocol (#LARC, #GARC, #AARC, #LGS, #LCMD, #LCMDA, #DALI CMDxx etc.). Template uses Modbus exclusively — ASCII would only matter for diagnostics/terminal access
DT6 fade time / fade rate / DAPC sequenceSmooth dimming primitives — DAPC (Direct Arc Power Control) sequence allows fast continuous level updates for smooth dimming. Each gear has stored fade time / fade rate that affect transitions. Template writes raw arc power without configuring fade behaviour
DT8 colour control (XY, colour temperature, RGBW)DALI DT8 tunable white / RGB / RGBW — DT8 colour control gears (tunable white CCT, XY colour, RGBW) require DALI 2.0 24-bit frames sent via H:541 / I:10020. Template exposes plain ModbusDimmer per gear — for DT8 lamps use a dedicated DT8 template
DT1 emergency lightingDALI DT1 self-contained emergency lights — Emergency-luminaire device type with periodic self-tests (function/duration test) and battery state queries. Out of scope — template is general-purpose dimming
Ste medzi prvými partnermi, ktorí môžu 2026.1 nasadiť u zákazníkov. Prechod za vás urobí asistent podpory cez WhatsApp alebo e-mail — s overením jednotky a zálohou pred zmenou.
Vyskúšajte 2026.1 skôr než ostatní. Prechod za vás urobí asistent podpory cez WhatsApp alebo e-mail — s overením jednotky a zálohou pred zmenou.