Decode and parse the Oregon Scientific V3 radio data transmitted by OWL CM180 Energy sensor (433.92MHz)

Owl micro+ Wireless electricity monitor runs on Oregon Scientific V3 protocol.

After buying one of those wonderful little devices to study the energy consumed at home, i browsed the internet to find a way to decode frames sent by the transmitter (CMR180) but I have not found any application describing the coding system of the data within  the radio frames. So I decided to study the radio packets to decode the system.

20150117_142540

Please visit the Github repository (https://github.com/onlinux/OWL-CMR180) to get all information about how to decode the packets.

Code available for RaspberryPi and Arduino.

Load arduino sketch to run a mini Owl Micro+ energy monitor as shown on the picture above.(https://raw.github.com/onlinux/OWLCMR180/master/arduino/oregon_owl.ino)

 

 

3 thoughts on “Decode and parse the Oregon Scientific V3 radio data transmitted by OWL CM180 Energy sensor (433.92MHz)

  1. snips

    Je suggère pour le calcul de l’index compteur (total) en KWH :
    ((d[8] << 24)+(d[7] <>4))/223666
    (en s’inspirant des codes pour les OWL CM119 et après vérification du résultat retourné sur un RFXCOM-usb).

    Je pense qu’il faut aussi ajouter (d[10] << 40)+(d[9] << 32) (égale à zéro la plupart du temps car utilisés que pour les très gros index des compteurs).

    Merci bien pour votre code.

    Reply
    1. eric Post author

      Bonjour Snips,

      Le RFXCOM-usb a peut-être un algorithme différent pour interpréter le cumul des Watts depuis le dernier reset du transmetteur CMR180.
      Pour ce qui est de mon récepteur CM180 qui reçoit donc les trames envoyées par le CMR180, le cumul est bien codé sur 32 bits (bytes de 5 à 8), et le cumul/3600/1000 donne exactement ce qui est affiché sur le CM180 en kWh pour 230V.. Le cumul est effectivement codé sur 48 bits.


      unsigned long long total(const unsigned char* d) {
      unsigned long long val = 0;
      if ( (d[1]&0x0F) == 0 ){
      // Sensor returns total only if nibble#4 == 0
      val = (unsigned long long)d[10]< < 40; val += (unsigned long long)d[9] << 32; val += (unsigned long)d[8]<<24; val += (unsigned long)d[7] << 16; val += d[6] << 8; val += d[5]; } return val ; }

      J'aurais aimé avoir plus de retours de trames d'utilisateurs afin de comprendre la signification des quelques bytes qui reste inconnue.

      Merci encore pour votre commentaire.

      Reply
  2. Pingback: Réception 433.92MHz du compteur de consommation électrique OWL Micro+ ou CM180 avec un dongle Realtek RTL2832 DVB. | Onlinux

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>