I'm not going to comment on 220V part, thats out of my comfort zone, bus here's how I do it (do not add pull down before limiting resistor cos it act as a voltage divider, and separate buttons if you want to control separate relays):
P.S. I don't remember if D1 5V compatable, if not – replace 5V on buttons with 3.3V

I used ULN283A just for example, it's a good IC for driving relays, but you can use your D1 mini shield, it will work just fine.
877:
Blynk is an iOS app, you can create a layout and receive data from the Wemos coded with the appropriate auth key. You may use an alternative program/app?
https://www.blynk.cc/
Sorry, no, I have no experience with iOS.
877:
already have all my switch wiring in place (currently running on mains 230V), so I thought it would be easy to convert. But as you said below if the arduino dies I lose the ability to switch the lights on. I don't mind altering the wiring if it's worth it.
It will work with current wiring just fine if you don't want to change anything, even the code will be the same (I talk about code below).
877:
Have I got this correct:
The push switches would be in parallel. And effectively the Blynk "virtual switch" would be in parallel too. So that a signal from either of the two switches, or Blynk app, would signal a pin on the arduino/wemos, and by using pin detection would flip the state of the relay? And when the relay is in the 'on or off' state it could signal back to the Blynk app.
OK, lets talk about code a bit.
It will be better to divide code in parts:
- D1 pin input processing
- Virtual input processing
- Setting output state
Lets start with easy part – "change output state" function, when it's called it will flip relay output:
void flipRelayOutput()
{
digitalWrite(RELAY, !digitalRead(RELAY));
}
Now input pin processing – here you will need to look for pin input state change, it's best to use pin change interrupts, and when detected just call flipRelayOutput() – easy peasy so far.
Aaand the fun part, Wifi button – after connection to device first thing you send to device is "RELAY" pin state so it knows if relay is ON or OFF. I don't know iOS UI so I assume it will be one toggle button with set background color according to "RELAY" pin state. So, when you push that button device will send command to D1 to call same good old flipRelayOutput() and same command about "RELAY" pin state to confirm that command was received and executed.
I think thats it 