Local MQTT gateway for FoxESS M1/Q1 microinverters - No cloud required

A Raspberry Pi-based gateway that pulls telemetry from FoxESS M1 (and potentially Q1) microinverters like the popular M1-800-E into Home Assistant without using the FoxESS cloud or mobile app at any point. The Pi intercepts the inverter's local TCP-to-cloud connection, decodes the proprietary frame format, and publishes everything to MQTT with auto-discovery.

What's in:

  • Setup via Bluetooth. The Pi can provision new and existing inverters directly over BLE, so the FoxESS mobile app isn't needed for setup.
  • Local telemetry every 90 s: PV power/voltage/current per string, AC power/voltage/current/frequency, inverter temperature, lifetime generation, lifetime grid export.
  • Diagnostic sensors: operating state, fault state, last fault code with a human-readable message, last fault time.
  • Optional cloud relay if you want the FoxESS app and cloud to keep working alongside.
  • Mesh-aware: with multiple inverters, sensors expose which one is the WiFi-connected mesh root and which are followers.
  • One install script sets up the AP, DHCP, redirect, daemon, and HA discovery and provision your inverter so it uses the new Wifi network.

Q1 testers wanted. The decoder has model-aware support for the Q1's third and fourth PV strings, but I don't own a Q1 to validate against. If you have one — particularly Q1-1600-E, Q1-2000-E, Q1-2400-E, or Q1-2500-E — and would be willing to try the installer and report what works or breaks, that would help close that gap.

Code, setup instructions, and a runbook:
github.com/040medien/foxess_local_gateway

1 Like

Would this work on any FoxESS inverter. Like the hybrid's? As long as they have a wifi-signal to send?

The honest answer is that I don't know. If they are built on the same platform, then I expect their communication protocol to be the same, but that only the fields that I've implemented for M1 (and potentially Q1) would be shown. There are plenty of zeros in the data packages I've observed, so I suspect that's where the model-specific data would live for those. The debug logs of my implementation would contain them, so if you want to try it and send me those, that would be a start. But I would need to also get full cloud data exports for the same time duration to correlate it with real world data so I can decode the fields.

I just managed to install it on a virtual machine on proxmoxx and it’s working like a charm. ChatGPT guided me through the installation. The virtual machine uses the on board wifi card to creat the separate wi-fi network and instead of forwarding the data to HA through another wi-fi connection I just send it through the virtual ethernet connection.

Thank you so much for this. I am still using the official app as back up, but in HA I only use local data which is a) updated more frequently and b) seems to provide more data compare to the FoxESS integration.

Love it! THANK YOU!

Thank you for creating the gateway.
I am a Q1-2000-E owner with Pi 3B, Zero is not yet available.
Bluetooth setup did not work, perhaps caused by Pi 3B, no BT found.
It works, My current Firmware is 1.22.
It generates some failures with each updates.
Last Fault Message →Remote Switch, AC Under Temperature, AC Over Temperature, AC Over Frequency, AC Under Voltage, AC Over Voltage, AC Over Current

Hi @wolf_gi, thank you for trying it. Good to hear the gateway is working in principle on a Q1-2000-E. Not sure if the bluetooth issue is related to the 3B, but you need it only for initial provisioning, which you can also do with the mobile app. So once it’s up and running, you’re fine.

That said, the Bluetooth result is worth investigating. If you try again, please share the output of sudo foxess-ble-provision scan and bluetoothctl show, with device IDs redacted.

The repeated combined fault message is not expected. Seeing under and over temperature or voltage together on every telemetry update does not look like a real simultaneous inverter fault. Q1 firmware 1.22 may use the fault/status fields differently from the versions the decoder was validated against.

Another Q1-2000-E owner previously confirmed successful provisioning and full four-string MQTT telemetry on firmware 1.07, so Q1 firmware versions may indeed behave differently. I do not know whether 1.22 is current or whether FoxESS offers a newer Q1 update.

To investigate the fault message, please run this after the next update:

sudo tail -n 30 /var/log/foxess-local-cloud/events.jsonl

Please post the most recent line whose event is telemetry. Please replace the inverter serial number with REDACTED before posting. The raw fault values in that line are what I need to compare Q1 firmware 1.22 with the previously tested Q1.

