66 * Autor: Sanweb
77 * * -----------------------------------------------------------------------------
88 * Versionshistorie:
9+ * v1.0.1 | 04.03.2026 | Auto-Create für fehlende Datenpunkte hinzugefügt
910 * v1.0.0 | 04.03.2026 | Initiale Version
1011 *******************************************************************************/
1112
@@ -91,7 +92,7 @@ function safeSetState(id, val) {
9192}
9293
9394// ==============================================================================
94- // INITIALISIERUNG
95+ // INITIALISIERUNG & AUTO-CREATE DATENPUNKTE
9596// ==============================================================================
9697
9798// Plausibilitätsprüfung der konfigurierten Zeiten
@@ -108,24 +109,40 @@ if (!/^([01]\d|2[0-3]):([0-5]\d)$/.test(ALEXA_START_ZEIT) || !/^([01]\d|2[0-3]):
108109 }
109110}
110111
111- // Wir prüfen nur, ob der Zutrittskontroll-Datenpunkt existiert.
112- // Manuelles Anlegen im ioBroker-Objektbaum wird empfohlen, um asynchrone Fehler durch createState zu vermeiden.
112+ // 1. Datenpunkt für die Zutrittskontrolle prüfen und ggf. anlegen
113113if ( ! stateExists ( DP_ZUTRITTSKONTROLLE ) ) {
114- log ( `WICHTIG: Der Datenpunkt ${ DP_ZUTRITTSKONTROLLE } existiert nicht. Bitte lege ihn manuell als Logikwert (boolean) an!` , 'error' ) ;
114+ log ( `Datenpunkt ${ DP_ZUTRITTSKONTROLLE } existiert nicht. Wird automatisch angelegt...` , 'info' ) ;
115+ await createStateAsync ( DP_ZUTRITTSKONTROLLE , false , {
116+ name : 'Zutrittskontrolle Haustür' ,
117+ desc : 'Status der Zutrittskontrolle' ,
118+ type : 'boolean' ,
119+ role : 'indicator' ,
120+ read : true ,
121+ write : true
122+ } ) ;
115123}
116124
117- // Letzten Klingel-Zeitpunkt laden, falls der Datenpunkt existiert
118- if ( stateExists ( DP_LAST_RING ) ) {
119- const savedTime = getState ( DP_LAST_RING ) . val ;
120- if ( typeof savedTime === 'number' && ! isNaN ( savedTime ) ) {
121- lastRingTime = savedTime ;
122- logDebug ( `Letzter Klingelzeitpunkt aus Datenpunkt geladen: ${ lastRingTime } ` ) ;
123- } else {
124- log ( 'WARNUNG: Gespeicherter Klingelzeitpunkt ist ungültig, verwende 0' , 'warn' ) ;
125- lastRingTime = 0 ;
126- }
125+ // 2. Datenpunkt für den letzten Klingelzeitpunkt prüfen und ggf. anlegen
126+ if ( ! stateExists ( DP_LAST_RING ) ) {
127+ log ( `Datenpunkt ${ DP_LAST_RING } existiert nicht. Wird automatisch angelegt...` , 'info' ) ;
128+ await createStateAsync ( DP_LAST_RING , 0 , {
129+ name : 'Letzter Klingelzeitpunkt' ,
130+ desc : 'Timestamp des letzten Klingelsignals in Millisekunden' ,
131+ type : 'number' ,
132+ role : 'value.time' ,
133+ read : true ,
134+ write : true
135+ } ) ;
136+ }
137+
138+ // Letzten Klingel-Zeitpunkt laden (Datenpunkt existiert jetzt garantiert)
139+ const savedTime = getState ( DP_LAST_RING ) . val ;
140+ if ( typeof savedTime === 'number' && ! isNaN ( savedTime ) ) {
141+ lastRingTime = savedTime ;
142+ logDebug ( `Letzter Klingelzeitpunkt aus Datenpunkt geladen: ${ lastRingTime } ` ) ;
127143} else {
128- log ( `HINWEIS: Der Datenpunkt ${ DP_LAST_RING } existiert nicht. Lege ihn als Zahl (number) an, um die Sturm-Protection über Skript-Neustarts hinweg zu erhalten.` , 'info' ) ;
144+ log ( 'WARNUNG: Gespeicherter Klingelzeitpunkt ist ungültig, verwende 0' , 'warn' ) ;
145+ lastRingTime = 0 ;
129146}
130147
131148// ==============================================================================
0 commit comments