<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://sigrok.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Hageman</id>
	<title>sigrok - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://sigrok.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Hageman"/>
	<link rel="alternate" type="text/html" href="https://sigrok.org/wiki/Special:Contributions/Hageman"/>
	<updated>2026-04-23T14:30:03Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Mooshim_Engineering_Mooshimeter&amp;diff=14156</id>
		<title>Mooshim Engineering Mooshimeter</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Mooshim_Engineering_Mooshimeter&amp;diff=14156"/>
		<updated>2019-03-27T23:35:47Z</updated>

		<summary type="html">&lt;p&gt;Hageman: /* Hardware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox multimeter&lt;br /&gt;
| image           = [[File:Mooshimeter-2X01A.jpg|180px]]&lt;br /&gt;
| name            = Mooshimeter DMM-BLE-2X01A&lt;br /&gt;
| status          = planned&lt;br /&gt;
| source_code_dir = ble-dmm&lt;br /&gt;
| counts          = 24 bit&lt;br /&gt;
| categories      = CAT III (600V)&lt;br /&gt;
| connectivity    = ble (aka Bluetooth Smart) ONLY&lt;br /&gt;
| measurements    = voltage, resistance, diode, continuity, frequency, current, temperature&lt;br /&gt;
| features        = autorange, logging to SD card, current / voltage simultaneously&lt;br /&gt;
| website         = https://moosh.im/mooshimeter/&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;Mooshimeter&amp;#039;&amp;#039;&amp;#039; is a 24-bit, two channel, CAT III (600V) remote access digital multimeter with Bluetooth Low Energy connectivity.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Multimeter&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
* BLE SoC: [http://www.ti.com/product/CC2540 TI CC2540] (custom firmware)&lt;br /&gt;
* ADC: [http://www.ti.com/product/ADS1292 ADS1292]&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Multimeter&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Mooshimeter-2X01A.jpg&lt;br /&gt;
File:Mooshimeter_Component_Side.jpg&lt;br /&gt;
File:Mooshimeter_Connection_Side.jpg&lt;br /&gt;
File:Mooshimeter_BLE_SoC.jpg&lt;br /&gt;
File:Mooshimeter_ADC.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Protocol ==&lt;br /&gt;
&lt;br /&gt;
Though the BLE SoC powering the Mooshimeter appears to be a TI CC2540,&lt;br /&gt;
the firmware running on it is not the standard &amp;quot;UART to BLE&amp;quot; that is&lt;br /&gt;
commonly found on them.  Instead, it implements the entire meter control&lt;br /&gt;
and its own custom protocol.&lt;br /&gt;
&lt;br /&gt;
The Mooshimeter protocol is broken down into several layers in a&lt;br /&gt;
communication stack.&lt;br /&gt;
&lt;br /&gt;
The lowest layer is the BLE GATT stack, which provides two characteristics:&lt;br /&gt;
one to write packets to the meter and one to receive them from it.  The&lt;br /&gt;
MTU for a packet in either direction is 20 bytes.  This is implemented&lt;br /&gt;
in the GATT abstraction, so we can talk to it via simple write commands&lt;br /&gt;
and a read callback.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The next layer is the serial stream: each BLE packet in either direction&lt;br /&gt;
has a 1-byte header of a sequence number.  Despite what the documentation&lt;br /&gt;
says, this is present in both directions (not just meter output) and is&lt;br /&gt;
NOT reset on the meter output on BLE connection.  So the implementation&lt;br /&gt;
here needs to provide an output sequence number and incoming reassembly&lt;br /&gt;
for out of order packets (I haven&amp;#039;t actually observed this, but&lt;br /&gt;
supposedly it happens, which is why the sequence number is present).&lt;br /&gt;
So the structure of packets received looks like:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 1 byte&lt;br /&gt;
! 1-19 bytes&lt;br /&gt;
|-&lt;br /&gt;
|SeqNum &lt;br /&gt;
| Serial Data &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On top of the serial layer is the &amp;quot;config tree&amp;quot; layer.  This is how&lt;br /&gt;
the meter actually exposes data and configuration.  The tree itself&lt;br /&gt;
is composed of nodes, each with a string name, data type, and a list&lt;br /&gt;
of children (zero or more).  For value containing (non-informational)&lt;br /&gt;
nodes, they also contain a 7-bit unique identifier.  Access to the&lt;br /&gt;
config tree is provided by packets on the serial stream, each packet&lt;br /&gt;
has a 1-byte header, where the uppermost bit (0x80) is set when writing&lt;br /&gt;
(i.e. never by the meter) and the remaining 7 bits are the node identifier.&lt;br /&gt;
The length of the packets varies based on the datatype of the tree node.&lt;br /&gt;
This means that any lost/dropped packets can make the stream unrecoverable&lt;br /&gt;
(i.e. there&amp;#039;s no defined sync method other that reconnection).  Packets&lt;br /&gt;
are emitted by the meter in response to a read or write command (write&lt;br /&gt;
commands simply back the value) and at unsolicited times by the meter&lt;br /&gt;
(e.g. continuous sampling and periodic battery voltage).  A read packet&lt;br /&gt;
send to the meter looks like:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 1 bit&lt;br /&gt;
! 7 bits&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| NodeID &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In response to the read, the meter will send:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 1 bit &lt;br /&gt;
! 7 bits &lt;br /&gt;
! 1-N bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| NodeID &lt;br /&gt;
| NodeValue&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
A write packet sent to the meter:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 1 bit &lt;br /&gt;
! 7 bits &lt;br /&gt;
! 1-N bytes |&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| NodeID &lt;br /&gt;
| NodeValue&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In response to the write, the meter will send a read response:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 1 bit &lt;br /&gt;
! 7 bits &lt;br /&gt;
! 1-N bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| NodeID &lt;br /&gt;
| NodeValue &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For the data in the tree, all values are little endian (least significant&lt;br /&gt;
bytes first).  The supported type codes are:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code &lt;br /&gt;
! Description &lt;br /&gt;
! Wire Format&lt;br /&gt;
|-&lt;br /&gt;
|  0   || Plain       ||                                        &lt;br /&gt;
|-&lt;br /&gt;
|  1   || Link        ||                                        &lt;br /&gt;
|-&lt;br /&gt;
|  2   || Chooser     || uint8_t                                &lt;br /&gt;
|-&lt;br /&gt;
|  3   || U8          || uint8_t                                &lt;br /&gt;
|-&lt;br /&gt;
|  4   || U16         || uint16_t                               &lt;br /&gt;
|-&lt;br /&gt;
|  5   || U32         || uint32_t                               &lt;br /&gt;
|-&lt;br /&gt;
|  6   || S8          || int8_t                                 &lt;br /&gt;
|-&lt;br /&gt;
|  7   || S16         || int16_t   &lt;br /&gt;
|-                             &lt;br /&gt;
|  8   || S32         || int32_t                                &lt;br /&gt;
|-&lt;br /&gt;
|  9   || String      || uint16_t length; char value[length]    &lt;br /&gt;
|-&lt;br /&gt;
|  10  || Binary      || uint16_t length; uint8_t value[length] &lt;br /&gt;
|-&lt;br /&gt;
|  11  || Float       || float                                  &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Plain and Link nodes are present to provide information and/or choices&lt;br /&gt;
but do not provide commands codes for direct access (see serialization&lt;br /&gt;
below).  Chooser nodes are written with indices described by their Plain&lt;br /&gt;
type children (e.g. to select a choice identified by the second child&lt;br /&gt;
of a chooser, write 1 to the chooser node itself).&lt;br /&gt;
&lt;br /&gt;
On initial connection only three nodes at fixed identifiers are available:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Node             &lt;br /&gt;
! ID &lt;br /&gt;
! Type   &lt;br /&gt;
|-&lt;br /&gt;
| ADMIN:CRC32      || 0  || U32    &lt;br /&gt;
|-&lt;br /&gt;
| ADMIN:TREE       || 1  || Binary &lt;br /&gt;
|-&lt;br /&gt;
| ADMIN:DIAGNOSTIC || 2  || String &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The handshake sequence is to read the contents of ADMIN:TREE, which contains&lt;br /&gt;
the zlib compressed tree serialization, then write the CRC of the compressed&lt;br /&gt;
data back to ADMIN:CRC32 (which the meter will echo back).  Only after&lt;br /&gt;
that is done will the meter accept access to the rest of the tree.&lt;br /&gt;
&lt;br /&gt;
After zlib decompression the tree serialization is as follows:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Type         &lt;br /&gt;
! Description &lt;br /&gt;
|-&lt;br /&gt;
| uint8_t      || The node data type code from above  &lt;br /&gt;
|-&lt;br /&gt;
| uint8_t      || Name length                         &lt;br /&gt;
|-&lt;br /&gt;
| char[length] || Node name (e.g. &amp;quot;ADMIN&amp;quot; or &amp;quot;CRC32&amp;quot;) &lt;br /&gt;
|-&lt;br /&gt;
| uint8_t      || Number of children                  &lt;br /&gt;
|-&lt;br /&gt;
| Node[count]  || Child serialization (length varies) &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Once the tree has been deserialized, each node needs it identifier&lt;br /&gt;
assigned.  This is a depth first tree walk, assigning sequential identifiers&lt;br /&gt;
first the the current node (if it needs one), then repeating recursively&lt;br /&gt;
for each of its children.  Plain and Link nodes are skipped in assignment&lt;br /&gt;
but not the walk (so the recursion still happens, but the identifier&lt;br /&gt;
is not incremented).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So, for example a write to the ADMIN:CRC32 as part of the handshake would&lt;br /&gt;
be a write by us (the host):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! SerSeq &lt;br /&gt;
! NodeID &lt;br /&gt;
! U32 (CRC)  &lt;br /&gt;
|-&lt;br /&gt;
! 1 byte &lt;br /&gt;
! 1 byte &lt;br /&gt;
! 4 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x01  &lt;br /&gt;
| 0x80  &lt;br /&gt;
| 0xDEADBEEF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The meter will respond with a packet like:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! SerSeq &lt;br /&gt;
! NodeID &lt;br /&gt;
! U32 (CRC) &lt;br /&gt;
|-&lt;br /&gt;
! 1 byte &lt;br /&gt;
! 1 byte &lt;br /&gt;
! 4 bytes  &lt;br /&gt;
|-&lt;br /&gt;
|  0x42  &lt;br /&gt;
|  0x00  &lt;br /&gt;
| 0xDEADBEEF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
A spontaneous error from the meter (e.g. in response to a bad packet)&lt;br /&gt;
can be emitted like:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! SerSeq &lt;br /&gt;
! NodeID &lt;br /&gt;
! U16 (len)  &lt;br /&gt;
!      String      &lt;br /&gt;
|-&lt;br /&gt;
! 1 byte &lt;br /&gt;
! 1 byte &lt;br /&gt;
!   2 bytes  &lt;br /&gt;
!  len (=8) bytes  &lt;br /&gt;
|-&lt;br /&gt;
|  0xAB  &lt;br /&gt;
|  0x20  &lt;br /&gt;
|   0x0008   &lt;br /&gt;
|    BAD\x20DATA   &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The config tree at the time of writing looks like:&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;ROOT&amp;gt; (PLAIN)&lt;br /&gt;
        ADMIN (PLAIN)&lt;br /&gt;
                CRC32 (U32) = 0&lt;br /&gt;
                TREE (BIN) = 1&lt;br /&gt;
                DIAGNOSTIC (STR) = 2&lt;br /&gt;
        PCB_VERSION (U8) = 3&lt;br /&gt;
        NAME (STR) = 4&lt;br /&gt;
        TIME_UTC (U32) = 5&lt;br /&gt;
        TIME_UTC_MS (U16) = 6&lt;br /&gt;
        BAT_V (FLT) = 7&lt;br /&gt;
        REBOOT (CHOOSER) = 8&lt;br /&gt;
                NORMAL (PLAIN)&lt;br /&gt;
                SHIPMODE (PLAIN)&lt;br /&gt;
        SAMPLING (PLAIN)&lt;br /&gt;
                RATE (CHOOSER) = 9&lt;br /&gt;
                        125 (PLAIN)&lt;br /&gt;
                        250 (PLAIN)&lt;br /&gt;
                        500 (PLAIN)&lt;br /&gt;
                        1000 (PLAIN)&lt;br /&gt;
                        2000 (PLAIN)&lt;br /&gt;
                        4000 (PLAIN)&lt;br /&gt;
                        8000 (PLAIN)&lt;br /&gt;
                DEPTH (CHOOSER) = 10&lt;br /&gt;
                        32 (PLAIN)&lt;br /&gt;
                        64 (PLAIN)&lt;br /&gt;
                        128 (PLAIN)&lt;br /&gt;
                        256 (PLAIN)&lt;br /&gt;
                TRIGGER (CHOOSER) = 11&lt;br /&gt;
                        OFF (PLAIN)&lt;br /&gt;
                        SINGLE (PLAIN)&lt;br /&gt;
                        CONTINUOUS (PLAIN)&lt;br /&gt;
        LOG (PLAIN)&lt;br /&gt;
                ON (U8) = 12&lt;br /&gt;
                INTERVAL (U16) = 13&lt;br /&gt;
                STATUS (U8) = 14&lt;br /&gt;
                POLLDIR (U8) = 15&lt;br /&gt;
                INFO (PLAIN)&lt;br /&gt;
                        INDEX (U16) = 16&lt;br /&gt;
                        END_TIME (U32) = 17&lt;br /&gt;
                        N_BYTES (U32) = 18&lt;br /&gt;
                STREAM (PLAIN)&lt;br /&gt;
                        INDEX (U16) = 19&lt;br /&gt;
                        OFFSET (U32) = 20&lt;br /&gt;
                        DATA (BIN) = 21&lt;br /&gt;
        CH1 (PLAIN)&lt;br /&gt;
                MAPPING (CHOOSER) = 22&lt;br /&gt;
                        CURRENT (PLAIN)&lt;br /&gt;
                                10 (PLAIN)&lt;br /&gt;
                        TEMP (PLAIN)&lt;br /&gt;
                                350 (PLAIN)&lt;br /&gt;
                        SHARED (LINK)&lt;br /&gt;
                RANGE_I (U8) = 23&lt;br /&gt;
                ANALYSIS (CHOOSER) = 24&lt;br /&gt;
                        MEAN (PLAIN)&lt;br /&gt;
                        RMS (PLAIN)&lt;br /&gt;
                        BUFFER (PLAIN)&lt;br /&gt;
                VALUE (FLT) = 25&lt;br /&gt;
                OFFSET (FLT) = 26&lt;br /&gt;
                BUF (BIN) = 27&lt;br /&gt;
                BUF_BPS (U8) = 28&lt;br /&gt;
                BUF_LSB2NATIVE (FLT) = 29&lt;br /&gt;
        CH2 (PLAIN)&lt;br /&gt;
                MAPPING (CHOOSER) = 30&lt;br /&gt;
                        VOLTAGE (PLAIN)&lt;br /&gt;
                                60 (PLAIN)&lt;br /&gt;
                                600 (PLAIN)&lt;br /&gt;
                        TEMP (PLAIN)&lt;br /&gt;
                                350 (PLAIN)&lt;br /&gt;
                        SHARED (LINK)&lt;br /&gt;
                RANGE_I (U8) = 31&lt;br /&gt;
                ANALYSIS (CHOOSER) = 32&lt;br /&gt;
                        MEAN (PLAIN)&lt;br /&gt;
                        RMS (PLAIN)&lt;br /&gt;
                        BUFFER (PLAIN)&lt;br /&gt;
                VALUE (FLT) = 33&lt;br /&gt;
                OFFSET (FLT) = 34&lt;br /&gt;
                BUF (BIN) = 35&lt;br /&gt;
                BUF_BPS (U8) = 36&lt;br /&gt;
                BUF_LSB2NATIVE (FLT) = 37&lt;br /&gt;
        SHARED (CHOOSER) = 38&lt;br /&gt;
                AUX_V (PLAIN)&lt;br /&gt;
                        0.1 (PLAIN)&lt;br /&gt;
                        0.3 (PLAIN)&lt;br /&gt;
                        1.2 (PLAIN)&lt;br /&gt;
                RESISTANCE (PLAIN)&lt;br /&gt;
                        1000.0 (PLAIN)&lt;br /&gt;
                        10000.0 (PLAIN)&lt;br /&gt;
                        100000.0 (PLAIN)&lt;br /&gt;
                        1000000.0 (PLAIN)&lt;br /&gt;
                        10000000.0 (PLAIN)&lt;br /&gt;
                DIODE (PLAIN)&lt;br /&gt;
                        1.2 (PLAIN)&lt;br /&gt;
        REAL_PWR (FLT) = 39&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
* [https://moosh.im/mooshimeter/specs/ Specs]&lt;br /&gt;
* [https://moosh.im/s/manual/MooshimeterManualRev1.pdf Manual]&lt;br /&gt;
* [https://play.google.com/store/apps/details?id=com.mooshim.mooshimeter&amp;amp;hl=en_GB Vendor software (Android)] [https://github.com/mooshim/Mooshimeter-AndroidApp sources]&lt;br /&gt;
* [https://itunes.apple.com/us/app/mooshimeter/id945898277?mt=8 Vendor software (iOS)]&lt;br /&gt;
* [https://gitlab.com/Sizurka/libsigrok/tree/mooshimeter/src/hardware/mooshimeter-dmm Out of tree driver (Linux only BLE stack)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Device]]&lt;br /&gt;
[[Category:Multimeter]]&lt;br /&gt;
[[Category:Planned]]&lt;/div&gt;</summary>
		<author><name>Hageman</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Mooshim_Engineering_Mooshimeter&amp;diff=14155</id>
		<title>Mooshim Engineering Mooshimeter</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Mooshim_Engineering_Mooshimeter&amp;diff=14155"/>
		<updated>2019-03-27T23:07:11Z</updated>

		<summary type="html">&lt;p&gt;Hageman: /* Resources */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox multimeter&lt;br /&gt;
| image           = [[File:Mooshimeter-2X01A.jpg|180px]]&lt;br /&gt;
| name            = Mooshimeter DMM-BLE-2X01A&lt;br /&gt;
| status          = planned&lt;br /&gt;
| source_code_dir = ble-dmm&lt;br /&gt;
| counts          = 24 bit&lt;br /&gt;
| categories      = CAT III (600V)&lt;br /&gt;
| connectivity    = ble (aka Bluetooth Smart) ONLY&lt;br /&gt;
| measurements    = voltage, resistance, diode, continuity, frequency, current, temperature&lt;br /&gt;
| features        = autorange, logging to SD card, current / voltage simultaneously&lt;br /&gt;
| website         = https://moosh.im/mooshimeter/&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;Mooshimeter&amp;#039;&amp;#039;&amp;#039; is a 24-bit, two channel, CAT III (600V) remote access digital multimeter with Bluetooth Low Energy connectivity.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Multimeter&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Multimeter&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Mooshimeter-2X01A.jpg&lt;br /&gt;
File:Mooshimeter_Component_Side.jpg&lt;br /&gt;
File:Mooshimeter_Connection_Side.jpg&lt;br /&gt;
File:Mooshimeter_BLE_SoC.jpg&lt;br /&gt;
File:Mooshimeter_ADC.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Protocol ==&lt;br /&gt;
&lt;br /&gt;
Though the BLE SoC powering the Mooshimeter appears to be a TI CC2540,&lt;br /&gt;
the firmware running on it is not the standard &amp;quot;UART to BLE&amp;quot; that is&lt;br /&gt;
commonly found on them.  Instead, it implements the entire meter control&lt;br /&gt;
and its own custom protocol.&lt;br /&gt;
&lt;br /&gt;
The Mooshimeter protocol is broken down into several layers in a&lt;br /&gt;
communication stack.&lt;br /&gt;
&lt;br /&gt;
The lowest layer is the BLE GATT stack, which provides two characteristics:&lt;br /&gt;
one to write packets to the meter and one to receive them from it.  The&lt;br /&gt;
MTU for a packet in either direction is 20 bytes.  This is implemented&lt;br /&gt;
in the GATT abstraction, so we can talk to it via simple write commands&lt;br /&gt;
and a read callback.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The next layer is the serial stream: each BLE packet in either direction&lt;br /&gt;
has a 1-byte header of a sequence number.  Despite what the documentation&lt;br /&gt;
says, this is present in both directions (not just meter output) and is&lt;br /&gt;
NOT reset on the meter output on BLE connection.  So the implementation&lt;br /&gt;
here needs to provide an output sequence number and incoming reassembly&lt;br /&gt;
for out of order packets (I haven&amp;#039;t actually observed this, but&lt;br /&gt;
supposedly it happens, which is why the sequence number is present).&lt;br /&gt;
So the structure of packets received looks like:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 1 byte&lt;br /&gt;
! 1-19 bytes&lt;br /&gt;
|-&lt;br /&gt;
|SeqNum &lt;br /&gt;
| Serial Data &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On top of the serial layer is the &amp;quot;config tree&amp;quot; layer.  This is how&lt;br /&gt;
the meter actually exposes data and configuration.  The tree itself&lt;br /&gt;
is composed of nodes, each with a string name, data type, and a list&lt;br /&gt;
of children (zero or more).  For value containing (non-informational)&lt;br /&gt;
nodes, they also contain a 7-bit unique identifier.  Access to the&lt;br /&gt;
config tree is provided by packets on the serial stream, each packet&lt;br /&gt;
has a 1-byte header, where the uppermost bit (0x80) is set when writing&lt;br /&gt;
(i.e. never by the meter) and the remaining 7 bits are the node identifier.&lt;br /&gt;
The length of the packets varies based on the datatype of the tree node.&lt;br /&gt;
This means that any lost/dropped packets can make the stream unrecoverable&lt;br /&gt;
(i.e. there&amp;#039;s no defined sync method other that reconnection).  Packets&lt;br /&gt;
are emitted by the meter in response to a read or write command (write&lt;br /&gt;
commands simply back the value) and at unsolicited times by the meter&lt;br /&gt;
(e.g. continuous sampling and periodic battery voltage).  A read packet&lt;br /&gt;
send to the meter looks like:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 1 bit&lt;br /&gt;
! 7 bits&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| NodeID &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In response to the read, the meter will send:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 1 bit &lt;br /&gt;
! 7 bits &lt;br /&gt;
! 1-N bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| NodeID &lt;br /&gt;
| NodeValue&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
A write packet sent to the meter:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 1 bit &lt;br /&gt;
! 7 bits &lt;br /&gt;
! 1-N bytes |&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| NodeID &lt;br /&gt;
| NodeValue&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In response to the write, the meter will send a read response:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 1 bit &lt;br /&gt;
! 7 bits &lt;br /&gt;
! 1-N bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| NodeID &lt;br /&gt;
| NodeValue &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For the data in the tree, all values are little endian (least significant&lt;br /&gt;
bytes first).  The supported type codes are:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code &lt;br /&gt;
! Description &lt;br /&gt;
! Wire Format&lt;br /&gt;
|-&lt;br /&gt;
|  0   || Plain       ||                                        &lt;br /&gt;
|-&lt;br /&gt;
|  1   || Link        ||                                        &lt;br /&gt;
|-&lt;br /&gt;
|  2   || Chooser     || uint8_t                                &lt;br /&gt;
|-&lt;br /&gt;
|  3   || U8          || uint8_t                                &lt;br /&gt;
|-&lt;br /&gt;
|  4   || U16         || uint16_t                               &lt;br /&gt;
|-&lt;br /&gt;
|  5   || U32         || uint32_t                               &lt;br /&gt;
|-&lt;br /&gt;
|  6   || S8          || int8_t                                 &lt;br /&gt;
|-&lt;br /&gt;
|  7   || S16         || int16_t   &lt;br /&gt;
|-                             &lt;br /&gt;
|  8   || S32         || int32_t                                &lt;br /&gt;
|-&lt;br /&gt;
|  9   || String      || uint16_t length; char value[length]    &lt;br /&gt;
|-&lt;br /&gt;
|  10  || Binary      || uint16_t length; uint8_t value[length] &lt;br /&gt;
|-&lt;br /&gt;
|  11  || Float       || float                                  &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Plain and Link nodes are present to provide information and/or choices&lt;br /&gt;
but do not provide commands codes for direct access (see serialization&lt;br /&gt;
below).  Chooser nodes are written with indices described by their Plain&lt;br /&gt;
type children (e.g. to select a choice identified by the second child&lt;br /&gt;
of a chooser, write 1 to the chooser node itself).&lt;br /&gt;
&lt;br /&gt;
On initial connection only three nodes at fixed identifiers are available:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Node             &lt;br /&gt;
! ID &lt;br /&gt;
! Type   &lt;br /&gt;
|-&lt;br /&gt;
| ADMIN:CRC32      || 0  || U32    &lt;br /&gt;
|-&lt;br /&gt;
| ADMIN:TREE       || 1  || Binary &lt;br /&gt;
|-&lt;br /&gt;
| ADMIN:DIAGNOSTIC || 2  || String &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The handshake sequence is to read the contents of ADMIN:TREE, which contains&lt;br /&gt;
the zlib compressed tree serialization, then write the CRC of the compressed&lt;br /&gt;
data back to ADMIN:CRC32 (which the meter will echo back).  Only after&lt;br /&gt;
that is done will the meter accept access to the rest of the tree.&lt;br /&gt;
&lt;br /&gt;
After zlib decompression the tree serialization is as follows:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Type         &lt;br /&gt;
! Description &lt;br /&gt;
|-&lt;br /&gt;
| uint8_t      || The node data type code from above  &lt;br /&gt;
|-&lt;br /&gt;
| uint8_t      || Name length                         &lt;br /&gt;
|-&lt;br /&gt;
| char[length] || Node name (e.g. &amp;quot;ADMIN&amp;quot; or &amp;quot;CRC32&amp;quot;) &lt;br /&gt;
|-&lt;br /&gt;
| uint8_t      || Number of children                  &lt;br /&gt;
|-&lt;br /&gt;
| Node[count]  || Child serialization (length varies) &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Once the tree has been deserialized, each node needs it identifier&lt;br /&gt;
assigned.  This is a depth first tree walk, assigning sequential identifiers&lt;br /&gt;
first the the current node (if it needs one), then repeating recursively&lt;br /&gt;
for each of its children.  Plain and Link nodes are skipped in assignment&lt;br /&gt;
but not the walk (so the recursion still happens, but the identifier&lt;br /&gt;
is not incremented).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So, for example a write to the ADMIN:CRC32 as part of the handshake would&lt;br /&gt;
be a write by us (the host):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! SerSeq &lt;br /&gt;
! NodeID &lt;br /&gt;
! U32 (CRC)  &lt;br /&gt;
|-&lt;br /&gt;
! 1 byte &lt;br /&gt;
! 1 byte &lt;br /&gt;
! 4 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x01  &lt;br /&gt;
| 0x80  &lt;br /&gt;
| 0xDEADBEEF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The meter will respond with a packet like:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! SerSeq &lt;br /&gt;
! NodeID &lt;br /&gt;
! U32 (CRC) &lt;br /&gt;
|-&lt;br /&gt;
! 1 byte &lt;br /&gt;
! 1 byte &lt;br /&gt;
! 4 bytes  &lt;br /&gt;
|-&lt;br /&gt;
|  0x42  &lt;br /&gt;
|  0x00  &lt;br /&gt;
| 0xDEADBEEF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
A spontaneous error from the meter (e.g. in response to a bad packet)&lt;br /&gt;
can be emitted like:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! SerSeq &lt;br /&gt;
! NodeID &lt;br /&gt;
! U16 (len)  &lt;br /&gt;
!      String      &lt;br /&gt;
|-&lt;br /&gt;
! 1 byte &lt;br /&gt;
! 1 byte &lt;br /&gt;
!   2 bytes  &lt;br /&gt;
!  len (=8) bytes  &lt;br /&gt;
|-&lt;br /&gt;
|  0xAB  &lt;br /&gt;
|  0x20  &lt;br /&gt;
|   0x0008   &lt;br /&gt;
|    BAD\x20DATA   &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The config tree at the time of writing looks like:&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;ROOT&amp;gt; (PLAIN)&lt;br /&gt;
        ADMIN (PLAIN)&lt;br /&gt;
                CRC32 (U32) = 0&lt;br /&gt;
                TREE (BIN) = 1&lt;br /&gt;
                DIAGNOSTIC (STR) = 2&lt;br /&gt;
        PCB_VERSION (U8) = 3&lt;br /&gt;
        NAME (STR) = 4&lt;br /&gt;
        TIME_UTC (U32) = 5&lt;br /&gt;
        TIME_UTC_MS (U16) = 6&lt;br /&gt;
        BAT_V (FLT) = 7&lt;br /&gt;
        REBOOT (CHOOSER) = 8&lt;br /&gt;
                NORMAL (PLAIN)&lt;br /&gt;
                SHIPMODE (PLAIN)&lt;br /&gt;
        SAMPLING (PLAIN)&lt;br /&gt;
                RATE (CHOOSER) = 9&lt;br /&gt;
                        125 (PLAIN)&lt;br /&gt;
                        250 (PLAIN)&lt;br /&gt;
                        500 (PLAIN)&lt;br /&gt;
                        1000 (PLAIN)&lt;br /&gt;
                        2000 (PLAIN)&lt;br /&gt;
                        4000 (PLAIN)&lt;br /&gt;
                        8000 (PLAIN)&lt;br /&gt;
                DEPTH (CHOOSER) = 10&lt;br /&gt;
                        32 (PLAIN)&lt;br /&gt;
                        64 (PLAIN)&lt;br /&gt;
                        128 (PLAIN)&lt;br /&gt;
                        256 (PLAIN)&lt;br /&gt;
                TRIGGER (CHOOSER) = 11&lt;br /&gt;
                        OFF (PLAIN)&lt;br /&gt;
                        SINGLE (PLAIN)&lt;br /&gt;
                        CONTINUOUS (PLAIN)&lt;br /&gt;
        LOG (PLAIN)&lt;br /&gt;
                ON (U8) = 12&lt;br /&gt;
                INTERVAL (U16) = 13&lt;br /&gt;
                STATUS (U8) = 14&lt;br /&gt;
                POLLDIR (U8) = 15&lt;br /&gt;
                INFO (PLAIN)&lt;br /&gt;
                        INDEX (U16) = 16&lt;br /&gt;
                        END_TIME (U32) = 17&lt;br /&gt;
                        N_BYTES (U32) = 18&lt;br /&gt;
                STREAM (PLAIN)&lt;br /&gt;
                        INDEX (U16) = 19&lt;br /&gt;
                        OFFSET (U32) = 20&lt;br /&gt;
                        DATA (BIN) = 21&lt;br /&gt;
        CH1 (PLAIN)&lt;br /&gt;
                MAPPING (CHOOSER) = 22&lt;br /&gt;
                        CURRENT (PLAIN)&lt;br /&gt;
                                10 (PLAIN)&lt;br /&gt;
                        TEMP (PLAIN)&lt;br /&gt;
                                350 (PLAIN)&lt;br /&gt;
                        SHARED (LINK)&lt;br /&gt;
                RANGE_I (U8) = 23&lt;br /&gt;
                ANALYSIS (CHOOSER) = 24&lt;br /&gt;
                        MEAN (PLAIN)&lt;br /&gt;
                        RMS (PLAIN)&lt;br /&gt;
                        BUFFER (PLAIN)&lt;br /&gt;
                VALUE (FLT) = 25&lt;br /&gt;
                OFFSET (FLT) = 26&lt;br /&gt;
                BUF (BIN) = 27&lt;br /&gt;
                BUF_BPS (U8) = 28&lt;br /&gt;
                BUF_LSB2NATIVE (FLT) = 29&lt;br /&gt;
        CH2 (PLAIN)&lt;br /&gt;
                MAPPING (CHOOSER) = 30&lt;br /&gt;
                        VOLTAGE (PLAIN)&lt;br /&gt;
                                60 (PLAIN)&lt;br /&gt;
                                600 (PLAIN)&lt;br /&gt;
                        TEMP (PLAIN)&lt;br /&gt;
                                350 (PLAIN)&lt;br /&gt;
                        SHARED (LINK)&lt;br /&gt;
                RANGE_I (U8) = 31&lt;br /&gt;
                ANALYSIS (CHOOSER) = 32&lt;br /&gt;
                        MEAN (PLAIN)&lt;br /&gt;
                        RMS (PLAIN)&lt;br /&gt;
                        BUFFER (PLAIN)&lt;br /&gt;
                VALUE (FLT) = 33&lt;br /&gt;
                OFFSET (FLT) = 34&lt;br /&gt;
                BUF (BIN) = 35&lt;br /&gt;
                BUF_BPS (U8) = 36&lt;br /&gt;
                BUF_LSB2NATIVE (FLT) = 37&lt;br /&gt;
        SHARED (CHOOSER) = 38&lt;br /&gt;
                AUX_V (PLAIN)&lt;br /&gt;
                        0.1 (PLAIN)&lt;br /&gt;
                        0.3 (PLAIN)&lt;br /&gt;
                        1.2 (PLAIN)&lt;br /&gt;
                RESISTANCE (PLAIN)&lt;br /&gt;
                        1000.0 (PLAIN)&lt;br /&gt;
                        10000.0 (PLAIN)&lt;br /&gt;
                        100000.0 (PLAIN)&lt;br /&gt;
                        1000000.0 (PLAIN)&lt;br /&gt;
                        10000000.0 (PLAIN)&lt;br /&gt;
                DIODE (PLAIN)&lt;br /&gt;
                        1.2 (PLAIN)&lt;br /&gt;
        REAL_PWR (FLT) = 39&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
* [https://moosh.im/mooshimeter/specs/ Specs]&lt;br /&gt;
* [https://moosh.im/s/manual/MooshimeterManualRev1.pdf Manual]&lt;br /&gt;
* [https://play.google.com/store/apps/details?id=com.mooshim.mooshimeter&amp;amp;hl=en_GB Vendor software (Android)] [https://github.com/mooshim/Mooshimeter-AndroidApp sources]&lt;br /&gt;
* [https://itunes.apple.com/us/app/mooshimeter/id945898277?mt=8 Vendor software (iOS)]&lt;br /&gt;
* [https://gitlab.com/Sizurka/libsigrok/tree/mooshimeter/src/hardware/mooshimeter-dmm Out of tree driver (Linux only BLE stack)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Device]]&lt;br /&gt;
[[Category:Multimeter]]&lt;br /&gt;
[[Category:Planned]]&lt;/div&gt;</summary>
		<author><name>Hageman</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Mooshim_Engineering_Mooshimeter&amp;diff=14154</id>
		<title>Mooshim Engineering Mooshimeter</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Mooshim_Engineering_Mooshimeter&amp;diff=14154"/>
		<updated>2019-03-27T23:03:51Z</updated>

		<summary type="html">&lt;p&gt;Hageman: /* Protocol */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox multimeter&lt;br /&gt;
| image           = [[File:Mooshimeter-2X01A.jpg|180px]]&lt;br /&gt;
| name            = Mooshimeter DMM-BLE-2X01A&lt;br /&gt;
| status          = planned&lt;br /&gt;
| source_code_dir = ble-dmm&lt;br /&gt;
| counts          = 24 bit&lt;br /&gt;
| categories      = CAT III (600V)&lt;br /&gt;
| connectivity    = ble (aka Bluetooth Smart) ONLY&lt;br /&gt;
| measurements    = voltage, resistance, diode, continuity, frequency, current, temperature&lt;br /&gt;
| features        = autorange, logging to SD card, current / voltage simultaneously&lt;br /&gt;
| website         = https://moosh.im/mooshimeter/&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;Mooshimeter&amp;#039;&amp;#039;&amp;#039; is a 24-bit, two channel, CAT III (600V) remote access digital multimeter with Bluetooth Low Energy connectivity.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Multimeter&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Multimeter&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Mooshimeter-2X01A.jpg&lt;br /&gt;
File:Mooshimeter_Component_Side.jpg&lt;br /&gt;
File:Mooshimeter_Connection_Side.jpg&lt;br /&gt;
File:Mooshimeter_BLE_SoC.jpg&lt;br /&gt;
File:Mooshimeter_ADC.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Protocol ==&lt;br /&gt;
&lt;br /&gt;
Though the BLE SoC powering the Mooshimeter appears to be a TI CC2540,&lt;br /&gt;
the firmware running on it is not the standard &amp;quot;UART to BLE&amp;quot; that is&lt;br /&gt;
commonly found on them.  Instead, it implements the entire meter control&lt;br /&gt;
and its own custom protocol.&lt;br /&gt;
&lt;br /&gt;
The Mooshimeter protocol is broken down into several layers in a&lt;br /&gt;
communication stack.&lt;br /&gt;
&lt;br /&gt;
The lowest layer is the BLE GATT stack, which provides two characteristics:&lt;br /&gt;
one to write packets to the meter and one to receive them from it.  The&lt;br /&gt;
MTU for a packet in either direction is 20 bytes.  This is implemented&lt;br /&gt;
in the GATT abstraction, so we can talk to it via simple write commands&lt;br /&gt;
and a read callback.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The next layer is the serial stream: each BLE packet in either direction&lt;br /&gt;
has a 1-byte header of a sequence number.  Despite what the documentation&lt;br /&gt;
says, this is present in both directions (not just meter output) and is&lt;br /&gt;
NOT reset on the meter output on BLE connection.  So the implementation&lt;br /&gt;
here needs to provide an output sequence number and incoming reassembly&lt;br /&gt;
for out of order packets (I haven&amp;#039;t actually observed this, but&lt;br /&gt;
supposedly it happens, which is why the sequence number is present).&lt;br /&gt;
So the structure of packets received looks like:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 1 byte&lt;br /&gt;
! 1-19 bytes&lt;br /&gt;
|-&lt;br /&gt;
|SeqNum &lt;br /&gt;
| Serial Data &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On top of the serial layer is the &amp;quot;config tree&amp;quot; layer.  This is how&lt;br /&gt;
the meter actually exposes data and configuration.  The tree itself&lt;br /&gt;
is composed of nodes, each with a string name, data type, and a list&lt;br /&gt;
of children (zero or more).  For value containing (non-informational)&lt;br /&gt;
nodes, they also contain a 7-bit unique identifier.  Access to the&lt;br /&gt;
config tree is provided by packets on the serial stream, each packet&lt;br /&gt;
has a 1-byte header, where the uppermost bit (0x80) is set when writing&lt;br /&gt;
(i.e. never by the meter) and the remaining 7 bits are the node identifier.&lt;br /&gt;
The length of the packets varies based on the datatype of the tree node.&lt;br /&gt;
This means that any lost/dropped packets can make the stream unrecoverable&lt;br /&gt;
(i.e. there&amp;#039;s no defined sync method other that reconnection).  Packets&lt;br /&gt;
are emitted by the meter in response to a read or write command (write&lt;br /&gt;
commands simply back the value) and at unsolicited times by the meter&lt;br /&gt;
(e.g. continuous sampling and periodic battery voltage).  A read packet&lt;br /&gt;
send to the meter looks like:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 1 bit&lt;br /&gt;
! 7 bits&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| NodeID &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In response to the read, the meter will send:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 1 bit &lt;br /&gt;
! 7 bits &lt;br /&gt;
! 1-N bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| NodeID &lt;br /&gt;
| NodeValue&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
A write packet sent to the meter:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 1 bit &lt;br /&gt;
! 7 bits &lt;br /&gt;
! 1-N bytes |&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| NodeID &lt;br /&gt;
| NodeValue&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In response to the write, the meter will send a read response:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 1 bit &lt;br /&gt;
! 7 bits &lt;br /&gt;
! 1-N bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| NodeID &lt;br /&gt;
| NodeValue &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For the data in the tree, all values are little endian (least significant&lt;br /&gt;
bytes first).  The supported type codes are:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code &lt;br /&gt;
! Description &lt;br /&gt;
! Wire Format&lt;br /&gt;
|-&lt;br /&gt;
|  0   || Plain       ||                                        &lt;br /&gt;
|-&lt;br /&gt;
|  1   || Link        ||                                        &lt;br /&gt;
|-&lt;br /&gt;
|  2   || Chooser     || uint8_t                                &lt;br /&gt;
|-&lt;br /&gt;
|  3   || U8          || uint8_t                                &lt;br /&gt;
|-&lt;br /&gt;
|  4   || U16         || uint16_t                               &lt;br /&gt;
|-&lt;br /&gt;
|  5   || U32         || uint32_t                               &lt;br /&gt;
|-&lt;br /&gt;
|  6   || S8          || int8_t                                 &lt;br /&gt;
|-&lt;br /&gt;
|  7   || S16         || int16_t   &lt;br /&gt;
|-                             &lt;br /&gt;
|  8   || S32         || int32_t                                &lt;br /&gt;
|-&lt;br /&gt;
|  9   || String      || uint16_t length; char value[length]    &lt;br /&gt;
|-&lt;br /&gt;
|  10  || Binary      || uint16_t length; uint8_t value[length] &lt;br /&gt;
|-&lt;br /&gt;
|  11  || Float       || float                                  &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Plain and Link nodes are present to provide information and/or choices&lt;br /&gt;
but do not provide commands codes for direct access (see serialization&lt;br /&gt;
below).  Chooser nodes are written with indices described by their Plain&lt;br /&gt;
type children (e.g. to select a choice identified by the second child&lt;br /&gt;
of a chooser, write 1 to the chooser node itself).&lt;br /&gt;
&lt;br /&gt;
On initial connection only three nodes at fixed identifiers are available:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Node             &lt;br /&gt;
! ID &lt;br /&gt;
! Type   &lt;br /&gt;
|-&lt;br /&gt;
| ADMIN:CRC32      || 0  || U32    &lt;br /&gt;
|-&lt;br /&gt;
| ADMIN:TREE       || 1  || Binary &lt;br /&gt;
|-&lt;br /&gt;
| ADMIN:DIAGNOSTIC || 2  || String &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The handshake sequence is to read the contents of ADMIN:TREE, which contains&lt;br /&gt;
the zlib compressed tree serialization, then write the CRC of the compressed&lt;br /&gt;
data back to ADMIN:CRC32 (which the meter will echo back).  Only after&lt;br /&gt;
that is done will the meter accept access to the rest of the tree.&lt;br /&gt;
&lt;br /&gt;
After zlib decompression the tree serialization is as follows:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Type         &lt;br /&gt;
! Description &lt;br /&gt;
|-&lt;br /&gt;
| uint8_t      || The node data type code from above  &lt;br /&gt;
|-&lt;br /&gt;
| uint8_t      || Name length                         &lt;br /&gt;
|-&lt;br /&gt;
| char[length] || Node name (e.g. &amp;quot;ADMIN&amp;quot; or &amp;quot;CRC32&amp;quot;) &lt;br /&gt;
|-&lt;br /&gt;
| uint8_t      || Number of children                  &lt;br /&gt;
|-&lt;br /&gt;
| Node[count]  || Child serialization (length varies) &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Once the tree has been deserialized, each node needs it identifier&lt;br /&gt;
assigned.  This is a depth first tree walk, assigning sequential identifiers&lt;br /&gt;
first the the current node (if it needs one), then repeating recursively&lt;br /&gt;
for each of its children.  Plain and Link nodes are skipped in assignment&lt;br /&gt;
but not the walk (so the recursion still happens, but the identifier&lt;br /&gt;
is not incremented).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So, for example a write to the ADMIN:CRC32 as part of the handshake would&lt;br /&gt;
be a write by us (the host):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! SerSeq &lt;br /&gt;
! NodeID &lt;br /&gt;
! U32 (CRC)  &lt;br /&gt;
|-&lt;br /&gt;
! 1 byte &lt;br /&gt;
! 1 byte &lt;br /&gt;
! 4 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x01  &lt;br /&gt;
| 0x80  &lt;br /&gt;
| 0xDEADBEEF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The meter will respond with a packet like:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! SerSeq &lt;br /&gt;
! NodeID &lt;br /&gt;
! U32 (CRC) &lt;br /&gt;
|-&lt;br /&gt;
! 1 byte &lt;br /&gt;
! 1 byte &lt;br /&gt;
! 4 bytes  &lt;br /&gt;
|-&lt;br /&gt;
|  0x42  &lt;br /&gt;
|  0x00  &lt;br /&gt;
| 0xDEADBEEF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
A spontaneous error from the meter (e.g. in response to a bad packet)&lt;br /&gt;
can be emitted like:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! SerSeq &lt;br /&gt;
! NodeID &lt;br /&gt;
! U16 (len)  &lt;br /&gt;
!      String      &lt;br /&gt;
|-&lt;br /&gt;
! 1 byte &lt;br /&gt;
! 1 byte &lt;br /&gt;
!   2 bytes  &lt;br /&gt;
!  len (=8) bytes  &lt;br /&gt;
|-&lt;br /&gt;
|  0xAB  &lt;br /&gt;
|  0x20  &lt;br /&gt;
|   0x0008   &lt;br /&gt;
|    BAD\x20DATA   &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The config tree at the time of writing looks like:&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;ROOT&amp;gt; (PLAIN)&lt;br /&gt;
        ADMIN (PLAIN)&lt;br /&gt;
                CRC32 (U32) = 0&lt;br /&gt;
                TREE (BIN) = 1&lt;br /&gt;
                DIAGNOSTIC (STR) = 2&lt;br /&gt;
        PCB_VERSION (U8) = 3&lt;br /&gt;
        NAME (STR) = 4&lt;br /&gt;
        TIME_UTC (U32) = 5&lt;br /&gt;
        TIME_UTC_MS (U16) = 6&lt;br /&gt;
        BAT_V (FLT) = 7&lt;br /&gt;
        REBOOT (CHOOSER) = 8&lt;br /&gt;
                NORMAL (PLAIN)&lt;br /&gt;
                SHIPMODE (PLAIN)&lt;br /&gt;
        SAMPLING (PLAIN)&lt;br /&gt;
                RATE (CHOOSER) = 9&lt;br /&gt;
                        125 (PLAIN)&lt;br /&gt;
                        250 (PLAIN)&lt;br /&gt;
                        500 (PLAIN)&lt;br /&gt;
                        1000 (PLAIN)&lt;br /&gt;
                        2000 (PLAIN)&lt;br /&gt;
                        4000 (PLAIN)&lt;br /&gt;
                        8000 (PLAIN)&lt;br /&gt;
                DEPTH (CHOOSER) = 10&lt;br /&gt;
                        32 (PLAIN)&lt;br /&gt;
                        64 (PLAIN)&lt;br /&gt;
                        128 (PLAIN)&lt;br /&gt;
                        256 (PLAIN)&lt;br /&gt;
                TRIGGER (CHOOSER) = 11&lt;br /&gt;
                        OFF (PLAIN)&lt;br /&gt;
                        SINGLE (PLAIN)&lt;br /&gt;
                        CONTINUOUS (PLAIN)&lt;br /&gt;
        LOG (PLAIN)&lt;br /&gt;
                ON (U8) = 12&lt;br /&gt;
                INTERVAL (U16) = 13&lt;br /&gt;
                STATUS (U8) = 14&lt;br /&gt;
                POLLDIR (U8) = 15&lt;br /&gt;
                INFO (PLAIN)&lt;br /&gt;
                        INDEX (U16) = 16&lt;br /&gt;
                        END_TIME (U32) = 17&lt;br /&gt;
                        N_BYTES (U32) = 18&lt;br /&gt;
                STREAM (PLAIN)&lt;br /&gt;
                        INDEX (U16) = 19&lt;br /&gt;
                        OFFSET (U32) = 20&lt;br /&gt;
                        DATA (BIN) = 21&lt;br /&gt;
        CH1 (PLAIN)&lt;br /&gt;
                MAPPING (CHOOSER) = 22&lt;br /&gt;
                        CURRENT (PLAIN)&lt;br /&gt;
                                10 (PLAIN)&lt;br /&gt;
                        TEMP (PLAIN)&lt;br /&gt;
                                350 (PLAIN)&lt;br /&gt;
                        SHARED (LINK)&lt;br /&gt;
                RANGE_I (U8) = 23&lt;br /&gt;
                ANALYSIS (CHOOSER) = 24&lt;br /&gt;
                        MEAN (PLAIN)&lt;br /&gt;
                        RMS (PLAIN)&lt;br /&gt;
                        BUFFER (PLAIN)&lt;br /&gt;
                VALUE (FLT) = 25&lt;br /&gt;
                OFFSET (FLT) = 26&lt;br /&gt;
                BUF (BIN) = 27&lt;br /&gt;
                BUF_BPS (U8) = 28&lt;br /&gt;
                BUF_LSB2NATIVE (FLT) = 29&lt;br /&gt;
        CH2 (PLAIN)&lt;br /&gt;
                MAPPING (CHOOSER) = 30&lt;br /&gt;
                        VOLTAGE (PLAIN)&lt;br /&gt;
                                60 (PLAIN)&lt;br /&gt;
                                600 (PLAIN)&lt;br /&gt;
                        TEMP (PLAIN)&lt;br /&gt;
                                350 (PLAIN)&lt;br /&gt;
                        SHARED (LINK)&lt;br /&gt;
                RANGE_I (U8) = 31&lt;br /&gt;
                ANALYSIS (CHOOSER) = 32&lt;br /&gt;
                        MEAN (PLAIN)&lt;br /&gt;
                        RMS (PLAIN)&lt;br /&gt;
                        BUFFER (PLAIN)&lt;br /&gt;
                VALUE (FLT) = 33&lt;br /&gt;
                OFFSET (FLT) = 34&lt;br /&gt;
                BUF (BIN) = 35&lt;br /&gt;
                BUF_BPS (U8) = 36&lt;br /&gt;
                BUF_LSB2NATIVE (FLT) = 37&lt;br /&gt;
        SHARED (CHOOSER) = 38&lt;br /&gt;
                AUX_V (PLAIN)&lt;br /&gt;
                        0.1 (PLAIN)&lt;br /&gt;
                        0.3 (PLAIN)&lt;br /&gt;
                        1.2 (PLAIN)&lt;br /&gt;
                RESISTANCE (PLAIN)&lt;br /&gt;
                        1000.0 (PLAIN)&lt;br /&gt;
                        10000.0 (PLAIN)&lt;br /&gt;
                        100000.0 (PLAIN)&lt;br /&gt;
                        1000000.0 (PLAIN)&lt;br /&gt;
                        10000000.0 (PLAIN)&lt;br /&gt;
                DIODE (PLAIN)&lt;br /&gt;
                        1.2 (PLAIN)&lt;br /&gt;
        REAL_PWR (FLT) = 39&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
* [https://moosh.im/mooshimeter/specs/ Specs]&lt;br /&gt;
* [https://moosh.im/s/manual/MooshimeterManualRev1.pdf Manual]&lt;br /&gt;
* [https://play.google.com/store/apps/details?id=com.mooshim.mooshimeter&amp;amp;hl=en_GB Vendor software (Android)] [https://github.com/mooshim/Mooshimeter-AndroidApp sources]&lt;br /&gt;
* [https://itunes.apple.com/us/app/mooshimeter/id945898277?mt=8 Vendor software (iOS)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Device]]&lt;br /&gt;
[[Category:Multimeter]]&lt;br /&gt;
[[Category:Planned]]&lt;/div&gt;</summary>
		<author><name>Hageman</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Mooshim_Engineering_Mooshimeter&amp;diff=14153</id>
		<title>Mooshim Engineering Mooshimeter</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Mooshim_Engineering_Mooshimeter&amp;diff=14153"/>
		<updated>2019-03-27T22:48:03Z</updated>

		<summary type="html">&lt;p&gt;Hageman: /* Photos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox multimeter&lt;br /&gt;
| image           = [[File:Mooshimeter-2X01A.jpg|180px]]&lt;br /&gt;
| name            = Mooshimeter DMM-BLE-2X01A&lt;br /&gt;
| status          = planned&lt;br /&gt;
| source_code_dir = ble-dmm&lt;br /&gt;
| counts          = 24 bit&lt;br /&gt;
| categories      = CAT III (600V)&lt;br /&gt;
| connectivity    = ble (aka Bluetooth Smart) ONLY&lt;br /&gt;
| measurements    = voltage, resistance, diode, continuity, frequency, current, temperature&lt;br /&gt;
| features        = autorange, logging to SD card, current / voltage simultaneously&lt;br /&gt;
| website         = https://moosh.im/mooshimeter/&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;Mooshimeter&amp;#039;&amp;#039;&amp;#039; is a 24-bit, two channel, CAT III (600V) remote access digital multimeter with Bluetooth Low Energy connectivity.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Multimeter&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Multimeter&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Mooshimeter-2X01A.jpg&lt;br /&gt;
File:Mooshimeter_Component_Side.jpg&lt;br /&gt;
File:Mooshimeter_Connection_Side.jpg&lt;br /&gt;
File:Mooshimeter_BLE_SoC.jpg&lt;br /&gt;
File:Mooshimeter_ADC.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Protocol ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
* [https://moosh.im/mooshimeter/specs/ Specs]&lt;br /&gt;
* [https://moosh.im/s/manual/MooshimeterManualRev1.pdf Manual]&lt;br /&gt;
* [https://play.google.com/store/apps/details?id=com.mooshim.mooshimeter&amp;amp;hl=en_GB Vendor software (Android)] [https://github.com/mooshim/Mooshimeter-AndroidApp sources]&lt;br /&gt;
* [https://itunes.apple.com/us/app/mooshimeter/id945898277?mt=8 Vendor software (iOS)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Device]]&lt;br /&gt;
[[Category:Multimeter]]&lt;br /&gt;
[[Category:Planned]]&lt;/div&gt;</summary>
		<author><name>Hageman</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=File:Mooshimeter_ADC.jpg&amp;diff=14152</id>
		<title>File:Mooshimeter ADC.jpg</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=File:Mooshimeter_ADC.jpg&amp;diff=14152"/>
		<updated>2019-03-27T22:47:45Z</updated>

		<summary type="html">&lt;p&gt;Hageman: ADC used on the Mooshimeter&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ADC used on the Mooshimeter&lt;/div&gt;</summary>
		<author><name>Hageman</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Mooshim_Engineering_Mooshimeter&amp;diff=14151</id>
		<title>Mooshim Engineering Mooshimeter</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Mooshim_Engineering_Mooshimeter&amp;diff=14151"/>
		<updated>2019-03-27T22:47:17Z</updated>

		<summary type="html">&lt;p&gt;Hageman: /* Photos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox multimeter&lt;br /&gt;
| image           = [[File:Mooshimeter-2X01A.jpg|180px]]&lt;br /&gt;
| name            = Mooshimeter DMM-BLE-2X01A&lt;br /&gt;
| status          = planned&lt;br /&gt;
| source_code_dir = ble-dmm&lt;br /&gt;
| counts          = 24 bit&lt;br /&gt;
| categories      = CAT III (600V)&lt;br /&gt;
| connectivity    = ble (aka Bluetooth Smart) ONLY&lt;br /&gt;
| measurements    = voltage, resistance, diode, continuity, frequency, current, temperature&lt;br /&gt;
| features        = autorange, logging to SD card, current / voltage simultaneously&lt;br /&gt;
| website         = https://moosh.im/mooshimeter/&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;Mooshimeter&amp;#039;&amp;#039;&amp;#039; is a 24-bit, two channel, CAT III (600V) remote access digital multimeter with Bluetooth Low Energy connectivity.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Multimeter&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Multimeter&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Mooshimeter-2X01A.jpg&lt;br /&gt;
File:Mooshimeter_Component_Side.jpg&lt;br /&gt;
File:Mooshimeter_Connection_Side.jpg&lt;br /&gt;
File:Mooshimeter_BLE_SoC.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Protocol ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
* [https://moosh.im/mooshimeter/specs/ Specs]&lt;br /&gt;
* [https://moosh.im/s/manual/MooshimeterManualRev1.pdf Manual]&lt;br /&gt;
* [https://play.google.com/store/apps/details?id=com.mooshim.mooshimeter&amp;amp;hl=en_GB Vendor software (Android)] [https://github.com/mooshim/Mooshimeter-AndroidApp sources]&lt;br /&gt;
* [https://itunes.apple.com/us/app/mooshimeter/id945898277?mt=8 Vendor software (iOS)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Device]]&lt;br /&gt;
[[Category:Multimeter]]&lt;br /&gt;
[[Category:Planned]]&lt;/div&gt;</summary>
		<author><name>Hageman</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=File:Mooshimeter_BLE_SoC.jpg&amp;diff=14150</id>
		<title>File:Mooshimeter BLE SoC.jpg</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=File:Mooshimeter_BLE_SoC.jpg&amp;diff=14150"/>
		<updated>2019-03-27T22:46:48Z</updated>

		<summary type="html">&lt;p&gt;Hageman: BLE SoC on the Mooshimeter&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;BLE SoC on the Mooshimeter&lt;/div&gt;</summary>
		<author><name>Hageman</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Mooshim_Engineering_Mooshimeter&amp;diff=14149</id>
		<title>Mooshim Engineering Mooshimeter</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Mooshim_Engineering_Mooshimeter&amp;diff=14149"/>
		<updated>2019-03-27T22:44:44Z</updated>

		<summary type="html">&lt;p&gt;Hageman: /* Photos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox multimeter&lt;br /&gt;
| image           = [[File:Mooshimeter-2X01A.jpg|180px]]&lt;br /&gt;
| name            = Mooshimeter DMM-BLE-2X01A&lt;br /&gt;
| status          = planned&lt;br /&gt;
| source_code_dir = ble-dmm&lt;br /&gt;
| counts          = 24 bit&lt;br /&gt;
| categories      = CAT III (600V)&lt;br /&gt;
| connectivity    = ble (aka Bluetooth Smart) ONLY&lt;br /&gt;
| measurements    = voltage, resistance, diode, continuity, frequency, current, temperature&lt;br /&gt;
| features        = autorange, logging to SD card, current / voltage simultaneously&lt;br /&gt;
| website         = https://moosh.im/mooshimeter/&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;Mooshimeter&amp;#039;&amp;#039;&amp;#039; is a 24-bit, two channel, CAT III (600V) remote access digital multimeter with Bluetooth Low Energy connectivity.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Multimeter&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Multimeter&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Mooshimeter-2X01A.jpg&lt;br /&gt;
File:Mooshimeter_Component_Side.jpg&lt;br /&gt;
File:Mooshimeter_Connection_Side.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Protocol ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
* [https://moosh.im/mooshimeter/specs/ Specs]&lt;br /&gt;
* [https://moosh.im/s/manual/MooshimeterManualRev1.pdf Manual]&lt;br /&gt;
* [https://play.google.com/store/apps/details?id=com.mooshim.mooshimeter&amp;amp;hl=en_GB Vendor software (Android)] [https://github.com/mooshim/Mooshimeter-AndroidApp sources]&lt;br /&gt;
* [https://itunes.apple.com/us/app/mooshimeter/id945898277?mt=8 Vendor software (iOS)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Device]]&lt;br /&gt;
[[Category:Multimeter]]&lt;br /&gt;
[[Category:Planned]]&lt;/div&gt;</summary>
		<author><name>Hageman</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=File:Mooshimeter_Connection_Side.jpg&amp;diff=14148</id>
		<title>File:Mooshimeter Connection Side.jpg</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=File:Mooshimeter_Connection_Side.jpg&amp;diff=14148"/>
		<updated>2019-03-27T22:44:31Z</updated>

		<summary type="html">&lt;p&gt;Hageman: Mooshimeter connections and battery side&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mooshimeter connections and battery side&lt;/div&gt;</summary>
		<author><name>Hageman</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=File:Mooshimeter_Component_Side.jpg&amp;diff=14147</id>
		<title>File:Mooshimeter Component Side.jpg</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=File:Mooshimeter_Component_Side.jpg&amp;diff=14147"/>
		<updated>2019-03-27T22:42:16Z</updated>

		<summary type="html">&lt;p&gt;Hageman: Component side of the Mooshimeter board&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Component side of the Mooshimeter board&lt;/div&gt;</summary>
		<author><name>Hageman</name></author>
	</entry>
</feed>