wolf@Fox-ESS-Q1:~/foxess_local_gateway $ sudo foxess-ble-provision scan
Scanning 8s for M1 inverters...
Traceback (most recent call last):
  File "/opt/foxess-local-cloud/tools/foxess-ble-provision", line 261, in <module>
    sys.exit(main())
             ~~~~^^
  File "/opt/foxess-local-cloud/tools/foxess-ble-provision", line 254, in main
    return asyncio.run(args.handler(args))
           ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/asyncio/runners.py", line 195, in run
    return runner.run(main)
           ~~~~~~~~~~^^^^^^
  File "/usr/lib/python3.13/asyncio/runners.py", line 118, in run
    return self._loop.run_until_complete(task)
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^
  File "/usr/lib/python3.13/asyncio/base_events.py", line 725, in run_until_complete
    return future.result()
           ~~~~~~~~~~~~~^^
  File "/opt/foxess-local-cloud/tools/foxess-ble-provision", line 65, in cmd_scan
    inverters = await bp.scan_for_inverters(timeout=args.timeout)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/foxess-local-cloud/foxess_local_cloud/ble_provision.py", line 281, in scan_for_inverters
    await scanner.start()
  File "/usr/lib/python3/dist-packages/bleak/__init__.py", line 203, in start
    await self._backend.start()
  File "/usr/lib/python3/dist-packages/bleak/backends/bluezdbus/scanner.py", line 173, in start
    adapter_path = manager.get_default_adapter()
  File "/usr/lib/python3/dist-packages/bleak/backends/bluezdbus/manager.py", line 361, in get_default_adapter
    raise BleakError("No powered Bluetooth adapters found.")
bleak.exc.BleakError: No powered Bluetooth adapters found.
wolf@Fox-ESS-Q1:~/foxess_local_gateway $ bluetoothctl show
Controller B8:27:EB:4D:80:73 (public)
	Manufacturer: 0x000f (15)
	Version: 0x07 (7)
	Name: Fox-ESS-Q1
	Alias: Fox-ESS-Q1
	Class: 0x00000000 (0)
	Powered: no
	PowerState: off-blocked
	Discoverable: no
	DiscoverableTimeout: 0x000000b4 (180)
	Pairable: no
	UUID: Generic Attribute Profile (00001801-0000-1000-8000-00805f9b34fb)
	UUID: Generic Access Profile    (00001800-0000-1000-8000-00805f9b34fb)
	UUID: SIM Access                (0000112d-0000-1000-8000-00805f9b34fb)
	UUID: PnP Information           (00001200-0000-1000-8000-00805f9b34fb)
	UUID: A/V Remote Control Target (0000110c-0000-1000-8000-00805f9b34fb)
	UUID: A/V Remote Control        (0000110e-0000-1000-8000-00805f9b34fb)
	UUID: Device Information        (0000180a-0000-1000-8000-00805f9b34fb)
	Modalias: usb:v1D6Bp0246d0552
	Discovering: no
	Roles: central
	Roles: peripheral
Advertising Features:
	ActiveInstances: 0x00 (0)
	SupportedInstances: 0x05 (5)
	SupportedIncludes: tx-power
	SupportedIncludes: appearance
	SupportedIncludes: local-name
	SupportedCapabilities.MaxAdvLen: 0x1f (31)
	SupportedCapabilities.MaxScnRspLen: 0x1f (31)

