diff --git a/control/gen-fan-zone-defs.py b/control/gen-fan-zone-defs.py
index a95920b..d11ff35 100755
--- a/control/gen-fan-zone-defs.py
+++ b/control/gen-fan-zone-defs.py
@@ -28,15 +28,19 @@
 },
 std::vector<Action>{
 %for a in event['action']:
+%if len(a['parameters']) != 0:
 make_action(action::${a['name']}(
+%else:
+make_action(action::${a['name']}
+%endif
 %for i, p in enumerate(a['parameters']):
 %if (i+1) != len(a['parameters']):
     static_cast<${p['type']}>(${p['value']}),
 %else:
-    static_cast<${p['type']}>(${p['value']})
+    static_cast<${p['type']}>(${p['value']}))
 %endif
 %endfor
-)),
+),
 %endfor
 },
 Timer{
@@ -144,8 +148,13 @@
                         },
                         std::vector<Action>{
                         %for i, a in enumerate(event['pc']['pcact']):
+                        %if len(a['params']) != 0:
                         make_action(
                             precondition::${a['name']}(
+                        %else:
+                        make_action(
+                            precondition::${a['name']}
+                        %endif
                         %for p in a['params']:
                         ${p['type']}${p['open']}
                         %for j, v in enumerate(p['values']):
@@ -158,7 +167,11 @@
                         ${p['close']},
                         %endfor
                         %if (i+1) != len(event['pc']['pcact']):
+                        %if len(a['params']) != 0:
                         )),
+                        %else:
+                        ),
+                        %endif
                         %endif
                         %endfor
                     std::vector<SetSpeedEvent>{
@@ -173,7 +186,11 @@
                     %endif
                     %if ('pc' in event) and (event['pc'] is not None):
                     }
+                        %if len(event['pc']['pcact'][-1]['params']) != 0:
                         )),
+                        %else:
+                        ),
+                        %endif
                         },
                         Timer{
                             ${event['pc']['pctime']['interval']}
@@ -275,27 +292,29 @@
                        if a['name'] == eActions['name'])
         actions['name'] = eAction['name']
         params = []
-        for p in eAction['parameters']:
-            param = {}
-            if type(eActions[p]) is not dict:
-                if p == 'property':
-                    param['value'] = str(eActions[p]).lower()
-                    param['type'] = str(
-                        e['property']['type']).lower()
+        if ('parameters' in eAction) and \
+           (eAction['parameters'] is not None):
+            for p in eAction['parameters']:
+                param = {}
+                if type(eActions[p]) is not dict:
+                    if p == 'property':
+                        param['value'] = str(eActions[p]).lower()
+                        param['type'] = str(
+                            e['property']['type']).lower()
+                    else:
+                        # Default type to 'size_t' when not given
+                        param['value'] = str(eActions[p]).lower()
+                        param['type'] = 'size_t'
+                    params.append(param)
                 else:
-                    # Default type to 'size_t' when not given
-                    param['value'] = str(eActions[p]).lower()
-                    param['type'] = 'size_t'
-                params.append(param)
-            else:
-                param['type'] = str(eActions[p]['type']).lower()
-                if p != 'map':
-                    param['value'] = str(
-                        eActions[p]['value']).lower()
-                else:
-                    emap = convertToMap(str(eActions[p]['value']))
-                    param['value'] = param['type'] + emap
-                params.append(param)
+                    param['type'] = str(eActions[p]['type']).lower()
+                    if p != 'map':
+                        param['value'] = str(
+                            eActions[p]['value']).lower()
+                    else:
+                        emap = convertToMap(str(eActions[p]['value']))
+                        param['value'] = param['type'] + emap
+                    params.append(param)
         actions['parameters'] = params
         action.append(actions)
     event['action'] = action
