Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Document a safe way to develop code and algorithms for the HLW8012 #4

Open
xoseperez opened this issue Jan 6, 2018 · 1 comment
Open

Comments

@xoseperez
Copy link
Owner

Originally reported by: Julian Todd (Bitbucket: goatchurch, GitHub: Unknown)


For most arduino sensors, I program the algorithms and send print statements through the serial line in order to debug it.

But everywhere it says DO NOT CONNECT TO SERIAL LINE WHEN THE HLW8012 IS WORKING (ie when it is connected to the mains).

It's good to be told what not to do. But even nicer to be told how we should do it instead.

@NdK73
Copy link

NdK73 commented Aug 22, 2018

What I'm doing:

#include <WiFiUdp.h>
...
IPAddress mcast(239,255,215,74);
WiFiUDP logger;

void setup() [
...
  logger.beginMulticast(WiFi.localIP(), mcast, 55114);
}

void sendlog(const char *logmessage) {
  logger.beginPacketMulticast(mcast, 55114, WiFi.localIP());
  logger.printf("* %s", logmessage);
  logger.endPacket();
}

The generated multicast packets can be monitored with

#!/usr/bin/python
# Multicast client
# Adapted from: http://chaos.weblogs.us/archives/164

import socket

ANY = "0.0.0.0" 
MCAST_ADDR = "239.255.215.74"
MCAST_PORT = 55114

# Create a UDP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)

# Allow multiple sockets to use the same PORT number
sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)

# Bind to the port that we know will receive multicast data
sock.bind((ANY,MCAST_PORT))

# Tell the kernel that we want to add ourselves to a multicast group
# The address for the multicast group is the third param
status = sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, socket.inet_aton(MCAST_ADDR) + socket.inet_aton(ANY))

# setblocking(0) is equiv to settimeout(0.0) which means we poll the socket.
# But this will raise an error if recv() or send() can't immediately find or send data. 
sock.setblocking(1)

while 1:
    try:
        data, addr = sock.recvfrom(1024)
    except socket.error as e:
        pass
    else:
        print "From: ", addr
        print "Data: ", data

Note that this address and port are used by the domotic protocol I'm developing so I can use a single monitor both for protocol messages and logging (the "* " guarantees that log messages cannot be interpreted by protocol decoder).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants