My recommendation is MQTT. Versatile, lightweight and modular, it can even run on a ESP8266 (Hub and client). The MQTT protocol is available for many platforms from embedded, mobile devices and up to big fat OS's like MAC, Windows and Linux.
The protocol have a Publisher, Subscriber model for the communication. And a QoS so a Hub can remember if a subscriber have received a message from a publisher. So a sleeping device can get up to speed when it wakes up and looks for it messages.
I run my MQTT server on a small Raspberry Pi Zero W, it's like a credit card on the wall and for the logic I uses "Node Red" and I have started to look at OpenHAB for a more complicated solution.
I have also built my own Arduino/MQTT devices for my 12v DC devices and uses a ESP8266 based product for my 230v AC devices.