wolf@Fox-ESS-Q1:~/foxess_local_gateway $ sudo tail -n 30 /var/log/foxess-local-cloud/events.jsonl
{"at":"2026-08-30T11:47:03Z","code":"4151,4152,4153,4155,4159,4160","event":"fault_observed","known":true,"offsets":{"100":936,"102":963,"104":931,"106":0,"98":970},"serial":"XXXXXXXXXXXXXXXXX","session":1,"ts":1788090423.9037771}
{"event":"telemetry","export_power_w":392,"export_total_kwh":7.102,"fault_active":true,"firmware":"1.22","generation_kwh":7.102,"inverter_temperature_c":25.44,"last_fault_code":"4151,4152,4153,4155,4159,4160","last_fault_message":"Lost AC, BUS Over Voltage, GFDI, AC Over Temperature, AC Over Voltage, AC Over Current","last_fault_timestamp":"2026-08-30T11:47:03Z","mesh_role":"root","model":"Q1-E","module":"M10300","operating_state":"running","operating_state_code":4,"pv1_current_a":3.506,"pv1_power_w":111,"pv1_voltage_v":31.676,"pv2_current_a":3.096,"pv2_power_w":93,"pv2_voltage_v":30.086,"pv3_current_a":3.43,"pv3_power_w":102,"pv3_voltage_v":29.988,"pv4_current_a":3.365,"pv4_power_w":107,"pv4_voltage_v":31.836,"pv_power_w":413,"r_current_a":1.697,"r_frequency_hz":49.953,"r_power_w":392,"r_voltage_v":231.031,"raw_nonzero_u16":{"000":65535,"002":65144,"006":392,"012":7393,"014":869,"016":6394,"018":392,"036":8109,"038":1795,"040":111,"042":7702,"044":1585,"046":93,"048":7677,"050":1756,"052":102,"054":8150,"056":1723,"058":107,"062":814,"066":191,"070":909,"074":909,"096":1000,"098":970,"100":936,"102":963,"104":931,"114":215,"116":237,"154":4,"156":4,"174":250,"178":207,"182":215,"186":237},"raw_u16_000":65535,"raw_u16_002":65144,"raw_u16_096":1000,"raw_u16_098":970,"raw_u16_100":936,"raw_u16_102":963,"raw_u16_104":931,"raw_u16_106":0,"raw_u16_154":4,"raw_u16_156":4,"sequence":191,"serial":"XXXXXXXXXXXXXXXXX","session":1,"ts":1788090423.9067013}
{"bytes":51,"direction":"client_to_upstream","event":"relay_decrypted","payload_hex":"7e 7e 06 00 00 00 00 00 26 4d 31 30 33 30 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 36 88 e7 e7","session":1,"ts":1788090453.9364376}
{"ascii":"M10300................................","bytes":51,"device":"06000000","event":"frame","family":"7e","func":"0x00","payload_hex":"4d 31 30 33 30 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00","payload_len":38,"serial":"XXXXXXXXXXXXXXXXX","session":1,"ts":1788090453.9380534,"valid_crc":true}
{"event":"module_info","module":"M10300","serial":"XXXXXXXXXXXXXXXXX","session":1,"ts":1788090453.938568}
{"bytes":121,"direction":"client_to_upstream","event":"relay_decrypted","payload_hex":"7e 7e 01 00 00 00 00 00 6c 4d 31 56 31 32 32 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 51 31 2d 45 00 00 00 00 51 31 2d 32 30 30 30 2d 45 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 32 30 30 30 00 04 00 00 31 2e 32 32 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 cc 17 e7 e7","session":1,"ts":1788090484.2600043}
{"ascii":"M1V122....................Q1-E....Q1-2000-E...............2000....1.22......................................","bytes":121,"device":"01000000","event":"frame","family":"7e","func":"0x00","payload_hex":"4d 31 56 31 32 32 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 51 31 2d 45 00 00 00 00 51 31 2d 32 30 30 30 2d 45 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 32 30 30 30 00 04 00 00 31 2e 32 32 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00","payload_len":108,"serial":"XXXXXXXXXXXXXXXXX","session":1,"ts":1788090484.262768,"valid_crc":true}
{"event":"product_info","family":"M1V122","firmware":"1.22","model":"Q1-E","module":"M1V122","serial":"XXXXXXXXXXXXXXXXX","session":1,"ts":1788090484.2641602}
{"bytes":251,"direction":"client_to_upstream","event":"relay_decrypted","payload_hex":"7e 7e 02 00 00 00 00 00 ee ff ff fe 42 00 00 01 be 00 00 00 00 1c da 03 dd 18 fd 01 be 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1f a1 08 04 00 7e 1e 69 07 06 00 6a 1e 75 07 ad 00 74 1f d5 07 b9 00 7a 00 00 02 df 00 00 00 c1 00 00 03 8f 00 00 03 8f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 e8 03 cb 03 aa 03 c4 03 a7 00 00 00 00 00 00 00 00 00 d7 00 ed 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 fb 00 00 00 d0 00 00 00 d7 00 00 00 ed 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 6e 79 e7 e7","session":1,"ts":1788090514.6432252}
{"ascii":"...B.....................................~.i...j.u...t.....z..................................................................................................................................................................................","bytes":251,"device":"02000000","event":"frame","family":"7e","func":"0x00","payload_hex":"ff ff fe 42 00 00 01 be 00 00 00 00 1c da 03 dd 18 fd 01 be 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1f a1 08 04 00 7e 1e 69 07 06 00 6a 1e 75 07 ad 00 74 1f d5 07 b9 00 7a 00 00 02 df 00 00 00 c1 00 00 03 8f 00 00 03 8f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 e8 03 cb 03 aa 03 c4 03 a7 00 00 00 00 00 00 00 00 00 d7 00 ed 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 fb 00 00 00 d0 00 00 00 d7 00 00 00 ed 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00","payload_len":238,"serial":"XXXXXXXXXXXXXXXXX","session":1,"ts":1788090514.6483777,"valid_crc":true}
{"at":"2026-08-30T11:48:34Z","code":"4151,4152,4153,4155,4158,4159,4160","event":"fault_observed","known":true,"offsets":{"100":938,"102":964,"104":935,"106":0,"98":971},"serial":"XXXXXXXXXXXXXXXXX","session":1,"ts":1788090514.649473}
{"event":"telemetry","export_power_w":446,"export_total_kwh":7.117,"fault_active":true,"firmware":"1.22","generation_kwh":7.117,"inverter_temperature_c":22.97,"last_fault_code":"4151,4152,4153,4155,4158,4159,4160","last_fault_message":"Lost AC, BUS Over Voltage, GFDI, AC Over Temperature, AC Under Voltage, AC Over Voltage, AC Over Current","last_fault_timestamp":"2026-08-30T11:48:34Z","mesh_role":"root","model":"Q1-E","module":"M10300","operating_state":"running","operating_state_code":4,"pv1_current_a":4.008,"pv1_power_w":126,"pv1_voltage_v":31.629,"pv2_current_a":3.512,"pv2_power_w":106,"pv2_voltage_v":30.41,"pv3_current_a":3.838,"pv3_power_w":116,"pv3_voltage_v":30.457,"pv4_current_a":3.861,"pv4_power_w":122,"pv4_voltage_v":31.832,"pv_power_w":470,"r_current_a":1.932,"r_frequency_hz":49.977,"r_power_w":446,"r_voltage_v":230.812,"raw_nonzero_u16":{"000":65535,"002":65090,"006":446,"012":7386,"014":989,"016":6397,"018":446,"036":8097,"038":2052,"040":126,"042":7785,"044":1798,"046":106,"048":7797,"050":1965,"052":116,"054":8149,"056":1977,"058":122,"062":735,"066":193,"070":911,"074":911,"096":1000,"098":971,"100":938,"102":964,"104":935,"114":215,"116":237,"154":4,"156":4,"174":251,"178":208,"182":215,"186":237},"raw_u16_000":65535,"raw_u16_002":65090,"raw_u16_096":1000,"raw_u16_098":971,"raw_u16_100":938,"raw_u16_102":964,"raw_u16_104":935,"raw_u16_106":0,"raw_u16_154":4,"raw_u16_156":4,"sequence":193,"serial":"XXXXXXXXXXXXXXXXX","session":1,"ts":1788090514.652002}
{"bytes":51,"direction":"client_to_upstream","event":"relay_decrypted","payload_hex":"7e 7e 06 00 00 00 00 00 26 4d 31 30 33 30 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 36 88 e7 e7","session":1,"ts":1788090544.6858764}
{"ascii":"M10300................................","bytes":51,"device":"06000000","event":"frame","family":"7e","func":"0x00","payload_hex":"4d 31 30 33 30 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00","payload_len":38,"serial":"XXXXXXXXXXXXXXXXX","session":1,"ts":1788090544.687391,"valid_crc":true}
{"event":"module_info","module":"M10300","serial":"XXXXXXXXXXXXXXXXX","session":1,"ts":1788090544.6878517}
{"bytes":121,"direction":"client_to_upstream","event":"relay_decrypted","payload_hex":"7e 7e 01 00 00 00 00 00 6c 4d 31 56 31 32 32 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 51 31 2d 45 00 00 00 00 51 31 2d 32 30 30 30 2d 45 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 32 30 30 30 00 04 00 00 31 2e 32 32 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 cc 17 e7 e7","session":1,"ts":1788090575.0091968}
{"ascii":"M1V122....................Q1-E....Q1-2000-E...............2000....1.22......................................","bytes":121,"device":"01000000","event":"frame","family":"7e","func":"0x00","payload_hex":"4d 31 56 31 32 32 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 51 31 2d 45 00 00 00 00 51 31 2d 32 30 30 30 2d 45 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 32 30 30 30 00 04 00 00 31 2e 32 32 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00","payload_len":108,"serial":"XXXXXXXXXXXXXXXXX","session":1,"ts":1788090575.0118852,"valid_crc":true}
{"event":"product_info","family":"M1V122","firmware":"1.22","model":"Q1-E","module":"M1V122","serial":"XXXXXXXXXXXXXXXXX","session":1,"ts":1788090575.0134294}
{"bytes":36,"direction":"client_to_upstream","event":"relay_decrypted","payload_hex":"7f 7f 3f 6a 94 89 50 00 17 01 05 01 01 00 06 ba 27 eb 12 7f 8c 03 0d 07 a1 01 00 04 00 00 65 f4 49 0b f7 f7","session":1,"ts":1788090575.8131073}
{"ascii":".......'.............e.","bytes":36,"device":"3f6a9489","event":"frame","family":"7f","func":"0x50","payload_hex":"01 05 01 01 00 06 ba 27 eb 12 7f 8c 03 0d 07 a1 01 00 04 00 00 65 f4","payload_len":23,"serial":"XXXXXXXXXXXXXXXXX","session":1,"ts":1788090575.8143582,"valid_crc":true}
{"bytes":251,"direction":"client_to_upstream","event":"relay_decrypted","payload_hex":"7e 7e 02 00 00 00 00 00 ee ff ff fd 91 00 00 02 6f 00 00 00 00 1d 09 05 5c 18 fc 02 6f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1f 83 0b 0c 00 ae 1e 69 09 ea 00 96 1e 47 0a bd 00 a2 1e dd 0b 0a 00 aa 00 00 03 2e 00 00 00 c3 00 00 03 91 00 00 03 91 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 e8 03 d4 03 b4 03 ce 03 ae 00 00 00 00 00 00 00 00 00 d8 00 ee 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 fb 00 00 00 d0 00 00 00 d8 00 00 00 ee 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 50 81 e7 e7","session":1,"ts":1788090605.39907}
{"ascii":".......o.......\\...o.......................i.....G............................................................................................................................................................................................","bytes":251,"device":"02000000","event":"frame","family":"7e","func":"0x00","payload_hex":"ff ff fd 91 00 00 02 6f 00 00 00 00 1d 09 05 5c 18 fc 02 6f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1f 83 0b 0c 00 ae 1e 69 09 ea 00 96 1e 47 0a bd 00 a2 1e dd 0b 0a 00 aa 00 00 03 2e 00 00 00 c3 00 00 03 91 00 00 03 91 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 e8 03 d4 03 b4 03 ce 03 ae 00 00 00 00 00 00 00 00 00 d8 00 ee 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 fb 00 00 00 d0 00 00 00 d8 00 00 00 ee 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00","payload_len":238,"serial":"XXXXXXXXXXXXXXXXX","session":1,"ts":1788090605.4038608,"valid_crc":true}
{"at":"2026-08-30T11:50:05Z","code":"4151,4152,4153,4155,4157,4158,4159","event":"fault_observed","known":true,"offsets":{"100":948,"102":974,"104":942,"106":0,"98":980},"serial":"XXXXXXXXXXXXXXXXX","session":1,"ts":1788090605.4048588}
{"event":"telemetry","export_power_w":623,"export_total_kwh":7.133,"fault_active":true,"firmware":"1.22","generation_kwh":7.133,"inverter_temperature_c":25.44,"last_fault_code":"4151,4152,4153,4155,4157,4158,4159","last_fault_message":"Lost AC, BUS Over Voltage, GFDI, AC Over Temperature, AC Over Frequency, AC Under Voltage, AC Over Voltage","last_fault_timestamp":"2026-08-30T11:50:05Z","mesh_role":"root","model":"Q1-E","module":"M10300","operating_state":"running","operating_state_code":4,"pv1_current_a":5.523,"pv1_power_w":174,"pv1_voltage_v":31.512,"pv2_current_a":4.957,"pv2_power_w":150,"pv2_voltage_v":30.41,"pv3_current_a":5.369,"pv3_power_w":162,"pv3_voltage_v":30.277,"pv4_current_a":5.52,"pv4_power_w":170,"pv4_voltage_v":30.863,"pv_power_w":656,"r_current_a":2.68,"r_frequency_hz":49.969,"r_power_w":623,"r_voltage_v":232.281,"raw_nonzero_u16":{"000":65535,"002":64913,"006":623,"012":7433,"014":1372,"016":6396,"018":623,"036":8067,"038":2828,"040":174,"042":7785,"044":2538,"046":150,"048":7751,"050":2749,"052":162,"054":7901,"056":2826,"058":170,"062":814,"066":195,"070":913,"074":913,"096":1000,"098":980,"100":948,"102":974,"104":942,"114":216,"116":238,"154":4,"156":4,"174":251,"178":208,"182":216,"186":238},"raw_u16_000":65535,"raw_u16_002":64913,"raw_u16_096":1000,"raw_u16_098":980,"raw_u16_100":948,"raw_u16_102":974,"raw_u16_104":942,"raw_u16_106":0,"raw_u16_154":4,"raw_u16_156":4,"sequence":195,"serial":"XXXXXXXXXXXXXXXXX","session":1,"ts":1788090605.4074368}
{"bytes":51,"direction":"client_to_upstream","event":"relay_decrypted","payload_hex":"7e 7e 06 00 00 00 00 00 26 4d 31 30 33 30 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 36 88 e7 e7","session":1,"ts":1788090635.4338522}
{"ascii":"M10300................................","bytes":51,"device":"06000000","event":"frame","family":"7e","func":"0x00","payload_hex":"4d 31 30 33 30 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00","payload_len":38,"serial":"XXXXXXXXXXXXXXXXX","session":1,"ts":1788090635.4354074,"valid_crc":true}
{"event":"module_info","module":"M10300","serial":"XXXXXXXXXXXXXXXXX","session":1,"ts":1788090635.4359126}
{"bytes":121,"direction":"client_to_upstream","event":"relay_decrypted","payload_hex":"7e 7e 01 00 00 00 00 00 6c 4d 31 56 31 32 32 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 51 31 2d 45 00 00 00 00 51 31 2d 32 30 30 30 2d 45 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 32 30 30 30 00 04 00 00 31 2e 32 32 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 cc 17 e7 e7","session":1,"ts":1788090665.7577255}
{"ascii":"M1V122....................Q1-E....Q1-2000-E...............2000....1.22......................................","bytes":121,"device":"01000000","event":"frame","family":"7e","func":"0x00","payload_hex":"4d 31 56 31 32 32 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 51 31 2d 45 00 00 00 00 51 31 2d 32 30 30 30 2d 45 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 32 30 30 30 00 04 00 00 31 2e 32 32 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00","payload_len":108,"serial":"XXXXXXXXXXXXXXXXX","session":1,"ts":1788090665.7603817,"valid_crc":true}
{"event":"product_info","family":"M1V122","firmware":"1.22","model":"Q1-E","module":"M1V122","serial":"XXXXXXXXXXXXXXXXX","session":1,"ts":1788090665.7618911}
wolf@Fox-ESS-Q1:~/foxess_local_gateway $ 

