[PROJECT] Driver for Neptune Systems Apex

It is because it cannot determine what type of Apex controller you have (the info message). When it tries to pull in the data after that it fails (the error) because the type field in the map it has made is null, since it did not know what type of controller it was.

What type of Apex controller do you have? An AC5 would correspond to an old (now) Apex released after 2016, but before their new A3 lineup. An AC5EL is what was identified as an Apex EL model for that timeframe. But I have never seen someone have something reported as an AC5L.

If you can tell me the model, I can add it in tomorrow most likely.

It appears to be (from the sticker on the base unit) to be an ApexEL. Thanks for the quick reply!

I did some monkeying around in the code, and can get it to recognize the device, but it seems to get tripped up by the ASM module. I'm including my status.json code here in hopes this will help debug.

{"istat":{"hostname":"chez_gallant","software":"5.11L_6A23","hardware":"1.0","serial":"AC5L:35096","type":"AC5L","extra":{"sdver":"SS08G,3,5344,2,0","sddate": "201201","sdserial": 3271529264,"sdextDate": "","sdhealth": 0,"WWWVer": "PASS","TmpUart": "PASS","sdstat": {"reads":3403030,"writes":17688,"readErr":0,"writeErr":0 }},"timezone":"-4.00","date":1696165529,
"inputs":[{"did":"base_Temp","type":"Temp","name":"Tmp","value":74.3 }
,{"did":"base_pH","type":"pH","name":"pH","value":6.95 }
,{"did":"2_P0","type":"Amps","name":"FilterA","value":0.0 }
,{"did":"2_P1","type":"Amps","name":"AirA","value":0.0 }
,{"did":"2_P2","type":"Amps","name":"HeaterA","value":0.0 }
,{"did":"2_P3","type":"Amps","name":"LightA","value":0.0 }
,{"did":"2_P4","type":"Amps","name":"Light1A","value":0.7 }
,{"did":"2_P5","type":"Amps","name":"CO2A","value":0.0 }
,{"did":"2_P6","type":"Amps","name":"UVA","value":0.0 }
,{"did":"2_P7","type":"Amps","name":"Fan_2_8A","value":0.0 }
,{"did":"2_P8","type":"pwr","name":"FilterW","value": 18 }
,{"did":"2_P9","type":"pwr","name":"AirW","value": 1 }
,{"did":"2_P10","type":"pwr","name":"HeaterW","value": 1 }
,{"did":"2_P11","type":"pwr","name":"LightW","value": 1 }
,{"did":"2_P12","type":"pwr","name":"Light1W","value": 45 }
,{"did":"2_P13","type":"pwr","name":"CO2W","value": 3 }
,{"did":"2_P14","type":"pwr","name":"UVW","value": 1 }
,{"did":"2_P15","type":"pwr","name":"Fan_2_8W","value": 8 }
,{"did":"2_P16","type":"volts","name":"Volt_2","value":119 }
,{"did":"4_0","type":"Temp","name":"Tmpx4","value":24.3 }
,{"did":"4_1","type":"ASM","name":"PARx4","value": 0 }

Thanks. I will try to get it in today sometime.

Updated Version(s):

  • NeptuneSystemsApex.groovy = 0.100.16


  • Recognition changed for the ApexEL and the ASM modules. These have always been MAY recognize because I never had an actual sample of a json with them. But thanks to @user6760 they SHOULD now be recognized properly.

I’m not really sure when it started but I noticed today that I’m no longer getting any notifications in hubitat for rules that I have setup to notify me when pumps turn on or off so I started digging into it and found the following in my error logs today for “Neptune Systems”.

Any idea what might have happened here?


That is an error that it cannot determine the device's type based on the Module Map. Can you send me a message with what the parent device's "Module Map" value is in the State Variables?

If there is not one... Can you set the Logging to "Trace", run a Refresh, then send me the lines that have:

  • [Parent Device Name] Module Map =
  • [Parent Device Name] List of DIDs =

Wondering if there is a Module type in there not being recognized or some odd DID that they added. Just in case, I deleted my whole device and had it add from scratch but it did not run into any issues. Then again, I do have a pretty old system by their standards now.

Although we could not figure out exactly WHY the error was happening for @inetjnky, I am publishing an update with a couple changes.

Updated Version(s):

  • NeptuneSystemsApex.groovy = 0.100.17


  • Additional error checking for Input and Output data to prevent null errors.
  • Added a Trace logging point for the JSON response received so it is easier to provide an entire response from the Apex rather than have people manually get it.

Weird, now it’s back to working again on my notifications…

1 Like

What it does now is effectively skip the entry with the null data, so it keeps going. If driver code hits an error (like yours was) it would otherwise STOP at that point, meaning it was not processing anything else after the point it errored so that was probably preventing your messages.

So at least the main problem is solved.

Here’s all my modules I have attached to my system. I do t see the MXM module listed. Does this driver support it?

MXM is "supported" but will not create a separate child device for itself. The MXM module acts as a bridge and does not appear to report any information of it's own. However, the devices it bridges for CAN provide information and I have added some of those as child devices so that people can control them (or monitor what little they provide). Of course I bet there are varieties I do not know about yet. :slight_smile:

But long story short, yes it is a known thing, but no, you will not get a child device for it.

1 Like

Updated Version(s):

  • NeptuneSystemsApex.groovy = 0.100.18
  • NSChild-EB832.groovy = 0.1.3
  • NSChild-ApexA3.groovy = 0.1.1
  • NSChild-ApexA3Jr.groovy = 0.1.1
  • NSChild-ApexA3Pro.groovy = 0.1.1
  • NSChild-FMM.groovy = 0.1.2


  • Attempting to handle GPH flow rate data. So added recognition of the GPH input field to the parent driver.
  • Parent driver now has an added preference to name match a particular flow rate input (like what is used for temperature, pH, etc...).
  • Child drivers have added attributes for each FMM input they have (the ones that can monitor flow rate). These are named FMM_#_rate to correspond with the particular input.
  • The sample I received also showed a GPH for the EB832 despite it lacking FMM inputs... so I added a rate attribute for it.
  • Flow rates are received as GPH, however they will be calculated and shown as a per-minute value (this was to support the built-in Hubitat capability of FlowRate until I realized that most of these can receive more than one flow rate) and if the user has Celsius as their Hubitat's temperature method will be converted to Liters Per Minute (LPM).
1 Like