Heizplan aktiviert als Trigger für Szene?

Hallo zusammen,

Ich würde gerne als Trigger für eine Szene auswerten, ob der Heizplan für eine Heizzone aktiviert ist oder nicht. Wenn der Heizplan aktiv, soll eine Szene starten, wenn der Heizülan im Urlaubsmodus für eine Heizzone eingestellt soll die Szene angehalten werden.

Warum das Ganze? Anstelle über ein Script den Urlaubsmodus zu aktivieren wenn ein Fenster geöffnet ist, möchte ich das Thermostat einfach abschalten. Das funktioniert mit meinen Spirit Thermostaten wunderbar. Nach erneutem Einschalten übernehmen sie genau die im Heizplan definierte Temperatur. Auch ist es möglich sie länger als zwei Stunden zu deaktivieren ohne, dass sie vom Heizplan wieder aktiviert werden.

Somit ist das Script für „Fenster auf, Heizung aus…“ meines Erachtens nicht mehr nötig um Thermostate zu schließen bei geöffnetem Fenster.

Mir fehlt nur der Trigger des aktivierten Heizplanes, so dass im Sommer nicht die Thermostate nach dem Schließen des Fensters wieder aktiviert werden.

Kann mir dabei jemand helfen wie der Status des Heizplanes für eine bestimmte Heizzone ausgewertet werden kann?

Vielen Dank
Christopher

@ChrisBu

hab Dir mal ein paar Zeilen Beispielcode gemacht. Hoffe das Du sowas gemeint hast.
Im ersten Fall brauchst Du die Zonen ID. Erhälst Du mit "http://DEINE_HC2_IP/api/panels/heating/
Dann die Zonen ID in myZone eintragen.

myZone = 999
zone = api.get('/panels/heating/' )

for id = 1, #zone do
  if (zone[id].id == myZone) and (zone[id].mode == "Vacation") then
    print("Zone " .. zone[id].name .. " ist im Urlaubsmodus.")
    -- weitere Befehle
  end  
end
    
-- oder du fragst alle Zonen ab ob eine im Urlaubsmodus ist:
    
for id = 1, #zone do
  if (zone[id].mode == "Vacation") then
    print("Zone " .. zone[id].name .. " ist im Urlaubsmodus.")
    -- weitere Befehle 
  end  
end

Hallo Jeep,

Vielen Dank. Ich werde es damit mal versuchen.
Kann ich damit auch eine globale Variable definieren?
Wenn Heizzone in Vacation mode dann setze Globale Variable auf 1 sonst auf null.

Leider bin ich was LUA angeht noch absoluter Anfänger. Aber ich denke jeder hat mal klein angefangen :wink:

Vielen Dank.

Ja, das geht. Du legst eine globale Variable an, z.B. ‘VacationMode’ oder ‘Urlaubsmodus’ und dann einfach wenn die Bedingung erfüllt ist:
fibaro:setGlobal(“VacationMode”, “1”);

abfragen mit: Modus = tonumber(fibaro:getGlobalValue("VacationMode"));

aber ich denke das hast Du schon allein herausgefunden,. :wink:

Hallo Jeep,

ich habe den Scriptsnippsel von die genommen und damit ein bisschen rumgespielt.

HeizzonenID = 4 --Heizzone für Herrenzimmer
zone = api.get('/panels/heating/' )
 
if (zone[4].mode == "Schedule") then
    print("Zone " .. zone[4].name .. " ist im Heizmodus.")
    -- weitere Befehle
end  

Allerdings wird mir in der Ausgabe folgendes angezeigt:
“[DEBUG] 18:04:26: Zone Temperature in Saunaraum ist im Heizmodus.”

Allerdings ist der Saunaraum die HeizzoneID = 7 und bei der HeizzonenID =4 müsste er mir eigentlich:
“[DEBUG] 18:04:26: Zone Temperature in Herrenzimmer ist im Heizmodus.” ausgeben

Hier scheine ich grundlegend etwas falsch zu machen. In meine Szene hatte ich dein Script schon eingebaut. Allerdings ist es glaub ich leichter an dem oben beschrieben Auszug zu erklären.

Für HeizzonenID = 11 bekomme ich ausgegeben:

[DEBUG] 18:10:33: [1;31m2018-10-24 18:10:33.084262 [ fatal] Unknown exception: /opt/fibaro/scenes/8.lua:13: attempt to index field ‘?’ (a nil value)

Was mache ich falsch?

Vielen Dank für deine Hilfe!

Hallo Chris,

Du kannst es mal mit dem Code gegenprüfen:

zone = api.get('/panels/heating/' )
for id = 1, #zone do
    print("ZoneID: " .. zone[id].id ..' - '.. zone[id].name )
end 

Hallo Jeep,

Mein Script ist fertig und funktioniert soweit ganz gut. Allerdings habe ich eingebaut, dass der Schaltbefehl für das Thermostat zweimal gesendet wird. Ich habe leider aufgrund der Distanz zum nächsten Aktor das Problem, dass nicht alle Schaltbefehle sauber übertragen werden.

then
36
                    fibaro:call(ThermostatID, "setMode", "1");
37
                    fibaro:sleep(20*1000);
38
                    fibaro:call(ThermostatID, "setMode", "1");
39
                    print("Heizung in " .. zone[id].name .. " ist wieder aktviert");
40
                end

Macht das Sinn, oder ist das unnötig da der Befehl sowieso so lange gesendet wird, bis die Gegenstelle akzeptiert hat?

Vielen Dank!

Hallo Chris,
schön das es funktioniert. Laut ZWave Protokoll werden bei ausbleibenden ACK, zwei weitere Sendeversuche
gestartet, danach wird versucht einem alternativen Weg zu nehmen (Routing).
Du solltest Dir vielleicht mal anschauen wie Dein Netz und die Nachbarliste der Geräte aussieht.
Natürlich erhöht ein 2ter Befehl den Funkverkehr, was in einem kleineren Netz nicht arg ins Gewicht fällt. Je
mehr solcher Programme man hat, die doppelte Befehle senden, desto schlechter ist es für’s Netz. Deshalb immer
erst nach den Ursachen forschen.