Thank you, this pinpoints both issues.

The Pi 3B Bluetooth adapter is detected but disabled. Please run:

sudo rfkill unblock bluetooth
sudo systemctl restart bluetooth
bluetoothctl power on
sudo foxess-ble-provision scan

The changing values are not fault bits on Q1 firmware 1.22, so those reported faults are false positives. I have shipped a fix that hides the incorrect Q1 fault entities while retaining raw diagnostics for further decoding. The normal telemetry looks good.

Thanks for quick response. BT works now.

wolf@Fox-ESS-Q1:~/foxess_local_gateway $ sudo foxess-ble-provision scan
Scanning 8s for M1 inverters...
Found 1 inverter(s):
   1. A8:46:74:68:D9:8E  MI_XXXXXXXXXXXXXX       RSSI  -59 dBm

How to install the fix?

you ssh into your pi, then:

cd foxess_local_gateway
git pull
sudo ./installer/install_pi_zero_gateway.sh

Thanks, first I tried a git clone - which does not make it.
Git pull did the magic, no more faults.
The inverter should have an “Active Power Limit”.
I asked FoxESS for software update. Let’s wait for their answer.
BR

One more question:
during night it gets unavailable due to no DC power.
Is it possible to hold the last states in HA?

The inverter might have an Active Power Limit, you can see it if you create an installer profile at foxess2.0 - there you can also do the firmware upgrade.

Holding the last state is not the right approach IMHO. I am running it behind a battery and if its output turns off, the last state is not 0 Watt, but something much higher.

1 Like

I created a new admin account, “Active Power Limit” is visible and a lot more.
The app doesn’t offer new FW. For now everything is fine.
If you need assistance from Q1 side, just ask.
Thanks again